三子棋的简单介绍主打的是简单,各有所需,有什么疑问的,也可以评论区留言,24小时在线回复。OK,开始!
这个三子棋主要是利用数组来写
因为写的代码行数较多,这些代码我们要把他们分开管理
test.c/负责测试游戏的逻辑
game.c/游戏代码的实现
game.h/游戏代码的声明
在主函数(test.c)里面实现游戏逻辑:
首先,我们打印的菜单利用上do while 循环
1.给出菜单,输入 1 进行游戏,输入 0 退出游戏2.用户输入及选择,先给出个大概,理顺逻辑
写完可以先测试一下,保证当前代码没有任何问题。
3.把玩游戏的过程放game.c到里面,还要把输入的数据存起来(利用二维数组)
玩家下棋打印的是 ' * ' ,没下棋打印的是 ' ' (空格)。
把初始化棋盘,放到game.h里面声明
放到game.c里面定义后,为了方便以后更改游戏棋盘的行和列,我们把3替换成一个参数,进行 修改
回到主函数(test.c),初始化棋盘函数
注意需要包含的头文件
初始化数组的第几行第几列打印空格
打印棋盘的功能
声明
实现
为了不把代码写死,我们把一个数据和一个分割行看作一个数组进行打印
运行
回到主函数(test.c)中完成玩家的下棋步骤
声明
实现
为避免出现错误,在game.c上要进行坐标范围合法的判断在(game.c)上
运行来验证代码是否正确
电脑下棋步骤类似
注意电脑需要随机数来带动,使用时间戳(time)和生成随机数的 srand、rand 函数来实现
在主函数(test.c)处,
注意头文件
声明
实现
rand函数生成的随机数是0~32767,%1~的3值是0~2
运行
判断 输赢,创建 IsWin 函数
在声明那里约定
要对数组进行访问
打印几种情况
注意字母符号的大小写,我在 'C' 那里写成了 'c' 迷路了好久(哭死)
写IsWin函数来判断游戏的输赢
最后
运行
完整代码
1、test.c 的
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("***********************************\n");
printf("********** 1.play *********\n");
printf("********** 0.exit *********\n");
printf("***********************************\n");
printf("***********************************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
//初始化棋盘的函数
InitBoard(board, ROW, COL);
DispalyBoard(board, ROW, COL);
//下棋
char ret = 0;
while (1)
{
PlayerMove(board, ROW, COL);//玩家下棋
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
DispalyBoard(board, ROW, COL);//打印棋盘
ComputerMove(board, ROW, COL);//电脑下棋
//判断输赢
ret = IsWin(board, ROW, COL);
if (ret != 'C')
{
break;
}
DispalyBoard(board, ROW, COL);//打印棋盘
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
DispalyBoard(board, ROW, COL);//打印游戏结局
}
int main()
{// 强制类型转换 返回时间戳
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);
return 0;
}
2、game.c 的
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
void DispalyBoard(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++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
//打印分割信息
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋\n");
printf("请输入坐标:>");
scanf("%d %d", &x, &y);
//坐标范围合法判断
while (1)
{
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("坐标被占用,不能下棋,请选择其他位置\n");
break;
}
}
else
{
printf("坐标非法,请重新输入\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋:>\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;//0~2
y = rand() % col;//0~2
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//如果满了,返回 1
//不满,返回 0
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char IsWin(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][1] != ' ')
{
return board[i][1];
}
}
//列
int j = 0;
for (j = 0; j < col; j++)
{
//判断三个相不相等
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
{
return board[1][j];
}
}
//对角线
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
//没有人赢,就要平局
//判断数组里面有没有空格的问题
if (IsFull(board, row, col))
{
return 'Q';
}
//游戏继续
return 'C';
}
3、game.h 的
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);
//打印棋盘
void DispalyBoard(char board[ROW][COL],int row,int col);
//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col);
//电脑下棋
//找没有下棋的位置随机下棋
void ComputerMove(char board[ROW][COL], int row, int col);
//
//玩家赢 返回 '*'
//电脑赢 返回 '#'
//平局 返回 'Q'
//继续 返回 'C'
//
char IsWin(char board[ROW][COL], int row, int col);
OK,完结撒花!
至于为什么写的怎么简单的真正原因是:部分知识理解的并不通透,难以表达。
还在学习中,还要更加努力才行!