




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第使用C語言實現(xiàn)五子棋游戲目錄一、實現(xiàn)的目的和意義二、實現(xiàn)內(nèi)容描述三、實現(xiàn)原理四、實現(xiàn)模塊五子棋實現(xiàn)分為三大模塊五、模塊代碼分析六、實現(xiàn)結(jié)果七、總結(jié)本文實例為大家分享了C語言實現(xiàn)五子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
一、實現(xiàn)的目的和意義
1、鞏固和加深對c語言知識的理解
2、學(xué)會使用編譯器的各種調(diào)試
3、提高解決實際問題的能力
二、實現(xiàn)內(nèi)容描述
實現(xiàn)簡單的人人對戰(zhàn)五子棋,此設(shè)計用的是C語言去實現(xiàn)
三、實現(xiàn)原理
采用二位數(shù)組保存棋盤信息,棋盤上面的任何一個位置,里頭可以放三個信息:
1、空
2、用戶1的落子
3、用戶2的落子
下棋就是在二維數(shù)組種找對應(yīng)的空位置,進(jìn)行落子,落完之后立即就要判斷落子位置是否有五字連珠,從而判斷誰數(shù)輸誰贏。每走一次棋會有四種情況:
*用戶1贏
*用戶2贏
*平局(這里說的平局是棋盤被占滿的情況)
*沒有出結(jié)果意思就是時此用戶沒贏下個用繼續(xù)去下棋
四、實現(xiàn)模塊五子棋實現(xiàn)分為三大模塊
文件名作用
five_chress.h五子棋的函數(shù)聲明,頭文件聲明等
five_chress.c五子棋函數(shù)接口的實現(xiàn)
main.c五子棋函數(shù)測試功能
五、模塊代碼分析
1、five_chress.h
#pragmaonce
#includestdio.h
#includestring.h
#includeWindows.h
#defineROW10//數(shù)組號行號按需求調(diào)整
#defineCOL10//數(shù)組列數(shù)按需求調(diào)整
#definePLAYER11//玩家編號,默認(rèn)棋盤數(shù)據(jù)是0,玩家1落子,該位置被改成1
#definePLAYER22//玩家編號,默認(rèn)棋盤數(shù)據(jù)是0,玩家2落子,該位置被改成2
#defineNEXT
0//游戲繼續(xù)
#definePLAYER1_WIN1//玩家1贏
#definePLAYER2_WIN2//玩家2贏
#defineDRAW
3//平局
enumDir{
LEFT,
RIGHT,
UP,
DOWN,
LEFT_UP,
LEFT_DOWN,
RIGHT_UP,
RIGHT_DOWN
};//用枚舉去表示4個方向,上下,左右,左上右下,右上左下,統(tǒng)計用戶當(dāng)前棋子四個方向的棋數(shù)是否為大于等于5
voidMenu();//實現(xiàn)菜單
voidGame();//構(gòu)建游戲入口Game()函數(shù)
2、five_chress.c
#include"five_chress.h"
intx=0;
inty=0;
voidMenu()
printf("############################\n");
printf("##1.Play
0.Exit##\n");
printf("############################\n");
printf("PleaseSelect#");
//按照x,y作為起點(diǎn),按照特定的方向,求連續(xù)相對的最大格式
intChessCount(intboard[][COL],introw,intcol,enumDird)
int_x=x-1;//從1
int_y=y-1;//從1
intcount=0;
while(1){
switch(d){
caseLEFT://從當(dāng)前位置向左移動統(tǒng)計橫坐標(biāo)不變縱坐標(biāo)變了所以是y--
_y--;
break;
caseRIGHT://從當(dāng)前位置向右移動統(tǒng)計橫坐標(biāo)不變縱坐標(biāo)變了所以是_y++
_y++;
break;
caseUP://從當(dāng)前位置向上移動統(tǒng)計縱坐標(biāo)不變橫坐標(biāo)變了所以是_x--
_x--;
break;
caseDOWN://從當(dāng)前位置向下移動統(tǒng)計縱坐標(biāo)不變橫坐標(biāo)變了所以是_x++
_x++;
break;
caseLEFT_UP://從當(dāng)前位置向左上移動統(tǒng)計縱,橫變都變了所以是_x--,_y--
_x--,_y--;
break;
caseLEFT_DOWN://從當(dāng)前位置左下移動統(tǒng)計縱,橫坐標(biāo)都變了所以是_x++,_y--
_x++,_y--;
break;
caseRIGHT_UP://從當(dāng)前位置右上移動統(tǒng)計縱,橫坐標(biāo)都變了所以是_x--,_y++-
_x--,_y++;
break;
caseRIGHT_DOWN://從當(dāng)前位置右下移動統(tǒng)計縱,橫坐標(biāo)都變了所以是_x++,_y++
_x++,_y++;
break;
default:
//DoNothing
break;
}
if(_x0||_xrow-1||_y0||_ycol-1){
break;/表示越界了就停止
}
//合法
if(board[x-1][y-1]==board[_x][_y]){
count++;//統(tǒng)計從舊位置出發(fā)統(tǒng)計和他一樣的個數(shù)
}
else{
break;//如果碰到不一樣的就終止循環(huán)
}
}
returncount;//返回統(tǒng)計個數(shù)
//4種情況
//NEXT:表明要繼續(xù)
//PLAYER1_WIN:用戶1贏了
//PLAYER2_WIN:用戶2贏了
//DRAW:平局
intIsOver(intboard[][COL],introw,intcol)
intcount1=ChessCount(board,row,col,LEFT)+ChessCount(board,row,col,RIGHT)+1;//
intcount2=ChessCount(board,row,col,UP)+ChessCount(board,row,col,DOWN)+1;//
intcount3=ChessCount(board,row,col,LEFT_UP)+ChessCount(board,row,col,RIGHT_DOWN)+1;//
intcount4=ChessCount(board,row,col,LEFT_DOWN)+ChessCount(board,row,col,RIGHT_UP)+1;//
if(count1=5||count2=5||count3=5||count4=5){
//有五子連珠
//一定有人贏
//x,y
if(board[x-1][y-1]==PLAYER1){
returnPLAYER1_WIN;
}
else{
returnPLAYER2_WIN;
}
}
inti=0;
for(;irow;i++){
intj=0;
for(;jcol;j++){
if(board[i][j]==0){
returnNEXT;//當(dāng)前位置還沒有被填寫棋盤不滿當(dāng)前用戶沒有贏返回next
讓下個用戶繼續(xù)下
}
}
}
returnDRAW;//最后一種情況棋盤滿了為平局
voidShowBoard(intboard[][COL],introw,intcol)
//printf("\e[1;1H\e[2J");這是linux環(huán)境下用的清屏
//講數(shù)組內(nèi)容,進(jìn)行可視化
system("cls");//vs環(huán)境下用的清屏
inti=0;
for(i=1;i=col;i++){
printf("%3d",i);
}
printf("\n");
for(i=0;irow;i++){
intj=0;
printf("%2d",i+1);
for(;jcol;j++){
if(board[i][j]==0){
printf(".");
}
elseif(board[i][j]==PLAYER1){
printf("x");
}
else{
printf("y");
}
}
printf("\n");
}
voidPlayerMove(intboard[][COL],introw,intcol,intwho)
while(1){
printf("Player[%d]PleaseEnterYourPos#",who);
scanf("%d%d",x,
if(x1||xrow||y1||ycol){
printf("PosIsNotRight!\n");
continue;
}
elseif(board[x-1][y-1]!=0){
printf("PosIsOccupied!\n");
continue;
}
else{
//合法性,去重
board[x-1][y-1]=who;
break;
}
}
voidGame()
intboard[ROW][COL];
memset(board,0,sizeof(board));
intresult=NEXT;
do{
ShowBoard(board,ROW,COL);//顯示棋盤
PlayerMove(board,ROW,COL,PLAYER1);//Player1先走
result=IsOver(board,ROW,COL);//判斷游戲是否結(jié)束
if(NEXT!=result){
break;//如果返回值不等于NEXT就跳出循環(huán)說明當(dāng)前用戶贏了或者平局如果=NEXT下個用戶繼續(xù)下
}
ShowBoard(board,ROW,COL);//同上
PlayerMove(board,ROW,COL,PLAYER2);
result=IsOver(board,ROW,COL);
if(NEXT!=result){
break;
}
}while(1);
//p1win,p2win,draw
switch(result){
casePLAYER1_WIN:
ShowBoard(board,ROW,COL);
printf("恭喜用戶1,你已經(jīng)贏了!\n");
break;
casePLAYER2_WIN:
printf("恭喜用戶2,你已經(jīng)贏了!\n");
break;
caseDRAW:
printf("平局\n");
break;
default:
//donothing!
break;
}
}
分析:
我們要先構(gòu)建游戲入口voidgame()函數(shù)在里面構(gòu)建上層本調(diào)用框架例如一開始初始化數(shù)組把每個位置都置為0,然后構(gòu)建調(diào)用框架:
1、我們要保存二位數(shù)組并可視化就要構(gòu)建ShowBoard函數(shù);
2、之后我們要讓用戶下棋就要構(gòu)建PlayerMove()函數(shù)
3、第一個用戶下完之后就要立馬判斷當(dāng)前用戶是否贏,因為落子和判定是強(qiáng)相關(guān)的這時候要構(gòu)建IsOver()函數(shù)
如果此用戶沒贏那二個用戶繼續(xù)下。
當(dāng)我們這些函數(shù)邏輯都明確好的時候就用分而治之思想,實現(xiàn)他們的功能。
*1、ShowBoard()函數(shù)里面我用到了一個c語言里面的清屏函數(shù)printf(cls);引上頭文件window.h,這個的作用是在固定地方刷新視圖,把上次的視圖清理掉,顯示當(dāng)前位置視圖。
后面就打印視圖的內(nèi)容。用戶一和用戶二可以用字符表示,也可以用圓圈圖案表示這個圖案可以在網(wǎng)上找復(fù)制一下就可
*2、Playermove()函數(shù)讓用戶下棋,里面先考慮它的合法性,不能越界和重復(fù),再然后用我們在five_chrsss.h文件定義宏來賦值,賦完之后再終止循環(huán)。
*3、Isover()函數(shù)里面是讓我們判斷誰輸誰贏換句話游戲是否結(jié)束。游戲結(jié)束標(biāo)志是分為四種情況。用戶一贏,用戶二贏,平局,繼續(xù)。前兩種情況則需要判斷從當(dāng)前位置出發(fā)沿四個方向當(dāng)前用戶棋的個數(shù)是否為大于等于5,在判斷一下是哪個用戶的棋就返回哪個用戶。而這判斷需要在構(gòu)建并調(diào)用ChressCount()函數(shù)去統(tǒng)計當(dāng)前用戶的個數(shù)是否大于等于5,有4個方向,例如上和下為一個方向,左和右為一個方向,左上和右下為一個方向,右上和左下為一個方向,分別各自相加之后在加上1就是當(dāng)前的棋,如果滿足這個4個方向大于等于5的一個條件,我們就能知道一定有人贏,否則在繼續(xù)判斷周圍是否有空位置,有則返回NEXT讓下個用戶繼續(xù)下,沒有則返回平局*ChressCoun()函數(shù)具體分析請看代碼塊
這些函數(shù)實現(xiàn)完之后再在Game()函數(shù)里面來個Switc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 孕婦協(xié)商自愿離婚協(xié)議書3篇
- 景觀設(shè)計入門基礎(chǔ)框架
- 膽漏疾病查房要點(diǎn)解析
- 2025西安信息職業(yè)大學(xué)輔導(dǎo)員考試試題及答案
- 2025遼寧特殊教育師范高等??茖W(xué)校輔導(dǎo)員考試試題及答案
- 2025贛南醫(yī)學(xué)院輔導(dǎo)員考試試題及答案
- 2025眉山藥科職業(yè)學(xué)院輔導(dǎo)員考試試題及答案
- 2025福州墨爾本理工職業(yè)學(xué)院輔導(dǎo)員考試試題及答案
- 急性胸痛的急救
- 金融產(chǎn)品課程設(shè)計
- BB/T 0034-2017鋁防盜瓶蓋
- 國家義務(wù)教育質(zhì)量監(jiān)測科學(xué)模擬測試題附答案
- 管道焊接寸徑工作量計算
- 12-1限度樣品管理辦法
- UI界面設(shè)計交互設(shè)計教學(xué)
- 鋼箱梁計算分析與案例詳解
- 絞肉機(jī)的設(shè)計本科生畢業(yè)論文
- 山東省某房地產(chǎn)開發(fā)項目建設(shè)節(jié)能評估報告
- 超聲引導(dǎo)豎脊肌平面阻滯
- 北京市專業(yè)技術(shù)類職業(yè)資格培訓(xùn)服務(wù)合同
- 新版VDA6.3過程審核實例(含評分矩陣)
評論
0/150
提交評論