




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易的三子棋小游戲本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.基本流程
1.菜單界面選擇開始或者退出游戲。
2.創(chuàng)建棋盤并初始化。
3.打印棋盤。
4.玩家落子并打印棋盤
5.電腦落子并打印棋盤
6.判定勝負(fù)關(guān)系(輸,贏,平局)
2.配置運(yùn)行環(huán)境
本次游戲用到三個(gè)文件,兩個(gè)源文件test.c,game.c,一個(gè)頭game.h。其中,game.c,game.h可以稱作一個(gè)游戲模塊,為什么要這樣做呢?因?yàn)槎鄠€(gè)文件可以分別處理各自模塊的功能,能更好處理各個(gè)模塊之間的邏輯并且便于后期調(diào)試,也使得代碼的可讀性提高。
3.代碼過(guò)程
3.1菜單界面選擇開始或者退出游戲
intmain()
test();
return0;
}
打印菜單
voidmenu()
printf("******************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("******************\n");
}
選擇數(shù)字,1代表玩游戲,0代表退出游戲
voidtest()
intinput=0;
do
{
menu();
printf("請(qǐng)選擇:
scanf("%d",input);
switch(input)
{
case1:
printf("玩游戲\n");//游戲
break;
case0:
printf("退出游戲\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
}while(input);
}
3.2.創(chuàng)建棋盤并初始化。
用一個(gè)二維數(shù)組創(chuàng)建一個(gè)3*3的棋盤。
使用宏定義的原因:
1.推高代碼可讀性,后續(xù)代碼中遇到3,方便理解含義。
2.提高擴(kuò)展性,如果將來(lái)要修改棋盤尺寸,代碼修改會(huì)很方便。
charboard[ROW][COL]={0};
#defineROW3
#defineCOL3
在game.c中初始化棋盤
voidInitBoard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
board[i][j]='';
}
}
}
3.3打印棋盤。
在game.c中實(shí)現(xiàn)打印棋盤
voidDisplayboard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
//打印數(shù)據(jù)
intj=0;
for(j=0;jcol;j++)
{
printf("%c",board[i][j]);
if(jcol-1)
printf("|");
}
printf("\n");
//打印分割的行
if(irow-1)
{
for(j=0;jcol;j++)
{
printf("---");
if(jcol-1)
{
printf("|");
}
}
printf("\n");
}
}
}
棋盤的搭建的本質(zhì)是留出一片空間,玩家或者電腦在棋盤上進(jìn)行操作。每一行和每一列都要設(shè)置分割線進(jìn)行區(qū)分,才能完成打印。
4.玩家落子并打印棋盤
在game.c中實(shí)現(xiàn)對(duì)棋盤上空位的判斷,防止一個(gè)位置多次下棋,并且顯示出空位給玩家下棋,之后打印出新的棋盤。
voidplayer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("玩家下棋\n");
while(1)
{
printf("請(qǐng)輸入坐標(biāo):
scanf("%d%d",x,
//下棋
if(x=1x=rowy=1y=col)
{
if(board[x-1][y-1]=='')
{
board[x-1][y-1]='*';
break;
}
else
printf("該坐標(biāo)已被占用,請(qǐng)重新輸入\n");
}
else
{
printf("數(shù)字輸入非法,請(qǐng)重新輸入\n");
}
}
}
5.電腦落子并打印棋盤
玩家選擇一個(gè)位置打印后,電腦通過(guò)rand()函數(shù)產(chǎn)生一個(gè)在限定范圍內(nèi)的的隨機(jī)值,并產(chǎn)生一個(gè)隨機(jī)坐標(biāo)并在相應(yīng)坐標(biāo)打印一個(gè)字符(電腦下棋過(guò)程),滯后打印新的棋盤。注意:rand函數(shù)使用之前要調(diào)用一個(gè)srand函數(shù)。
同樣也是在game.c文件中實(shí)現(xiàn)。
voidcomputer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("電腦下棋\n");
while(1)
{
x=rand()%row;
//0~2
y=rand()%col;
//0~2
if(board[x][y]=='')
{
board[x][y]='#';
break;
}
}
}
6.判定勝負(fù)關(guān)系(輸,贏,平局)
在玩家與電腦多次落子之后,產(chǎn)生最終的結(jié)果,這時(shí)候?qū)Y(jié)果進(jìn)行分析,相同的3個(gè)字符相連(行列對(duì)角線)即為勝利,如果棋盤已滿但雙方都沒(méi)有完成三個(gè)字符相連即為平局。
創(chuàng)建一個(gè)is_win函數(shù)用它的返回值來(lái)表示游戲結(jié)果
玩家贏:*
電腦贏:#
平局:E
繼續(xù):C
charis_win(charboard[ROW][COL],introw,intcol)
//判斷行
inti=0;
for(i=0;irow;i++)
{
if(board[i][0]==board[i][1]board[i][1]==board[i][2]board[i][1]!='')
returnboard[i][1];
}
//判斷列
for(i=0;icol;i++)
{
if(board[0][i]==board[1][i]board[1][i]==board[2][i]board[1][i]!='')
returnboard[1][i];
}
//判斷對(duì)角線
if(board[0][0]==board[1][1]board[1][1]==board[2][2]board[1][1]!='')
returnboard[1][1];
if(board[0][2]==board[1][1]board[1][1]==board[2][0]board[1][1]!='')
returnboard[1][1];
//判斷平局
if(is_full(board,row,col)==1)
return'E';
//繼續(xù)
return'C';
}
每一次玩家與電腦落子后都要進(jìn)行判斷
//判斷輸贏的代碼
char
ret=0;
ret=is_win(board,ROW,COL);
if(ret!='C')
break;
}
在下棋的過(guò)程中,還要時(shí)時(shí)刻刻判斷棋盤有沒(méi)有滿。
intis_full(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
if(board[i][j]=='')
return0;//沒(méi)滿
}
}
return1;//(滿了)
}
7.整體代碼展示
7.1test.c
#includestdio.h
#include"game.h"
voidmenu()
printf("******************\n");
printf("*****1.play*****\n");
printf("*****0.exit*****\n");
printf("******************\n");
voidgame()
char
ret=0;
charboard[ROW][COL]={0};
//初始化棋盤為全空格
InitBoard(board,ROW,COL);
//打印棋盤
Displayboard(board,ROW,COL);
while(1)
{
//玩家下棋
player_move(board,ROW,COL);
Displayboard(board,ROW,COL);
//判斷輸贏
ret=is_win(board,ROW,COL);
if(ret!='C')
{
break;
}
//電腦下棋
隨機(jī)下棋
computer_move(board,ROW,COL);
Displayboard(board,ROW,COL);
ret=is_win(board,ROW,COL);
if(ret!='C')
{
break;
}
}
if(ret=='*')
{
printf("玩家贏了\n");
}
elseif(ret=='#')
{
printf("電腦贏了\n");
}
else
printf("平局\n");
//什么情況,游戲就結(jié)束了
//玩家贏-'*'
//電腦贏-'#'
//平局
-'E'
//繼續(xù)
-'C'
voidtest()
srand((unsignedint)time(NULL));
intinput=0;
do
{
menu();
printf("請(qǐng)選擇:
scanf("%d",input);
switch(input)
{
case1:
game();//游戲
break;
case0:
printf("退出游戲\n");
break;
default:
printf("選擇錯(cuò)誤\n");
break;
}
}while(input);
intmain()
test();
return0;
}
7.2game.c
//初始化棋盤
voidInitBoard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
board[i][j]='';
}
}
//打印棋盤
voidDisplayboard(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
//打印數(shù)據(jù)
intj=0;
for(j=0;jcol;j++)
{
printf("%c",board[i][j]);
if(jcol-1)
printf("|");
}
printf("\n");
//打印分割的行
if(irow-1)
{
for(j=0;jcol;j++)
{
printf("---");
if(jcol-1)
{
printf("|");
}
}
printf("\n");
}
}
//玩家下棋
voidplayer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("玩家下棋\n");
while(1)
{
printf("請(qǐng)輸入坐標(biāo):
scanf("%d%d",x,
//下棋
if(x=1x=rowy=1y=col)
{
if(board[x-1][y-1]=='')
{
board[x-1][y-1]='*';
break;
}
else
printf("該坐標(biāo)已被占用,請(qǐng)重新輸入\n");
}
else
{
printf("數(shù)字輸入非法,請(qǐng)重新輸入\n");
}
}
//電腦下棋
voidcomputer_move(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
printf("電腦下棋\n");
while(1)
{
x=rand()%row;
//0~2
y=rand()%col;
//0~2
if(board[x][y]=='')
{
board[x][y]='#';
break;
}
}
//判斷棋盤有沒(méi)有滿
intis_full(charboard[ROW][COL],introw,intcol)
inti=0;
for(i=0;irow;i++)
{
intj=0;
for(j=0;jcol;j++)
{
if(board[i][j]=='')
return0;//沒(méi)滿
}
}
return1;//(滿了)
//判斷輸贏
charis_win(charboard[ROW][COL],introw,intcol)
//判斷行
inti=0;
for(i=0;irow;i++)
{
if(board[i][0]==board[i][1]board[i][1]==board[i][2]board[i][1]!='')
returnboard[i][1];
}
//判斷列
for(i=0;icol;i++)
{
if(board[0][i]==board[1][i]board[
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 美發(fā)裝修合同協(xié)議書
- 解析紡織品評(píng)估中的數(shù)據(jù)處理試題及答案
- 協(xié)議書與合同書的區(qū)別
- 飯館工作人員合同協(xié)議書
- 共同合同協(xié)議書
- 甲方強(qiáng)行解除合同協(xié)議書
- 勞動(dòng)合同和培訓(xùn)協(xié)議書
- 租房房屋合同協(xié)議書
- 轉(zhuǎn)租公寓合同協(xié)議書
- 分房合同協(xié)議書
- 炊事人員考試題及答案
- 《埃菲爾鐵塔》課件
- 紅細(xì)胞生成素靶向治療策略-全面剖析
- 人教版美術(shù)一年級(jí)下冊(cè)《走進(jìn)舊時(shí)光》課件
- 人工智能設(shè)計(jì)倫理(浙江大學(xué))知到智慧樹章節(jié)答案
- 2024年河北高中學(xué)業(yè)水平合格性考試地理試題真題(含答案)
- 黑布林英語(yǔ)閱讀初一年級(jí)16《柳林風(fēng)聲》譯文和答案
- 國(guó)家開放大學(xué)《管理英語(yǔ)3》章節(jié)測(cè)試參考答案
- 《小兒推拿穴位》課件.ppt
- 太倉(cāng)德資企業(yè)
- 折板絮凝池計(jì)算
評(píng)論
0/150
提交評(píng)論