三子棋小游戏

一、三子棋简介

三子棋,民间传统游戏,又叫九宫棋、井字棋等。对局开始时,先由执任意一方将一枚棋子落在棋盘上,然后由另一方在已落的棋子子周围的交叉点上落子,只要将自己的三个棋子走成一条线,对方就算输了。

二、流程逻辑

三、函数模块

(1)初始化:定义一个三行三列的数组,每一个元素的值为0

void Init(int array[3][3])
{
	int i, j = 0;
	for (i = 0; i < 3; i++)
	for (j = 0; j < 3; j++)
	{
		array[i][j] = 0;
	}
}

(2)输出棋盘

void Print(int array[3][3])
{
	system("cls");
	printf("==========三子棋==========\n");
	int i, j = 0;
	for (i = 0; i < 3; i++)
	{
		printf("\t");
		for (j = 0; j < 3; j++)
		{
			if (array[i][j] == 0)
			{
				printf("   ");
				if (j < 3 - 1)
					printf("|");
			}
			if (array[i][j] == 1)
			{
				printf(" X ");
				if (j < 3 - 1)
					printf("|");
			}
			if (array[i][j] == 4)
			{
				printf(" O ");
				if (j < 3 - 1)
					printf("|");
			}
		}
		printf("\n");
		if (i < 3 - 1)
		{
			printf("\t");
			for (j = 0; j < 3; j++)
			{
				if (i < 3 - 1)
					printf("---");
				if (j < 3 - 1)

					printf("|");
			}
			printf("\n");
		}
	}
	printf("注意:坐标由数字1、2、3组成,例如:3 2\n");
}

(3)玩家走棋:输入坐标,坐标由数字1、2、3组成(坐标不合法将重新输入),输入坐标后,把所在的元素置为1,方便计算胜负以及电脑如何走棋。

void PlayMove(int array[3][3])
{
	int row, col = 0;

	while (1)
	{
		printf("请输入坐标:");
		scanf("%d %d", &row, &col);
		if ((row <= 0 && row >= 4) && (col <= 0 && col >= 4))
		{
			system("cls");
			printf("坐标不合法!!!\n");
			continue;
		}
		if (0 == array[row - 1][col - 1])
		{
			array[row - 1][col - 1] = 1;
			break;
		}
		else
			printf("您输入的坐标被占用 !!!\n");
	}
}

(4)电脑走棋:首先判断是否可以赢,接着判断对方是否可以赢,如果以上两者都不满足,先占最中心,其次占角,剩下的随机生成。

void ComputerMove(int array[3][3])
{
	int i, j = 0;
	int sum = 0;
	for (i = 0; i < 3; i++)
	{
		sum = 0;
		for (j = 0; j < 3; j++)
		{
			sum = sum + array[i][j];
		}
		if (sum >= 8)
		{
			for (j = 0; j < 3; j++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	for (j = 0; j < 3; j++)
	{
		sum = 0;
		for (i = 0; i < 3; i++)
		{
			sum = sum + array[i][j];
		}
		if (sum >= 8)
		{
			for (i = 0; i < 3; i++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	sum = array[0][0] + array[1][1] + array[2][2];
	if (sum >= 8)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][i])
			{
				array[i][i] = 4;
				return;
			}
		}
	}
	sum = array[0][2] + array[1][1] + array[2][0];
	if (sum >= 8)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][2 - i])
			{
				array[i][i - 2] = 4;
				return;
			}
		}
	}

	for (i = 0; i < 3; i++)
	{
		sum = 0;
		for (j = 0; j < 3; j++)
		{
			sum = sum + array[i][j];
		}
		if (sum == 2 || sum == 6)
		{
			for (j = 0; j < 3; j++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	for (j = 0; j < 3; j++)
	{
		sum = 0;
		for (i = 0; i < 3; i++)
		{
			sum = sum + array[i][j];
		}
		if (sum == 2 || sum == 6)
		{
			for (i = 0; i < 3; i++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	sum = array[0][0] + array[1][1] + array[2][2];
	if (sum == 2 || sum == 6)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][i])
			{
				array[i][i] = 4;
				return;
			}
		}
	}
	sum = array[0][2] + array[1][1] + array[2][0];
	if (sum == 2 || sum == 6)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][2 - i])
			{
				array[i][i - 2] = 4;
				return;
			}
		}
	}

	if (0 == array[1][1])
	{
		array[1][1] = 4;
		return;
	}

	for (i = 0; i < 3; i += 2)
	{
		for (j = 0; j < 3; j += 2)
		if (0 == array[i][j])
		{
			array[i][j] = 4;
			return;
		}

	}

	system("cls");
	printf("电脑正在思考!!!\n");
	while (1)
	{
		srand(time(NULL));
		i = rand() % 3;
		j = rand() % 3;
		if (0 == array[i][j])
		{
			system("cls");
			array[i][j] = 4;
			break;
		}
	}

}

