詳解用C語言實(shí)現(xiàn)三子棋游戲流程
三子棋游戲簡(jiǎn)介

這是一個(gè)簡(jiǎn)單的三子棋小游戲,估計(jì)大家小時(shí)候都玩兒過,只要能連成三個(gè),無論是行,列還是對(duì)角線,就可以勝利了。是不是很簡(jiǎn)單呢,那我們來嘗試一下用C語言來寫一個(gè)簡(jiǎn)單的三子棋游戲。
一、分析及實(shí)現(xiàn)
1.棋盤
想要玩游戲,那首先應(yīng)該有一個(gè)棋盤吧。因?yàn)槲覀兺鎯旱氖侨悠?,所以來說一個(gè)3X3的棋盤應(yīng)該可以滿足要求。這里使用了一個(gè)三行三列的二維數(shù)組來模擬三子棋的棋盤。
有了棋盤之后在開始游戲之前先把棋盤初始化一下,這樣看起來更方便。
//初始化棋盤
void InitBoard(char board[][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] = ' ';
}
}
}
之后呢,再來打印看看,要優(yōu)化一下再打印出來
//打印棋盤
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("+---+---+---+\n");
int j = 0;
for (j = 0; j < col; j++)
{
printf("| %c ", board[i][j]);
}
printf("|\n");
}
printf("+---+---+---+\n");
}
這是我設(shè)計(jì)的一個(gè)簡(jiǎn)單的小棋盤

棋盤的風(fēng)格和樣式可以根據(jù)自己的喜好更改。
好了,現(xiàn)在我們有了棋盤,有了打印出來的樣子,那接下來就應(yīng)該向棋盤上落子了!
2.落子
下棋呢可以是兩個(gè)人下,當(dāng)然也可以自己和電腦下棋,這里我選擇和電腦對(duì)弈,這樣就需要兩個(gè)功能了,一個(gè)是玩家下棋,一個(gè)就是電腦下棋了。
//玩家下棋
void Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:->");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'O';
break;
}
else
{
printf("坐標(biāo)已被占用!\n");
}
}
else
{
printf("坐標(biāo)非法,請(qǐng)重新輸入!\n");
}
}
}
為了將玩家和電腦區(qū)分開,需要使用兩個(gè)不一樣的符號(hào)來代表玩家的落子和電腦的落子 玩家----O,電腦----X
//電腦下棋
void Computer_move(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] = 'X';
break;
}
}
}
玩家的落子可以通過輸入坐標(biāo),而電腦呢,我們讓他隨機(jī)選擇合理的坐標(biāo)范圍進(jìn)行落子。
那隨著玩家和電腦相繼落子,我們就需要判斷誰獲勝了,或者平局的情況。
3.判斷輸贏
//判斷輸贏
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][1] == board[i][2])
{
return board[i][0];
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[0][i];
}
}
//判斷對(duì)角線
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2])
|| (board[0][2] == board[1][1] && board[1][1] == board[2][0]))
{
return board[1][1];
}
if (Is_full(board, row, col))
{
return 'D'; //平局
}
return 'C'; //Continue表示繼續(xù)
}
如果棋盤滿了,還沒有分出勝負(fù)的話就是平局的情況。
為了判斷棋盤是否滿了,我們也需要相應(yīng)的功能來簡(jiǎn)化我們的代碼。
//判斷棋盤是否滿了
int Is_full(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++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
二、程序演示

三、完整代碼
以下是完整代碼,有需要的可以查看,我用了三個(gè)文件來存儲(chǔ),兩個(gè).c文件用來書寫主要代碼,一個(gè).h文件用來存儲(chǔ)預(yù)處理指令和宏定義
1.main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
test();
return 0;
}
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("**********************************\n");
printf("********** 1.play ************\n");
printf("********** 0.exit ************\n");
printf("**********************************\n");
}
void game()
{
char board[ROW][COL] = {0};
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
char ret = 0;
while (1)
{
Player_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Is_win(board, ROW, COL);
if (ret == 'O')
{
printf("玩家贏!\n");
break;
}
if (ret == 'D')
{
printf("平局\n");
break;
}
Computer_move(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = Is_win(board, ROW, COL);
if (ret == 'X')
{
printf("電腦贏!\n");
break;
}
}
}
void test()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("請(qǐng)選擇:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲!\n");
break;
default:
printf("輸入錯(cuò)誤,請(qǐng)重新輸入!\n");
break;
}
} while (input);
}
//初始化棋盤
void InitBoard(char board[][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] = ' ';
}
}
}
//打印棋盤
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("+---+---+---+\n");
int j = 0;
for (j = 0; j < col; j++)
{
printf("| %c ", board[i][j]);
}
printf("|\n");
}
printf("+---+---+---+\n");
}
//玩家下棋
void Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:->");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'O';
break;
}
else
{
printf("坐標(biāo)已被占用!\n");
}
}
else
{
printf("坐標(biāo)非法,請(qǐng)重新輸入!\n");
}
}
}
//電腦下棋
void Computer_move(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] = 'X';
break;
}
}
}
//判斷棋盤是否滿了
int Is_full(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++)
{
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][1] == board[i][2])
{
return board[i][0];
}
if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
{
return board[0][i];
}
}
//判斷對(duì)角線
if ((board[0][0] == board[1][1] && board[1][1] == board[2][2])
|| (board[0][2] == board[1][1] && board[1][1] == board[2][0]))
{
return board[1][1];
}
if (Is_full(board, row, col))
{
return 'D'; //平局
}
return 'C'; //Continue表示繼續(xù)
}
3.game.h
#define _CRT_SECURE_NO_WARNINGS 1 #define ROW 3 #define COL 3 #include<stdio.h> #include<math.h> #include<time.h> void test(); void menu(); void InitBoard(char board[ROW][COL], int, int); void DisplayBoard(char board[ROW][COL], int, int); void Player_move(char board[ROW][COL], int, int); void Computer_move(char board[ROW][COL], int, int); char Is_win(char board[ROW][COL], int, int);
總結(jié)
以上就是一個(gè)完整的三子棋小游戲的C語言實(shí)現(xiàn)版本,謝謝觀看!
以上就是詳解用C語言實(shí)現(xiàn)三子棋游戲流程的詳細(xì)內(nèi)容,更多關(guān)于C語言 三子棋的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù)
這篇文章主要介紹了C語言中獲取進(jìn)程識(shí)別碼的相關(guān)函數(shù),分別為getpid()函數(shù)和getppid()函數(shù)的使用,需要的朋友可以參考下2015-08-08
vscode調(diào)試使用make編譯的項(xiàng)目
VSCode本身是一個(gè)代碼編輯器,自帶的編譯功能比較弱,本文主要介紹了vscode調(diào)試使用make編譯的項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn)
這篇文章主要介紹了使用VSCode和VS2017編譯調(diào)試STM32程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
詳解Matlab繪制3D玫瑰花的方法(內(nèi)附旋轉(zhuǎn)版本)
這篇文章主要為大家介紹了如何利用Matlab繪制3D版的玫瑰花以及旋轉(zhuǎn)版的3D玫瑰花,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以動(dòng)手試一試2022-03-03

