亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++程序設計-五子棋

2020-01-26 14:14:56
字體:
來源:轉載
供稿:網友

前言:很多剛剛接觸編程的人都不知道怎么下手編寫程序,特別是學習了新的知識點,不知道有什么用,那么本文將以簡單的存儲結構及簡單的運算,條件語句,分支語句,循環語句結合,帶來一個雙人對戰版五子棋,這是一個簡單的模型,實現了五子棋最最基本的功能,還有好多地方需要補全,如邊界問題,設計問題,游戲邏輯問題,希望讀者閱讀后能夠注意,通過自己的努力來完善它,還能擴展各種功能,如悔棋,網絡對戰等,有時候寫程序和小生命一樣,慢慢會成長,而我們作為“父母”的看到自己的小寶寶成為有用之才,過程之欣喜特別棒!下面正題!

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

流程設計:

游戲流程分析:  

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

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

1.首先,我們需要一個棋盤,那么我可以使用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;}

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

2.那么擁有棋盤后,我們需要擁有一個光標,來對落子位置進行定點,那么我如何進行表示呢。我們可以在棋盤上找一個點,也就是在數組對應位置找一個元素,更改他的值,我們用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;     }

3.這時,我們可以控制光標的移動了,接下來要實現落子操作,棋子又怎么表示呢?

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

我們回顧一下光標移動的代碼,我們會發現,光標的移動會影響元素的變化,那么我們如果在棋盤中進行落子后,我們光標再次移動有可能會改變已記錄的落子信息,為了使光標與棋子不沖突,我們使用兩個圖層,表示兩個相同的棋盤。

那么我就需要再聲明一個棋盤,方法和1中一樣:

 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落子,那么我們只需要在2.中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就不能進行統一的分支選擇了,此時我們需要將1.中的打印內容改為:

 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<<"○"; }

4.游戲規則,我們落子之后要進行一個判斷,如何判斷是否勝利呢?  

此時,我們就要使用游戲規則來進行算法的分析,當落子位橫、縱、斜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”);//擦除控制臺中所有已顯示的字符

就可以完成了。

 完整代碼(可運行):

