目錄
- 前言
- 游戲設計思路
- 生成選單界面(do while)
- 初始化棋盤
- 生成棋盤(二維陣列的應用)
- 玩家下棋
- 電腦下棋(亂數生成)
- 判斷輸贏
- 判斷是否棋格滿了
- 游戲全部代碼
- game.h
- test.c
- game. c
- 游戲效果圖
- 勝利
- 失敗
前言
?? :熱愛編程學習,期待一起交流!
🙏:博主水平有限,如有發現錯誤,求告知,多謝!
- 我們先認識一下本章涉及的英文單詞,
row:一行; 一排; ;
col:一列;
Init:初始化
InitBoard:初始化棋盤
DisplayBoard:展覽棋盤;展出棋盤; - 井字棋又稱三子棋,此游戲是對前面C語言知識學習的綜合應用,主要包括 函式、陣列、的應用,可以算是對前面所學知識的復習鞏固,以及形成知識的輸出,
- 相信大家也玩過井字棋,甚至熟練掌握井字棋的棋法并且百戰百勝,是的,這就是我的1.0版本,對抗人工智障,你將百戰百勝,由于博主知識暫時有限,不能寫出一個具有戰略頭腦的電腦玩家與你斗智斗勇,只能設計出一個胡亂下棋的電腦玩家,沒錯,就是胡亂下的,但是經過我后期的學習一定會對這個游戲進行優化,

游戲設計思路
這里我們把這個游戲專案整體上分為三個模塊
- 頭檔案(game.h)c語言中頭檔案中一般定義了函式的宣告、結構體的定義、宏定義,(常量和全域變數最好放到源檔案中)
- 源檔案(game.c)在這個源檔案中我們放置一些函式,來將游戲的具體實作, 源檔案(test.c)里面放主函式和游戲的整體功能,
- 這樣寫的好處可以不至于一個游戲直接在一個源檔案寫幾百行,不能及時檢查錯誤,而導致bug頻出,
- 把游戲分為一個個的模塊就可以提高代碼的可讀性,減少錯誤率,
我們規定人下的棋子為 “x”,電腦下的棋子為 “o”,
- 為了照顧沒有設計過的朋友,在這里我會講的詳細一些,
- 先按照我們正常的思維來設計,
- 一、工欲善其事,必先利其器,我們首先需要先設計一個3 * 3的一個棋盤,如上圖所示,
- 二、然后玩家先手下棋,
- 三、電腦下棋,
- 四、我們需要在第三個回合判斷輸贏(就是判斷三個棋子是否在一條線上)
- 五、如果沒有分出勝負,我們需要繼續進行回圈 – 步驟三、四、五,直到判斷出輸贏,或者平局,
- 現在我們用程式員的話翻譯以上句子是什么意思,
- 一、生成一個3*3的二維陣列,并將二維陣列初始化后用符號列印出來,
- 二、運用二維陣列輸入兩個數字定位棋子落下的位置,
- 三、運用rand函式生成亂數,對二維陣列(即3*3的棋盤)進行遍歷,if有空位,就下棋 *
- 四、判斷二維陣列上的行,列,十字相交,的位置是否構成一條線,
- 五、運用回圈陳述句對此進行判斷輸贏,或平局,
生成選單界面(do while)
- 玩過超級瑪麗,或者魂斗羅的都知道,我們進入游戲的時候都有一個選單界面,來選擇玩游戲,或者退出游戲,因此在我們進行玩游戲之前,需要用do陳述句先生成一個選單來進行選擇,
void menu()
{
printf("————1.play————\n");
printf("————2.exit————\n");
}
初始化棋盤
宏定義:
- 將3用ROW,COL代替,
- 提高擴展性,如果將來要修改棋盤尺寸,代碼修改會很方便,
#define ROW 3
#define COL 3
- 運用回圈嵌套,對3 *3的二維陣列進行遍歷,實作9個格子都是空格,
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;//i 控制行數
int j = 0;//j 控制列數
for (i = 0; i < row; i++)//控制列印的行數
{
for (j = 0; j < col; j++)//控制每行的列數
{
printf(" %c ", board[i][j]);
if (j < col - 1)//col為3,if(j<2),意思就是只列印棋盤的第一列和第二列,
printf("|");
}
printf("\n");//每列印一行就需要換行
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("+");
}
}
printf("\n");
}
}
- 如圖所示

