C語言實現(xiàn)簡單的控制臺三子棋游戲
用C語言實現(xiàn)簡單的控制臺三子棋游戲
首先,確定一局游戲的基本流程:
1、創(chuàng)建棋盤并初始化。(將棋盤看作一個二維數(shù)組)
2、打印顯示出棋盤。
3、玩家落子(玩家通過輸入行列坐標的方式來落子)。
4、判定勝負關系。(如果玩家勝出,則退出游戲。)
5、電腦落子(隨機位置落子) 。
6、判定勝負關系(如果電腦勝出,退出游戲。否則,回到步驟 2 繼續(xù)執(zhí)行。)
第一步,此處通過構造menu()函數(shù)搭建一個簡單的交互菜單和玩家交互,用來判斷是否開始進行一局游戲。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int menu() {
printf("====================\n");
printf("1.開始游戲\n");
printf("0.結束游戲\n");
printf("====================\n");
printf(" 請輸入您的選擇: ");
int choice = 0;
scanf("%d", &choice);
return choice;
}
int main() {
while (1) {
int choice = menu();
if (choice == 1) {
//game();//此處調用了一個game函數(shù)。
}
else if (choice == 0) {
printf("goodbye!\n");
break;
}
}
system("pause");
return 0;
}
第二步,對第一步中調用的game()函數(shù)進行構造。game()函數(shù)為核心功能函數(shù),其主要任務是完成基本流程。
1.構建初始化init()函數(shù)。初始化一個3*3的二維數(shù)組,將它當做棋盤,并將數(shù)組元素全部初始化為0。
void init(char chessBoard[MAX_ROW][MAX_COL]) {
// 把數(shù)組中的每個元素都設=初始化為“空格”。
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
chessBoard[row][col] = ' ';
}
}
}
2.構建棋盤打印printChessBoard()函數(shù)。運用for循環(huán)打印出3*3的棋盤。
void printChessBoard(char chessBoard[MAX_ROW][MAX_COL]) {
//把棋盤打印出來。
printf("+---+---+---+\n");
for (int row = 0; row < MAX_ROW; row++) {
printf("| %c | %c | %c |\n", chessBoard[row][0],
chessBoard[row][1], chessBoard[row][2]);
printf("+---+---+---+\n");
}
}
3.構建玩家落子playerMove()函數(shù),玩家通過輸入行列坐標的方式來落子。此過程中需要判斷:1.玩家輸入的行列坐標是否在棋盤的合理位置。2.玩家輸入的行列坐標位置是否已經(jīng)有棋子。
void playerMove(char chessBoard[MAX_ROW][MAX_COL]) {
// 讓玩家落子. 通過控制臺輸入行列坐標的方式來實現(xiàn)。
while (1) {
printf(" 請玩家輸入坐標(row col): ");
int row = 0;
int col = 0;
scanf("%d %d", &row, &col);
// 校驗玩家輸入的坐標是否合法(是否在棋盤合理范圍內(nèi))。
if (row < 0 || row >= MAX_ROW
|| col < 0 || col >= MAX_COL) {
// 若出現(xiàn)非法情況,此時應該讓玩家重新輸入。
printf("您的坐標不在合法范圍[0, 2]內(nèi) \n");
continue;
}
// 校驗玩家落子位置是否已經(jīng)有子了。
if (chessBoard[row][col] != ' ') {
printf("您的坐標位置已經(jīng)有子了!\n");
continue;
}
// 真正落子。用“X”表示玩家落子。
chessBoard[row][col] = 'x';
break;
}
}
4.構建一個computerMove()函數(shù)來控制電腦落子。通過電腦產(chǎn)生一系列隨機數(shù)來控制棋子落在棋盤坐標范圍內(nèi)。
void computerMove(char chessBoard[MAX_ROW][MAX_COL]) {
// 電腦落子,讓電腦隨機產(chǎn)生一組行列坐標。
while (1) {
int row = rand() % MAX_ROW;
int col = rand() % MAX_COL;
if (chessBoard[row][col] != ' ') {
// 需要保證隨機數(shù)不能是已經(jīng)有棋子的位置。
continue;
}
chessBoard[row][col] = 'o';
break;
}
}
在該函數(shù)模塊中,電腦落子隨機位置的生成通過rand()函數(shù)控制,需要注意的是,我們需要通過設置隨機種子來避免“偽隨機”的出現(xiàn)。
srand((unsigned int)time(0));//以當前時間戳作為隨機種子。
5.構建isWin()函數(shù)判斷是否勝利。此處人為約定該函數(shù)的返回結果的含義: ‘x' 表示玩家獲勝?!畂' 表示電腦獲勝。 ' ' 表示勝負未分。 ‘q' 表示和棋。
char isWin(char chessBoard[MAX_ROW][MAX_COL]) {
// 判定所有的行。
for (int row = 0; row < MAX_ROW; row++) {
if (chessBoard[row][0] != ' '
&& chessBoard[row][0] == chessBoard[row][1]
&& chessBoard[row][0] == chessBoard[row][2]) {
return chessBoard[row][0];
}
}
// 判定所有的列。
for (int col = 0; col < MAX_COL; col++) {
if (chessBoard[0][col] != ' '
&& chessBoard[0][col] == chessBoard[1][col]
&& chessBoard[0][col] == chessBoard[2][col]) {
return chessBoard[0][col];
}
}
// 判定兩個對角線。
if (chessBoard[0][0] != ' '
&& chessBoard[0][0] == chessBoard[1][1]
&& chessBoard[0][0] == chessBoard[2][2]) {
return chessBoard[0][0];
}
if (chessBoard[2][0] != ' '
&& chessBoard[2][0] == chessBoard[1][1]
&& chessBoard[2][0] == chessBoard[0][2]) {
return chessBoard[2][0];
}
// 判定是否和棋??雌灞P中是否有剩余空間。
//調用了isFull函數(shù)。
if (isFull(chessBoard)) {
return 'q';
}
return ' ';
}
6.構造isFull()函數(shù)用來判斷棋盤中是否有剩余空間供玩家落子,以便判斷是否是和棋。
int isFull(char chessBoard[MAX_ROW][MAX_COL]) {
// 找”空格“. 如果找不到, 說明棋盤滿了。
for (int row = 0; row < MAX_ROW; row++) {
for (int col = 0; col < MAX_COL; col++) {
if (chessBoard[row][col] == ' ') {
// 如果找到“空格”說明棋盤沒滿。
return 0;
}
}
}
return 1;
}
最后,根據(jù)組合調用上面的幾個功能函數(shù),我們可以獲得最終的game()函數(shù)的整體架構。
void game() {
// 1. 創(chuàng)建棋盤并初始化
char chessBoard[MAX_ROW][MAX_COL] = { 0 };
init(chessBoard);//調用初始化函數(shù)
char winner = ' ';
while (1) {
// 2. 打印棋盤
printChessBoard(chessBoard);
// 3. 玩家落子(玩家輸入行列坐標的方式來落子)
playerMove(chessBoard);
// 4. 判定勝負關系
winner = isWin(chessBoard);
if (winner != ' ') {
break;
}
// 5. 電腦落子(隨機位置落子)
computerMove(chessBoard);
// 6. 判定勝負關系
winner = isWin(chessBoard);
if (winner != ' ') {
break;
}
}
printChessBoard(chessBoard);
if (winner == 'x') {
printf("恭喜您, 您贏了!\n");
}
else if (winner == 'o') {
printf("很遺憾, 您輸了!再接再厲!\n");
}
else {
printf("您棋逢對手,這一局是平局!\n");
}
}
運行截圖如下:
勝利啦!

失敗了!

此處有棋子!

更多有趣的經(jīng)典小游戲實現(xiàn)專題,分享給大家:
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++多線程實現(xiàn)TCP服務器端同時和多個客戶端通信
通訊建立后首先由服務器端發(fā)送消息,客戶端接收消息;接著客戶端發(fā)送消息,服務器端接收消息,實現(xiàn)交互發(fā)送消息。本文主要介紹了C++多線程實現(xiàn)TCP服務器端同時和多個客戶端通信,感興趣的可以了解一下2021-05-05
c++中#include <>與#include""的區(qū)別詳細解析
<>先去系統(tǒng)目錄中找頭文件,如果沒有在到當前目錄下找。所以像標準的頭文件 stdio.h、stdlib.h等用這個方法2013-10-10

