c语言小游戏——三子棋

一. 基本流程

在写代码之前,我们首先要梳理好逻辑:

1.基本框架
2.菜单界面
3.创建棋盘
4.棋盘初始化
5.显示棋盘
6.玩家走
7.电脑走
8.判断胜负


二. 步骤

1.基本框架

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 menu()
{
	printf("**************************\n");
	printf("**** 1.play   0. exit ****\n");
	printf("**************************\n");
}

1.开始游戏 0.结束游戏


3.创建棋盘

棋盘用3行3列的二维数组来表示。
行和列可以用宏定义方法:
好处:
1. 修改棋盘很方便,只用改宏定义就可以
2. 提高代码可读性

#define ROW 3
#define COL 3
char board[ROW][COL] = { 0 };

4.棋盘初始化

把棋盘需要落子的地方初始化为’ '。

void InitBoard(char board[ROW][COL])
{
	int i = 0;
	for (i = 0; i < ROW; i++)
	{
		int j = 0;
		for (j = 0; j < COL; j++)
		{
			board[i][j] = ' ';
		}
	}
}

5.显示棋盘

为了方便棋盘随着ROW和COL的变化而变化,采用循环的打印方法。

void Display(char board[ROW][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)
		{
			for (j = 0; j < COL; j++)
			{
				printf("---");
				if (j < COL - 1)
				{
					printf("|");
				}
			}
			printf("\n");
		}
	}
}

6.玩家走

用 * 代表玩家落的子
注意:
1.玩家落子要在棋盘范围内。
2.玩家落子的位置必须是空的(’ ')。
3.输入坐标不满足要重新输入。

void PlayerMove(char board[ROW][COL])
{
	printf("玩家走\n");
	printf("请输入坐标:>");
	int x = 0;
	int y = 0;
	while (1)
	{
		scanf("%d %d", &x, &y);
		if (1 <= x && x <= ROW && 1 <= x && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
			{
				printf("坐标被占用,请重新输入\n");
			}
		}
		else
		{
			printf("输入错误,请重新输入\n");
		}
	}
	
}

电脑走

电脑随机数生成坐标,# 表示电脑落子
注意:
1.在主函数使用srand((unsigned int)time(NULL));
2.要在空的地方下

void ComputerMove(char board[ROW][COL])
{
	printf("电脑走\n");
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}

}

判断胜负

有四种情况:
1.玩家赢
2.电脑赢
3.都没赢,继续下
4.棋盘满了,平局

char BoardCheck(char board[ROW][COL])
{
	int flag = ' ';
	int i = 0;
	int j = 0;
	//横判断
	for (i = 0; i < ROW; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
		{
			flag = board[i][1];
			break;
		}
	}
	//竖判断
	for (i = 0; i < COL; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			flag = board[1][i];
			break;
		}
	}
	//斜判断
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
			{
				flag = board[1][1];
				break;
			}
		}
	}
	//平局判断
	char flag1 = 'a';
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == ' ')
			{
				flag1 = ' ';
				break;
			}
		}
	}
	if (flag1 == 'a')
	{
		return flag1;
	}
	return flag;
}

三. 结果演示

1.玩家胜利
在这里插入图片描述
2.电脑赢
在这里插入图片描述
3.平局

在这里插入图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

命由己造~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值