1.在主函数中先打印出菜单
2.定义棋盘的大小 创建二维数组 并且打印出棋盘
将3×3的数组都设为空格 之后的下棋步骤 是替换空格的位置 不是空格的位置不能下棋
打印3×3的数组 并且将棋盘的边线也打印出来 如下图
3.打印出棋盘之后 开始玩家和电脑下棋
双方每下一步棋 打印一次目前棋盘 在输赢之前一直持续 因此做while循环 当一方获胜时退出
![]()
玩家下棋 坐标范围控制在1~3之间 如果不是 则打印”坐标输入错误“
如果是空格 则可以下 如果不是 打印”该坐标被占用“
电脑下棋 随机产生两个数 % 可以将产生的两个数大小控制在0~2之间
然后替换空格 完成则退出 产生的两个数确定的位置被占用 则重新生成两个数
4.判断获胜
//电脑赢--'#'
//玩家赢--'*'
//平局----'Q'
//继续----'C'判断函数如果输出是C 那么说明游戏还未结束
如果不是C 说明有人获胜 或者平局
所以在玩家和电脑下棋之后都应该判断一下
如果三点一线成功 那么返回所在位置的符号 和ret进行比较 是哪方获胜
判断平局函数 :如果所有位置都被占用 且无人获胜 那么返回Q 平局
整体思路顺序就是这样 下方请看所有代码
创建三个源代码 对应下方三部分分别是
将所用到的函数 和头文件在放在 game.h 中
后面两个只需要包含第一个就行 #include"game.h"
头文件
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void Initboard(char board[ROW][COL], int row, int col);//初始化棋盘
void Displayboard(char board[ROW][COL],int row ,int col );//打印棋盘
void player_move(char board[ROW][COL],int row ,int col );//玩家下棋
void computer_move(char board[ROW][COL],int row ,int col );//电脑下棋
char is_win(char board[ROW][COL], int row, int col);//判断输赢
游戏实现顺序
#include"game.h"
void menu()
{
printf("*************************\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("*************************\n");
}
void game()
{
char ret;
//存放下棋的数据
char board[ROW][COL] = { 0 };
//初始化棋盘为空格
Initboard(board, ROW, COL);
//打印棋盘
Displayboard(board, ROW, COL);
while (1) {
//玩家下棋
player_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret=is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
//电脑下棋
computer_move(board, ROW, COL);
Displayboard(board, ROW, COL);
//判断输赢
ret = is_win(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '#')
{
printf("电脑赢!\n");
}
else if (ret == '*')
{
printf("玩家赢!\n");
}
else
printf("平局!\n");
}
//电脑赢--'#'
//玩家赢--'*'
//平局----'Q'
//继续----'C'
void test()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf_s("%d", &input);
switch (input)
{
case 1:
game();//菜单
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
游戏的各部分功能实现
#include"game.h"
void Initboard(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < ROW; i++)
{
int j;
for (j = 0; j < COL; j++)
{
board[i][j] = ' ';
}
}
}
void Displayboard(char board[ROW][COL], int row, int col)
{
int i;
for (i = 0; i < ROW; i++)
{
//打印数据
int j;
for (j = 0; j < COL; j++)
{
printf(" %c ", board[i][j]);
if (j < COL - 1)
printf("|");
}
printf("\n");
//打印分割行
if (i < ROW - 1)
{
for (j = 0; j < COL; j++)
{
printf("---");
if (j < COL - 1)
printf("|");
}
printf("\n");
}
}
}
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("请输入坐标:");
while (1)
{
scanf_s("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标被占用,请重新输入:");
}
}
else
{
printf("坐标输入错误!请重新输入");
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋:\n");
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
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] && board[i][0] != ' ')
{
return board[i][0];
break;
}
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
break;
}
}
//对角线
if (board[1][1] == board[2][2] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (is_full(board,row,col) == 1)
{
return 'Q';
}
//继续
return 'C';
}