欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++程序設(shè)計(jì)-五子棋

 更新時間:2017年02月15日 11:41:03   作者:蠟筆小黑  
本文將以簡單的存儲結(jié)構(gòu)及簡單的運(yùn)算,條件語句,分支語句,循環(huán)語句結(jié)合,帶來一個雙人對戰(zhàn)版五子棋,這是一個簡單的模型,實(shí)現(xiàn)了五子棋最最基本的功能。具有很好的參考價值,下面跟著小編一起來看下吧

前言:很多剛剛接觸編程的人都不知道怎么下手編寫程序,特別是學(xué)習(xí)了新的知識點(diǎn),不知道有什么用,那么本文將以簡單的存儲結(jié)構(gòu)及簡單的運(yùn)算,條件語句,分支語句,循環(huán)語句結(jié)合,帶來一個雙人對戰(zhàn)版五子棋,這是一個簡單的模型,實(shí)現(xiàn)了五子棋最最基本的功能,還有好多地方需要補(bǔ)全,如邊界問題,設(shè)計(jì)問題,游戲邏輯問題,希望讀者閱讀后能夠注意,通過自己的努力來完善它,還能擴(kuò)展各種功能,如悔棋,網(wǎng)絡(luò)對戰(zhàn)等,有時候?qū)懗绦蚝托∩粯?,慢慢會成長,而我們作為“父母”的看到自己的小寶寶成為有用之才,過程之欣喜特別棒!下面正題!

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

流程設(shè)計(jì):

游戲流程分析:  

當(dāng)我們要扒一個已存在的程序時(有的是五子棋的程序,可以在互聯(lián)網(wǎng)里找到很多),我們可以從他的UI入手,通過我們所觀察到的,所感受到,所使用到的服務(wù),來對軟件進(jìn)行分析,從而獲得以上流程,但我們一旦需要將需求變?yōu)榇a時,我們的設(shè)計(jì)就要考慮的更多了。

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

1.首先,我們需要一個棋盤,那么我可以使用C++里的什么來存儲和表示棋盤呢?通過抽象,因?yàn)槠灞P是個二維圖形,我推薦使用二維數(shù)組,假設(shè)我們構(gòu)建一個19行*19列的棋盤。

實(shí)現(xiàn):

 int qiPan[19][19];  //聲明一個19行19列的數(shù)組來存儲棋盤 
 for(int h=0;h<19;h++) //對數(shù)組進(jìn)行遍歷,所有元素進(jìn)行初始化(賦值),默認(rèn)為0值 
 {
 for(int l=0;l<19;l++)
 {
  qiPan[h][l]=0; //對當(dāng)前元素進(jìn)行初始化(賦值),默認(rèn)為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;
}

運(yùn)行以上代碼,我們可以得到一個棋盤。

2.那么擁有棋盤后,我們需要擁有一個光標(biāo),來對落子位置進(jìn)行定點(diǎn),那么我如何進(jìn)行表示呢。我們可以在棋盤上找一個點(diǎn),也就是在數(shù)組對應(yīng)位置找一個元素,更改他的值,我們用8來表示光標(biāo),而找到這個元素我們需要知道其橫縱坐標(biāo)值,我們用兩個int變量表示。

 int X=9;   //2.聲明并初始化光標(biāo)的橫縱坐標(biāo) 
 int Y=9;   
 qiPan[9][9]=8;  //更改棋盤中光標(biāo)所在元素的值為8

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

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

獲得光標(biāo)后我們?nèi)绾我苿铀??那么我們可以通過接受鍵盤輸入的字符來控制光標(biāo)的移動,本例中使用 W上,S下,A左,D右 來移動光標(biāo)。

 char xx=getch();  //控制臺從鍵盤獲得一個字符的函數(shù)(方法)
 switch(xx)   //控制
 {
  case 'w':  //上
  Y=Y-1;  //使光標(biāo)縱坐標(biāo)-1 
  qiPan[Y][X]=8; //將光標(biāo)寫入棋盤 
  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.這時,我們可以控制光標(biāo)的移動了,接下來要實(shí)現(xiàn)落子操作,棋子又怎么表示呢?

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

我們回顧一下光標(biāo)移動的代碼,我們會發(fā)現(xiàn),光標(biāo)的移動會影響元素的變化,那么我們?nèi)绻谄灞P中進(jìn)行落子后,我們光標(biāo)再次移動有可能會改變已記錄的落子信息,為了使光標(biāo)與棋子不沖突,我們使用兩個圖層,表示兩個相同的棋盤。

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

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

好,棋盤2已經(jīng)建立好了,那么我們?nèi)绾温渥??我們一定要選擇執(zhí)棋方后,在光標(biāo)位置通過接收鍵盤輸入的j落子,那么我們只需要在2.中switch語句中添加一個分支 case 'j':即可,并且我們需要使用一個變量來表示玩家,我們可以在程序一開始定義:

int player=1;//設(shè)定玩家并進(jìn)行初始化賦值  
case 'j':   //落子 
 if(player==1)  //如果當(dāng)前玩家為白色方時 
 {
 qiPanTwo[Y][X]=1; //通過棋盤1中的光標(biāo)位置更改棋盤2
//中對應(yīng)元素的值為1,也就是白棋落子
 player=2;  //白棋落子后更換玩家   
 }
 else if(player==2) 
 {
 qiPanTwo[Y][X]=2;
 player=1;   
 }
break;

落子成功,接下來我們可以把它展示出來,由于此時我們要對兩個棋盤進(jìn)行統(tǒng)一的打印,那么我們使用swicth就不能進(jìn)行統(tǒng)一的分支選擇了,此時我們需要將1.中的打印內(nèi)容改為:

 if(qiPan[h][l]==8) //由于光標(biāo)所在圖層應(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<<"○";
 }

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

