C語言實現(xiàn)簡單的三子棋游戲
C語言:三子棋游戲,供大家參考,具體內(nèi)容如下
首先,我們從main函數(shù)開始寫起,分析游戲的整體邏輯
int main()
{
int input=0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("請選擇:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("輸入有誤,請重試!\n");
break;
}
}while(input);
return 0;
}
通過一個do…while循環(huán)來實現(xiàn)整體邏輯,首先要展示游戲菜單界面,即要編寫菜單menu()函數(shù):
void menu()
{
printf("************************************\n");
printf("******** 1.play 0.exit *********\n");
printf("************************************\n");
}
展示之后,通過用戶輸入的值來判斷用戶是要進行游戲還是要退出游戲,使用switch來實現(xiàn):當(dāng)用戶輸入1則表示進行游戲,輸入0表示退出游戲,而輸入其他的數(shù)字則提示輸入錯誤,重新輸入!
接下來就是要編寫game()函數(shù)了:
void game()
{
char board[ROW][COL] = {0};
char result='N';
initBoard(board,ROW,COL);
display(board,ROW,COL);
while(1)
{
playerMove(board,ROW,COL);
display(board,ROW,COL);
result=judge(board,ROW,COL);
if (result != 'N')
{
break;
}
computerMove(board,ROW,COL);
display(board,ROW,COL);
result=judge(board,ROW,COL);
if (result != 'N')
{
break;
}
}
switch(result)
{
case '*':
printf("恭喜你,你贏了!!!\n");
break;
case '#':
printf("很遺憾,電腦贏了?。?!\n");
break;
case 'E':
printf("你和電腦是平局?。。n");
break;
default:
break;
}
}
首先進入游戲,要初始化棋盤界面并展示給用戶,即編寫initBoard()函數(shù)和display()函數(shù):
void initBoard(char board[ROW][COL],int row,int col)
{
int i = 0;
for(; i<row; i++)
{
int j=0;
for(; j <col; j++)
{
board[i][j]=' ';
}
}
}
void display(char board[ROW][COL],int row,int col)
{
int i = 0;
for(; i<row; i++)
{
int j=0;
//打印數(shù)據(jù)
for(; j<col; j++)
{
printf(" %c ",board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
//打印分割行
if(i<row-1)
{
for(j=0; j<col;j++)
{
printf("---");
if(j<row-1)
{
printf("|");
}
}
printf("\n");
}
}
}
接下來就要進入循環(huán),實現(xiàn)用戶和電腦下棋的邏輯,用playerMove()函數(shù)和computerMove()函數(shù)來實現(xiàn):
void playerMove(char board[ROW][COL],int row,int col)
{ int x=0;
int y=0;
printf("玩家走:>");
while(1)
{
scanf("%d%d",&x,&y);
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='*';
break;
}
else
{
printf("該坐標(biāo)被占用,請重新輸入!\n");
}
}
else
{
printf("坐標(biāo)非法,請重新輸入");
}
}
}
void computerMove(char board[ROW][COL],int row,int col)
{
printf("電腦走:>\n");
while(1)
{
int x = rand() % row;
int y = rand() % col;
if(board[x][y]==' ')
{
board[x][y] = '#';
break;
}
}
}
此時要注意每當(dāng)用戶或者電腦走完一步之后要展示棋盤并判斷輸贏,因此還需要寫一個judge()函數(shù):
char judge(char board[ROW][COL],int row,int col)
{
int i=0;
int j=0;
for(;i<row;i++)
{
if(board[i][0]!=' ' && board[i][0]==board[i][1] && board[i][1]==board[i][2])
{
return board[i][0];
}
}
for(;j<col;j++)
{
if(board[0][j]!=' ' && board[0][j]==board[1][j] && board[1][j]==board[2][j])
{
return board[0][j];
}
}
if(board[0][0]!=' ' && board[0][0]==board[1][1] && board[1][1]==board[2][2])
{
return board[0][0];
}
if(board[0][2]!=' ' && board[0][2]==board[1][1] && board[1][1]==board[2][1])
{
return board[0][2];
}
for (i = 0; i < row; i++)
{
int j = 0;
for (; j < col; j++)
{
if (board[i][j] == ' ')
{
return 'N';
}
}
}
return 'E';
}
判斷輸贏的條件就是三顆棋子連成一條直線即為贏,如果到最后用戶和電腦將棋盤下滿并且沒有分出勝負(fù)則判為平局。
最后在game函數(shù)中通過switch將judge()函數(shù)的返回值進行判斷,是玩家贏還是電腦贏還是平局。
注:將數(shù)組作為參數(shù)傳遞的時候,一定要記著將數(shù)組的大小也傳過去,如果不將數(shù)組的大小傳過去的話,在新的函數(shù)中計算數(shù)組的大小時,使用sizeof(arr)/sizeof(arr[0])會出現(xiàn)問題,因為數(shù)組作為參數(shù)傳遞的時候會被降維成指針,指針在32位系統(tǒng)下的大小為4個字節(jié),假設(shè)傳遞的是int類型的數(shù)組,則sizeof(arr)/sizeof(arr[0])=1,我們就不能按照正常的邏輯來實現(xiàn)想要實現(xiàn)的功能了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Qt實現(xiàn)駕??颇靠荚囅到y(tǒng)的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何基于Qt實現(xiàn)駕??颇靠荚囅到y(tǒng),文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Qt有一定幫助,需要的可以參考一下2022-07-07

