目录
一、问题分析
二、代码流程
1.简单的菜单
2.下棋的方案
3.棋盘初始化
4.玩家下棋
5.电脑下棋
6.判定输赢
7.头文件
8.主函数
三、总结
一、问题分析
1.写一个简单的菜单界面,供用户进行选择
2.下棋的总方案,需要实现哪些具体的步骤
3.就是将我们的棋盘进行初始化
4.玩家进行下棋的方式
5.电脑进行下棋的方式
6.判断电脑和玩家谁获胜
二、代码流程
1.简单的菜单
只有简单的两个功能,输入1是开始玩游戏,输入0是退出游戏
void menu()
{
printf("*************************\n");
printf("******* ********\n");
printf("******* ********\n");
printf("*************************\n");
}
void test()
{
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);
}
2.下棋的方案
// 游戏总方案
void game()
{
// 棋盘的创立
char board[ROW][COL] = { 0 };
// 初始化棋盘
init_Board(board, ROW, COL);
// 打印棋盘
Print_Board(board,ROW,COL);
// 游戏开始
while (1)
{
// 玩家输入
printf("玩家输入\n");
Player_move(board, ROW, COL);
Print_Board(board, ROW, COL);
//判断胜利条件
if (Win_Name(board, ROW, COL) == '*') { // 返回值为1,说明玩家胜利
printf("恭喜你赢了\n");
break;
}
if (Board_Max(board, ROW, COL) == 1){ // 判断棋子是否满了
printf("真菜!还打成平手\n");
break;
}
// 电脑输入
printf("电脑输入.............................\n");
Sleep(1000); //延迟1秒
Computer_move(board, ROW, COL);
Print_Board(board, ROW, COL);
if (Win_Name(board, ROW, COL) == '#') { // 返回值为#,说明电脑胜利
printf("真菜!人机都打不过\n");
break;
}
if (Board_Max(board, ROW, COL) == 1) { // 判断棋子是否满了
printf("真菜!还打成平手\n");
break;
}
}
}
3.棋盘初始化
建立一个二维数组作为棋盘,这一步骤是将棋盘的值先初始化为空格,然后再设置一个样式。
// 棋盘初始化,将所有值设置为空格
void init_Board(char board[][COL], int row, int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
board[i][j] = ' ';
printf("\n");
}
// 打印棋盘,为棋盘设置一个好看的样式
void Print_Board(char board[][COL],int row,int col) {
printf("+---+---+---+\n");
for (int row = 0; row < ROW; row++) {
printf("| %c | %c | %c |\n", board[row][0],board[row][1], board[row][2]);
printf("+---+---+---+\n");
}
printf("\n");
}
4.玩家下棋
这一步骤让玩家通过输入来确认在哪个位置下棋,判断这个位置是否合理,如不合理让玩家重新输入。
// 玩家下棋
void Player_move(char board[][COL], int row, int col)
{
while (1)
{
// 定义坐标
int x = 0; // 行
int y = 0; // 列
printf("输入方法:行 列 \n");
printf("请输入您的坐标(row,col):> ");
scanf("%d %d", &x, &y);
// 判断这个坐标是否在合理范围,行和列均从1开始
if (x >= 0 && x <= row && y >= 0 && y <= col)
{
if (board[x-1][y-1] != ' ')
printf("此位置已有棋子,无法下棋\n");
else
{
board[x-1][y-1] = '*'; // *号代表是玩家下的棋
break;
}
}
else
printf("您输入的坐标不合理,请重新输入\n");
}
}
5.电脑下棋
这一步骤是通过一个传入一个随机值来让电脑进行随机下棋。
// 电脑输入
void Computer_move(char board[][COL], int row, int col)
{
while (1)
{
int x = rand() % (row+1);
int y = rand() % (col+1);
//检查电脑下棋的位置是否有棋子
if (board[x - 1][y - 1] != ' ')
continue;
board[x - 1][y - 1] = '#'; // # 为电脑下棋
break;
}
}
6.判定输赢
三子棋游戏的输赢是看数组中横、竖、斜的字符是否相等,如果相等就传回其中一个值。如果棋盘已满,则为平手。
// 判断谁胜利
char Win_Name(char board[][COL], int row, int col)
{
// 胜利条件是横排或者竖排或者斜对角线都是相同符号,满足其中一个条件即可
// 玩家胜利
int i, j = 0;
// 判断横排是否相等
for (i = 0; i < row; i++)
{
if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
return board[i][0];
}
}
// 判断竖排是否相等
for (i = 0; i < col; i++) {
if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {
return board[0][i];
}
}
// 判断左斜线是否相等
if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
return board[0][0];
}
// 判断右斜线是否相等
if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
return board[1][1];
}
return 0;
}
// 判断是否棋满
int Board_Max(char board[][COL], int row, int col)
{
int i, j;
int count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
if (board[i][j] != ' ')
count++;
}
if (count == row * col)
return 1;
return 0;
}
7.头文件
#include <>
#include <> // 包含 time
#include <> // 包含 rand、srand
#include <> // 包含 Sleep
// 棋盘大小的初始值设置
#define ROW 3
#define COL 3
// 棋盘初始化
void init_Board(char board[][COL],int row,int col);
// 打印棋盘
void Print_Board(char board[][COL], int row, int col);
// 玩家输入
void Player_move(char board[][COL], int row, int col);
// 电脑输入
void Computer_move(char board[][COL], int row, int col);
// 判断谁赢了
char Win_Name(char board[][COL], int row, int col);
// 判断是否棋盘
int Board_Max(char board[][COL], int row, int col);
8.主函数
int main()
{
srand((unsigned int)time(NULL)); // 设置随机数
test();
return 0;
}
三、总结
进行一个大工程的代码实现,最好就是先理清思路,设计好一个总方案以及具体需要实现的步骤,才能把复杂问题变成简单问题。再写这篇代码之前,可以先看了别人写的代码,了解后再用自己擅长的方式进行填写。