前言:
很多剛接觸編程的人都不知道怎么下手編寫程序,特別是學(xué)習(xí)了新的知識點,不知道有什么用,那么本文將以簡單的存儲結(jié)構(gòu)及簡單的運算,條件語句,分支語句,循環(huán)語句結(jié)合,帶來一個雙人對戰(zhàn)版五子棋,這是一個簡單的模型,實現(xiàn)了五子棋最最基本的功能。

【文章福利】:小編推薦自己的C語言/C++交流群:836880131!整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!~
需求分析:
通過C++語言來實現(xiàn)一個以windows控制臺為展示平臺的簡單版五子棋程序,其中通過鍵盤輸入來控制游戲中的行為(光標移動、落子、確認)。規(guī)則要求某一方在橫豎斜方向連續(xù)存在五個或五個以上本人所執(zhí)棋子獲得為獲勝。

游戲流程分析:

當我們要扒一個已存在的程序時,我們可以從他的UI入手,通過我們所觀察到的,所感受到,所使用到的服務(wù),來對軟件進行分析,從而獲得以上流程,但我們一旦需要將需求變?yōu)榇a時,我們的設(shè)計就要考慮的更多了。
這樣我們就需要一種能力--抽象
首先
我們需要一個棋盤,那么我可以使用C++里的什么來存儲和表示棋盤呢?通過抽象,因為棋盤是個二維圖形,我推薦使用二維數(shù)組,假設(shè)我們構(gòu)建一個19行*19列的棋盤。
實現(xiàn):
int qiPan[19][19]; //聲明一個19行19列的數(shù)組來存儲棋盤
for(int h=0;h<19;h++) //對數(shù)組進行遍歷,所有元素進行初始化(賦值),默認為0值
{
for(int l=0;l<19;l++)
{
qiPan[h][l]=0; //對當前元素進行初始化(賦值),默認為0值
}
}
for(int h=0;h<19;h++) //打印
{
for(int l=0;l<19;l++)
{
switch(qiPan[h][l])
{
case 0: //如果棋盤存儲的元素為0時,我們打印 · 樣式的字符
cout<<"·";
break;
}
}
cout<<endl;
}
運行以上代碼,我們可以得到一個棋盤。
那么擁有棋盤后
我們需要擁有一個光標,來對落子位置進行定點,那么我如何進行表示呢。
我們可以在棋盤上找一個點,也就是在數(shù)組對應(yīng)位置找一個元素,更改他的值,我們用8來表示光標,而找到這個元素我們需要知道其橫縱坐標值,我們用兩個int變量表示。
int X=9; //2.聲明并初始化光標的橫縱坐標
int Y=9;
qiPan[9][9]=8; //更改棋盤中光標所在元素的值為8
打印時,我們只要在switch 語句中添加一個case 選項 8即可:
case 8: //如果棋盤存儲的元素為0時,我們打印 · 樣式的字符
cout<<"╋";
break;
獲得光標后我們?nèi)绾我苿铀??那么我們可以通過接受鍵盤輸入的字符來控制光標的移動,本例中使用 W上,S下,A左,D右 來移動光標。
char xx=getch(); //控制臺從鍵盤獲得一個字符的函數(shù)(方法)
switch(xx) //控制
{
case 'w': //上
Y=Y-1; //使光標縱坐標-1
qiPan[Y][X]=8; //將光標寫入棋盤
qiPan[Y+1][X]=0; //使原本位置的值還原
break;
case 's': //下
Y=Y+1;
qiPan[Y][X]=8;
qiPan[Y-1][X]=0;
break;
case 'a': //左
X=X-1;
qiPan[Y][X]=8;
qiPan[Y][X+1]=0;
break;
case 'd': //右
X=X+1;
qiPan[Y][X]=8;
qiPan[Y][X-1]=0;
break;
}
這時,我們可以控制光標的移動了
接下來要實現(xiàn)落子操作
棋子怎么表示呢?
可以使用兩個int類型的值來表示:白子- 1,黑子- 2,那么我們只要在棋盤中更改光標所在位置元素的值為1或2就可以了
光標的移動會影響元素的變化,那么我們?nèi)绻谄灞P中進行落子后,我們光標再次移動有可能會改變已記錄的落子信息,為了使光標與棋子不沖突,我們使用兩個圖層,表示兩個相同的棋盤。

