零基礎(chǔ)也能玩轉(zhuǎn)游戲項(xiàng)目!C語(yǔ)言五子棋小游戲從零到1妒御!

前言:

很多剛接觸編程的人都不知道怎么下手編寫程序解愤,特別是學(xué)習(xí)了新的知識(shí)點(diǎn),不知道有什么用乎莉,那么本文將以簡(jiǎn)單的存儲(chǔ)結(jié)構(gòu)及簡(jiǎn)單的運(yùn)算送讲,條件語(yǔ)句,分支語(yǔ)句惋啃,循環(huán)語(yǔ)句結(jié)合哼鬓,帶來(lái)一個(gè)雙人對(duì)戰(zhàn)版五子棋,這是一個(gè)簡(jiǎn)單的模型边灭,實(shí)現(xiàn)了五子棋最最基本的功能异希。

【文章福利】:小編推薦自己的C語(yǔ)言/C++交流群:836880131!整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍绒瘦、視頻資料共享在群文件里面称簿,有需要的可以自行添加哦!~

需求分析:

通過(guò)C++語(yǔ)言來(lái)實(shí)現(xiàn)一個(gè)以windows控制臺(tái)為展示平臺(tái)的簡(jiǎn)單版五子棋程序椭坚,其中通過(guò)鍵盤輸入來(lái)控制游戲中的行為(光標(biāo)移動(dòng)予跌、落子、確認(rèn))善茎。規(guī)則要求某一方在橫豎斜方向連續(xù)存在五個(gè)或五個(gè)以上本人所執(zhí)棋子獲得為獲勝券册。

游戲流程分析:

當(dāng)我們要扒一個(gè)已存在的程序時(shí),我們可以從他的UI入手,通過(guò)我們所觀察到的,所感受到烁焙,所使用到的服務(wù)航邢,來(lái)對(duì)軟件進(jìn)行分析,從而獲得以上流程骄蝇,但我們一旦需要將需求變?yōu)榇a時(shí)膳殷,我們的設(shè)計(jì)就要考慮的更多了。

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

首先

我們需要一個(gè)棋盤九火,那么我可以使用C++里的什么來(lái)存儲(chǔ)和表示棋盤呢赚窃?通過(guò)抽象,因?yàn)槠灞P是個(gè)二維圖形岔激,我推薦使用二維數(shù)組,假設(shè)我們構(gòu)建一個(gè)19行*19列的棋盤勒极。

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

int qiPan[19][19];  //聲明一個(gè)19行19列的數(shù)組來(lái)存儲(chǔ)棋盤 
 for(int h=0;h<19;h++) //對(duì)數(shù)組進(jìn)行遍歷,所有元素進(jìn)行初始化(賦值),默認(rèn)為0值 
 {
 for(int l=0;l<19;l++)
 {
  qiPan[h][l]=0; //對(duì)當(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:  //如果棋盤存儲(chǔ)的元素為0時(shí)虑鼎,我們打印 · 樣式的字符
  cout<<"·";
  break;
 } 
 }
 cout<<endl;
}

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

那么擁有棋盤后

我們需要擁有一個(gè)光標(biāo),來(lái)對(duì)落子位置進(jìn)行定點(diǎn),那么我如何進(jìn)行表示呢炫彩。

我們可以在棋盤上找一個(gè)點(diǎn)匾七,也就是在數(shù)組對(duì)應(yīng)位置找一個(gè)元素,更改他的值江兢,我們用8來(lái)表示光標(biāo)昨忆,而找到這個(gè)元素我們需要知道其橫縱坐標(biāo)值,我們用兩個(gè)int變量表示划址。

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

打印時(shí)扔嵌,我們只要在switch 語(yǔ)句中添加一個(gè)case 選項(xiàng) 8即可:

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

獲得光標(biāo)后我們?nèi)绾我苿?dòng)他呢夺颤?那么我們可以通過(guò)接受鍵盤輸入的字符來(lái)控制光標(biāo)的移動(dòng)痢缎,本例中使用 W上,S下世澜,A左独旷,D右 來(lái)移動(dòng)光標(biāo)。


char xx=getch();  //控制臺(tái)從鍵盤獲得一個(gè)字符的函數(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;    
}

這時(shí),我們可以控制光標(biāo)的移動(dòng)了

接下來(lái)要實(shí)現(xiàn)落子操作

