C語言版的三子棋游戲
本文實例為大家分享了C語言版三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
一、游戲說明
三子棋相信大家都不陌生,小時候經(jīng)常在紙上畫出九宮格就可以直接和小伙伴一起玩,規(guī)則就是誰先在九宮格中下出同一行三個一樣,或者同一列三個一樣,又或者對角線的三個一樣的棋子,誰就獲勝;其實在編程中,代碼也能實現(xiàn)人機(jī)版的三子棋小游戲,讓我們一起來看看如何實現(xiàn)的吧!
二、游戲設(shè)計步驟
將三子棋游戲的實現(xiàn)邏輯分為以下步驟:
1.創(chuàng)建菜單(選擇玩游戲或者退出游戲)
2.創(chuàng)建和初始化游戲棋盤(本質(zhì)上為一個二維數(shù)組)
3.打印出棋盤
4.玩家下棋(用‘ * '表示棋子)
5.判斷輸贏或者是否平局
6.電腦下棋(用‘ # '表示棋子)
7.判斷輸贏(同第5步)
8.回到第3步直至確定輸贏
三、代碼實現(xiàn)
1.創(chuàng)建菜單
規(guī)定輸入 1 為玩游戲,輸入 0 為退出游戲
void menu()
{
printf("******************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("******************************\n");
}
2.創(chuàng)建和初始化游戲棋盤
本質(zhì)為創(chuàng)建一個二維數(shù)組并初始化
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
3.打印出棋盤
利用循環(huán)的方式將字符排版成棋盤的樣式(n x n 的棋盤也同樣可以打?。?/p>
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; 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 < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
4.玩家下棋
規(guī)定玩家的棋子為字符‘ * ',同時需判斷棋子坐標(biāo)的合理性
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走\(yùn)n");
printf("請輸入坐標(biāo)>:");
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//判斷游戲合法性
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("坐標(biāo)已被占用,請重新輸入\n");
}
else
printf("坐標(biāo)非法,請重新輸入\n");
}
}
5.電腦下棋
規(guī)定電腦的棋子為字符‘ # ',同樣需判斷棋子坐標(biāo)的合理性
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦走\(yùn)n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
6.判斷輸贏或者是否平局
規(guī)定電腦贏返回字符‘ # ',玩家贏返回字符‘ * ',游戲繼續(xù)返回字符‘C',平局(即棋盤滿但還未出現(xiàn)勝負(fù))則返回字符‘Q';而這里我們又需要注意,判斷輸贏的函數(shù)需返回一個字符,所以判斷棋盤是否已滿的函數(shù)需在判斷輸贏的函數(shù)中并且能返回一個字符,這樣才能保證游戲輸贏判斷的完整性
(1)判斷輸贏函數(shù):
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')//判斷行是否相等
return board[i][0];
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')//判斷列是否相等
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')//判斷對角線
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')//判斷對角線
{
return board[0][2];
}
int ret = IsFull(board, row , col );
if (ret == 0)
{
return 'Q';
}
else
return 'C';
}
(2)判斷棋盤是否已滿的函數(shù)
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 1;
}
}
return 0;
}
以上是各各步驟函數(shù)的具體實現(xiàn),而為了方便,我們將代碼分為三個文件:
1.game.h------關(guān)于游戲相關(guān)的函數(shù)聲明,符號聲明及頭文件的包含
2.game.c------游戲相關(guān)函數(shù)的實現(xiàn)
3.test.c------測試游戲的邏輯
具體如下:
game.h文件:
#include<stdio.h> #include<time.h> #define ROW 3 #define COL 3 void InitBoard(char board[ROW][COL],int row,int col); void DisplayBoard(char board[ROW][COL], int row, int col); void PlayerMove(char board[ROW][COL], int row, int col); void ComputerMove(char board[ROW][COL], int row, int col); char IsWin(char board[ROW][COL], int row, int col);
game.c文件:
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; 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 < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家走\(yùn)n");
printf("請輸入坐標(biāo)>:");
while (1)
{
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
printf("坐標(biāo)已被占用,請重新輸入\n");
}
else
printf("坐標(biāo)非法,請重新輸入\n");
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("電腦走\(yùn)n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 1;
}
}
return 0;
}
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
return board[i][0];
}
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][2] && board[2][0] != ' ')
{
return board[0][2];
}
int ret = IsFull(board, row , col );
if (ret == 0)
{
return 'Q';
}
else
return 'C';
}
test.c文件:
#include"game.h"
void menu()
{
printf("******************************\n");
printf("********** 1.play **********\n");
printf("********** 0.exit **********\n");
printf("******************************\n");
}
void game()
{
char board[ROW][COL];//定義棋盤
InitBoard(board, ROW, COL);//初始化棋盤
DisplayBoard(board, ROW, COL);//打印棋盤
char ret = 0;
//
while (1)
{
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
ComputerMove(board, ROW, COL);//電腦下棋
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*')
{
printf("玩家勝利!\n");
}
else if (ret == '#')
{
printf("電腦勝利!\n");
}
if(ret=='Q')
{
printf("平局\n");
}
DisplayBoard(board, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("請選擇:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戲結(jié)束\n");
break;
default:
printf(",文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下輸入錯誤,請重新輸入\n");
}
} while (input);
return 0;
}
四、運(yùn)行效果
玩游戲的三種情況分別如下:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通訊錄系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07
C++編程模板匹配超詳細(xì)的識別手寫數(shù)字實現(xiàn)示例
大家好!本篇文章是關(guān)于手寫數(shù)字識別的,接下來我將在這里記錄我的手寫數(shù)字識別的從零到有,我在這里把我自己的寫代碼過程發(fā)出來,希望能幫到和我一樣努力求知的人2021-10-10
對比C語言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用
這篇文章主要介紹了對比C語言中g(shù)etc()函數(shù)和ungetc()函數(shù)的使用,是C語言入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-08-08
C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)BMP格式圖片轉(zhuǎn)化為灰度,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
C++利用棧實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式
這篇文章主要為大家詳細(xì)介紹了C++利用棧實現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-04-04
C語言中g(shù)etch()函數(shù)詳解及簡單實例
這篇文章主要介紹了C語言中g(shù)etch()函數(shù)詳解及簡單實例的相關(guān)資料,需要的朋友可以參考下2017-03-03