那么我就需要再聲明一個棋盤,方法和最開始一樣:
int qiPanTwo[19][19]; //聲明一個19行19列的數(shù)組來存儲棋盤
for(int h=0;h<19;h++) //對數(shù)組進行遍歷,所有元素進行初始化(賦值),默認為0值
{
for(int l=0;l<19;l++)
{
qiPanTwo[h][l]=0; //對當前元素進行初始化(賦值),默認為0值
}
}
棋盤2已經(jīng)建立好了,那么我們?nèi)绾温渥樱课覀円欢ㄒx擇執(zhí)棋方后,在光標位置通過接收鍵盤輸入的j落子,那么我們只需要在棋盤中switch語句中添加一個分支 case 'j':即可,并且我們需要使用一個變量來表示玩家,我們可以在程序一開始定義:
int player=1;//設(shè)定玩家并進行初始化賦值
case 'j': //落子
if(player==1) //如果當前玩家為白色方時
{
qiPanTwo[Y][X]=1; //通過棋盤1中的光標位置更改棋盤2
//中對應(yīng)元素的值為1,也就是白棋落子
player=2; //白棋落子后更換玩家
}
else if(player==2)
{
qiPanTwo[Y][X]=2;
player=1;
}
break;
落子成功,接下來我們可以把它展示出來,由于此時我們要對兩個棋盤進行統(tǒng)一的打印,那么我們使用swicth就不能進行統(tǒng)一的分支選擇了,此時我們需要將最開始的打印內(nèi)容改為:
if(qiPan[h][l]==8) //由于光標所在圖層應(yīng)該在棋子圖層之上,所以優(yōu)先考慮。
{
cout<<"╋";
}
else if(qiPanTwo[h][l]==0)
{
cout<<"·";
}
else if(qiPanTwo[h][l]==1)
{
cout<<"●";
}
else if(qiPanTwo[h][l]==2)
{
cout<<"○";
}
游戲規(guī)則
落子之后要進行一個判斷,如何判斷是否勝利呢?
這時,我們就要使用游戲規(guī)則來進行算法的分析,當落子位橫、縱、斜5格內(nèi)存在相互連接的五個同類棋子時,我們可認為執(zhí)該棋者獲勝,所以我們需要在各個方向進行判斷。
int shu=1,heng=1,pie=1,na=1;//橫豎撇捺計數(shù)器,累計到5則表示某方向出現(xiàn)五個相同的旗子
for(int i=1;i<=4;i++) //上
{
if(qiPanTwo[Y+i][X]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
shu++;
else
break;
}
for(int i=1;i<=4;i++) //下
{
if(qiPanTwo[Y-i][X]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
shu++;
else
break;
}
for(int i=1;i<=4;i++) //左
{
if(qiPanTwo[Y][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
heng++;
else
break;
}
for(int i=1;i<=4;i++) //右
{
if(qiPanTwo[Y][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
heng++;
else
break;
}
for(int i=1;i<=4;i++) //左下
{
if(qiPanTwo[Y+i][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
pie++;
else
break;
}
for(int i=1;i<=4;i++) //右上
{
if(qiPanTwo[Y-i][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
pie++;
else
break;
}
for(int i=1;i<=4;i++) //右下
{
if(qiPanTwo[Y+i][X+i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
na++;
else
break;
}
for(int i=1;i<=4;i++) //左上
{
if(qiPanTwo[Y-i][X-i]==qiPanTwo[Y][X]&&qiPanTwo[Y][X]!=0)
na++;
else
break;
}
if(shu==5||heng==5||pie==5||na==5)
{
if(qiPanTwo[Y][X]==1)
{
cout<<"白子獲勝!";
system("pause");
break;
}
else
{
cout<<"黑子獲勝!";
system("pause");
break;
}
}
shu=1,heng=1,pie=1,na=1;
當完成這一步時,我們的程序基本就搞定了,剩下就是按照一開始的流程進行拼接了,其中我們在打印屏幕之前,要對上一次打印的結(jié)果進行擦除,使用函數(shù)system(“cls”);//擦除控制臺中所有已顯示的字符
就可以完成了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持小編。
另外本程序還需要一部分頭文件,想要領(lǐng)取可以添加小編的C語言/C++交流④群:836880131,源碼在群文件里
福利來咯~
學(xué)習(xí)過程很“痛苦”,但是結(jié)果大家一定會對自己很滿意!
如果覺得學(xué)習(xí)資料難找的話,可以添加小編的C語言/C++交流群:836880131! 學(xué)習(xí)資料已經(jīng)共享在群里了,期待你的加入~