#include<iostream>#include<string> #include<windows.h> #include<conio.h>using namespace std;int main(){ int player=1;  //定義一個玩家,當1時為白方,2時為黑方  //................................棋盤1.............................................. int qiPan[19][19];  //1.聲明一個19行19列的數組來存儲棋盤 1  for(int h=0;h<19;h++) //對數組進行遍歷,所有元素進行初始化(賦值),默認為0值  { for(int l=0;l<19;l++) {  qiPan[h][l]=0; //對當前元素進行初始化(賦值),默認為0值 } } //...............................棋盤2................................................ int qiPanTwo[19][19]; //聲明一個19行19列的數組來存儲棋盤 2 for(int h=0;h<19;h++) //對數組進行遍歷,所有元素進行初始化(賦值),默認為0值  { for(int l=0;l<19;l++) {  qiPanTwo[h][l]=0; //對當前元素進行初始化(賦值),默認為0值 } } //...............................光標聲明............................................. int X=9;   //2.聲明并初始化光標的橫縱坐標  int Y=9;    qiPan[9][9]=8; //..............................顯示................................................... for(int h=0;h<19;h++)  {  for(int l=0;l<19;l++)  {  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<<"○";  }   }  cout<<endl; } //..............................輸入控制............................................... while(true) { 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;   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;     } //................................清屏操作................................................  system("cls");   //...............................打印..................................................... for(int h=0;h<19;h++)  {  for(int l=0;l<19;l++)  {  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<<"○";  }   }  cout<<endl; } //.........................游戲規則.............................................. int shu=1,heng=1,pie=1,na=1;//橫豎撇捺  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;  } } }  return 0; }

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区动漫| 国产精品久久久久久久久久ktv| 国产精品海角社区在线观看| 精品国偷自产在线视频| 青青a在线精品免费观看| 亚洲欧洲中文天堂| 国产精品毛片a∨一区二区三区|国| 日韩精品一二三四区| 欧美精品一区在线播放| 国产亚洲精品美女久久久久| 亚洲人高潮女人毛茸茸| 91久久精品日日躁夜夜躁国产| 成人伊人精品色xxxx视频| 欧美性感美女h网站在线观看免费| 秋霞av国产精品一区| 欧美日韩美女视频| 爽爽爽爽爽爽爽成人免费观看| 色婷婷久久一区二区| 1769国产精品| 国产一区二区三区在线看| 国产一区二区三区18| 欧美一级片在线播放| 欧美乱大交xxxxx另类电影| 成人高清视频观看www| 91tv亚洲精品香蕉国产一区7ujn| 欧美日韩国产激情| 中文字幕精品影院| 欧美乱妇高清无乱码| 久久精品中文字幕电影| 91亚洲一区精品| 国产亚洲成精品久久| 欧美日本黄视频| 亚洲欧美制服另类日韩| 日韩的一区二区| 精品久久久久久久久久久| 久久久久国产精品免费网站| 国产91av在线| 久久精品人人做人人爽| 欧美成人激情视频免费观看| 久久视频精品在线| 国产精品扒开腿爽爽爽视频| 久热在线中文字幕色999舞| yellow中文字幕久久| 国产精品女主播| 69久久夜色精品国产69| 成人网欧美在线视频| 成人亚洲综合色就1024| 欧美亚洲国产视频小说| 国产精品免费久久久久影院| 亚洲春色另类小说| 91九色在线视频| 欧美激情奇米色| 亚洲黄色片网站| 91在线免费观看网站| 欧美成人合集magnet| 亚洲最新av网址| 久久91精品国产91久久久| 久久国产一区二区三区| 亚洲精品中文字幕av| 在线a欧美视频| 亚洲精品永久免费| 亚洲高清久久久久久| 午夜精品久久久久久久久久久久久| 日韩欧美国产一区二区| 91亚洲精品在线观看| 91国产精品电影| 2025国产精品视频| 国产午夜精品全部视频播放| 激情亚洲一区二区三区四区| 欧美精品第一页在线播放| 欧美电影免费观看| 欧美另类精品xxxx孕妇| 7m第一福利500精品视频| 亚洲欧美国产一本综合首页| 欧美主播福利视频| 成人综合网网址| 国产美女精品视频| 久久久久久久久久久久久久久久久久av| 91久久国产精品| 97涩涩爰在线观看亚洲| 国产精品视频免费观看www| 欧美高跟鞋交xxxxhd| 日韩av中文字幕在线免费观看| 欧美亚洲午夜视频在线观看| 国产精品久久久久久久久久小说| 国产精品久久久久久久久免费看| 亚洲欧美激情四射在线日| 国产精品jizz在线观看麻豆| 秋霞av国产精品一区| 欧洲精品毛片网站| 亚洲精品成人久久电影| 国产a∨精品一区二区三区不卡| 中文字幕日韩专区| 日韩欧美中文字幕在线观看| 亚洲一区二区三区sesese| 成人激情视频在线观看| 欧美刺激性大交免费视频| 国产香蕉97碰碰久久人人| 成人日韩在线电影| 亚洲欧美在线免费| 国内精品视频在线| 欧美肥老太性生活视频| 在线观看亚洲区| 综合136福利视频在线| 国产精品久久久久影院日本| 亚洲精品v天堂中文字幕| 九九精品在线视频| 欧美日韩国产成人高清视频| 日韩在线观看视频免费| 国产精品精品视频一区二区三区| 国产精品偷伦一区二区| 欧美在线一级视频| 欧美理论电影在线播放| 日韩av在线网页| 在线播放国产一区中文字幕剧情欧美| 97涩涩爰在线观看亚洲| 奇米成人av国产一区二区三区| 亚洲激情国产精品| 国产xxx69麻豆国语对白| 最近2019好看的中文字幕免费| 欧美日本高清视频| 91成人在线视频| 亚洲综合自拍一区| 青草热久免费精品视频| 欧美日本在线视频中文字字幕| 亚洲高清不卡av| 亚洲国产精品中文| 亚洲欧美日韩在线高清直播| 黑人与娇小精品av专区| 亚洲男人av电影| 欧美一级在线亚洲天堂| 国产精品久久久久久久9999| 亚洲国产精品视频在线观看| 成人性教育视频在线观看| 久久精视频免费在线久久完整在线看| 伊是香蕉大人久久| 亚洲最大激情中文字幕| 亚洲美女黄色片| 亚洲精品综合久久中文字幕| 国内精品久久久久| 亚洲福利视频网站| 91chinesevideo永久地址| 亚洲理论片在线观看| 国产精品视频中文字幕91| 国产精品免费一区豆花| 欧洲午夜精品久久久| 国产不卡一区二区在线播放| 午夜精品一区二区三区在线播放| 日韩av免费在线看| 久久精品青青大伊人av| 亚洲成人精品久久| www.99久久热国产日韩欧美.com| 欧美精品在线免费观看| 国产精品久久久久99| 国产精品v日韩精品| 亚洲欧美日韩图片| 国产精品久久一区| 精品视频久久久| 日韩美女视频中文字幕| 国产精品视频99| 国产精品极品美女粉嫩高清在线| 日韩欧美精品中文字幕| 欧美激情视频在线观看| 亚洲第一视频网|