淺談C語言中的三子棋小游戲
1. 三子棋的思考程序:
很多小白在一開始看到這個三子棋,會感覺到無從下手,不知道應該把哪里作為突破口,但是大可不必,只需要在腦子中將這個游戲的幾個步驟分成一個個小程式,把它們一個個寫出來,然后將它們像組裝零件一樣組裝起來,即可,
步驟如下:
(1)起始界面
(2)初始化棋盤
(3)列印棋盤
(4)玩家輸入
(5)位置是否合法判斷
(6)輸贏判斷
(7)電腦輸入
(8)輸贏判斷
(9)結束
是不是拆分成一個個部分就想得出來了?
那接下來就是零件的制造了
2. 零件制造
這次我們分別創建game.h,game.c和test.c,
game.h檔案中主要寫一些預處理資訊、一些需要用到的現有的函式的頭檔案和自定義函式的宣告,
game.c檔案中就主要寫game.h中自定義函式的具體定義,
test.c檔案中就主要寫三子棋游戲的主體代碼,
起始界面
起始界面寫于test.c中
void menu()
{
printf("************************\n");
printf("*********1.play*********\n");
printf("*********0.exit*********\n");
printf("************************\n");
}
初始化棋盤
在game.h檔案中先對初始化棋盤的函式進行宣告,再在game.c中對其進行具體定義
別忘了在這些檔案開頭參考頭檔案,其中game.c和test.c只需要參考”game.h“頭檔案,因為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] = ' ';
}
}
}
其中的ROW和COL,是我們在game.h檔案中宏定義的兩個數,這樣的話,就避免因為條件的變換,而大幅度更改代碼,
列印棋盤
void 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 < 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("玩家走:>\n");
while (1)
{
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] = '#';
break;
}
else
printf("坐標被占用,請重新輸入!\n");
}
else
{
printf("坐標非法,請重新輸入!\n");
}
}
}
電腦輸入
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;
}
}
}
因為電腦在這是隨意下棋的,所以我們在這引入一個隨機變數
rand();生成亂數,它的頭檔案是<stdlib.h>,因為在使用rand函式之前要呼叫srand(x)函式,并且要求x要時刻變化,所以我們要參考時間戳,
srand((unsigned int)time(NULL));
其中NULL為空指標,為了讓每一次程式的呼叫都產生不同的值,所以經常使用系統時間來初始化,也就是time(NULL),time的頭檔案為<time.h>,所以我們還需在game.h中將其寫入開頭,
輸贏判斷
game.c中
char CheckWin(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[0][2] != ' ')
return board[0][2];
//判斷是否為和其
if (IsFull(board, row, col) == 1)
return 'q';
//勝負未定,繼續游戲
return 'c';
}
test.c中
if (ret == '#')
printf("玩家贏\n");
else if (ret == '*')
printf("電腦贏\n");
else if (ret == 'q')
printf("和棋\n");
零件都做好了,接下是組裝了
3. 組裝
在組裝的時候,如果還要考慮到視窗整潔明了,可以用system(“cls”);來對視窗進行清理,
其中game()是其它函式的整和,在其中進行,
void game()
{
char ret = 0;
char board[ROW][COL];
//初始化
InitBoard(board, ROW, COL);
//列印棋盤
DisplayBoard(board, ROW, COL);
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
system("cls");
DisplayBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != 'c')
break;
//電腦下棋
ComputerMove(board, ROW, COL);
system("cls");
DisplayBoard(board, ROW, COL);
ret = CheckWin(board, ROW, COL);
if (ret != 'c')
break;
}
if (ret == '#')
printf("玩家贏\n");
else if (ret == '*')
printf("電腦贏\n");
else if (ret == 'q')
printf("和棋\n");
}
總結
這是我身為小白寫的第一篇關于C語言內容的博客,我在聽老師講解的時候也是一知半解,寫代碼的時候也是寫一點,改一點;但是當我寫完這篇博客后,我感覺我對這個小游戲的了解更加深了,知識也鞏固了,希望我的這篇博客可以對你起到一些幫助;也希望可以指出我的問題或者給我多補充點知識,我會很開心,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/252213.html
標籤:其他
上一篇:動態規劃拙見
