C語言實現(xiàn)簡易的三子棋小游戲_第1頁
C語言實現(xiàn)簡易的三子棋小游戲_第2頁
C語言實現(xiàn)簡易的三子棋小游戲_第3頁
C語言實現(xiàn)簡易的三子棋小游戲_第4頁
C語言實現(xiàn)簡易的三子棋小游戲_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第C語言實現(xiàn)簡易的三子棋小游戲本文實例為大家分享了C語言實現(xiàn)三子棋小游戲的具體代碼,供大家參考,具體內(nèi)容如下

1.基本流程

1.菜單界面選擇開始或者退出游戲。

2.創(chuàng)建棋盤并初始化。

3.打印棋盤。

4.玩家落子并打印棋盤

5.電腦落子并打印棋盤

6.判定勝負(fù)關(guān)系(輸,贏,平局)

2.配置運(yùn)行環(huán)境

本次游戲用到三個文件,兩個源文件test.c,game.c,一個頭game.h。其中,game.c,game.h可以稱作一個游戲模塊,為什么要這樣做呢?因為多個文件可以分別處理各自模塊的功能,能更好處理各個模塊之間的邏輯并且便于后期調(diào)試,也使得代碼的可讀性提高。

3.代碼過程

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("請選擇:

scanf("%d",input);

switch(input)

{

case1:

printf("玩游戲\n");//游戲

break;

case0:

printf("退出游戲\n");

break;

default:

printf("選擇錯誤\n");

break;

}

}while(input);

}

3.2.創(chuàng)建棋盤并初始化。

用一個二維數(shù)組創(chuàng)建一個3*3的棋盤。

使用宏定義的原因:

1.推高代碼可讀性,后續(xù)代碼中遇到3,方便理解含義。

2.提高擴(kuò)展性,如果將來要修改棋盤尺寸,代碼修改會很方便。

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中實現(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中實現(xiàn)對棋盤上空位的判斷,防止一個位置多次下棋,并且顯示出空位給玩家下棋,之后打印出新的棋盤。

voidplayer_move(charboard[ROW][COL],introw,intcol)

intx=0;

inty=0;

printf("玩家下棋\n");

while(1)

{

printf("請輸入坐標(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)已被占用,請重新輸入\n");

}

else

{

printf("數(shù)字輸入非法,請重新輸入\n");

}

}

}

5.電腦落子并打印棋盤

玩家選擇一個位置打印后,電腦通過rand()函數(shù)產(chǎn)生一個在限定范圍內(nèi)的的隨機(jī)值,并產(chǎn)生一個隨機(jī)坐標(biāo)并在相應(yīng)坐標(biāo)打印一個字符(電腦下棋過程),滯后打印新的棋盤。注意:rand函數(shù)使用之前要調(diào)用一個srand函數(shù)。

同樣也是在game.c文件中實現(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é)果,這時候?qū)Y(jié)果進(jìn)行分析,相同的3個字符相連(行列對角線)即為勝利,如果棋盤已滿但雙方都沒有完成三個字符相連即為平局。

創(chuàng)建一個is_win函數(shù)用它的返回值來表示游戲結(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];

}

//判斷對角線

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;

}

在下棋的過程中,還要時時刻刻判斷棋盤有沒有滿。

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;//沒滿

}

}

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("請選擇:

scanf("%d",input);

switch(input)

{

case1:

game();//游戲

break;

case0:

printf("退出游戲\n");

break;

default:

printf("選擇錯誤\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("請輸入坐標(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)已被占用,請重新輸入\n");

}

else

{

printf("數(shù)字輸入非法,請重新輸入\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;

}

}

//判斷棋盤有沒有滿

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;//沒滿

}

}

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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論