(5)判断输赢:玩家所下棋子的元素为1,电脑所下棋子的元素为4,计算行列及对角线的元素和,如果和为3或者12则有一方已经赢棋,返回1;所有元素都不为0,为和棋返回2;否则返回0,无法判断输赢。

int IsWine(int array[3][3])
{
	int i, j = 0;
	int sum = 0;
	for (i = 0; i < 3; i++)
	{
		sum = 0;
		for (j = 0; j < 3; j++)
		{
			sum = sum + array[i][j];
		}
		if (3 == sum || 12 == sum)
		{
			return 1;
		}
	}

	for (j = 0; j < 3; j++)
	{
		sum = 0;
		for (i = 0; i < 3; i++)
		{
			sum = sum + array[i][j];
		}
		if (3 == sum || 12 == sum)
		{
			return 1;
		}
	}

	int win = 0;
	win = array[0][0] + array[1][1] + array[2][2];
	if (3 == win || 12 == win)
	{
		return 1;
	}

	win = array[0][2] + array[1][1] + array[2][0];
	if (3 == win || 12 == win)
	{
		return 1;
	}
	while (1)
	{
		for (j = 0; j < 3; j++)
		{
			for (i = 0; i < 3; i++)
			{
				if (0 == array[i][j])
					return 0;
			}
		}
		return 2;
	}
	return 0;
}

(6)主菜单

void Menu1()
{
	printf("Wlecome to play game!!!\n");
	printf("     1.play \n");
	printf("     0.exit \n");
	printf("请选择:");
}

(7)玩游戏

void play()
{
	int choices = 0;
	int array[3][3] = { 0 };
	int win = 0;
	while (1)
	{
		Menu1();
		scanf("%d", &choices);
		if (0 == choices)
			return;
		while (1)
		{
			Menu2();
			scanf("%d", &choices);
			Init(array);
			if (1 == choices)
				goto Part1;
			Print(array);
			while (1)
			{
				PlayMove(array);
				Print(array);
				win = IsWineTest(array);
				if (1 == win)
				{
					printf("您真厉害!!!\n");
					break;
				}
				else if (2 == win)
				{
					printf("平局!!!\n");
					break;
				}
			Part1:
				ComputerMoveAd(array);
				Print(array);
				win = IsWineTest(array);
				if (1 == win)
				{
					printf("很遗憾您输了!!!\n");
					break;
				}
				else if (2 == win)
				{
					printf("平局!!!\n");
					break;
				}
			}
			break;
		}
	}
}

(8)主函数

int main()
{
	play();
	return 0;
}

四、运行界面

(1)进入游戏

(2)选择谁先走

(3)输入由数字1、2、3组成的坐标

(4)输入错误将重新输入

(5)电脑走棋,刷新后打印出棋盘

(6)一局完成后,选择1继续玩游戏,选择0退出

五、源代码

#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <windows.h>

void Init(int array[3][3])
{
	int i, j = 0;
	for (i = 0; i < 3; i++)
	for (j = 0; j < 3; j++)
	{
		array[i][j] = 0;
	}
}

void Print(int array[3][3])
{
	system("cls");
	printf("==========三子棋==========\n");
	int i, j = 0;
	for (i = 0; i < 3; i++)
	{
		printf("\t");
		for (j = 0; j < 3; j++)
		{
			if (array[i][j] == 0)
			{
				printf("   ");
				if (j < 3 - 1)
					printf("|");
			}
			if (array[i][j] == 1)
			{
				printf(" X ");
				if (j < 3 - 1)
					printf("|");
			}
			if (array[i][j] == 4)
			{
				printf(" O ");
				if (j < 3 - 1)
					printf("|");
			}
		}
		printf("\n");
		if (i < 3 - 1)
		{
			printf("\t");
			for (j = 0; j < 3; j++)
			{
				if (i < 3 - 1)
					printf("---");
				if (j < 3 - 1)

					printf("|");
			}
			printf("\n");
		}
	}
	printf("注意:坐标由数字1、2、3组成,例如:3 2\n");
}

int IsWine(int array[3][3])
{
	int i, j = 0;
	int sum = 0;
	for (i = 0; i < 3; i++)
	{
		sum = 0;
		for (j = 0; j < 3; j++)
		{
			sum = sum + array[i][j];
		}
		if (3 == sum || 12 == sum)
		{
			return 1;
		}
	}

	for (j = 0; j < 3; j++)
	{
		sum = 0;
		for (i = 0; i < 3; i++)
		{
			sum = sum + array[i][j];
		}
		if (3 == sum || 12 == sum)
		{
			return 1;
		}
	}

	int win = 0;
	win = array[0][0] + array[1][1] + array[2][2];
	if (3 == win || 12 == win)
	{
		return 1;
	}

	win = array[0][2] + array[1][1] + array[2][0];
	if (3 == win || 12 == win)
	{
		return 1;
	}
	while (1)
	{
		for (j = 0; j < 3; j++)
		{
			for (i = 0; i < 3; i++)
			{
				if (0 == array[i][j])
					return 0;
			}
		}
		return 2;
	}
	return 0;
}