玩家下棋
- 運用if的嵌套
void Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("請玩家輸入(x y)坐標下棋:");
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//對下棋位置進行約定,只能下到3*3的棋盤內,
{
if (board[x - 1][y - 1] == ' ')//x-1和y-1的寫法就是因為對我們程式員來說陣列的元素下標識從0開始的,
{//陣列通過下標來訪問元素,但是玩家卻不懂這個,所以要這么寫,
board[x - 1][y - 1] = 'x';
break;
}
else
{
printf("坐標已被占用,請重新輸入\n");
}
}
else
{
printf("坐標非法,請重新輸入\n");
}
}
}
電腦下棋(亂數生成)
- 亂數的生成.要在主函式中使用 srand((unsigned int)time(0))
- 將time作為種子,保證時間的隨機性,從而使棋子隨機生成,
void Computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % ROW;
y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = 'o';
break;
}
}
}
判斷輸贏
- 規定:
- 回傳‘Q’是平局
- 回傳‘c’是繼續
- 下面是判斷三行,三列,還有十字相交是否相同,然后還要繼續判斷棋盤是否滿了,最后才能判斷是否輸贏,
- 判斷棋盤滿不滿需要呼叫is_full函式,
char is_win(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][0] == 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[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (1 == is_full(board, row, col))
{
return 'Q';
}
return 'c';
}
判斷是否棋格滿了
- 對棋盤進行遍歷,如果沒有空格,就回傳1,為真,則是棋盤滿了,然后就回傳Q來跳出回圈,
int 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;
}
游戲全部代碼
game.h
#include<stdio.h>
#include<stdlib.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 Player_move(char board[ROW][COL], int row, int col);
void Computer_move(char board[ROW][COL], int row, int col);
char is_win(char board[ROW][COL], int row, int col);
test.c
#include "game.h"
void game()
{
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
char ret = 0;
while (1)
{
system("cls");
DisplayBoard(board, ROW, COL);
Player_move(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'c')
{
break;
}
Computer_move(board, ROW, COL);
ret = is_win(board, ROW, COL);
if (ret != 'c')
{
break;
}
}
printf("對抗結果如下:\n");
DisplayBoard(board, ROW, COL);
if (ret == 'x')
{
printf("恭喜你對抗人工智障1.0成功!!!\n");
printf("再來一盤吧?\n");
printf("\n");
}
else if (ret == 'o')
{
printf("不會吧?不會還有人玩不過電腦吧?\n");
printf("再來一盤吧?\n");
printf("\n");
}
else
{
printf("你竟然和電腦旗鼓相當!!!\n");
printf("再來一盤吧?\n");
printf("\n");
}
}
void menu()
{
printf("————1.play————\n");
printf("————2.exit————\n");
}
void test()
{
srand((unsigned int)time(NULL));
int n = 0;
do
{
printf("開始游戲請選擇輸入1\n");
menu();
scanf("%d", &n);
switch (n)
{
case 1:
game();
break;
case 0:
printf("退出游戲\n");
break;
default:
printf("選擇錯誤請重新選擇:\n");
break;
}
}while (n);
}
int main()
{
test();
return 0;
}
game. c
#define _CRT_SECURE_NO_WARNINGS
#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;//i 控制行數
int j = 0;//j 控制列數
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 Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("請玩家輸入(x y)坐標下棋:");
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] = 'x';
break;
}
else
{
printf("坐標已被占用,請重新輸入\n");
}
}
else
{
printf("坐標非法,請重新輸入\n");
}
}
}
void Computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
x = rand() % ROW;
y = rand() % COL;
if (board[x][y] == ' ')
{
board[x][y] = 'o';
break;
}
}
}
int 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;
}
char is_win(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][0] == 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[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
if (1 == is_full(board, row, col))
{
return 'Q';
}
return 'c';
}
游戲效果圖


勝利

失敗
- 失敗的截圖可以自己下去試試哦,
最后,如果你覺得我的文章對你有幫助🎉歡迎關注🔎點贊👍收藏??留言📝,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/353540.html
標籤:其他
