象棋编程
① 象棋对弈软件是如何编制出来的
呵呵,开始我也觉得没有破绽,后来发现了软件也会出昏招。原来原理很简单,只是把基本的开局定式以及常见的对弈拆解局面转换成数据库函数,当出现数据库招数,便调出同类型的宏功能。说到底,只是电脑软件做到了更多的对弈棋局收集,把相关的招数进行了数码汇编。比如:仙人指路开局,软件就会自动把存储在数据库中的符合这一定式类型的所有函数自动调出,选择基本应招(根据用户选手游戏难度不同,软件也会选择相应招数致胜比率和复杂程度)。所以按一般局面和软件玩,就等于和一个熟读兵法的谋士作战,很难赢。你会有看不透,想不到的时候,软件按步就班,数据库就是它的眼睛和脑袋。但是编制软件的并不是一流大师,他们手头上有的都是找得到的棋局,但是棋盘千变万化,有很多招式不可能存在软件中,所以软件也会碰到出昏招的时候。我们可以做一个小实验,两台电脑玩相同的象棋游戏,如果以A电脑进行先手,B电脑进行后手,以B电脑的招式来和A电脑下。百分之九十九的机率是和棋。如果我们用自己的方式操作B电脑和A电脑进行至中局(有一方有多子优势),然后再让两台电脑自己下,肯定有一台电脑是输的。你就会发现输的电脑下的棋局很一般,因为它还是在以应对的形式开展,试问没有优势的情况下,那台数据库一样的电脑软件会出现奇招嘛?也就是说软件也是会输的。我记得国际象棋那个深蓝也输给过卡斯帕罗夫,然后那个更深的蓝赢了卡斯帕罗夫。还是赢在数据采集啊。
② 使用java编程:国际象棋棋盘64个格,第一格放一粒米,每一格比前一格多一颗,放满需要多少米 急!急!
package com.plague.math;
import java.lang.Math;
public class Chess {
private final static int CHESS_NUMBER = 64;
private int total;
public Chess () {
System.out.println("国王的赏赐,其实,问题是这样的:" +
"在国际象棋的棋盘上,第一格放一粒米,第二格放2粒米,第三个放四粒米。。。最后国王要赏赐多少米");
for (int i = 0; i < CHESS_NUMBER; i++) {
total += Math.pow(2.0,(double)i);
}
System.out.println("国王的赏赐是:"+total);
}
public static void main(String[] args) {
Chess c1 = new Chess();
}
}
③ c/c++编程题 在国际象棋的棋盘上(N*N),皇后可以走直线也可以走斜线(对角线).一个皇后能吃
#include<iostream>
#include<cstdio>
#defineUINTunsignedint
#defineULLunsignedlonglong
#defineMAXN110;
usingnamespacestd;
intN,ans,minstep;
UINTRow,Col;
UINTLft,Rgt;
inlineUINTlowbit(UINTx){
returnx&(-x);
}
boolcheck(){
UINTtR=~Row,tC;
UINTcurR,curC;
while(tR){
curR=lowbit(tR);
tR^=curR;
tC=~Col;
while(tC){
curC=lowbit(tC);
tC^=curC;
if((Rgt&(curR*curC))!=0||(Lft&((1<<(N-1))/curR*curC))!=0)
continue;
returnfalse;
}
}
returntrue;
}
voiddfs(introw,intused,UINTcol,UINTdig,UINTadg){
if(used>minstep)
return;
if(row==N){
if(check()){
if(used<minstep){
minstep=used;
ans=0;
}
ans++;
}
return;
}
UINTstatus=~(col|dig|adg);
UINTbinRow=(1<<row);
while(status){
UINTt=status&(-status);
Col^=t;
Row^=binRow;
Lft^=((1<<(N-1))/binRow*t);
Rgt^=(binRow*t);
dfs(row+1,used+1,(t|col),(t|dig)>>1,(t|adg)<<1);
Col^=t;
Row^=binRow;
Lft^=((1<<(N-1))/binRow*t);
Rgt^=(binRow*t);
status^=t;
}
dfs(row+1,used,col,dig>>1,adg<<1);
}
intmain(){
while(cin>>N){
UINTcol=(1<<N)-1;
col=~col;
ans=0;
minstep=N+1;
Row=Col=col;
Rgt=Lft=0;
dfs(0,0,col,0,0);
cout<<minstep<<endl<<ans<<endl;
}
return0;
}
代码见上方
④ 手机象棋软件是怎么编程出来的,这么厉害
软件下棋是这样的:
先观察当前局面,列出所有可能的走法,然后对每种走法进行分析。
分析时,会深入若干步,看这种下法究竟如何。
判断局面的时候,会根据多种因素评分:比如为每一个棋子赋予不同的权重,车为20,马为10,炮为10,之类;为不同的位置也赋予不同的权重,比如,车在中央为50,在角落为10,在靠近对方九宫的地方为80;同一个棋子在不同的进程也可能有不同的值,比如马,到了残局阶段就会增加价值;兵过河以后会增加价值;如果能够导致杀棋的下法,价值会最大。如果能造成对方拥塞、丢子等分值降低的下法,也会为己方增值。
如果你按照套路开局,它还有开局库可以随便挑;如果你不按照套路开局,它有强大的计算力。
软件的优势是计算的全面和较深入。能够把人对象棋棋理的认识反应出来,所以很厉害。
(围棋软件暂时还没有那么厉害,是因为围棋的变化和棋理更复杂。最高水平的围棋棋手都谦虚的说自己只了解了围棋的7% )