目录
一、游戏规则(逻辑图)
二、实现方法
1.创建游戏初始界面
2.定义并初始化棋盘
3.显示棋盘
4.玩家电脑下棋
5.判断结果
三、内容整合
1.头文件函数及函数声明(game.h)
2.游戏主函数(gameMain.c)
3.游戏实现部分(game.c)
四、最终效果图
一、游戏规则
玩家每人选择一种棋子,先三个棋子连成一线的一方为胜方,横向、竖向、斜向均可
二、实现方法
1.创建游戏初始界面
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;
}
2.定义并初始化棋盘
char chess_board[ROW][COL];//定义棋盘
void InitChessBoard(char chess_board[ROW][COL])//初始化棋盘
{
for (int i = 0; i < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
chess_board[i][j] = ' ';
}
}
}
3.显示棋盘
void DisplayChessBoard(char chess_board[ROW][COL])//显示棋盘
{
for (int i = 0; i < ROW; ++i)
{
printf("| %c | %c | %c |\n", chess_board[i][0],
chess_board[i][1],
chess_board[i][2]);
if (i < ROW - 1)
printf(" --- --- ---\n");
}
}
4.玩家电脑下棋
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;
}
}
}
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;
}
}
}
5.判断结果
char CheckResult(char chess_board[ROW][COL])//检查结果 'c' 继续,'x'玩家赢,
//'o' 电脑赢,'h' 和棋
{
for (int i = 0; i < ROW; i++)//1 检查行
{
if (chess_board[i][0] == chess_board[i][1] &&
chess_board[i][1] == chess_board[i][2] &&
chess_board[i][2] != ' ')
{
return chess_board[i][2];
}
}
for (int j = 0; j < COL; j++) //2 检查列
{
if (chess_board[0][j] == chess_board[1][j] &&
chess_board[1][j] == chess_board[2][j] &&
chess_board[2][j] != ' ')
{
return chess_board[2][j];
}
}
if (chess_board[0][0] == chess_board[1][1] &&
chess_board[1][1] == chess_board[2][2] &&
chess_board[2][2] != ' ') //3 检查主对角线
{
return chess_board[1][1];
}
if (chess_board[0][2] == chess_board[1][1] &&
chess_board[1][1] == chess_board[2][0] &&
chess_board[2][0] != ' ') //3 检查副对角线
{
return chess_board[1][1];
}
for (int i = 0; i < ROW; ++i)//4 检查是否有空格
{
for (int j = 0; j < COL; ++j)
{
if (chess_board[i][j] == ' ')
{
return 'c';
}
}
}
return 'h';
}
三、内容整合
1.头文件函数及函数声明(game.h)
#ifndef _GAME_H_
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#define ROW 3
#define COL 3
//函数申明
void StartGame();
void InitChessBoard(char chess_board[ROW][COL]);
void DisplayChessBoard(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 /* _GAME_H_ */
2.游戏主函数(gameMain.c)
#define _CRT_SECURE_NO_WARNINGS
#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;
}
3.游戏实现部分(game.c)
#define _CRT_SECURE_NO_WARNINGS
#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 < ROW; ++i)
{
for (int j = 0; j < COL; ++j)
{
chess_board[i][j] = ' ';
}
}
}
void DisplayChessBoard(char chess_board[ROW][COL])//显示棋盘
{
for (int i = 0; i < ROW; ++i)
{
printf("| %c | %c | %c |\n", chess_board[i][0],
chess_board[i][1],
chess_board[i][2]);
if (i < ROW - 1)
printf(" --- --- ---\n");
}
}
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;
}
}
}
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;
}
}
}
char CheckResult(char chess_board[ROW][COL])//检查结果 'c' 继续,'x'玩家赢,'o' 电脑赢,'h' 和棋
{
for (int i = 0; i < ROW; i++)//1 检查行
{
if (chess_board[i][0] == chess_board[i][1] &&
chess_board[i][1] == chess_board[i][2] &&
chess_board[i][2] != ' ')
{
return chess_board[i][2];
}
}
for (int j = 0; j < COL; j++) //2 检查列
{
if (chess_board[0][j] == chess_board[1][j] &&
chess_board[1][j] == chess_board[2][j] &&
chess_board[2][j] != ' ')
{
return chess_board[2][j];
}
}
if (chess_board[0][0] == chess_board[1][1] &&
chess_board[1][1] == chess_board[2][2] &&
chess_board[2][2] != ' ') //3 检查主对角线
{
return chess_board[1][1];
}
if (chess_board[0][2] == chess_board[1][1] &&
chess_board[1][1] == chess_board[2][0] &&
chess_board[2][0] != ' ') //3 检查副对角线
{
return chess_board[1][1];
}
for (int i = 0; i < ROW; ++i)//4 检查是否有空格
{
for (int j = 0; j < COL; ++j)
{
if (chess_board[i][j] == ' ')
{
return 'c';
}
}
}
return 'h';
}
void StartGame()//开始游戏
{
char chess_board[ROW][COL];//定义棋盘
InitChessBoard(chess_board);//初始化棋盘
DisplayChessBoard(chess_board);//显示棋盘
char winner;
while (1)//进入游戏
{
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("程序出错\n");//程序出错
}
}
四、最终效果图