这是我的第一个C语言小游戏:三子棋。
下面分享一下我的思路:
代码分为四个部分:utili.h是存放头文件;game.h是存放函数声明;game.c是游戏内所需要的函数的代码编写;gameMain.c是进行游戏的逻辑编写。
<1>打印菜单栏
首先我们进入游戏肯定会看到菜单栏进行选择玩游戏或者退出,1就是玩游戏,0就是退出游戏。代码如下:
//这里在gameMain.c源文件中
int select = 1;
while(select)
{
printf("********************************n");
printf("* 简 易 三 子 棋 *n");
printf("********************************n");
printf("* [1] Play *n");
printf("* [0] Exit *n");
printf("********************************n");
printf("请选择:>");
scanf("%d", &select);
if(select == 0)
break;
if(select != 1)
{
printf("输入的选项有误,请重新输入......n");
continue;
}
在这里我把菜单放到了主函数里,也可以单独写一个函数。
<2>初始化棋盘
三子棋游戏中的棋盘我们用空格来初始化,代码如下:
//这里在game.c源文件中
void InitChessBoard(char chess_board[ROW][COL])//ROW是行,COL是列,可以在文件前做一个宏定义
{ //#define ROW 3
for(int i=0; i
<3>显示棋盘
这里打印出棋盘的样子,代码如下:
//utili.h头文件中的代码
//预防头文件重复引入
#ifndef _UTILI_H_
#define _UTILI_H_
#include
#include
#include
#endif
//game.h头文件中的代码
#ifndef _GAME_H_
#define _GAME_H_
#include"utili.h"
#define ROW 3
#define COL 3
//函数申明
void StartGame();
void InitChessBoard(char chess_board[ROW][COL]);
void DisplayChessBoard(char chess_board[ROW][COL]);
#endif
//这里在game.c源文件中
void DisplayChessBoard(char chess_board[ROW][COL])
{
for(int i=0; i
这里可以自己调整成自己喜欢的样子。
<4>玩家下棋
写完玩家下棋函数后在头文件里加入声明。
//game.c源文件中的代码
void PlayerMove(char chess_board[ROW][COL])
{
int x, y;
printf("玩家下棋.n");
printf("请输入坐标:>");
while(1)
{
scanf("%d %d", &x, &y);
//检查坐标的有效性
if(x<0||x>=ROW || y<0 || y>COL)
{
printf("输入的坐标不合法,请重新输入.....n");
continue;
}
//检查坐标是否被占用
if(chess_board[x][y] == ' ')
{
chess_board[x][y] = PLAYER_CHESS_SYMBAL;
break;
}
}
}
<5>电脑下棋
电脑下棋要随机下棋可以写一个随机数函数(根据时间生成数值)
//电脑下棋
void ComputerMove(char chess_board[ROW][COL])
{
int x, y;
srand(time(0));//种一个随机数种子
while(1)
{
x = rand()%ROW;
y = rand()%COL;
if(chess_board[x][y] == ' ')
{
chess_board[x][y] = COMPUTER_CHESS_SYMBAL; //'o'
break;
}
}
}
<6>判满
我们需要判断胜负首先要知道棋盘是否下满,这就要我们写一个判满函数。代码如下:
bool ChessBoardFull(char chess_board[ROW][COL])
{
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
if (chess_board[i][j] == ' ')
{
return false;
}
}
}
return true;
}
<7>检查结果
有四种情况就是玩家赢,电脑赢,平局,继续游戏,我们可以有一个返回值,根据返回值来判。比如玩家赢我们就返回'x',电脑赢我们就返回'o',平局就返回'h',继续游戏就返回'c'。
//检查结果
//'c': 继续
//'x':玩家赢
//'o': 电脑赢
//'h': 和棋
char CheckResult(char chess_board[ROW][COL])
{
//1 检查行
for (int i = 0; i < ROW; ++i)
{
if ((chess_board[i][0] != ' ') &&
(chess_board[i][0] == chess_board[i][1]) &&
(chess_board[i][0] == chess_board[i][2]))
return chess_board[i][0];
}
//2 检查列
for (int i = 0; i < ROW; ++i)
{
if ((chess_board[0][i] != ' ') &&
(chess_board[0][i] == chess_board[1][i]) &&
(chess_board[0][i] == chess_board[2][i]))
return chess_board[0][i];
}
//3 检查对角线
if ((chess_board[0][0] != ' ') &&
(chess_board[0][0] == chess_board[1][1]) &&
(chess_board[0][0] == chess_board[2][2]))
return chess_board[1][1];
if ((chess_board[1][1] != ' ') &&
(chess_board[1][1] == chess_board[2][0]) &&
(chess_board[1][1] == chess_board[0][2]))
return chess_board[1][1];
//4 检查是否和棋
if (ChessBoardFull(chess_board))
return 'h';
return 'c';
}
<8>开始游戏
将以上所有的函数进行三子棋游戏逻辑进行组装函数,代码如下:
void StartGame()
{
//定义棋盘
char chess_board[ROW][COL];
//初始化棋盘
InitChessBoard(chess_board);
//进入游戏
char winner;
while(1)
{
//显示棋盘
DisplayChessBoard(chess_board);
//玩家下棋
PlayerMove(chess_board);
//判断结果
winner = CheckResult(chess_board);
if(winner != 'c')
break;
//电脑下棋
ComputerMove(chess_board);
//判断结果
winner = CheckResult(chess_board);
if (winner != 'c')
break;
}
DisplayChessBoard(chess_board);
//显示结果
if(winner == 'x')
{
//玩家赢
printf("玩家胜利.n");
}
else if(winner == 'o')
{
//电脑赢
printf("电脑胜利.n");
}
else if(winner == 'h')
{
//和棋
printf("和棋.n");
}
else
{
//程序出错
printf("error.n");
}
}
<9>utili.h全部代码
//预防头文件重复引入
#ifndef _UTILI_H_
#define _UTILI_H_
#include
#include
#include
#endif
<10>game.h全部代码
#ifndef _GAME_H_
#define _GAME_H_
#include"utili.h"
#define ROW 3
#define COL 3
//函数申明
void StartGame();
void InitChessBoard(char chess_board[ROW][COL]);
void DisplayChessBoard(char chess_board[ROW][COL]);
bool ChessBoardFull(char chess_board[ROW][COL]);
void PlayerMove(char chess_board[ROW][COL]);
void ComputerMove(char chess_board[ROW][COL]);
char CheckResult(char chess_board[ROW][COL]);
#endif
<11>game.c全部代码
#include"game.h"
#define PLAYER_CHESS_SYMBAL 'x'
#define COMPUTER_CHESS_SYMBAL 'o'
//初始化棋盘
void InitChessBoard(char chess_board[ROW][COL])
{
for(int i=0; i");
while(1)
{
scanf("%d %d", &x, &y);
//检查坐标的有效性
if(x<0||x>=ROW || y<0 || y>COL)
{
printf("输入的坐标不合法,请重新输入.....n");
continue;
}
//检查坐标是否被占用
if(chess_board[x][y] == ' ')
{
chess_board[x][y] = PLAYER_CHESS_SYMBAL;
break;
}
}
}
//电脑下棋
void ComputerMove(char chess_board[ROW][COL])
{
int x, y;
srand(time(0));
while(1)
{
x = rand()%ROW;
y = rand()%COL;
if(chess_board[x][y] == ' ')
{
chess_board[x][y] = COMPUTER_CHESS_SYMBAL; //'o'
break;
}
}
}
//检查结果
//'c': 继续
//'x':玩家赢
//'o': 电脑赢
//'h': 和棋
char CheckResult(char chess_board[ROW][COL])
{
//1 检查行
for (int i = 0; i < ROW; ++i)
{
if ((chess_board[i][0] != ' ') &&
(chess_board[i][0] == chess_board[i][1]) &&
(chess_board[i][0] == chess_board[i][2]))
return chess_board[i][0];
}
//2 检查列
for (int i = 0; i < ROW; ++i)
{
if ((chess_board[0][i] != ' ') &&
(chess_board[0][i] == chess_board[1][i]) &&
(chess_board[0][i] == chess_board[2][i]))
return chess_board[0][i];
}
//3 检查对角线
if ((chess_board[0][0] != ' ') &&
(chess_board[0][0] == chess_board[1][1]) &&
(chess_board[0][0] == chess_board[2][2]))
return chess_board[1][1];
if ((chess_board[1][1] != ' ') &&
(chess_board[1][1] == chess_board[2][0]) &&
(chess_board[1][1] == chess_board[0][2]))
return chess_board[1][1];
//4 检查是否和棋
if (ChessBoardFull(chess_board))
return 'h';
return 'c';
}
//开始游戏
void StartGame()
{
//定义棋盘
char chess_board[ROW][COL];
//初始化棋盘
InitChessBoard(chess_board);
//进入游戏
char winner;
while(1)
{
//显示棋盘
DisplayChessBoard(chess_board);
//玩家下棋
PlayerMove(chess_board);
//判断结果
winner = CheckResult(chess_board);
if(winner != 'c')
break;
//电脑下棋
ComputerMove(chess_board);
//判断结果
winner = CheckResult(chess_board);
if (winner != 'c')
break;
}
DisplayChessBoard(chess_board);
//显示结果
if(winner == 'x')
{
//玩家赢
printf("玩家胜利.n");
}
else if(winner == 'o')
{
//电脑赢
printf("电脑胜利.n");
}
else if(winner == 'h')
{
//和棋
printf("和棋.n");
}
else
{
//程序出错
printf("error.n");
}
}
<12>gameMain.c全部代码
#include"game.h"
int main(int argc, char *argv[])
{
int select = 1;
while(select)
{
printf("********************************n");
printf("* 简 易 三 子 棋 *n");
printf("********************************n");
printf("* [1] Play *n");
printf("* [0] Exit *n");
printf("********************************n");
printf("请选择:>");
scanf("%d", &select);
if(select == 0)
break;
if(select != 1)
{
printf("输入的选项有误,请重新输入......n");
continue;
}
//开始游戏
StartGame();
}
printf("Game Over, 拜拜......n");
return 0;
}



