简单介绍的三子棋实现

  三子棋的简单介绍主打的是简单,各有所需,有什么疑问的,也可以评论区留言,24小时在线回复。OK,开始!

  这个三子棋主要是利用数组来写

  因为写的代码行数较多,这些代码我们要把他们分开管理

4f195b9eb14f4eca9a034e1db9309a90.png

test.c/负责测试游戏的逻辑

game.c/游戏代码的实现

game.h/游戏代码的声明

  在主函数(test.c)里面实现游戏逻辑:

  首先,我们打印的菜单利用上do while 循环af548c7f3af54be1934dcbdab3afe4bb.png

1.给出菜单,输入 1 进行游戏,输入 0 退出游戏6b9093e9391740348f5473964e466dd9.png2.用户输入及选择,先给出个大概,理顺逻辑

34aeeb180c5b48728ede8b4ddc97d856.png1703b98381664547899bba0c75a054fe.png

  写完可以先测试一下,保证当前代码没有任何问题。

3.把玩游戏的过程放game.c到里面,还要把输入的数据存起来(利用二维数组)

e2e53979730a4dbe95feceb240b64ac6.png

  玩家下棋打印的是 ' * ' ,没下棋打印的是 '   ' (空格)。

  把初始化棋盘,放到game.h里面声明55f7bde039ef43b598432204c4a894a5.png

  放到game.c里面定义后,为了方便以后更改游戏棋盘的行和列,我们把3替换成一个参数,进行  修改ab41d1f8824d44d29bdc62790ee01955.png

  回到主函数(test.c),初始化棋盘函数

  注意需要包含的头文件b57bc1555aa64bd9b98fe4336f8b04fe.png

  初始化数组的第几行第几列打印空格a2e20525097541d4910ae16ff8dafe56.png

  打印棋盘的功能

909cadd0fa8a4ec395ee1b19093b0027.png

  声明4d0efbf157ab4ae1975cb6ff16fa9e17.png

  实现e6c133ec33d443fa931f01be3b32a43b.png

  为了不把代码写死,我们把一个数据和一个分割行看作一个数组进行打印

51f214f9b7d647c4a7e3cc15fe6d37c3.png

  运行

2ecc69db102c4a7980e95359cceb89aa.png

  回到主函数(test.c)中完成玩家的下棋步骤

0ebb93788d074292908ccfde8a07587f.png

  声明07642631acf94d6e8c914c6613ec0d50.png

  实现bc08632741f04c8a984c77085ed3590a.png

  为避免出现错误,在game.c上要进行坐标范围合法的判断在(game.c)上

1f7cf9b654fc4c869b7e0538f4805583.png

  运行来验证代码是否正确

efdc187a50664c56b8ca6ac204ff1174.png

  电脑下棋步骤类似

  注意电脑需要随机数来带动,使用时间戳(time)和生成随机数的 srand、rand  函数来实现

  在主函数(test.c)处,

5f98ba5c2bfb4fbf807bc481af02ced8.png

  注意头文件

516f77ccce2a47ea9d5dd2d7fdc22a4a.png

  声明

2b99b947df1a48a5b9cbdcf2272c78a8.png

  实现

43fd2049b2f44c1bbc6e1d57b5ec7781.png

  rand函数生成的随机数是0~32767,%1~的3值是0~2

  运行

c1565e32504944b3ada2c449f34c8025.png

判断  输赢,创建 IsWin 函数

eb2f6ee5e2da4ed9bf1b7fbf17705840.png

  在声明那里约定

e56e884308c545ef9130566c9fa2347d.png

  要对数组进行访问

ea940c42a48c43d1a0d810c556b8c298.png

  打印几种情况

d93fc5fe206543d38b45538e20409fc4.png

  注意字母符号的大小写,我在 'C' 那里写成了 'c' 迷路了好久(哭死) 

  写IsWin函数来判断游戏的输赢9a8d5aff816b48569dcd587f9d3a6d14.png

cad80de9ea5443409f4de4da568f2c03.pngdb6f50442a1d40a598398aae9f8cf3b1.png38f196d5ee0d49d3b74ab15a0ae744c0.png

  最后

56eff63dd45e49e29c2429502154a391.png

  运行

277fabe4a6ce497ba6196cae62d7e5f1.png    完整代码

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,完结撒花!

  至于为什么写的怎么简单的真正原因是:部分知识理解的并不通透,难以表达。

  还在学习中,还要更加努力才行!

  拜拜,下次的博客,我会做的更好,期待下一次见面~~~~啦~

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是JOJO嘛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值