零基礎也能玩轉游戲項目!C語言五子棋小遊戲從零到1!

前言:

很多剛接觸編程的人都不知道怎麼下手編寫程序,特別是學習了新的知識點,不知道有什麼用,那麼本文將以簡單的存儲結構及簡單的運算,條件語句,分支語句,循環語句結合,帶來一個雙人對戰版五子棋,這是一個簡單的模型,實現了五子棋最最基本的功能。

**【文章福利】:**小編推薦自己的C語言/C++交流羣:836880131!整理了一些個人覺得比較好的學習書籍、視頻資料共享在羣文件裏面,有需要的可以自行添加哦!~

需求分析:

通過C++語言來實現一個以windows控制檯爲展示平臺的簡單版五子棋程序,其中通過鍵盤輸入來控制遊戲中的行爲(光標移動、落子、確認)。規則要求某一方在橫豎斜方向連續存在五個或五個以上本人所執棋子獲得爲獲勝。

遊戲流程分析:

當我們要扒一個已存在的程序時,我們可以從他的UI入手,通過我們所觀察到的,所感受到,所使用到的服務,來對軟件進行分析,從而獲得以上流程,但我們一旦需要將需求變爲代碼時,我們的設計就要考慮的更多了。

這樣我們就需要一種能力–抽象

首先

我們需要一個棋盤,那麼我可以使用C++裏的什麼來存儲和表示棋盤呢?通過抽象,因爲棋盤是個二維圖形,我推薦使用二維數組,假設我們構建一個19行*19列的棋盤。

實現:

int qiPan[19][19];  //聲明一個19行19列的數組來存儲棋盤 
 for(int h=0;h<19;h++) //對數組進行遍歷,所有元素進行初始化(賦值),默認爲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;
}

運行以上代碼,我們可以得到一個棋盤。

那麼擁有棋盤後

我們需要擁有一個光標,來對落子位置進行定點,那麼我如何進行表示呢。

我們可以在棋盤上找一個點,也就是在數組對應位置找一個元素,更改他的值,我們用8來表示光標,而找到這個元素我們需要知道其橫縱座標值,我們用兩個int變量表示。

int X=9;   //2.聲明並初始化光標的橫縱座標 
int Y=9;   
qiPan[9][9]=8;  //更改棋盤中光標所在元素的值爲8

打印時,我們只要在switch 語句中添加一個case 選項 8即可:

case 8:  //如果棋盤存儲的元素爲0時,我們打印 · 樣式的字符
cout<<"╋"; 
break;

獲得光標後我們如何移動他呢?那麼我們可以通過接受鍵盤輸入的字符來控制光標的移動,本例中使用 W上,S下,A左,D右 來移動光標。


char xx=getch();  //控制檯從鍵盤獲得一個字符的函數(方法)
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;    
}

這時,我們可以控制光標的移動了

接下來要實現落子操作

棋子怎麼表示呢?

可以使用兩個int類型的值來表示:白子- 1,黑子- 2,那麼我們只要在棋盤中更改光標所在位置元素的值爲1或2就可以了

光標的移動會影響元素的變化,那麼我們如果在棋盤中進行落子後,我們光標再次移動有可能會改變已記錄的落子信息,爲了使光標與棋子不衝突,我們使用兩個圖層,表示兩個相同的棋盤。

那麼我就需要再聲明一個棋盤,方法和最開始一樣:


int qiPanTwo[19][19]; //聲明一個19行19列的數組來存儲棋盤 
for(int h=0;h<19;h++) //對數組進行遍歷,所有元素進行初始化(賦值),默認爲0值 
{
for(int l=0;l<19;l++)
{
 qiPanTwo[h][l]=0; //對當前元素進行初始化(賦值),默認爲0值
}
}

棋盤2已經建立好了,那麼我們如何落子?我們一定要選擇執棋方後,在光標位置通過接收鍵盤輸入的j落子,那麼我們只需要在棋盤中switch語句中添加一個分支 case ‘j’:即可,並且我們需要使用一個變量來表示玩家,我們可以在程序一開始定義:


int player=1;//設定玩家並進行初始化賦值  
case 'j':   //落子 
 if(player==1)  //如果當前玩家爲白色方時 
 {
 qiPanTwo[Y][X]=1; //通過棋盤1中的光標位置更改棋盤2
//中對應元素的值爲1,也就是白棋落子
 player=2;  //白棋落子後更換玩家   
 }
 else if(player==2) 
 {
 qiPanTwo[Y][X]=2;
 player=1;   
 }
break;

落子成功,接下來我們可以把它展示出來,由於此時我們要對兩個棋盤進行統一的打印,那麼我們使用swicth就不能進行統一的分支選擇了,此時我們需要將最開始的打印內容改爲:

if(qiPan[h][l]==8) //由於光標所在圖層應該在棋子圖層之上,所以優先考慮。
{
 cout<<"╋";
}
else if(qiPanTwo[h][l]==0)
{
 cout<<"·";
}
else if(qiPanTwo[h][l]==1)
{
 cout<<"●";
}
else if(qiPanTwo[h][l]==2)
{
 cout<<"○";
}

遊戲規則

落子之後要進行一個判斷,如何判斷是否勝利呢?

這時,我們就要使用遊戲規則來進行算法的分析,當落子位橫、縱、斜5格內存在相互連接的五個同類棋子時,我們可認爲執該棋者獲勝,所以我們需要在各個方向進行判斷。

int shu=1,heng=1,pie=1,na=1;//橫豎撇捺計數器,累計到5則表示某方向出現五個相同的旗子
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;

當完成這一步時,我們的程序基本就搞定了,剩下就是按照一開始的流程進行拼接了,其中我們在打印屏幕之前,要對上一次打印的結果進行擦除,使用函數system(“cls”);//擦除控制檯中所有已顯示的字符

就可以完成了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持小編。

另外本程序還需要一部分頭文件,想要領取可以添加小編的C語言/C++交流④羣:836880131,源碼在羣文件裏

福利來咯~

學習過程很“痛苦”,但是結果大家一定會對自己很滿意!

如果覺得學習資料難找的話,可以添加小編的C語言/C++交流羣:967051845! 學習資料已經共享在羣裏了,期待你的加入~
image

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章