象棋編程
① 象棋對弈軟體是如何編制出來的
呵呵,開始我也覺得沒有破綻,後來發現了軟體也會出昏招。原來原理很簡單,只是把基本的開局定式以及常見的對弈拆解局面轉換成資料庫函數,當出現資料庫招數,便調出同類型的宏功能。說到底,只是電腦軟體做到了更多的對弈棋局收集,把相關的招數進行了數碼匯編。比如:仙人指路開局,軟體就會自動把存儲在資料庫中的符合這一定式類型的所有函數自動調出,選擇基本應招(根據用戶選手游戲難度不同,軟體也會選擇相應招數致勝比率和復雜程度)。所以按一般局面和軟體玩,就等於和一個熟讀兵法的謀士作戰,很難贏。你會有看不透,想不到的時候,軟體按步就班,資料庫就是它的眼睛和腦袋。但是編制軟體的並不是一流大師,他們手頭上有的都是找得到的棋局,但是棋盤千變萬化,有很多招式不可能存在軟體中,所以軟體也會碰到出昏招的時候。我們可以做一個小實驗,兩台電腦玩相同的象棋游戲,如果以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% )