棋子怎么表示呢寥裂?

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

光標(biāo)的移動(dòng)會(huì)影響元素的變化封恰,那么我們?nèi)绻谄灞P中進(jìn)行落子后麻养,我們光標(biāo)再次移動(dòng)有可能會(huì)改變已記錄的落子信息,為了使光標(biāo)與棋子不沖突,我們使用兩個(gè)圖層诺舔,表示兩個(gè)相同的棋盤鳖昌。

那么我就需要再聲明一個(gè)棋盤备畦,方法和最開(kāi)始一樣:

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

棋盤2已經(jīng)建立好了许昨,那么我們?nèi)绾温渥佣危课覀円欢ㄒx擇執(zhí)棋方后,在光標(biāo)位置通過(guò)接收鍵盤輸入的j落子糕档,那么我們只需要在棋盤中switch語(yǔ)句中添加一個(gè)分支 case 'j':即可,并且我們需要使用一個(gè)變量來(lái)表示玩家莉恼,我們可以在程序一開(kāi)始定義:

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

落子成功速那,接下來(lái)我們可以把它展示出來(lái)俐银,由于此時(shí)我們要對(duì)兩個(gè)棋盤進(jìn)行統(tǒng)一的打印,那么我們使用swicth就不能進(jìn)行統(tǒng)一的分支選擇了琅坡,此時(shí)我們需要將最開(kāi)始的打印內(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<<"○";
}

游戲規(guī)則

落子之后要進(jìn)行一個(gè)判斷榆俺,如何判斷是否勝利呢?

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

int shu=1,heng=1,pie=1,na=1;//橫豎撇捺計(jì)數(shù)器啡直,累計(jì)到5則表示某方向出現(xiàn)五個(gè)相同的旗子
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)完成這一步時(shí)烁涌,我們的程序基本就搞定了,剩下就是按照一開(kāi)始的流程進(jìn)行拼接了酒觅,其中我們?cè)诖蛴∑聊恢按橹矗獙?duì)上一次打印的結(jié)果進(jìn)行擦除,使用函數(shù)system(“cls”);//擦除控制臺(tái)中所有已顯示的字符

就可以完成了舷丹。

以上就是本文的全部?jī)?nèi)容抒钱,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持小編颜凯。

另外本程序還需要一部分頭文件谋币,想要領(lǐng)取可以添加小編的C語(yǔ)言/C++交流④群:836880131,源碼在群文件里

福利來(lái)咯~

學(xué)習(xí)過(guò)程很“痛苦”症概,但是結(jié)果大家一定會(huì)對(duì)自己很滿意!

如果覺(jué)得學(xué)習(xí)資料難找的話彼城,可以添加小編的C語(yǔ)言/C++交流群:836880131逼友! 學(xué)習(xí)資料已經(jīng)共享在群里了秤涩,期待你的加入~

image

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末帜乞,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子筐眷,更是在濱河造成了極大的恐慌,老刑警劉巖匀谣,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異武翎,居然都是意外死亡烈炭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門宝恶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)符隙,“玉大人垫毙,你說(shuō)我怎么就攤上這事∽劢妫” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵膀藐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我额各,道長(zhǎng),這世上最難降的妖魔是什么臊泰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮针饥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丁眼。我一直安慰自己,他們只是感情好苞七,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蹂风,像睡著了一般。 火紅的嫁衣襯著肌膚如雪惠啄。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天融柬,我揣著相機(jī)與錄音,去河邊找鬼粒氧。 笑死节腐,一個(gè)胖子當(dāng)著我的面吹牛外盯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播铜跑,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼门怪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了锅纺?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤囤锉,失蹤者是張志新(化名)和其女友劉穎护锤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體烙懦,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年亏较,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掩缓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雪情。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巡通,死狀恐怖尘执,靈堂內(nèi)的尸體忽然破棺而出宴凉,到底是詐尸還是另有隱情,我是刑警寧澤弥锄,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站窘行,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏罐盔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一惶看、第九天 我趴在偏房一處隱蔽的房頂上張望六孵。 院中可真熱鬧,春花似錦劫窒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)孕索。三九已至逛艰,卻和暖如春搞旭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肄渗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留恳啥,地道東北人偏灿。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓钝的,卻偏偏與公主長(zhǎng)得像铆遭,于是被迫代替她去往敵國(guó)和親沿猜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子枚荣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355