void PlayMove(int array[3][3])
{
	int row, col = 0;

	while (1)
	{
		printf("请输入坐标:");
		scanf("%d %d", &row, &col);
		if ((row <= 0 && row >= 4) && (col <= 0 && col >= 4))
		{
			system("cls");
			printf("坐标不合法!!!\n");
			continue;
		}
		if (0 == array[row - 1][col - 1])
		{
			array[row - 1][col - 1] = 1;
			break;
		}
		else
			printf("您输入的坐标被占用 !!!\n");
	}
}

void ComputerMove(int array[3][3])
{
	int i, j = 0;
	int sum = 0;
	for (i = 0; i < 3; i++)
	{
		sum = 0;
		for (j = 0; j < 3; j++)
		{
			sum = sum + array[i][j];
		}
		if (sum >= 8)
		{
			for (j = 0; j < 3; j++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	for (j = 0; j < 3; j++)
	{
		sum = 0;
		for (i = 0; i < 3; i++)
		{
			sum = sum + array[i][j];
		}
		if (sum >= 8)
		{
			for (i = 0; i < 3; i++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	sum = array[0][0] + array[1][1] + array[2][2];
	if (sum >= 8)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][i])
			{
				array[i][i] = 4;
				return;
			}
		}
	}
	sum = array[0][2] + array[1][1] + array[2][0];
	if (sum >= 8)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][2 - i])
			{
				array[i][i - 2] = 4;
				return;
			}
		}
	}

	for (i = 0; i < 3; i++)
	{
		sum = 0;
		for (j = 0; j < 3; j++)
		{
			sum = sum + array[i][j];
		}
		if (sum == 2 || sum == 6)
		{
			for (j = 0; j < 3; j++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	for (j = 0; j < 3; j++)
	{
		sum = 0;
		for (i = 0; i < 3; i++)
		{
			sum = sum + array[i][j];
		}
		if (sum == 2 || sum == 6)
		{
			for (i = 0; i < 3; i++)
			{
				if (0 == array[i][j])
				{
					array[i][j] = 4;
					return;
				}
			}
		}
	}
	sum = array[0][0] + array[1][1] + array[2][2];
	if (sum == 2 || sum == 6)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][i])
			{
				array[i][i] = 4;
				return;
			}
		}
	}
	sum = array[0][2] + array[1][1] + array[2][0];
	if (sum == 2 || sum == 6)
	{
		for (i = 0; i < 3; i++)
		{
			if (0 == array[i][2 - i])
			{
				array[i][i - 2] = 4;
				return;
			}
		}
	}

	if (0 == array[1][1])
	{
		array[1][1] = 4;
		return;
	}

	for (i = 0; i < 3; i += 2)
	{
		for (j = 0; j < 3; j += 2)
		if (0 == array[i][j])
		{
			array[i][j] = 4;
			return;
		}

	}

	system("cls");
	printf("电脑正在思考!!!\n");
	while (1)
	{
		srand(time(NULL));
		i = rand() % 3;
		j = rand() % 3;
		if (0 == array[i][j])
		{
			system("cls");
			array[i][j] = 4;
			break;
		}
	}

}

void Menu1()
{
	printf("Wlecome to play game!!!\n");
	printf("     1.play \n");
	printf("     0.exit \n");
	printf("请选择:");
}

void Menu2()
{
	system("cls");
	printf("Wlecome to play game!!!\n");
	printf("     1.电脑先走 \n");
	printf("     2.玩家先走 \n");
	printf("请选择:");
}

void play()
{
	int choices = 0;
	int array[3][3] = { 0 };
	int win = 0;
	while (1)
	{
		Menu1();
		scanf("%d", &choices);
		if (0 == choices)
			return;
		while (1)
		{
			Menu2();
			scanf("%d", &choices);
			Init(array);
			if (1 == choices)
				goto Part1;
			Print(array);
			while (1)
			{
				PlayMove(array);
				Print(array);
				win = IsWine(array);
				if (1 == win)
				{
					printf("您真厉害!!!\n");
					break;
				}
				else if (2 == win)
				{
					printf("平局!!!\n");
					break;
				}
			Part1:
				ComputerMove(array);
				Print(array);
				win = IsWine(array);
				if (1 == win)
				{
					printf("很遗憾您输了!!!\n");
					break;
				}
				else if (2 == win)
				{
					printf("平局!!!\n");
					break;
				}
			}
			break;
		}
	}
}

int main()
{
	play();
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值