Ⅰ c++ 菜鳥級 運行錯誤 段錯誤 Segmentation fault
Board的成員變數需要初始化,再就是CheckerPiece的構造函數在Board類進行構造的時候好像是涉及到嵌套類的構造問題吧,把CheckerPiece建立一個無參構造函數和一個初始化函數,這樣可以進行初始化
還有就是內部的一些矩陣元素賦值的時候
#include<iostream>
#include<cstdlib>
#include<cctype>
#include<cmath>
usingnamespacestd;
//定義了類Checkerpiece(用來檢查塊,相當於裁判?)
classCheckerpiece
{
charcolor; //todistinctdifferentplayers
intx;
inty; //:thecoordinateofthepiece.
boolselected; //:
boolisKing; //
//boolhasEnemy; //:
public:
//Boardlivespace;
Checkerpiece(){};
Checkerpiece(charcolor,intx,inty);//Constructor
voidInitCheckerpiece(charcolor,intx,inty);
intgetX();
intgetY();
碰岩擾chargetColor();
boolishimking();
voidselect();
voinselect();
boolcrown();
//boolmovable();
//boolmove(intnextX,intnextY,Board&checkerboard);
//boolsimplymove(intnextX,intnextY,Board&checkerboard);
//booljump(intnextX,intnextY,Board&checkerboard);
//boolisenemy(Checkerpiececp);
};
//CheckerPiece類的成員函數的實現
Checkerpiece::Checkerpiece(charcolor0,intx0,inty0)
{
color=color0;
x=x0;
y=y0;
}
voidCheckerpiece::InitCheckerpiece(charcolor0,intx0,inty0)
{
color=color0;
x=x0;
y=y0;
}
intCheckerpiece::getX()
{
returnx;
}
intCheckerpiece::getY()
{
棗野returny;
}
charCheckerpiece::getColor()
{
returncolor;
}
boolCheckerpiece::ishimking()
{
returnisKing;
}
voidCheckerpiece::select()
{
selected=true;
}
voidCheckerpiece::unselect()
{
selected=false;
}
boolCheckerpiece::crown()
{
returnisKing=true;
}
//定義類Player(玩家信息)
classPlayer
{
//boolred_turn;
charcolor;
intnoOfPieces;
intnoOf_movable;
笑旦//Checkerpiece*pieces[12];
public:
Player(charcolor);
boollose();
charplayercolor();
};
//成員函數的實現
Player::Player(charcolor0)
{
color=color0;
noOfPieces=12;
noOf_movable=12;
}
boolPlayer::lose()
{
returnnoOfPieces*noOf_movable==0;//沒有棋子或所有棋子不可動則表示輸了
}
charPlayer::playercolor()
{
returncolor;
}
//定義了Board類(棋盤)
classBoard
{
Checkerpiecematrix[8][8];
public:
Board();
voiddisPlayMatrix();
chargetmatrix(intx,inty);
boolgetKingship(intx,inty);
boolsetKingship(intx,inty);
voidsetPosition(intcrrentX,intcrrentY,intnextX,intnextY);
voidcapture(intx,inty);
boolmove(Playerp);
intreadX();
intreadY();
boolsimplymove(intcurrentX,intcurrentY,intnextX,intnextY);
booljump(intcurrentX,intcurrentY,intnextX,intnextY);
};
//初始化Board的成員
Board::Board()
{
for(inti=0;i<8;i++)
for(intj=0;j<8;j++)
matrix[i][j].InitCheckerpiece('',i,j);
for(intk=0;k<8;k+=2)
{
matrix[0][k]=Checkerpiece('r',0,k);
matrix[1][k+1]=Checkerpiece('r',1,k);
matrix[2][k]=Checkerpiece('r',2,k);
matrix[5][k+1]=Checkerpiece('b',5,k);
matrix[6][k]=Checkerpiece('b',6,k);
matrix[7][k+1]=Checkerpiece('b',7,k);
}
}
voidBoard::disPlayMatrix()
{
//Checkerpiece*matrix4print[8][8];
cout<<"abcdefgh"<<endl;
for(inti=0;i<8;i++)
{
cout<<i+1<<'|';
for(intj=0;j<8;j++)
{
//*matrix4print[i][j]=*matrix[i][j];
//cout<<*matrix4print[i][j].getColor()<<'|';
Checkerpiececp=matrix[i][j];
cout<<cp.getColor()<<'|';
}
cout<<endl;
}
}
charBoard::getmatrix(intx,inty)
{
Checkerpiececp=matrix[x][y];
returncp.getColor();
}
boolBoard::getKingship(intx,inty)
{
Checkerpiececp=matrix[x][y];
returncp.ishimking();
}
boolBoard::setKingship(intx,inty)
{
Checkerpiececp=matrix[x][y];
returncp.crown();
}
voidBoard::setPosition(intcurrentX,intcurrentY,intnextX,intnextY)
{
//CheckerpieceoldP=
charcolor=getmatrix(currentX,currentY);
matrix[currentX][currentY].InitCheckerpiece('',currentX,currentY);
matrix[nextX][nextY].InitCheckerpiece(color,currentX,currentY);
}
voidBoard::capture(intx,inty)
{
matrix[x][y].InitCheckerpiece('',x,y);
}
boolBoard::simplymove(intcurrentX,intcurrentY,intnextX,intnextY)
{
boolKingship=getKingship(currentX,currentY);
charpcolor=getmatrix(currentX,currentY);
if((Kingship==false)&&((nextX<currentX&&pcolor=='r')||(nextX>currentY&&pcolor=='b')))
cout<<"Notking!!"<<endl;
else
{
setPosition(currentX,currentY,nextX,nextY);
if((nextX==0&&pcolor=='b')||(nextX==7&&pcolor=='r'))
setKingship(nextX,nextY);
}
return(getmatrix(currentX,currentY)!=pcolor);
}
boolBoard::jump(intcurrentX,intcurrentY,intnextX,intnextY)
{
boolKingship=getKingship(currentX,currentY);
charpcolor=getmatrix(currentX,currentY);
intmidX=(currentX+nextY)/2;
intmidY=(currentY+nextY)/2;
if((Kingship==false)&&((nextX<currentX&&pcolor=='r')||(nextX>currentY&&pcolor=='b')))
cout<<"Notking!!"<<endl;
else
{
setPosition(currentX,currentY,nextX,nextY);
capture(midX,midY);
if((nextX==0&&pcolor=='b')||(nextX==7&&pcolor=='r'))
setKingship(nextX,nextY);
}
return(getmatrix(currentX,currentY)!=pcolor);
}
intBoard::readX()
{
introw;
cout<<"Enteranumberfrom1-8tochooserow:";
cin>>row;
returnrow-1;
}
intBoard::readY()
{
charletter;
intcolumn;
cout<<"Enteraletterfroma-htochoosecolumn:";
cin>>letter;
switch(letter)
{
case'a':column=0;
break;
case'b':column=1;
break;
case'c':column=2;
break;
case'd':column=3;
break;
case'e':column=4;
break;
case'f':column=5;
break;
case'g':column=6;
break;
case'h':column=7;
break;
default:column=8;
}
returncolumn;
}
boolBoard::move(Playerp)
{
disPlayMatrix();
charplayerid=p.playercolor();
cout<<playerid<<"piece'sturn,Slectthepieceyou'dliketomove:"<<endl;
intcurrentX=readX();
intcurrentY=readY();
if(getmatrix(currentX,currentY)!=playerid)
cout<<"!"<<endl;
else
{
cout<<"Enterthepositionyou'dliketomoveto:"<<endl;
intnextX=readX();
intnextY=readY();
if(nextY==8||nextX<0||nextX>7)
{
cout<<"Don'tbedaughty,youcan'tmoveoutoftheboard,deadoralive."<<endl;
}
elseif(getmatrix(nextX,nextY)!='')
cout<<"Thepositionisoccupid!"<<endl;
else
{
if(abs(currentX-nextX)==1&&abs(currentY-nextY)==1)
{
returnsimplymove(currentX,currentY,nextX,nextY);
}
elseif(abs(currentX-nextX)==2&&abs(currentY-nextY)==2)
{
returnjump(currentX,currentY,nextX,nextY);
}
else
{
cout<<"Notavalidmove!"<<endl;
}
}
}
returnfalse;
}
intmain()
{
Boardcheckergame;
Playerred('r');
Playerblack('b');
checkergame.move(red);
boolred_turn=true;
boolturntaking;
while(!red.lose()&&!black.lose())
{
if(red_turn==true)
{
turntaking=checkergame.move(red);
red_turn=red_turn&&turntaking;
}
else
{
turntaking=checkergame.move(black);
red_turn=turntaking;
}
}
return0;
}
Ⅱ 國際跳棋之基礎規則
國際 跳棋 雖然歷史也有幾百年了,但是對於大家來說並不為所知道,但是也還是有一些人會學習一些冷門的棋法,下面我給你介紹國際跳棋之基礎規則吧。
國際跳棋之基礎規則
基本簡介國際跳棋
國際跳棋前蘇聯曾是國際跳棋強國,在和平年代裡這個項目受到廣泛重視,還作為一種體育鍛煉項目在群眾中推廣,各個地方還設有國際跳棋學校,並出版了大量的具有指導性的讀物。在學校、工廠、集體農庄之間常常舉行比賽。在各個加盟共和國乃至全國也經常舉行大規模的正規比賽。並設有「共和國冠軍」和「全國冠軍」的光榮稱號。為推動國際跳棋項目起了巨大的作用。
曾見過八九十年代有關國際跳棋歷史簡介的報道。國際跳棋雖然在世界上已有幾百年歷史,但 是在我國還是一個比較新的項目。目前,國際跳棋這個項目已經受到北京棋院等單位的重視,在 教育 部門的支持下,正在北京的一些小學的低年級學生中間普及。我們的這個材料,希望有助於國際跳棋在我國的開展。
據史料記載,跳棋最早出現在古埃及、古羅馬、古希臘。人們已經從古埃及的墳墓里找到下跳棋的畫。在英國的博物館里珍藏著古埃及的獅子和羚羊下跳棋的篆刻畫。法國盧瓦爾存放著兩個從金字塔附近挖掘出的大理石跳棋棋盤。古代跳棋傳到歐洲、亞洲、非洲和北美洲,以後發生了一些變化。在許多國家形成了民族跳棋。棋盤的格數在大多數國家是六十四格,稱為:六十四格跳棋。但是在巴比倫為一百格,稱為:百格跳棋。加拿大的跳棋為一百四十四格,雙方各有三十枚棋子。
國際跳棋是由民族跳棋演變而來的。據說在一七二三年,居住在法國的一名波蘭軍官把六十四格跳棋改為一百格。跳棋改成百格後,它被稱為「波蘭-法國跳棋野陪」、「波蘭跳棋」或「斯拉夫跳棋」。國際跳棋由於變化甚多,內容豐富而吸引了許多名人。據李卜克內西講,馬克思是一名很好的跳棋手,幾乎找不到自己的對手。由於他十分精通跳棋,贏他一盤很不容易。跳棋 愛好 者中的世界著名人物除馬克思外,還有達爾文、拿破崙、蘇沃洛夫、愛倫堡、盧梭和列夫·托爾斯泰和富蘭克林等等。
國際跳棋的第一屆比賽是一八九四年在法國舉行的,冠軍獲得者是法備脊早國的и·魏斯
第一屆國際國際跳棋冠軍-法國и·魏斯。當時採用的就是棋盤為一百格的跳棋,叫著國際跳棋而不是棋盤為六十四格的跳棋。國際跳棋比賽自一八九四年起舉行過多次,法國的и·魏斯是一八九四年至一九一一年的國際跳棋冠軍。荷蘭的 T·霍赫蘭是一九一二年至一九二四年的國際跳棋冠軍。一九二五年法國的 C·比佐獲得世界冠軍。法國的 M·法布爾是一九二六年、一九三一年和一九三二年的世界冠軍。一九二八年的世界冠軍是荷蘭的Б·施普林格。法國的M·賴亨巴赫是在一九三三年至一九三八年連續六次獲得世界冠軍。第二次世界大戰以後國際跳棋的世界冠軍有法國的п·蓋斯特瑪(一九四五年)、荷蘭的п·羅曾堡(一九四八年、一九五二年)、加拿大的M·德洛里耶(一九五六年)、蘇聯的B·謝格列夫(一九六0年、一九-- 年)、蘇聯的A·安德列科(一九六八年)、荷蘭的T?塞布蘭茨(一九七二年)、荷蘭的 X·維爾斯馬(一九七六年、一九八一年、一九八三年)、蘇聯的A·甘特瓦爾格(一九七九年)、蘇聯的B·維爾內(一九八四年)。女子和青年冠軍有:蘇聯的E·米哈依洛夫斯卡婭四次獲得世界冠軍;蘇聯的A·巴利亞金和B·維爾內都獲得過世界冠軍。一九八一年的里加女子國際跳棋比賽中,蘇聯棋手包攬了前三名。
國際跳棋著法簡單,內容豐富,既有助於開發智力,又能培養頑強進取的精神。
國際跳棋又名百格跳棋。它的棋盤是由深淺兩色相間的10X10的小方格組成的一個大正方形。 國際象棋 的棋盤仿雀是64格的,它比國際象棋的棋盤整整多了一圈。
國際跳棋中的大斜線棋盤上深色的格子叫黑格,淺色的格子叫白格。對局時,棋盤放在對局者中間,雙方左下角的第一個格子必須是黑格,不能擺錯。與國際象棋不同的是,棋盤上的黑格才是國際跳棋擺棋子和行棋的地方,無論任何時候,都不能把任何棋子放到白格中去。
對局時,棋子的原始擺法為:20枚黑兵排列在已方後四排的黑格內,白方棋子同黑,黑棋擺在1到20棋位,白棋擺在31到50棋位。經過一段對局,任何一方的兵沖破重重障礙,走至並停留在對方底線,即升變為王棋,如果沒有停留在對方底線不能立即成王。王棋可以用兩個兵摞起來表示,也可以將兵翻轉過來做王棋。兵與王棋的走法:對局開始,由執白棋者先行,然後由黑棋行棋;雙方輪流走子,直到終局。
白、黑各走一著叫一個回合。對局開始時,出現在棋盤上的都是兵。
兵在走棋時,每步棋只能向前方鄰近的空棋位上向左或向右移動一格,並且只能前進,不允許後退。
兵的吃子法是用跳的形式進行的。這和一般跳棋的走法相似,只要自己的一個兵與對方的一枚棋子相遇,並且與這兩枚棋子成一斜行的、緊挨著對方棋子的棋位是空著的,那麼,輪至走子的一方就要用自己的兵跳過對方的棋子,放在緊挨著對方棋子後面的空棋位上,將對方的那枚棋子吃掉。吃子時,可以象普通跳棋一樣一次連跳連吃幾枚棋子,但連跳時不允許以自己的棋子為橋梁,也就是說,自己的棋子不能從自己的棋子上越過去再去吃對方的棋子。兵吃子時可以後退。
王棋的走法與兵不同,它可以前進,可以後退;有些規則中,只要在一條斜線上,一次移動幾格都可能。有些規則則沒有這些規定,一次仍然走一格。王棋的跳吃,也比兵的跳吃自由度要大得多。有些規則中,只要在同一斜線上,不管距離多麼遠,都可以跳過對方的這枚棋子,停在它後面的任何一個空格里,從而將對方這枚棋子吃掉。有些規則則沒有這些規定,跳吃除了可進可退和兵一樣。王棋的連跳,與兵的連跳大致相同,只是有些規則不限距離;只要有機會,一次可以跳吃對方的數枚棋子。
吃子還有三條重要規則:第一,能吃子必須吃子,不能不吃;第二,能多吃子,必須多吃,不能少吃;第三,能吃子的時候必須吃到底,不許半路停下不再吃了.以上規則無論是否對自己有利都必須執行.如果將對方的棋子吃光或者讓對方沒有可以走的棋了即為獲勝。
國際跳棋走法
棋子走法
1一個棋子既可以是一枚普通棋子,也可以是一枚王棋。
2普通棋子和王棋有著不同的走法和吃子規則。一個棋子移動一次,無論是一枚普通棋子還是一枚王棋,都被稱為「一著」。
3 對局首步永遠由執白棋的一方走出。雙方輪流走棋,每次各走一著,白方走白色棋子,黑方走黑色棋子。
4 一枚普通棋子每次只能向前方斜走一格至下一排的一個空格。普通棋子移動時,只能前進,不能後退。
5 當一枚普通棋子走到並停在對方底線即升變線上的任何一個格子內時,它將升變為王棋,並在這只棋子的上面疊上另一隻同樣顏色(即同一方)的棋子,稱做加冕。
6 當一方棋子到達對方的升變線時,雙方都可以給這枚棋子加冕。但是如果對方不給這枚棋子加冕的話,升變方就必須在這枚棋子到達對方底線升變後立即給它加冕,升變與加冕算是一步棋。不給王棋加冕是不合規則的著法。
7 升變為王棋的棋子即使沒有被加冕,仍然保持王棋的身份。雙方以後都有權利加冕這只王棋。(與規則5.4相抵觸)。移動沒有被加冕的王棋是不合規則的著法。
8 只有在對方走了一著棋以後,升變方才可以繼續移動王棋。
9 王棋可以在它控制的斜線上向前方和向後方移動任意格數的距離,因此它可以一步走到斜線上很遠的空格內。
10 行棋方移動棋子後,手已離開該棋子時,這著棋就算完成。
11 當行棋方觸摸了己方一個可以走動的棋子時,只要有合乎規則的著法,他就必須走這個棋子。
12 一方在行棋過程中,只要手沒有離開棋子,他就可以將這只棋子放到另一個合乎規則的空格內,如果他想這樣做的話。
13 行棋方如果希望擺正己方一個或更多的棋子,他必須提前清楚地告知對方,可以說「我擺正棋子」。
14 當沒有行棋權的一方觸摸或移動了一個或多個己方或對方的棋子時,這種行為是不恰當的。
總結 :國際跳棋雖然在中國不是很熱衷,但也是有很多世界大賽的,並且也有很多中國人參加,我在這為您整理一些國際跳棋的簡介,希望您能對它產生興趣。
Ⅲ 基礎篇:問題1.人工智慧的發展簡史是怎樣的1936-1969(1/3)
點擊收聽課程音頻
在我們悉圓信槐開始探討人工智慧的相關問題之前,還是先簡單回顧一下人工智慧發展簡史。
一、人工智慧的誕生(20世紀三十~五十年代)
人工智慧的概念最早是由約翰·麥卡錫(John McCarthy)在1956年著名的達特矛斯會議(Dartmouth Conference)上提出: 人工智慧是指讓機器的行為看起來就象是人類所表現出的智能行為一樣。 因為社會在不斷進步和發展,所以對新技術的認知不可避免存在時空的局限性。人工智慧這個定義在六十年後再往回看,已經被賦予了更多新的內容, 個別領域的人工智慧應用已經不僅僅是象人類行為一樣,甚至已經超越了人類,更快速、更准確、更強大。
這個定義強調人工智慧是人造機器,所「表現」出來一定的智能性也就是 弱人工智慧 。主流科學研究也是集中在弱人工智慧上,並且取得可觀的成就。那既然說到了弱人工智慧,就不得說與之對應的另一個分類就是強人工智慧。
強人工智慧一般觀點認為: 人類有可能製造出真正能推理和解決問題的智能機器 ,具有以下幾種特徵:
1、機器有知覺和自我意識;2、機器可以獨立思考問題並制定解決問題的最優方案; 3、有自己的價值觀和世界觀體系; 4、有和生物一樣的各種本能,比如生存和安全需求; 5、在某種意義上可以看作一種新的文明。
比如在好萊塢出品的人工智慧的題材科幻電影中,很多機器人都表現出了很強的學習認知能力以及自我意識,這樣的人工智慧就可以認為屬於強人工智慧。但遺憾的是當前我們科技發展水平還沒有能力創造任何種類的強人工智慧。還有 弱人工智慧與強人工智慧並不是發展階段的關系,弱人工智慧不一定能發展為強人工智慧,二者發展路徑與理念存在根本的不同。
讓我們來回顧一下在人工智慧誕生時期的偉大歷史事件:
1936年,數學家 阿隆佐·邱奇 (Alonzo Churc) 和艾倫·圖靈 ( Alan Turing) 命名邱奇-圖靈論題,提出 所有計算或演算法都可以由一台圖靈機來執行,這也是構建計算機科學的基礎之一。 圖靈這個人相信大家都有了解了,二戰時發明了解碼機破解了德國人密碼,改變了戰爭的進程。並且他發表的圖靈計算機論文也是現代計算機的原型。他把生物的進化也看做是一種程序,也就是圖靈機的基本概念,一切都是數學公式的表達,然後按程序進行。
1943年, 沃倫 · 麥卡洛克 (WarrenMcCulloch) 和沃爾特 · 皮茨 (WalterPitts) 兩位科學家提出了 「 神經網路 」 的概念,正式開啟了 AI 的大門。 雖然在當時僅是一個數學理論,但有著極其深遠的影響,因為這個理論讓人們了解到計算機可以如人類大腦一樣進行「深度學習」,描述了人造神經元網路如何實現邏輯功能。
1945年博弈論的創立者 馮·諾依曼(John.Von.N eumann)提出了存儲程序的概念,在計算機領域建立了不朽的功勛。 他的這一思想被譽為電子計算機時代的開始。到今天計算機的體系結構還基本上是馮 · 諾依曼型。
1946年2月14日情人節那天,基於 圖靈和馮 · 諾伊曼 學說,計算機的先驅者莫克利(J.W.Mauchly)與他的研究生埃克特(J.P.Eckert)在美國合作研發了世界上第一台通用計算機, 這 是現代計算機發展史上重要的里程碑,也 為人工智慧的出現奠定了硬體基礎。
1947年,神經學的研究發現大腦結構是由神經元組成的電子網路,其電平只存在「有」和「無」兩種狀態,不存在中間狀態,這也是人類研究大腦結構的重大成果。
1948年,計算機時代剛剛進入黎明時, 諾伯特 · 維納 ( Norbert Wiener) 就提出了一種「控制論」的概念。他是最先預見到信息技術雙重可能性的人,這把雙刃劍可能也逃離人類掌控並反過來控制人類。他也成為了最早對機器智能的到來提出批判的學者。
1950 年,圖靈發表了一篇劃時代的論文,預言了創造出具有真正智能的機器的可能性。 圖靈測試是人工智慧哲學方面第一個嚴肅的提案。著名的圖靈測試誕生: 如果一台機器能夠與人類 ( 通過電子設備 ) 展開間接對話而不能被辨別出其機器身份,那麼稱這台機器具有智能。 他也因此被譽為「人工智慧之父」。同一年,圖睜坦塌靈還預言了人類將會創造出具有真正智能的機器的可能性。
1951年, 克 里斯托弗 · 斯特雷奇 (ChristopherStrachey) 使用寫出了一個西洋跳棋程序; 迪特里希 · 普林茨 (DietrichPrinz) 寫出了一個國際象棋程序。 從這開始游戲 AI 就一直被當做評價 AI 發展水平的標准。
1955 年,艾倫·紐厄爾 (Allen Newell) 和赫伯特 · 西蒙 (Herbert Simon) 在 J. C. 肖 的協助下開發了「邏輯理論家」。這個程序通過模擬人證明符號邏輯定理的思維活動,證明《數學原理》中的38個定理,其中某些證明比原著更加簡明合理。
1956 年,人工智慧誕生 馬文· 明斯基 (Marvin Minsky) 與 約翰· 麥卡錫 (John McCarthy) 、克勞德· 香農 (Claude Shannon) 等人一起在美國達特茅斯學院發起並組織「達特茅斯會議」,麥卡錫首次提出了「人工智慧」這個概念,紐厄爾和西蒙則展示了編寫的「邏輯理論家」。會議上AI的名稱和任務得以確定,同時出現了最初的成就和最早的一批研究者,因此這一事件被廣泛認為是AI誕生的標志,被譽為「人工智慧的起點」。
1956 年喬治 · 戴沃爾戴沃爾 (Ge orge Devol ) 與約瑟夫 · 恩格爾博格 ( Joseph F·Engelberger ) , 創建了世界上第一家機器人公司,名為「尤尼梅新」。
1956 年,奧利弗·薩爾夫瑞德 (Oliver Selfridge) 研製出第一個字元識別程序,開辟了模式識別這一新的領域。
1957年, 艾倫·紐厄爾 (Allen Newell) 和 赫伯特 · 西蒙 (Herbert Simon) 等人開始研究一種不依賴於具體領域的通用問題求解器,他們稱之為GPS(General Problem Solver),這一時期,搜索式推理是許多AI程序使用相同的基本演算法。原理就像在迷宮中尋找出路一般;如果遇到了死胡同則進行回溯選擇其他分支路徑往前,這就是「搜索式推理」。這演算法主要困難是在很多問題中,線路總數的可能性是一個天文數字。
1958年,美國國防部先進研究項目局(Defense Advanced ResearchProjects Agency)成立,主要負責高新技術的研究、開發和應用。幾十年來DARPA已為美軍研發成功了大量的先進武器系統,同時為美國積累了大量的科技資源儲備,並且引領著美國乃至世界軍民高技術研發的潮流。
總結一下,最初的人工智慧研究是20世紀30年代末到50年代初的一系列科學研究成果交匯的創新的產物。在這些領域的頂級研究人員本身也是多學科跨界的專家,因此需要集各家所長的人工智慧,才得以快速發展,其中主要的幾個學科成果是:
1、神經學研究發現神經網路;2、維納的控制論描述了電子網路研究3、香農資訊理論的數字信號研究;4、圖靈的計算理論證明數字信號可以描述任何形式的計算,5、馮·諾依曼提出了存儲程序的概念,這些密切相關的想法融合在一起,展現了構建一個電子大腦的可能性,研究如何用機器來模擬人類智能的學科產生了。
二、人工智慧邏輯推理時期 (20世紀六十年代)
在這一時期,一般認為只要機器被賦予了邏輯推理能力就可以實現人工智慧。 不過此後人們失望的發現,製造出來的機器僅僅具備了基本的邏輯推理能力,還遠遠達不到「智能」的水平。
早在1958年, 約翰· 麥卡錫 (John McCarthy) 提出了「納諫者」的程序構想,將邏輯學引入了AI研究界。到了六十年代末麥卡錫和他的學生們發現,實現這一想法運算復雜度極高:即便是證明很簡單的定理也需要天文數字的運算步驟。此時,麥卡錫認為,人類怎麼思考是無關緊要的:真正的目標應該是解決問題的機器,而不是模仿人類進行思考的機器。因此麥卡錫等人一派也被稱為「簡約派」。
這一時期的重大事件有:
1962年,創立6年時間的公司 「尤尼梅特」 , 推出了世界上首款工業機器人「尤尼梅特」, 開始在通用汽車公司的裝配線上服役。
1963年6月,麻省理工學院MIT從DARPA,國防部先進研究項目局獲得經費資助,其中包括 馬文· 明斯基 (MarvinMinsky) 和麥卡錫 (John McCarthy) 五年前建立的 AI 研究組。 此後DARPA每年提供三百萬美元,直到七十年代為止。
1966年到1972年間,美國斯坦福國際研究所(SRI)研製了具備一定人工智慧移動式機器人Shakey,,它能夠自主進行感知、環境建模、行為規劃並執行任務(如尋找木箱並將其推到指定目的位置)。這是首台採用了人工智慧學的移動機器人,引發了人工智慧早期研究工作爆發。
1966 年, MIT 的系統工程師約瑟夫·魏澤堡 (Joseph Weizenbaum 和精神病學家 肯尼思·科爾比 (Kenneth Colby) 發布了世界上第一個聊天機器人艾麗莎 Eliza 。智能之處在於她能通過腳本「理解」簡單的自然語言,並能產生類似人類的互動。而其中最著名的腳本便是模擬羅吉斯心理治療師的Doctor。作為最早的有情感人工智慧機器,可以幫助用戶和機器進行對話,緩解壓力和抑鬱,同時這也是人工智慧語音助手最早的雛形。
1968年12,加州斯坦福研究所的 道格·恩格勒巴特 ( Douglas C. Engelbart) 發明了滑鼠,被譽為「滑鼠之父」。 如果你認為發明滑鼠已經很厲害的話,那他還有個更厲害發明,正是他提出了超鏈接概念,而超鏈接原理幾十年後成了現代互聯網的根基。他關於人工智慧發展的理念是提倡「智能增強」而非取代人類。
了解最新課程內容,點擊 原文鏈接 或者搜索"知識星球"小程序,在裡面搜索「人工智慧進化論」訂閱課程,加入圈子討論或者向作者提問。 或者加wx:AI61825
Ⅳ 國際跳棋殘局技巧
跳棋 是一項老少皆宜、流傳廣泛的益智型棋類游戲。下族雀面我教你國際跳棋殘局技巧,歡迎閱讀。
國際跳棋 別留遺憾,別做前功盡棄的事
前功盡棄,是我們經常說的一個 成語 ,下棋的人最有體會,費了多大的周析和努力,關鍵時刻沒有把握住,前功盡棄了。殘局就是我們經過很久的努力才進入的階段,如果有些基本功不會,該贏的棋下和了或者下輸掉了。這就會讓你深刻地理解前功盡棄四個字,別留遺憾,別做前功盡棄的事。學點基本功,必有好處。
國際跳棋王棋捉兵的 方法
a. 國際跳棋叉子戰法
見圖一:
圖一
如圖,白棋的王棋在48位,黑棋兩兵分別在26位和25位。雙方子力組成的三個點,就是一個“叉子”圖形。
黑棋先行,只能先送一兵,另一兵也會被攔截之後消滅,白勝。
見圖二:
圖二:
如圖,白棋先行。黑棋兩兵分別在11位和15位,目前還行不成叉子形狀。但白棋可以通過一連串的強迫著法,使得黑棋不得已形成叉子圖形。
走法如下:1. 31—22(捉11位兵) 11—16
2. 22—27(阻止16位兵前進)15—20
3. 27—38(捉20位兵)20—25 4. 38—43
經過白棋的一連串的逼破著法,雙方棋子的位置終於呈現出“叉子”形狀,
白勝。
b. 國際跳棋鏈條戰法
見圖三:
圖三
如圖,白棋王棋在45位,黑棋兩兵分別在12位和18位。雙方的子力都處於同一條斜線上,組成了“鏈條”圖形。
黑棋的兩兵,被白棋王棋控制住,兩兵都會先後被殺,白勝。
見圖四:
圖四
如圖,白棋先行。目前黑棋兩兵尚未被白棋王棋“鏈”起來,但經過一系列的強制著法,白棋可以輕松獲取勝利。
走法如下:1. 6—1(威脅吃兵)12—18(不丟兵的唯一辦法)
2. 1—7!(等著)雙方棋子呈現“鏈條”形狀,黑棋必失兵,白勝。
“鏈條戰法”王棋的應用,從兵的背面攻擊、控制效果更佳。如果兆頌早在兵的前方攻擊和控制,兩兵方通常會採用棄兵再突破的方法,獲取和棋。
見圖五:
圖五
如圖,白棋先行。黑棋的王棋和白棋兩兵雖然呈現了“鏈條”形狀,但是由於白棋位置比較接近底線王棋位,所以白棋的計劃就是:棄掉28位兵,使22位兵形成突破而獲取和棋。
走法如下:1. 22—18(棄28位兵) 11×33 2. 18—12 白兵即將到達底線升變,而黑方王
棋無法阻擋,和棋。
“叉子”戰法和“鏈條”戰法,在實戰殘局中應用廣泛,望大家能熟練掌握其要領,靈活運用於實戰當中。
介紹完王棋如何成功控制兵,直至取勝,我們知道了王棋的威力。但是,王棋是否不可戰勝?其實不然,在前面,我們講到“王兵平等、可以互吃”。這就說明,兵也是可以對抗王棋的,只要兵與兵之間互相配合,聯合起來對抗王棋,王棋也是會被消滅的。
國際跳棋兵捉王棋的方法:
a. 國際跳棋兩兵捉王棋:
見圖六:
圖六
如圖,白棋先行。白棋的兵和黑棋的王棋處於同一條斜線上,但是白棋的兵可以利用邊線的作用,成功消滅黑棋王棋。
走法如下:1.20—14 3×20 2. 25×14 白勝
圖七:
圖七
如圖,白棋先行。
走法如下:1.20—15 47×20 2. 15×24 白勝
見圖八:
圖八
如圖,白棋先行。白棋兩兵櫻拍,可以藉助底線,成功消滅黑棋王棋。
走法如下:1. 42—38 20×42 2. 47×38 白勝
經過這三例兩兵捉王棋的局面,大家會注意到,兩兵可以成功捉王棋,是必須有一兵處於邊線或底線,另一兵送吃。這樣就可以依據“有吃必吃”原則,送吃的兵把王棋引到另一枚兵的射程內消滅。
b. 國際跳棋三兵捉王棋:
見圖九:
圖九
如圖,白棋先行。
走法如下:1. 27—22 11×20 2. 15×24 白勝。
白棋送兵到22位是關鍵,根據“有吃必吃”的規則,黑棋王棋必須連吃兩兵,被迫停留在20位,然後被白兵消滅。
見圖十:
圖十
如圖,白棋先行。
走法如下:1. 28—22 2—11 2. 40—34 11×30 3. 25×34 白勝
此局面本是一盤和棋,白棋利用了黑方王棋急於捉兵的做法,給黑棋設了一個陷阱,導致黑方王棋被消滅。
上述三兵捉王棋的定式,我們習慣稱為“扣子”,因為其形狀如同衣服上的扣子一樣,希望大家能對此捉王定式,加深印象,熟練掌握。
c. 國際跳棋封王戰法
封王戰法,是很特殊的定式,請看圖十一:
圖十一
如圖,黑棋先行。雙方各有一王棋一兵,看起來雙方都沒有辦法吃掉對方的棋子,這似乎是個沒有爭議的和棋局面。
但是,在前面講過的《勝、負、和》的知識中,對弈中如果出現一方棋盤上有棋子,但是不能走動時,棋局會被判負。根據這一規則,採用“封王戰術”,黑棋可以獲取勝利。
走法如下:1. … 9—14(棄兵,使白兵擋住了王棋的退路) 2. 19×10 31—4 形成白方的王被自己的兵堵死,兵又被黑王堵死,不能前進,黑勝。
請注意,“封王戰法”只能再“大道”上使用,在其他的斜線上是無法封堵住靈活的王棋。
國際跳棋王棋捉王棋的方法:
a. 國際跳棋四王棋捉一王棋
當出現四枚王棋對一枚王棋的局面時,四王棋方是必勝的棋局。捉死一王棋並不是很困難,但是一定要採用正確的方法,四王棋方才可以獲取勝利,否則將會是徒勞無益,無法取勝。
下面見圖十二:
圖十二
如圖,這是四王棋捉一王棋的定式。
將四枚王棋分別擺在50位、39位、45位和34位, 形成一個長方形的圖形。這樣,四枚王棋佔領雙重道,以50位王棋和39位王棋控制“雙聯道”左下方區域;用45位王棋和34位王棋控制“雙聯道”右上方區域。
這樣,無論對方的王棋出現在棋盤上的任何一個位置,都會被消滅。
下面來看具體分析。
當黑方王棋如果處於“雙重道”右上方區域,如圖十三:
圖十三
白棋34位的王棋走到23位送吃,黑方王棋吃白棋兩王棋之後,被迫停留在44位,形成圖十四的局面,白勝。
圖十四
當黑方王棋如果處於“雙重道”左下方區域,如圖十五:
圖十五
白棋39位的王棋走到28位送吃,黑棋王棋吃白棋兩王棋之後,被迫停留在40位,形成圖十六的局面,白勝。
圖十六
b. 國際跳棋三王棋捉一王棋
在三枚王棋對一枚王棋的殘局中,通常情況下是和棋。單王棋方只要應對正確,三枚王棋是無法取勝的。也就是說,在通常情況下,三枚王棋是捉不死一枚王棋的。
但是,在某些特殊的局面中,三枚王棋也是可以成功捉死一枚王棋,而獲取勝利的。
國際跳棋第一種定式:
三枚王棋排列成“直線”捉單王,簡稱“直線“捉王棋。
下面,請看圖十七:
圖十七
如圖,黑棋先行。
著法如下:變化一1.… 3—12 2. 38—21 12×26 3. 28—37 26×42 4. 48×37 白勝
變化二1.… 3—9 2. 38—20 9×25 3. 28—39 25×43 4.48×39 白勝
第二種定式:
三枚王棋排列成“斜線“捉單王,簡稱“斜線”捉王棋。
下面看圖三十一:
圖十八
如圖,白棋先行。白棋三枚王棋處於大道上排列,占據了有利的位置;而黑棋王棋處於三聯道,行動范圍很小,位置很不利。所以白棋可以成功捉住黑棋王棋,獲取勝利。
走法如下:1. 41—47(逼迫黑方)15—4 2. 32—38(不允許黑王回來)4—36
3. 38—15 36—18 4. 37—31 18×36 5. 15—4 白勝
國際跳棋第三種定式:
三枚王棋佔領控制范圍大的好位置捉單王,棋簡稱“火力交叉”捉王棋。
下面看圖三十二:
圖十九
如圖,白棋先行。
走法如下:1. 42—48! 白棋形成了三枚王棋“火力交叉”控制黑棋王棋的局面。黑棋王棋可以選擇在26位—3位斜線或是2位—35位斜線上移動,結果都是輸棋。
a.1.… 8—17 2. 49—21 17×26 3. 18—31 26×42 4. 48×26 白勝
b.1.… 8—19 2. 48—30 19×35 3. 18—40 35×44 4. 49×35 白勝
Ⅳ 求一個能在電腦上玩的國際跳棋軟體
QQ游戲上就行吧。這是網路上的。單機的就不知道了。
Ⅵ 用C語言程序編一個跳棋游戲。怎麼編求高手解答
VC跳棋源代碼 http://www.pudn.com/downloads25/sourcecode/game/detail80585.html
Ⅶ 僅用c語言能編出哪些小游戲
可以編寫狼追兔子游戲,擲骰子游戲,24點游戲,井字棋游戲,農夫過河游戲,掃雷小游戲,人機猜數游戲,三色球游戲, 推箱子游戲,坦克大戰游戲,貪吃蛇游戲等。
Ⅷ 國際跳棋戰術技巧
只要我們的國際 跳棋 棋手善於從棋賽中汲取哲理和感悟,就有可能不斷戰勝困難,成為意志堅強、勇敢自信的人,就能真正走向世界!下面給大家介紹國際跳棋面介紹一下國際跳棋戰術技巧。歡迎大家閱讀。
國際跳棋 精美的樂章
戰術組合閃爍著棋手超人的 想像力 和創造力,是棋手智慧的結晶,是國際跳棋最激動人心的部分,形成了精美的樂章。
配者困合進攻法是用一整套棄子和吃子的 方法 ,來達到打擊對方的目的。也是取得勝利、獲得局面優勢、打破突破口及在劣勢時爭取和棋的手段,更是最重要的一種戰術手段,威力大,形式也非常美妙。
國際跳棋戰術技巧
如圖1,白先勝。1、c3-b4 a5×c3 2、e1-d2 c3×g3 3、e3-d4 c5×g5 4、h2×b8白棋用配合進攻法獲得絕對優勢,勝了。
圖1
配合進攻法的目的可分為以下幾點:
A、獲取子力的優勢,通過有目的的棄子,一舉消滅對方更多的棋子,使己方的棋子在數量上超過對方。
B、獲取局面的優勢,使己方的棋子占據據點或好的位置,直接威脅對方。
C、在不利的形勢下,為了避免失敗,挽救劣勢以達到和棋。
D、在局勢異常復雜,難於選擇,因而尋找機會應用配合進攻法,以達到簡化局面的目的。
如圖2,(白先)黑棋在f6、d6、b6各有一枚棋子,這就布置成了一個柵欄的形式,有利於白棋進行攻擊。1、a3-b4 c5×a3 2、f4-g5 h6×f4 3、c1-b2 a3×c1 4、e1-d2 c1×e3 5、d2×f4 h4×f2 6、g1×a7完成了配合進攻法,白棋取得了顯著的優勢,勝了。
圖2
如圖3(黑先),乍看上去白棋沒有排成柵欄位置,經研究細看黑棋有調使白棋布置成柵欄位置的可能性。黑棋計劃分兩部分進行:第一,誘白棋布成柵欄位置,調走e3、c5並調一個到b6來,於是白棋b6、d4、f2就成柵欄位置了。第二,展開攻擊。1、…g5-f4 2、e3×e7 f8×b4 3、c3×a5 h6-g5 4、h4×f6 d8-e7 5、f6×b6 a7×g1黑勝。
圖3
如圖4(白先),黑棋在f8王棋位上沒有棋子,白棋要利用這個弱點作為目標。1、h4-g5 f4×h6 2、c3-b4 a5×e1 3、g3-h4 e1×g3 4、h2×f8白勝.
圖4
如圖5(白先),1、g3-h4?這著棋走錯了,使自己處於首搭念被動。(正確的走法應該是1、b4-c5 d6×b4 2、a3×c5進行兌換。)1、…b8-a7 2、g1-h2白棋不能進行兌換了,晚了一著,(如2、b4-c5 d6×b4 3、a3×c5 f8-e7 4、g1-h2 e7-d6 5、c5×e7 f6×d8 6、h4×f6 d8-e7 7、f6×b6 a3×c1+)2、…f8-e7 3、h2-g3 d6-e5 4、e1-f2 e5-f4 5、g3×g7 h6×f8 6、h4×b6 a7×g1+
圖5
明顯的宜於配合進攻法的局勢枝友,當然較易看出,那麼只要爭取主動,控制局勢,就可以進行攻擊了。但是,更多的時候是隱藏在整個局勢里的。這就需要仔細對棋局進行觀察,查看適合配合進攻法的位置(如柵欄、王位上缺乏棋子等),也就是有沒有配合進攻法的可能性。
先在思想中確定一條進行配合進攻法的主要路線,接著著手准備條件(如有沒有等著(搶速度),該修的修,該補的補,該拆的拆,調運對方棋子等)。
完成了准備工作,接著就是最後的一擊。
Ⅸ VC++ 編程題 "井字棋"游戲設計(高手請進)
#include <stdio.h>
#include <stdlib.h> #define SIZE 3
typedef enum {CBLANK, CBLACK, CWHITE} CHESS;
typedef enum {GM_WIN, GM_LOST, GM_UNKNOW, GM_ERROR} GAMEFLAG;void init_board(CHESS board[SIZE][SIZE]) //初始化
{
int i, j;
for (i = 0; i < SIZE; i++)
{
for (j = 0; j < SIZE; j++)
{
board[i][j] = CBLANK;
}
}
}void print_chess(CHESS board[SIZE][SIZE]) //列印棋盤
{
int i, j;
putchar(' ');
for (i=0; i < SIZE; i++)
{
printf("%2d", i+1);
}
putchar('\n');
for (i=0; i < SIZE; i++)
{
printf("%-2d", i+1);
for (j=0; j < SIZE; j++)
{
switch (board[i][j])
{
case CWHITE:
putchar('O');
break;
case CBLACK:
putchar('*');
break;
case CBLANK:
putchar('_');
break;
default:
putchar('?');
break;
}
putchar(' ');
}
putchar('\n');
}
}void swc(CHESS chess, int *black, int *white, int *bmax, int *wmax) //判斷
{
switch (chess)
{
case CBLACK:
*white = 0;
(*black)++;
break;
case CWHITE:
*black = 0;
(*white)++;
break;
case CBLANK:
*black = 0;
*white = 0;
break;
default:
break;
} if (*black > *bmax) *bmax = *black;
if (*white > *wmax) *wmax = *white;
}
GAMEFLAG res(CHESS board[SIZE][SIZE]) //判斷輸贏
{
int i, j;
int win[4] = {0, 0, 0, 0};
int rblack, rwhite, cblack, cwhite,
loblack = 0, lowhite = 0,
roblack = 0, rowhite = 0,
bmax = 0, wmax = 0; for (i=0; i < SIZE; i++)
{
rblack = 0;
rwhite = 0;
cblack = 0;
cwhite = 0; swc(board[i][i], &loblack, &lowhite, &bmax, &wmax);
swc(board[i][SIZE-i-1], &roblack, &rowhite, &bmax, &wmax); for (j=0; j < SIZE; j++)
{
swc(board[i][j], &rblack, &rwhite, &bmax, &wmax);
swc(board[j][i], &cblack, &cwhite, &bmax, &wmax); } } if (bmax >= 3)
{
if (wmax >= 3)
{
return GM_ERROR;
}
else
{
return GM_WIN;
}
}
else
{
if (wmax >= 3)
{
return GM_LOST;
}
else
{
return GM_UNKNOW;
}
}}int move(CHESS board[SIZE][SIZE], CHESS chs, int x, int y)
{
int bs = 1;
if (board[x][y])
bs = 0;
else if (y >= SIZE || y < 0 || x >= SIZE || x < 0)
bs = 0;
else
board[x][y] = chs;
return bs;
}int main()
{
CHESS b[SIZE][SIZE];
char *msg[] = {"BLACK WIN!\n", "WHITE LOST!", "NOT YET", "ERROR!!"};
char *plr[] = {"NON", "BLACK", "WHITE"};
CHESS p = CBLACK;
GAMEFLAG flg;
init_board(b);
while ((flg = res(b)) == GM_UNKNOW)
{
int x, y, bmv = 1;
system("cls");
print_chess(b);
while (bmv)
{
printf("%s回合,輸入坐標:", plr[p]);
scanf("%d%d", &x, &y);
bmv = !move(b,p,x-1,y-1);
}
p = (CHESS)(CWHITE + CBLACK - p);
}
printf("%s", msg[flg]);
system("pause");
return 0;
}
Ⅹ 求跳棋游戲VB代碼
VB跳棋代碼:
窗體代碼:
Dim ChessBoard(-2 To 10, -2 To 10) As Byte ''棋盤(8豎*8棋)
Dim x(10) As Integer, y(10) As Integer ''搜索的每種走法脊宴
Dim x1(10) As Integer, y1(10) As Integer ''搜索的每種走法的可吃子坐標
Dim BestLocate As CHESSER
Dim CurrentPlayer As Byte ''當前玩家
Dim CurrentStep As Integer ''當前步
Dim 人機模式 As Boolean
Dim cSel As Byte ''玩家選擇了哪個棋子
Dim tTemp As Boolean
Const MAXDOWNPOINT = 7
Rem 如果Cer為1(黑方),則返回2(紅方),否則返加1(黑方)
Public Function NextCer(ByVal Cer As Byte) As Byte
NextCer = 1
If Cer = 1 Then NextCer = 2
End Function
Rem 棋盤
Private Sub Initial()
Dim i As Integer, j As Integer
For i = 1 To 8: For j = 1 To 8: ChessBoard(i, j) = 0: Next j: Next i
ChessBoard(1, 2) = 201
ChessBoard(1, 4) = 201
ChessBoard(1, 6) = 201
ChessBoard(1, 8) = 201
ChessBoard(2, 1) = 201
ChessBoard(2, 3) = 201
ChessBoard(2, 5) = 201
ChessBoard(2, 7) = 201
ChessBoard(3, 2) = 201
ChessBoard(3, 4) = 201
ChessBoard(3, 6) = 201
ChessBoard(3, 8) = 201
ChessBoard(6, 1) = 101
ChessBoard(6, 3) = 101
ChessBoard(6, 5) = 101
ChessBoard(6, 7) = 101
ChessBoard(7, 2) = 101
ChessBoard(7, 4) = 101
ChessBoard(7, 6) = 101
ChessBoard(7, 8) = 101
ChessBoard(8, 1) = 101
ChessBoard(8, 3) = 101
ChessBoard(8, 5) = 101
ChessBoard(8, 7) = 101
End Sub
Rem 反顯示(將屏幕顯示的內容存入ChessBoard數組)
Private Sub ReDisplay()
Dim i As Integer, j As Integer, k As Integer
k = 0
For i = 1 To 8
For j = 1 To 8
If cbText(k).Text = "" Then ChessBoard(i, j) = 0
If cbText(k).Text = "101" Then ChessBoard(i, j) = 101
If cbText(k).Text = "201" Then ChessBoard(i, j) = 201
If cbText(k).Text = "102" Then ChessBoard(i, j) = 102
If cbText(k).Text = "202" Then ChessBoard(i, j) = 202
k = k + 1
Next j
Next i
End Sub
Rem 顯示(將ChessBoard數組的內容顯示到屏幕後櫻察銀)
Private Sub Display()
Dim i As Integer, j As Integer, k As Integer
k = 0
For i = 1 To 8
For j = 1 To 8
If ChessBoard(i, j) = 0 Then
cbText(k).Text = ""
Else
cbText(k).Text = ChessBoard(i, j)
End If
k = k + 1
Next j
Next i
Call 勝負判沒納斷
End Sub
Rem 勝負判斷
Private Sub 勝負判斷()
Dim i As Integer, j As Integer
Dim a As Integer, b As Integer
a = 0: b = 0
For i = 1 To 8
For j = 1 To 8
If Int(ChessBoard(i, j) / 100) = 1 Then a = a + 1 ''計算玩家的棋子數
If Int(ChessBoard(i, j) / 100) = 2 Then b = b + 1 ''計算電腦的棋子數
Next j
Next i
If a = 0 Then Call MsgBox("我贏了!", vbOKOnly + 32, "提示:"): Exit Sub
If b = 0 Then Call MsgBox("我認輸了!", vbOKOnly + 32, "提示:"): Exit Sub
End Sub
Rem 返回估值
Private Function CurrentValue(Cer As Byte) As Integer
Dim i As Integer, j As Integer
CurrentValue = 0
For i = 1 To 8
For j = 1 To 8
If Int(ChessBoard(i, j) / 100) = Cer Then _
CurrentValue = CurrentValue + ChessBoard(i, j) Mod 100 * 100 + 100 ''是我方的棋子,棋子為1加100分,棋子為2加200分
If Int(ChessBoard(i, j) / 100) = NextCer(Cer) Then _
CurrentValue = CurrentValue - (ChessBoard(i, j) Mod 100 * 100 + 100) ''對方的棋子,棋子為1減100分,棋子為2減200分
Next j
Next i
End Function
Rem 如果Cer方i,j的棋子還可以吃子則返回True
Private Function IsLine(Cer As Byte, i As Byte, j As Byte) As Boolean
Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte
IsLine = False
''開始搜索棋盤
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
''吃子式走法1:即如果基本走法的位置有對方的棋子則可以跳吃(走法限制:Cer為1或棋子為加強棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1 ''目標坐標
y = (j - 1) - 1
x1 = i - 1 ''吃子坐標
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine = True '有可吃子,返回True
End If
End If
End Function
Rem 如果Cer方的棋子還可以吃子則返回True
Private Function IsLine2(Cer As Byte) As Boolean
Dim x As Byte, y As Byte, x1 As Byte, y1 As Byte
Dim i As Integer, j As Integer
IsLine2 = False
''開始搜索棋盤
For i = 1 To 8
For j = 1 To 8
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
''吃子式走法1:即如果基本走法的位置有對方的棋子則可以跳吃(走法限制:Cer為1或棋子為加強棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1 ''目標坐標
y = (j - 1) - 1
x1 = i - 1 ''吃子坐標
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i - 1) - 1
y = (j + 1) + 1
x1 = i - 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j - 1) - 1
x1 = i + 1
y1 = j - 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x = (i + 1) + 1
y = (j + 1) + 1
x1 = i + 1
y1 = j + 1
If x > 0 And y > 0 And x < 9 And y < 9 And ChessBoard(x, y) = 0 Then IsLine2 = True '有可吃子,返回True
End If
End If
Next j
Next i
End Function
Rem 搜索程序
Private Function Search(Cer As Byte, Steps As Integer, IsTop As Boolean, UpMax As Integer)
Dim a As Integer, b As Integer, b1 As Integer, b2 As Integer, i As Integer, j As Integer, k As Integer, l As Integer, v As Integer
Dim MaxValue As Integer
Dim Sc(40) As CHESSER
Dim IsEat(7) As Boolean ''搜索到的7種走法有沒有吃子
Dim EAT As Boolean ''有沒有吃子
If IsTop Then
List1.Clear
For i = 0 To 40: Sc(i).Allow = False: Next i ';默認情況下所有走法皆不允許,如果所有值均為False則皆允許
End If
EAT = False
For i = 0 To 7: IsEat(7) = False: Next i ''默認情況所有搜索到的走法都沒有吃子
Steps = Steps - 1
If Steps < 1 And IsLine2(Cer) = False Then
''如果我方無子可吃時才返回估值
Search = -CurrentValue(Cer) ''返回估值
Exit Function
End If
k = 0
''開始搜索棋盤
For i = 1 To 8
For j = 1 To 8
''如果是Cer方的棋子
If Int(ChessBoard(i, j) / 100) = Cer Then
For i1 = 1 To MAXDOWNPOINT: x(i1) = 0: x1(i1) = 0: Next ''x記載所有走法,清空x
''列出所有走法
''基本走法:上左、上右、下左、下右
x(0) = i - 1: y(0) = j - 1
x(1) = i - 1: y(1) = j + 1
x(2) = i + 1: y(2) = j - 1
x(3) = i + 1: y(3) = j + 1
''棋子表示方法:白棋 101(普通)、102 (過底的威力棋)
'' 紅棋 201(普通)、202 (過底的威力棋)
''下一句解釋:如果是白棋(101、102),不允許後退(刪除x(2)、x(3))
If Cer = 1 And ChessBoard(i, j) Mod 100 <> 2 Then x(2) = -2: x(3) = -2
''下一句解釋:如果是紅棋(201、202),不允許後退(刪除x(0)、x(1))
If Cer = 2 And ChessBoard(i, j) Mod 100 <> 2 Then x(0) = -2: x(1) = -2
''吃子式走法1:即如果基本走法的位置有對方的棋子則可以跳吃(走法限制:Cer為1或棋子為加強棋才可走)
If Int(ChessBoard(i - 1, j - 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x(4) = (i - 1) - 1 ''目標坐標
y(4) = (j - 1) - 1
x1(4) = i - 1 ''吃子坐標
y1(4) = j - 1
If x(4) > 0 And y(4) > 0 And x(4) < 9 And y(4) < 9 And ChessBoard(x(4), y(4)) = 0 Then _
EAT = True: IsEat(4) = True ''有可吃子,必需走此步,其餘走法無效
End If
''吃子式走法2
If Int(ChessBoard(i - 1, j + 1) / 100) = NextCer(Cer) And (Cer = 1 Or ChessBoard(i, j) Mod 100 = 2) Then
x(5) = (i - 1) - 1
y(5) = (j + 1) + 1
x1(5) = i - 1
y1(5) = j + 1
If x(5) > 0 And y(5) > 0 And x(5) < 9 And y(5) < 9 And ChessBoard(x(5), y(5)) = 0 Then _
EAT = True: IsEat(5) = True ''有可吃子,必需走此步,其餘走法無效
End If
''吃子式走法3
If Int(ChessBoard(i + 1, j - 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x(6) = (i + 1) + 1
y(6) = (j - 1) - 1
x1(6) = i + 1
y1(6) = j - 1
If x(6) > 0 And y(6) > 0 And x(6) < 9 And y(6) < 9 And ChessBoard(x(6), y(6)) = 0 Then _
EAT = True: IsEat(6) = True ''有可吃子,必需走此步,其餘走法無效
End If
''吃子式走法4
If Int(ChessBoard(i + 1, j + 1) / 100) = NextCer(Cer) And (Cer = 2 Or ChessBoard(i, j) Mod 100 = 2) Then
x(7) = (i + 1) + 1
y(7) = (j + 1) + 1
x1(7) = i + 1
y1(7) = j + 1
If x(7) > 0 And y(7) > 0 And x(7) < 9 And y(7) < 9 And ChessBoard(x(7), y(7)) = 0 Then _
EAT = True: IsEat(7) = True ''有可吃子,必需走此步,其餘走法無效
End If
''如果有吃子走法,刪除沒有吃子的其它走法
If EAT = True Then
For a = 0 To 7
If IsEat(a) = False Then x(a) = -1
Next a
End If
''存入Sc(走法表)中
For a = 0 To 7
'If x(a) = 5 And y(a) = 2 Then Stop
''如果超過棋盤將不能走
If x(a) > 0 And y(a) > 0 And x(a) < 9 And y(a) < 9 Then
''如果目標有棋子則不能走,為0才存入
If ChessBoard(x(a), y(a)) = 0 Then
''將走法存入「走法表」
Sc(k).Initx = i
Sc(k).Inity = j
Sc(k).ObjX = x(a)
Sc(k).ObjY = y(a)
Sc(k).x1 = x1(a) ''被吃子位置
Sc(k).y1 = y1(a)
If IsEat(a) = True Then Sc(k).Allow = True ''如果有吃子,則允許此著走法
k = k + 1
End If
End If
Next a
'If EAT = True Then i = 100: j = 100 ''如果有吃子則不必再搜索
End If
Next j
Next i
MaxValue = -30000 ''當前分數
tTemp = False
''搜索是否有允許走法,如果沒有則所有走法皆允許
For i = 0 To k - 1
If Sc(i).Allow = True Then tTemp = True
Next i
''如果有允許走法,則除允許走法外,其餘走法皆不允許走
If tTemp = False Then
For i = 0 To k - 1: Sc(i).Allow = True: Next i
End If
''試走每種走法
For i = 0 To k - 1
If Sc(i).Allow = True Then
b1 = ChessBoard(Sc(i).Initx, Sc(i).Inity) ''記錄起點棋子和終點棋子
b2 = ChessBoard(Sc(i).ObjX, Sc(i).ObjY)
b = ChessBoard(Sc(i).x1, Sc(i).y1) ''記錄被吃子位置的棋子
ChessBoard(Sc(i).Initx, Sc(i).Inity) = 0 ''清除起點的棋子
ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b1 ''試下棋
ChessBoard(Sc(i).x1, Sc(i).y1) = 0 ''清除被吃子位置的棋子
''如果到邊界則威力加強
''下句:如果是黑方(101、102)
If Cer = 1 Then
''下句:如果走到第一行則棋子變成102,威力加強
If Sc(i).ObjX = 1 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 102
End If
''下句:如果是紅方(201、202)
If Cer = 2 Then
''下句:如果走到第八行則棋子變成202,威力加強
If Sc(i).ObjX = 8 Then ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = 202
End If
If b > 0 And IsLine(Cer, Sc(i).ObjX, Sc(i).ObjY) = True And EAT = True Then
''如果可連續吃子
v = CurrentValue(Cer) + 300 ''V為當前局面價值加300分
Else
v = Search(NextCer(Cer), Steps - 1, False, -UpMax) ''沒有連續可吃子,繼續搜索
End If
''恢復棋盤
ChessBoard(Sc(i).x1, Sc(i).y1) = b ''恢復被吃子
ChessBoard(Sc(i).Initx, Sc(i).Inity) = b1 ''記錄起點棋子和終點棋子
ChessBoard(Sc(i).ObjX, Sc(i).ObjY) = b2
'' 顯示每種走法的得分
If IsTop Then
List1.AddItem "從" & Str(Sc(i).Initx) & "," & Str(Sc(i).Inity) & _
"到" & Str(Sc(i).ObjX) & "," & Str(Sc(i).ObjY) & "得分:" & Str(v)
End If
'如果這種走法分數高,記錄
If IsTop And (v > MaxValue Or MaxValue = -30000) Then
BestLocate.Initx = Sc(i).Initx
BestLocate.Inity = Sc(i).Inity
BestLocate.ObjX = Sc(i).ObjX
BestLocate.ObjY = Sc(i).ObjY
BestLocate.x1 = Sc(i).x1
BestLocate.y1 = Sc(i).y1
MaxValue = v
End If
If v > MaxValue Then MaxValue = v
'下句: 如果 MaxValue >= -UpMax //α-β剪枝, 符合剪枝條件的就Cut掉。UpMax為上層的MaxValue
If IsTop = False And MaxValue >= -UpMax Then i = 100 ''剪枝程序
End If
Next i
If IsTop = False Then Search = -MaxValue Else Search = MaxValue
End Function
Private Sub cbText_Click(Index As Integer)
Dim i As Integer, j As Integer, C As Integer ''C記載吃子
Dim Temp As String, Temp2 As String, Temp3 As String
Dim x As Byte, y As Byte, x2 As Byte, y2 As Byte
If cbText(Index).BackColor <> &HC0E0FF Then Call MsgBox("落棋無效!", vbOKOnly + 32, "提示:"): Exit Sub
If cSel = 0 And Trim(cbText(Index).Text) > "" Then cSel = Index: cbText(cSel).ForeColor = QBColor(12): Exit Sub ''如果玩家一個也沒先且當前棋盤位置有棋子,則標示玩家選擇此棋子
If cSel <> 0 And Val(cbText(Index).Text) = Val(cbText(cSel).Text) Then cbText(cSel).ForeColor = H80000008&: cSel = 0: Exit Sub ''如果玩家兩次選擇相同的棋子則取消選擇
If cSel <> 0 Then
''下棋
cbText(Index).Text = cbText(cSel).Text
''判斷是否可變成加強棋
k = Val(cbText(Index).Text)
If Int(k / 100) = 1 And Index < 8 Then cbText(Index).Text = "102" ''如果1方走到頂端就變成加強棋
If Int(k / 100) = 2 And Index > 55 Then cbText(Index).Text = "202" ''如果2方走到頂端就變成加強棋
cbText(cSel).Text = ""
cbText(cSel).ForeColor = H80000008&
''判斷有沒有吃子
''向上左斜
If Index - cSel = -18 Then
cbText(Index + 9).Text = "": ''被吃子
C = Index + 9
End If
''向上右斜
If Index - cSel = -14 Then
cbText(Index + 7).Text = "": ''被吃子
C = Index + 7
End If
''向下左斜
If Index - cSel = 14 Then
cbText(Index - 7).Text = "": ''被吃子
C = Index - 7
End If
''向下右斜
If Index - cSel = 18 Then
cbText(Index - 9).Text = "": ''被吃子
C = Index - 9
End If
''存儲走法
k = 0: Temp = "": Temp2 = "": Temp = ""
For i = 1 To 8
For j = 1 To 8
If k = cSel Then Temp = "從" & Str(i) + "," + Str(j)
If k = Index Then Temp2 = " 到" + Str(i) + "," + Str(j): x = i: y = j
If k = C Then Temp3 = "吃子 " & Str(i) & "," & Str(j): x2 = i: y2 = j
k = k + 1
Next j
Next i
List2.AddItem "第" & Str(CurrentStep) & "手 " & Str(CurrentPlayer) + "方" + Temp + Temp2 + Temp3
CurrentStep = CurrentStep + 1
Text3.Text = Temp + Temp2
cSel = 0
Call ReDisplay
''下句:如果是人機模式並且玩家還沒有可吃子
If 人機模式 = True And (IsLine(CurrentPlayer, x, y) = True And x2 > 1 And y2 > 2) = False Then
'If 人機模式 = True Then
''看玩家走了哪方的棋子,就運算另一方的棋子
CurrentPlayer = NextCer(Int(Val(cbText(Index).Text) / 100))
Call Command2_Click ''如果是人機模式則讓電腦運長
End If
End If
End Sub
Private Sub Command1_Click()
List2.Clear ''清除棋譜
CurrentStep = 1
Call Initial
Call Display
End Sub
Private Sub Command2_Click()
Dim t As Boolean
Command2.Enabled = False
t:
Text1.Text = Str(Search(CurrentPlayer, Val(Text2.Text), True, 0))
Command2.Enabled = True
With BestLocate
t = DownChess(.Initx, .Inity, .ObjX, .ObjY, .x1, .y1)
Call Display
If t = True And IsLine(CurrentPlayer, .ObjX, .ObjY) Then Call MsgBox("我還想再吃一個"): GoTo t ''如果所下之棋還能吃子(連續吃)則再運算
End With
CurrentPlayer = NextCer(CurrentPlayer)
End Sub
Rem 移棋
Rem Sx,Sy:起點棋子 Ex,Ey:終點棋子 Ax,Ay:被吃子
Rem 如果有吃子則返回True
Private Function DownChess(Sx As Byte, Sy As Byte, ex As Byte, ey As Byte, Ax As Byte, Ay As Byte) As Boolean
ChessBoard(ex, ey) = ChessBoard(Sx, Sy)
ChessBoard(Sx, Sy) = 0
ChessBoard(Ax, Ay) = 0 ''清除被吃子
If Ax <> 0 And Ay <> 0 Then DownChess = True Else DownChess = False
Text3.Text = "第" & Str(CurrentStep) & "手 " & Str(CurrentPlayer) + "方從" & Str(Sx) + "," + Str(Sy) + "到" + Str(ex) + "," + Str(ey) & _
"吃子 " & Str(Ax) & "," & Str(Ay)
CurrentStep = CurrentStep + 1
List2.AddItem Text3.Text
''下句:如果是黑方(101、102)
If Int(ChessBoard(ex, ey) / 100) = 1 Then
''下句:如果走到第一行則棋子變成102,威力加強
If ex = 1 Then ChessBoard(ex, ey) = 102
End If
''下句:如果是紅方(201、202)
If Int(ChessBoard(ex, ey) / 100) = 2 Then
''下句:如果走到第八行則棋子變成202,威力加強
If ex = 8 Then ChessBoard(ex, ey) = 202
End If
End Function
Rem 運算一
Private Sub Command3_Click()
CurrentPlayer = 1
Call Command2_Click
End Sub
Rem 運算二
Private Sub Command4_Click()
CurrentPlayer = 2
Call Command2_Click
End Sub
Private Sub Command5_Click()
Call ReDisplay
End Sub
Private Sub Command6_Click()
If 人機模式 = False Then 人機模式 = True Else 人機模式 = False
If 人機模式 = False Then Command6.Caption = " 人機模式": Command6.ToolTipText = "當前模式:人人對戰" Else Command6.Caption = " 休息模式": Command6.ToolTipText = "當前模式:人機對戰"
End Sub
Private Sub Command7_Click()
End
End Sub
Rem 存譜
Private Sub Command8_Click()
On Error GoTo e
Dim i As Integer
Open InputBox("請輸入文件名:") For Output As #1
For i = 0 To List2.ListCount - 1
Print #1, List2.List(i)
Next i
Close #1
Exit Sub
e:
Call MsgBox("存儲錯誤!", vbOKOnly + 32, "提示:")
Err.Clear
Exit Sub
End Sub
Private Sub Form_Load()
人機模式 = False
cSel = 0
CurrentPlayer = 1
Call Command1_Click
End Sub
模塊代碼:
Type CHESSER
Chess As Byte ''為何棋,在BestLocate則標明為何數組
Initx As Byte ''起初棋的位置
Inity As Byte
ObjX As Byte ''經運算後的落棋點
ObjY As Byte
x1 As Byte
y1 As Byte
Allow As Boolean ''是否允許
End Type