將下三子棋的過程分類為不同的模組,再逐一用函式實現相應的操作,採用化繁為簡,化整為零的思想。因此採用多檔案,將整個程式細分,使其變得清晰簡明,一旦出現問題也方便除錯和維護。比如這次就分為標頭檔案,函式檔案,以及主函式檔案(可視情況而定)
首先將標頭檔案命名為chess.h,函式檔案命名為chess.c,主函式檔案命名為main.c
#ifndef _chess_h_
#define _chess_h_
#include#include#include#include#pragma warning(disable:4996)
#define row 3
#define col 3
#define redpiece 'x'
#define blackpiece 'o'
void menu();
void game();
void intboard(char board[col], int row, int col);
void showboard(char board[col], int row, int col);
int playmove(char board[col], int row, int col);
void comptmove(char board[col], int row, int col);
char judgeresult(char board[col], int row, int col);
#endif
此時要注意標頭檔案的格式,定義的全域性變數和所要呼叫的函式都要在標頭檔案中進行宣告。三子棋所要用到三行三列的二維陣列,intboard為定義三子棋棋盤;showboard為展示三子棋棋盤;playmove為玩家落子;comptmove為電腦落子;judgereslt為判斷當前棋局。為了區分玩家與電腦的棋子,定義紅棋redpiece為玩家,顯示為字元「x」,定義黑棋blackpiece為電腦,顯示為字元「o」。
main.c要完成整個遊戲的框架。首先呼叫定義的menu顯示主頁,引導玩家進入遊戲,其次採用switch讓玩家選擇是否進入遊戲。若選擇1,則呼叫main.c中的game函式,實現遊戲功能。要想多次遊戲可將switch包含到while迴圈中,並定義乙個區域性變數永不成立作為進入迴圈的條件,若想要退出,則將其賦值1(表示成立)即可退出迴圈退出遊戲。
#include "chess.h"//注意格式,""用於自定義頭檔名
void menu()
int main()
} return 0;
system("pause");
}
函式檔案內包含所有定義的函式,讓我們分別看一下。
1.intboard
void intboard(char board[col], int row, int col)
} }
棋盤可以看成乙個二維陣列,運用定義的全域性變數row,col分別作為陣列的行列,採用for迴圈巢狀將陣列每個元素初始化為空格。
2.showboard
void showboard(char board[col], int row, int col)
printf("-------------------\n");
}
此為展示棋盤,注意最好將顯示出的行列轉換為習慣標號,有別於陣列。
3.playmove
int playmove(char board[col], int row, int col)
board[x - 1][y - 1] = redpiece;
return 0;
} return 1;
}
定義整型函式,首先玩家需要輸入要落子的座標,再對座標進行判斷是否已經落子,若之前無落子則返回0,若有返回2,輸入錯誤則返回1.
4.judgeresult
char judgeresult(char board[col], int row, int col)
} for (i = 0; i < row; i++)
} if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2])
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[0][2])
for (i = 0; i < row; i++) }}
return 'p';
}
定義字元型函式,判斷行,列,兩個對角線三個相鄰棋格是否相等且不為空,若符合則返回對應符號代表對應方獲勝,若棋格仍有空位則返回n表示繼續落子,若無任何行列對角線有三個相同符號且棋格無空,則說明此局平局返回p。
5.comptmove
void comptmove(char board[col], int row, int col)
} printf("computer...done");
sleep(1000);
}
採用while迴圈,用rand生成隨機數作為座標位置,若該格為空,則電腦落子,輸出指示,到下一步。
6.game
void game()
else if (2 == type)
else
result = judgeresult(board, row, col);
if (result != 'n')
comptmove(board, row, col);
result = judgeresult(board, row, col);
if (result != 'n')
}showboard(board, row, col);
switch (result)
}
此為重要的一步,game要做的就是將其他函式整合起來,將初始化棋盤(intboard),展示棋盤(showboard),用while迴圈將玩家落子(palymove),判斷(judgeresult),電腦落子(comptmove),判斷這一系列過程串起來,完成遊戲步驟。
game函式中有srand((unsigned long)time(null));,這個函式常與rand函式一起使用,包含在標頭檔案中。
其原型為void srand(unsigned int seed)或void rand(void)seed相當於乙個種子,srand函式根據seed設定隨機起點,rand函式就是根據這個起點返回乙個隨機數【seed rang_max】。為了讓每一次程式呼叫的值都不同,所以使用系統時間用來初始化(time(null))
雖然三子棋實現思路及過程並不難,學會其中思想非常關鍵。將大問題劃分為小模組,用函式實現其功能可以讓**有條理,易維護,採用多檔案也可以使思路更為清晰。養成良好的編寫習慣非常重要,邊寫就要邊試著執行,可以縮小出錯的範圍。這篇部落格還有很多不足的地方,日後還得多加練習,才可以寫出更漂亮的**。
C語言實現三子棋
game.h define crt secure no warnings 1 ifndef game h define game h include include include include define rows 3 define cols 3 void init board char bo...
三子棋C語言實現
要寫這個三子棋的程式我們分為三個部分首先是宣告函式的標頭檔案,我們分別宣告了五個函式,初始化棋盤,列印棋盤,玩家走,電腦走,檢查是否贏了。之後我們寫測試 然後分別來實現這五個函式 define crt secure no warnings 1 ifndef game h define game h ...
C語言實現三子棋
實現三子棋程式,只要我們能夠理清楚思路,就可以知道其實它的做法並不難,重點在於實際寫 時需要多關注細節。這裡我們可以寫完一塊就可以立馬執行程式檢查是否如我們所想的效果出現,如若不是便可立即查錯糾錯。如下。test.c include include include include game.h vo...