今天小玄為大家帶來一個操作性較強的C語言小游戲——三子棋,在我們學習編程語言的程序中,需要有這樣有趣的專案來保持自己對于編程的興趣和信心,相信通過這一篇文章你能夠在博主的引導下一步步做出屬于你的“三子棋游戲”,
那么,準備開始嘍!


目錄
“游戲整體思路”
“游戲選單的創建”
“游戲主體核心的實作”
1·棋盤的初始化
2·棋盤的展現
3·玩家下棋
4·電腦自動下棋
5·游戲勝負的判斷
“游戲運行實況”
“游戲整體思路”
我們需要有三個檔案如下:
- test.c —— 測驗游戲
- game.h —— 游戲函式的宣告
- game.c —— 游戲函式的實作
“游戲選單的創建”
在我們進入游戲時,首先出現的就應該是我們的選單界面,
我們選擇使用“選單函式”(menu())來實作這一功能,提高程式的可重復性,確保代碼塊的函式分塊使用,
游戲選單應該實作這幾個功能:
- 游戲的進入
- 游戲的退出
- 非法輸入的回傳提示和說明
接下來是我們實作這一功能的代碼塊
void menu()
{
printf("****************************\n");
printf("******* 1·play ********** \n");
printf("******* 2·exit ********** \n");
printf("****************************\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("請輸入:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("三子棋\n");
break;
case 2:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤\n");
break;
}
} while (input);
return 0;
}
這是該模塊選單函式的運行截圖

“游戲主體核心的實作”
1·棋盤的初始化
在游戲剛開始時,我們需要對棋盤進行初始化操作,對棋盤進行清空,以保證后續游戲的正常進行,我們將使用“InitBoard()”函式來進行棋盤的初始化操作,

函式的實作如下:
InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
2·棋盤的展現
在完成棋盤的初始化操作后,我們需要將初始化后的棋盤展現出來,以便玩家進一步的游戲,
在這里,我們使用“BoardDisplay()”這一函式來進行實作,
代碼如下:
DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//列印資料
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j < col - 1)
printf("|");
}
printf("\n");
//列印分割行
if (i < col - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
運行效果:

tips:為了提高代碼的健壯性,我們使用了全域變數 ROW 和 COL 來進行操作,通過改變這兩個全域變數的值就可以操作棋盤的格局,方便了日后的進一步優化改進,提高游戲可操作性,
3·玩家下棋
接下來我們來實作玩家下棋這一功能,
為了完成這一功能,我們需要注意以下幾點:
- 接收玩家所輸入的地址位置(我們所判斷的陣列元素應該是玩家輸入值-1)
- 判斷玩家所輸入的地址所在是否已有落子
- 將玩家的棋子落入對應地
代碼實作:
PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家走:>");
int x = 0;
int y = 0;
printf("請輸入坐標:>");
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] = '*';
}
else
{
printf("坐標被占用,請重新輸入\n");
}
}
else
{
printf("坐標非法,超出范圍");
}
}
運行截圖如下 :

4·電腦自動下棋
在實作電腦自動下棋這一功能時,我們需要創建亂數,這就需要呼叫以下頭檔案:
- <stdlib.h>
- <time.h>
同時,我們還需要使用:
- srand((unsigned int)time(NULL)); 來進行初始化
- x = rand() % row;
y = rand() % col; 來進行創建坐標的亂數
當然,與玩家下棋相一致,我們也需要判斷電腦所下的地址是否被占用,以及將棋子落下,
代碼實作如下:
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("電腦走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
運行截圖如下:

5·游戲勝負的判斷
在我們下棋的程序中,由于規則的特殊性,我們需要在玩家和電腦下的每一步后都對比賽的結果進行判斷,確保程式的邏輯正確性,
在這里,我們使用Iswin()函式來實作這一功能,
在這一函式中,我們需要實作以下幾個邏輯:
- 要回傳四種不同的狀態
- 玩家贏 --> 回傳'*'
- 電腦贏 --> 回傳'#'
- 平局 --> 回傳'Q'
- 游戲繼續 --> 回傳'C'
首先我們要確立判斷函式再整個游戲主體中的位置和作用,邏輯如下:
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);
if (ret != 'C'
{
break;
}
else if (ret == '*')
{
printf("玩家贏\n");
}
else if(ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
我們在實作Iswin()這一函式時,需要注意以下幾點:
- 判斷行
- 判斷列
- 判斷對角線
- 判斷棋盤是否已經放滿 -- > 確認游戲是否繼續(需要一個Is_full()函式來實作這一功能)
以下是Iswin()函式的實作
char Iswin(char board[ROW][COL], int row, int col)
{
//1,判斷輸贏
//2,判斷平局
//3,游戲繼續
//行
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[0][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[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
//判斷平局
if (Is_full(board, row, col) == 1)
{
return 'Q';
}
return 'C';
}
接著是Is_full()函式的實作
Is_full(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 0; //棋盤未滿
}
}
return 1; //棋盤慢
}
最后是游戲整體邏輯的實作:
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);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家贏\n");
}
else if(ret == '#')
{
printf("電腦贏\n");
}
else
{
printf("平局\n");
}
}
“游戲運行實況”
當我們將上述步驟和流程依次完成后,然我們開始運行這一游戲吧!!


以上就是三子棋游戲的全部內容,相信大家看到這里應該也能夠獨立的完成屬于自己專有的“三子棋游戲”,也相信你在這程序中對于C語言,對于編程有了更進一步的看法,
很高興能夠為大家帶來幫助,碼字不易,如果大家覺得我這篇文章對你有幫助的話,
請給小玄:

希望大家多多關注小玄,我也會在將來給大家帶來更加優質的文章!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300825.html
標籤:其他
上一篇:Unity 性能優化方法總結
