版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第C語言版三子棋游戲?qū)崿F(xiàn)代碼本文實(shí)例為大家分享了C語言版三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)一個(gè)三子棋小游戲
下面是實(shí)現(xiàn)步驟:
總共有需要三個(gè)文件
第一,test.c
我們要在這個(gè)文件里面實(shí)現(xiàn)游戲的主體流程
第二,game.c
在這個(gè)文件里我們可以實(shí)現(xiàn)各個(gè)游戲函數(shù)的分裝
第三,game.h
在這個(gè)文件里我們實(shí)現(xiàn)的是各個(gè)函數(shù)的聲明
test.c
1、首先要有一個(gè)菜單
讓玩家可以做出選擇
2、接著對(duì)玩家做出的不同選擇進(jìn)行實(shí)現(xiàn)
選1就是開始游戲,所以我們進(jìn)入到game函數(shù)里就好了
選0就是退出游戲,
其他選擇的話就是選擇錯(cuò)誤,重新選擇
這個(gè)我們可以用switch語句來實(shí)現(xiàn)
這里我們要先用的是do,while循環(huán),條件里放入我們要輸入的數(shù)
這樣的話如果輸入的數(shù)為0,即為假,正好會(huì)跳出循環(huán),后面接上return0的話程序就結(jié)束了
所以我們先把以上所描述的功能寫出來
#includestdio.h
#include"game.h"
voidmenu()
printf("***********\n");
printf("***1play***\n");
printf("***0exit***\n");
printf("***********\n");
intmain()
menu();
intinput=0;
printf("請(qǐng)選擇\n");
scanf("%d",input);
switch(input)
case1:
game();
break;
case0:
printf("退出游戲\n");
break;
default:
printf("選擇錯(cuò)誤,請(qǐng)重新選擇\n");
}while(input);
return0;
}
3、實(shí)現(xiàn)游戲函數(shù)的各個(gè)功能
我們要做的是三子棋,應(yīng)該先有一個(gè)棋盤
所以我們就可以用二維數(shù)組來創(chuàng)建這樣一個(gè)3*3的棋盤
鑒于以后可能會(huì)想要不同行和列的棋盤
所以我們可以定義宏來表示數(shù)組的行和列,以后想要修改行數(shù)和列數(shù)也很方便
創(chuàng)建棋盤之后,我們要將棋盤里的元素進(jìn)行初始化
接著還要打印出來呈現(xiàn)給玩家
然后就是下棋的過程,因?yàn)槲覀兊貌粩嘞碌揭环节A或者棋盤滿
所以我們可以用while循環(huán)來實(shí)現(xiàn)
接著就是
玩家下棋,展示棋盤,判斷輸贏
電腦下棋,展示棋盤,判斷輸贏
......
我們可以把以上功能表達(dá)出來
voidgame()
charboard[ROW][COL];//宏的定義放在game.h里面
charret=0;//我們用ret這個(gè)變量去接收判斷輸贏的函數(shù)所返回的值
IntBoard(board,ROW,COL);//這些具體的函數(shù)都會(huì)分裝到game.c上面
DisplayBoard(board,ROW,COL);
//創(chuàng)建和展示棋盤之后,就是不斷下棋,展示,判斷的過程了
while(1)
PlayerMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret!='C')//也就是指要么一方贏,要么棋盤滿,就應(yīng)該跳出循環(huán),不再繼續(xù)下棋了
break;
//這兩步的區(qū)別就只是第一行而已
ComputerMove(board,ROW,COL);
DisplayBoard(board,ROW,COL);
ret=IsWin(board,ROW,COL);
if(ret!='C')
break;
if(ret=='*')
printf("玩家贏\n");
elseif(ret=='#')
printf("電腦贏\n");
else
printf("平局\n");
}
game函數(shù)放在menu函數(shù)后面就好了
game.c
所以我們所需要分裝到game.c里的函數(shù)有:
初始化棋盤,打印棋盤,玩家下棋,電腦下棋,判斷輸贏
那么接下來我們就在game.c里實(shí)現(xiàn)上述函數(shù)的功能
初識(shí)化棋盤
我們利用for循環(huán)把里面的元素都初始化為空格
#include"game.h"
voidIntBoard(charboard[ROW][COL],introw,intcol)
inti=0;
intj=0;
for(i=0;irow;i++)
for(j=0;jcol;j++)
board[i][j]='';
}
打印棋盤
這里要特別注意分割行的問題
voidDisplayBoard(charboard[ROW][COL],introw,intcol)
inti=0;
intj=0;
for(i=0;irow;i++)
for(j=0;jcol;j++)
printf("%c",board[i][j]);
if(jcol-1)
printf("|");//每一列的每一個(gè)元素中間打印|
printf("\n");//每列打印完打印分割行
if(irow-1)
for(j=0;jcol;j++)
printf("---");
if(jcol-1)
printf("|");
printf("\n");//棋盤全都打印好之后打印分割行
}
玩家下棋
這里的實(shí)現(xiàn)思路是:
1、判斷輸入的位置有無越界
2、有則提示,沒有則判斷有無棋子
3、有則提示,沒有則將該位置放入元素*
(因?yàn)橥婕铱赡芤B續(xù)輸入幾次,所以我們要用到while循環(huán))
voidPlayerMove(charboard[ROW][COL],introw,intcol)
intx;
inty;
//玩家要輸入的行和列
while(1)
printf("請(qǐng)輸入坐標(biāo)\n");
scanf("%d%d",x,
if(x=1x=rowy=1y=col)//判斷有無越界
if(board[x-1][y-1]=='')//判斷有無棋子
board[x-1][y-1]='*';
break;//輸入成功之后跳出循環(huán)
else
printf("坐標(biāo)被占用,請(qǐng)重新輸入\n");
else
printf("坐標(biāo)非法,請(qǐng)重新輸入\n");
}
電腦下棋
這里的實(shí)現(xiàn)思路是:
1、生成隨機(jī)數(shù)(這個(gè)數(shù)值不能越界)
2、將該位置放入元素#,這里不需要判斷,因?yàn)楸旧砭筒恍枰斎?/p>
voidComputerMove(charboard[ROW][COL],introw,intcol)
intx=0;
inty=0;
srand((unsignedint)time(NULL));
printf("電腦走\(yùn)n");
while(1)
x=rand()%row;//生成隨機(jī)數(shù),這里就需要用到時(shí)間戳了,我們還要做test.c里面包含一個(gè)time.h
y=rand()%col;
if(board[x][y]=='')
board[x][y]='#';
break;
}
判斷輸贏
這里還要分為棋盤是否滿子和一方贏
是否滿子
實(shí)現(xiàn)思路:
這個(gè)比較簡單,我們只要依次查看棋盤,若有一個(gè)元素為空格,即為滿
然后注意一下返回值就好了
intIsFull(charboard[ROW][COL],introw,intcol)
inti=0;
intj=0;
for(i=0;irow;i++)
for(j=0;jcol;j++)
if(board[i][j]=='')
return0;
return1;
}
哪一方贏
實(shí)現(xiàn)思路:
根據(jù)規(guī)則,我們要判斷是否有三個(gè)相同的棋子連成直線
所以,每一行,每一列判斷一次,然后對(duì)角線再判斷兩次就好了
使用for循環(huán)和if語句來實(shí)現(xiàn)
charIsWin(charboard[ROW][COL],introw,intcol)
inti=0;
intj=0;
for(i=0;irow;i++)//先判斷行
if(board[i][0]==board[i][1]board[i][1]==board[i][2]board[i][0]!='')
returnboard[i][0];
for(j=0;jcol;j++)//再判斷列
if(board[0][i]==board[1][i]board[1][i]==board[2][i]board!='')
returnboard[0][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];
//然后我們?cè)龠@里直接調(diào)用IsFull函數(shù),就不用在game函數(shù)里調(diào)用了,而且返回值都能統(tǒng)一管理
if(IsFull(board,ro
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 學(xué)校課題活動(dòng)策劃方案(3篇)
- 2026烏魯木齊市第三十六中學(xué)誠聘初高中教師(18人)參考考試題庫及答案解析
- 2026浙江臺(tái)州市緊急救援中心招聘編制外人員1人參考考試題庫及答案解析
- 2026年甘肅省慶陽市西峰環(huán)宇中學(xué)春季招聘教師備考考試題庫及答案解析
- 2026泰安岱岳區(qū)事業(yè)單位初級(jí)綜合類崗位招聘工作人員(99人)考試備考試題及答案解析
- 2026廣東中山市東鳳鎮(zhèn)佛奧幼兒園教職工招聘2人筆試模擬試題及答案解析
- 2026中鐵建昆侖高速公路運(yùn)營管理有限公司德遂高速公路路巡隊(duì)員招聘1人(重慶)參考考試題庫及答案解析
- 2026上半年玉溪師范學(xué)院招聘6人參考考試題庫及答案解析
- 第四單元7靜夜思
- 三臺(tái)公安公開招聘60名警務(wù)輔助人員備考考試試題及答案解析
- 四川省南充市2024-2025學(xué)年高一上學(xué)期期末質(zhì)量檢測英語試題(含答案無聽力原文及音頻)
- 專題08解題技巧專題:圓中輔助線的作法壓軸題三種模型全攻略(原卷版+解析)
- 2024年全國職業(yè)院校技能大賽(節(jié)水系統(tǒng)安裝與維護(hù)賽項(xiàng))考試題庫(含答案)
- 24秋人教版英語七上單詞表(Vocabulary in Each Unit)總表
- ISO 15609-1 2019 金屬材料焊接工藝規(guī)程和評(píng)定-焊接工藝規(guī)程-電弧焊(中文版)
- 肥胖患者麻醉管理
- 小鯉魚跳龍門電子版
- 2019年急性腦梗死出血轉(zhuǎn)化專家共識(shí)解讀
- 《混凝土結(jié)構(gòu)工程施工規(guī)范》
- 土地證延期申請(qǐng)書
- 硫乙醇酸鹽流體培養(yǎng)基適用性檢查記錄
評(píng)論
0/150
提交評(píng)論