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

這是一個簡單的三子棋小游戲,估計(jì)大家小時候都玩兒過,只要能連成三個,無論是行,列還是對角線,就可以勝利了。是不是很簡單呢,那我們來嘗試一下用C語言來寫一個簡單的三子棋游戲。
一、分析及實(shí)現(xiàn)
1.棋盤
想要玩游戲,那首先應(yīng)該有一個棋盤吧。因?yàn)槲覀兺鎯旱氖侨悠澹詠碚f一個3X3的棋盤應(yīng)該可以滿足要求。這里使用了一個三行三列的二維數(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ì)的一個簡單的小棋盤

棋盤的風(fēng)格和樣式可以根據(jù)自己的喜好更改。
好了,現(xiàn)在我們有了棋盤,有了打印出來的樣子,那接下來就應(yīng)該向棋盤上落子了!
2.落子
下棋呢可以是兩個人下,當(dāng)然也可以自己和電腦下棋,這里我選擇和電腦對弈,這樣就需要兩個功能了,一個是玩家下棋,一個就是電腦下棋了。
//玩家下棋
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)非法,請重新輸入!\n");
}
}
}
為了將玩家和電腦區(qū)分開,需要使用兩個不一樣的符號來代表玩家的落子和電腦的落子 玩家----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];
}
}
//判斷對角線
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)的功能來簡化我們的代碼。
//判斷棋盤是否滿了
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;
}
二、程序演示

三、完整代碼
以下是完整代碼,有需要的可以查看,我用了三個文件來存儲,兩個.c文件用來書寫主要代碼,一個.h文件用來存儲預(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("請選擇:->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戲!\n");
break;
default:
printf("輸入錯誤,請重新輸入!\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)非法,請重新輸入!\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];
}
}
//判斷對角線
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é)
以上就是一個完整的三子棋小游戲的C語言實(shí)現(xiàn)版本,謝謝觀看!
以上就是詳解用C語言實(shí)現(xiàn)三子棋游戲流程的詳細(xì)內(nèi)容,更多關(guān)于C語言 三子棋的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程實(shí)例
這篇文章主要介紹了C++機(jī)房預(yù)約系統(tǒng)實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-10-10
VC6.0打開文件以及向工程中添加文件時程序崩潰自動退出解決方法
vc6.0程序中,點(diǎn)擊打開文件以及向工程中添加文件時,程序竟然崩潰自動退出了,不知什么原因,安裝相同的vc程序,本本竟然出現(xiàn)此緣故2013-01-01
C語言實(shí)現(xiàn)BMP轉(zhuǎn)換JPG的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)BMP轉(zhuǎn)換JPG的方法,涉及C#圖片格式轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07
C++Node類Cartographer開始軌跡的處理深度詳解
這篇文章主要介紹了C++Node類Cartographer開始軌跡的處理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-03-03
Cocos2d-x學(xué)習(xí)筆記之開發(fā)環(huán)境搭建
這篇文章主要介紹了Cocos2d-x學(xué)習(xí)筆記之開發(fā)環(huán)境搭建,本文使用Visual Studio作為開發(fā)IDE,是不同于其它教程的,需要的朋友可以參考下2014-09-09
C++?AVL樹插入新節(jié)點(diǎn)后的四種調(diào)整情況梳理介紹
AVL樹是高度平衡的而二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個子樹的高度最大差別為1,本文主要給大家介紹了C++如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下2022-08-08

