版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C語言數(shù)組應(yīng)用實(shí)現(xiàn)三子棋游戲三子棋游戲的基本構(gòu)架是數(shù)組的應(yīng)用,但是要實(shí)現(xiàn)游戲還得結(jié)合具有相關(guān)功能的函數(shù),接下來就介紹三子棋游戲的基本框架及相關(guān)函數(shù):
下面先介紹一下寫三子棋代碼的過程和思路:
1、游戲開始要先顯示游戲界面(菜單函數(shù))。
2、要有一個(gè)棋盤給玩家下棋,所以需要一個(gè)二維數(shù)組,最開始顯示給玩家的棋盤應(yīng)該是空棋盤,所以初始化數(shù)組為空格(棋盤初始化函數(shù)),全為空格的數(shù)組打印出來是沒有顯示的,所以我們要畫一個(gè)棋盤框并把它打印出來(打印棋盤函數(shù))。
3、開始游戲后,玩家下棋(玩家下棋函數(shù)),數(shù)組更改并打印,電腦下棋(電腦下棋函數(shù)),數(shù)組更改并打印。
4、游戲是一個(gè)循環(huán)的過程,所以輸贏(判斷輸贏函數(shù))及平局(判斷平局函數(shù))的判斷也是一個(gè)循環(huán)的過程,因此判斷輸贏及平局應(yīng)該在下每一顆棋子后就進(jìn)行判斷。
來看一下游戲效果:
程序運(yùn)行,顯示游戲菜單,選擇1開始游戲。
玩家落子為x,電腦落子為0。
這里的棋盤行和列用宏定義可以方便更改:
#defineROW3
#defineCOL3
頭文件game.h:
#define_CRT_SECURE_NO_WARNINGS1
#includestdio.h
#includestdlib.h
#includetime.h
#defineROW3
#defineCOL3
voidsetboard(chararr[ROW][COL],introw,intcol);
voiddisplayboard(chararr[ROW][COL],introw,intcol);
voidplayermove(chararr[ROW][COL],introw,intcol);
voidcomputermove(chararr[ROW][COL],introw,intcol);
intiswin(chararr[ROW][COL],introw,intcol);
intisfull(chararr[ROW][COL],introw,intcol);
voidmenu();
源文件main.c:
按照前面的分析及思路寫出框架,完善函數(shù)功能,構(gòu)成體系;人機(jī)對(duì)戰(zhàn)中電腦下棋是隨機(jī)的;需要注意在每次落子后都要判斷輸贏平局;
#define_CRT_SECURE_NO_WARNINGS1
//三子棋主函數(shù)
#include"game.h"
intmain()
srand((unsignedint)time(NULL));
//游戲界面
intx=0;
intret=0;
charn=0;
while(1)
menu();//菜單
scanf("%d",
printf("\n");
if(x==1)
//設(shè)置棋盤
chararr[ROW][COL]={0};
setboard(arr,ROW,COL);//棋盤初始化為空格
displayboard(arr,ROW,COL);//打印棋盤
while(1)
//玩家下棋
playermove(arr,ROW,COL);
//打印棋盤
displayboard(arr,ROW,COL);
//判斷平局
ret=isfull(arr,ROW,COL);
if(ret==1)
{
printf("平局\n");
break;
}
//判斷輸贏
n=iswin(arr,ROW,COL);
if(n=='x')
{
printf("玩家贏\n");
break;
}
elseif(n=='0')
{
printf("電腦贏\n");
break;
}
//玩家贏--x
//電腦贏--0
//平局--P
//繼續(xù)--C
//電腦下棋
computermove(arr,ROW,COL);
//打印棋盤
displayboard(arr,ROW,COL);
//判斷平局
ret=isfull(arr,ROW,COL);
if(ret==1)
{
printf("平局\n");
break;
}
//判斷輸贏
n=iswin(arr,ROW,COL);
if(n=='x')
{
printf("玩家贏\n");
break;
}
elseif(n=='0')
{
printf("電腦贏\n");
break;
}
elseif(x==0)
break;
else
printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");
system("pause");
return0;
}
源文件game.c:
主要的函數(shù)有以下幾個(gè):
(菜單函數(shù)沒什么可講的)
初始化棋盤
voidsetboard(chararr[ROW][COL],introw,intcol)
inti=0;
intj=0;
for(i=0;iROW;i++)//棋盤初始化為空格
for(j=0;jCOL;j++)
arr[i][j]='';
}
這里我加了格子的序號(hào),提高使用感,在大于3小于10的棋盤中可以更好的找到想要的坐標(biāo),為什么小于10呢,因?yàn)樵谛蛱?hào)由一位數(shù)變?yōu)閮晌粩?shù)時(shí),打印出來的棋盤不規(guī)整了,當(dāng)然這個(gè)地方還可以優(yōu)化,目前就只支持行列小于10的棋盤。
voiddisplayboard(chararr[ROW][COL],introw,intcol)
inti=0;
intj=0;
for(i=1;i=col;i++)
printf("
%d
",i);
if(iCOL)
printf("|");
printf("\n");
for(j=0;jCOL;j++)
if(j==0)
printf("----");
elseif(j0)
printf("-----");
if(jCOL-1)
printf("|");
printf("\n");
for(i=0;iROW;i++)
printf("%d",i+1);
for(j=0;jCOL;j++)
if(j==0)
printf("%c",arr[i][j]);
else
printf("
%c
",arr[i][j]);
if(jCOL-1)
printf("|");
printf("\n");
if(iROW-1)
for(j=0;jCOL;j++)
if(j==0)
{
printf("----");
}
elseif(j0)
{
printf("-----");
}
if(jCOL-1)
printf("|");
printf("\n");
}
這里要注意判斷坐標(biāo)的合法性
voidplayermove(chararr[ROW][COL],introw,intcol)
printf("\n\n玩家走:\n");
while(1)
printf("請(qǐng)輸入坐標(biāo):
intx=0;
inty=0;
scanf("%d%d",x,
if(x0x=ROWy0y=COLarr[x-1][y-1]=='')
arr[x-1][y-1]='x';
break;
elseif(xROW||yCOL)
printf("錯(cuò)誤坐標(biāo),請(qǐng)重新輸入!\n");
elseif(arr[x-1][y-1]!='')
printf("該坐標(biāo)下過棋了,請(qǐng)重新輸入!\n");
}
電腦下棋是隨機(jī)的,利用rand();及srand();產(chǎn)生0-2的隨機(jī)數(shù),注意生成隨機(jī)數(shù)需要引用time.h這個(gè)頭文件,雖然是產(chǎn)生隨機(jī)坐標(biāo)但是要確定電腦找到一個(gè)有空位的棋格才可以停下。
voidcomputermove(chararr[ROW][COL],introw,intcol)
printf("\n\n電腦走:\n");
intx=0;
inty=0;
while(1)
x=rand()%ROW;
y=rand()%COL;
if(arr[x][y]=='')
arr[x][y]='0';
break;
}
intisfull(chararr[ROW][COL],introw,intcol)
intx=0;
inty=0;
for(x=0;xrow;x++)
for(y=0;ycol;y++)
if(arr[x][y]=='')
return0;
return1;
}
只要棋盤中任意一個(gè)坐標(biāo)的行,列,斜為相同符號(hào),即為勝利,我這里在保證坐標(biāo)合法的前提下對(duì)每一個(gè)坐標(biāo)周圍8個(gè)坐標(biāo)進(jìn)行判斷,這樣可以做到在非3x3的棋盤中也可以完成三子棋游戲,當(dāng)然這段代碼只是實(shí)現(xiàn)了功能而已,寫的非常繁瑣,我也覺得非3x3里還下三子棋說不過去,之后也可以繼續(xù)擴(kuò)展到五子棋的判斷輸贏,以后再詳細(xì)整改。
int
iswin(chararr[ROW][COL],introw,intcol)
intx=0;
inty=0;
intcount=0;
for(x=0;xrow;x++)
for(y=0;ycol;y++)
if(arr[x][y]==arr[x][y-1]arr[x][y-1]==arr[x][y+1]arr[x][y]!=''arr[x][y-1]!=''arr[x][y+1]!='')
returnarr[x][y];
elseif(arr[x][y]==arr[x-1][y+1]arr[x-1][y+1]==arr[x+1][y-1]arr[x][y]!=''arr[x-1][y+1]!=''arr[x+1][y-1]!='')
returnarr[x][y];
elseif(arr[x][y]==arr[x-1][y]arr[x-1][y]==arr[x+1][y]arr[x][y]!=''arr[x-1][y]!=''arr[x+1][y]!='')
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 外勤機(jī)械工復(fù)試考核試卷含答案
- 刨插工安全培訓(xùn)效果評(píng)優(yōu)考核試卷含答案
- 玻璃制品手工成型工安全宣傳強(qiáng)化考核試卷含答案
- 海鹽采收工班組建設(shè)競賽考核試卷含答案
- 絞車操作工安全素養(yǎng)競賽考核試卷含答案
- 磚瓦生產(chǎn)工安全素養(yǎng)測試考核試卷含答案
- 海南房產(chǎn)中介培訓(xùn)課程
- 酒店員工培訓(xùn)計(jì)劃實(shí)施與跟蹤制度
- 酒店客房用品更換與補(bǔ)給制度
- 超市員工培訓(xùn)及業(yè)務(wù)知識(shí)制度
- 家居行業(yè)投資合作合同(2025修訂版)
- 2025年高三語文10月考聯(lián)考作文匯編(解析+立意+范文)
- 2025年人工智慧行業(yè)人工智能技術(shù)與智能操作系統(tǒng)研究報(bào)告
- 供應(yīng)商管理績效綜合評(píng)價(jià)表
- 破產(chǎn)業(yè)務(wù)培訓(xùn)課件
- 蓖麻醇酸鋅復(fù)合除味劑的制備及其除臭效能研究
- 王者輔助教學(xué)課件
- 警用偵查無人機(jī)偵查技術(shù)在反偷獵中的應(yīng)用分析報(bào)告
- 2025-2026秋“1530”安全教育記錄表
- 執(zhí)法中心設(shè)計(jì)方案(3篇)
- 藥物警戒基礎(chǔ)知識(shí)全員培訓(xùn)
評(píng)論
0/150
提交評(píng)論