此時,我們就要使用游戲規(guī)則來進(jìn)行算法的分析,當(dāng)落子位橫、縱、斜5格內(nèi)存在相互連接的五個同類棋子時,我們可認(rèn)為執(zhí)該棋者獲勝,所以我們需要在各個方向進(jìn)行判斷。

 int shu=1,heng=1,pie=1,na=1;//橫豎撇捺計(jì)數(shù)器,累計(jì)到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; 

好 當(dāng)完成這一步時,我們的程序基本就搞定了,剩下就是按照一開始的流程進(jìn)行拼接了,其中我們在打印屏幕之前,要對上一次打印的結(jié)果進(jìn)行擦除,使用函數(shù)

system(“cls”);//擦除控制臺中所有已顯示的字符

就可以完成了。

 完整代碼(可運(yùn)行):

#include<iostream>
#include<string> 
#include<windows.h> 
#include<conio.h>
using namespace std;
int main()
{
 int player=1;  //定義一個玩家,當(dāng)1時為白方,2時為黑方 
 //................................棋盤1..............................................
 int qiPan[19][19];  //1.聲明一個19行19列的數(shù)組來存儲棋盤 1 
 for(int h=0;h<19;h++) //對數(shù)組進(jìn)行遍歷,所有元素進(jìn)行初始化(賦值),默認(rèn)為0值 
 {
 for(int l=0;l<19;l++)
 {
  qiPan[h][l]=0; //對當(dāng)前元素進(jìn)行初始化(賦值),默認(rèn)為0值
 }
 }
 //...............................棋盤2................................................
 int qiPanTwo[19][19]; //聲明一個19行19列的數(shù)組來存儲棋盤 2
 for(int h=0;h<19;h++) //對數(shù)組進(jìn)行遍歷,所有元素進(jìn)行初始化(賦值),默認(rèn)為0值 
 {
 for(int l=0;l<19;l++)
 {
  qiPanTwo[h][l]=0; //對當(dāng)前元素進(jìn)行初始化(賦值),默認(rèn)為0值
 }
 }
 //...............................光標(biāo)聲明.............................................
 int X=9;   //2.聲明并初始化光標(biāo)的橫縱坐標(biāo) 
 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;  //使光標(biāo)縱坐標(biāo)-1 
  qiPan[Y][X]=8; //講光標(biāo)寫入棋盤 
  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)  //如果當(dāng)前玩家為白色方時 
  {
   qiPanTwo[Y][X]=1; //通過棋盤1中的光標(biāo)位置更改棋盤2中對應(yīng)元素的值為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;
 }
 //.........................游戲規(guī)則..............................................
 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; 
}

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • c++自帶的查找函數(shù)詳解

    c++自帶的查找函數(shù)詳解

    這篇文章主要介紹了c++自帶的查找函數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • C語言的分支和循環(huán)語句你真的了解嗎

    C語言的分支和循環(huán)語句你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語言的分支和循環(huán)語句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 一文詳解C語言中文件相關(guān)函數(shù)的使用

    一文詳解C語言中文件相關(guān)函數(shù)的使用

    這篇文章主要為大家詳細(xì)介紹了C語言中文件相關(guān)函數(shù)的使用,可以實(shí)現(xiàn)文件的讀寫、打開和關(guān)閉。文中通過示例進(jìn)行了詳細(xì)介紹,需要的可以參考一下
    2022-07-07
  • C++?opencv圖像處理實(shí)現(xiàn)灰度變換示例

    C++?opencv圖像處理實(shí)現(xiàn)灰度變換示例

    這篇文章主要為大家介紹了C++?opencv圖像處理灰度變換的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • C++ 命名空間--namespace總結(jié)

    C++ 命名空間--namespace總結(jié)

    namespace中文意思是命名空間或者叫名字空間,下面這篇文章主要給大家介紹了關(guān)于C++中名稱空間namespace使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起看看吧
    2021-09-09
  • C++ AVLTree高度平衡的二叉搜索樹深入分析

    C++ AVLTree高度平衡的二叉搜索樹深入分析

    這篇文章主要介紹了C++ AVLTree高度平衡的二叉搜索樹,二叉搜索樹雖可以縮短查找的效率,但如果數(shù)據(jù)有序或接近有序二叉搜索樹將退化為單支樹,查找元素相當(dāng)于在順序表中搜索元素,效率低下
    2023-03-03
  • C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)

    C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞)

    不論是哪種參數(shù)傳遞方式,都有形參和實(shí)參之分,本文主要介紹了C++函數(shù)三種傳參形式(指針傳遞、引用傳遞、值傳遞),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C語言中static的使用介紹

    C語言中static的使用介紹

    大家好,本篇文章主要講的是C語言中static的使用介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言 二叉查找樹性質(zhì)詳解及實(shí)例代碼

    C語言 二叉查找樹性質(zhì)詳解及實(shí)例代碼

    這篇文章主要介紹了C語言 二叉查找樹性質(zhì)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C++使用循環(huán)計(jì)算標(biāo)準(zhǔn)差的代碼實(shí)現(xiàn)

    C++使用循環(huán)計(jì)算標(biāo)準(zhǔn)差的代碼實(shí)現(xiàn)

    在C++中,計(jì)算標(biāo)準(zhǔn)差可以使用循環(huán)來實(shí)現(xiàn),本文給大家介紹了一個示例代碼,演示了如何使用循環(huán)計(jì)算標(biāo)準(zhǔn)差,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2023-12-12

最新評論