三子棋小游戏

三子棋游戏规则:

玩家使用x,电脑使用o,在九宫格上面看谁先能连成一条线(一行/一列/对角线),若是棋盘下满并没有分出胜负,那就是和棋。

游戏开始界面:

游戏界面:

游戏结束界面:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//使用宏定义可以减少后期更改代码的时间
#define MAX_ROW 3
#define MAX_COL 3
//创建棋盘
char chess[MAX_ROW][MAX_COL];

void Init()
{
	//对棋盘进行初始化,使用' '来占满棋盘
	for (int row = 0; row < MAX_ROW; row++)
	{
		for (int col = 0; col < MAX_COL; col++)
		{
			chess[row][col] = ' ';
		}
	}
	//设置随机种子
	srand((unsigned int)time(0));
}

void Print()
{
	//为了美观进行美化打印
	for (int row = 0; row < MAX_ROW; ++row)
	{
		printf("| %c | %c | %c |\n",chess[row][0],chess[row][1],chess[row][2]);
		if (row != MAX_ROW)
		{
			printf("|---|---|---|\n");
		}
	}
	//为了调试临时加的注释
	//system("pause");
}

void Player()
{
	printf("玩家落子!\n");
	while (1)
	{
		printf("请输入落子坐标(行,列):");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		//检查输入是否合法
		if (row<0 || row>MAX_ROW || col<0 || col>MAX_COL)
		{
			printf("输入不合理!请重新输入:\n");
			continue;
		}
		//判断落子的地方是否已经有落子了
		if (chess[row][col] != ' ')
		{
			printf("你落子地点已经有了落子!\n");
			continue;
		}
		//玩家使用x来进行标记落子
		chess[row][col] = 'x';
		break;
	}
	printf("玩家落子完毕!\n");
}

char CheckWinner()
{
	//检查所有行/列/斜线是否连成一条线
	for (int row = 0; row < MAX_ROW; ++row)
	{
		if (chess[row][0] == chess[row][1] 
			&& chess[row][0] == chess[row][2])
		{
			//使用返回值表示胜利者
			//x玩家赢o电脑赢
			//' '表示未分出胜负
			//'h'表示和棋 
			return chess[row][0];
		}
	}

	for (int col = 0; col < MAX_COL; ++col)
	{
		if (chess[0][col] == chess[1][col]
			&& chess[0][col] == chess[2][col])
		{
			return chess[0][col];
		}
	}

	if (chess[0][0] == chess[1][1]
		&& chess[1][1] == chess[2][2])
	{
		return chess[0][0];
	}

	if (chess[0][2] == chess[1][1]
		&& chess[2][0] == chess[0][2])
	{
		return chess[0][2];
	}

	//检查所有地点是否落满为分出胜负
	if (isFull())
	{
		return 'h';
	}
	//如果还未分出胜负就继续落子
	return ' ';
}

//判断期盼是否被占满
int isFull()
{
	for (int row = 0; row < MAX_ROW; ++row)
	{
		for (int col = 0; col < MAX_COL; ++col)
		{
			if (chess[row][col] == ' ')
			{
				//未满
				return 0;
			}
		}
	}
	return 1;
}

void Computer()
{
	printf("电脑落子!\n");
	while (1)
	{
		//电脑随机产生坐标,来进行落子
		int row = rand() % 3;
		int col = rand() % 3;
		//判断电脑落子是否合法
		if (chess[row][col] != ' ')
		{
			continue;
		}
		//电脑使用o来占据空格
		chess[row][col] = 'o';
		break;
	}
	printf("电脑落子结束!\n");
}

void game()
{
	//创建char型来接收CheckWinner的返回值,判断胜利者
	char winner;
	//1、初始化棋盘
	Init();
	while (1)
	{
		//2、打印棋盘
		Print();
		//3、玩家落子
		Player();
		//4、判断胜负
		winner=CheckWinner();
		if (winner != ' ')
		{
			//胜负已分
			break;
		}
		//5、电脑落子
		Computer();
		//6、判断胜负
		winner = CheckWinner();
		if (winner != ' ')
		{
			//胜负已分
			break;
		}
	}
	Print();
	if (winner == 'x')
	{
		printf("您赢了!!!!\n");
	}
	else if (winner == 'h')
	{
		printf("您和电脑和棋了!!!\n");
	}
	else if (winner == 'o')
	{
		printf("电脑赢了!!!\n");
	}
}

int Menu()
{
	printf("************************\n");
	printf("1、开始游戏\n");
	printf("2、退出游戏\n");
	printf("************************\n");
	int x = 0;
	printf("请输入你的选择:");
	scanf("%d", &x);
	return x;
}

int main()
{
	while (1)
	{
		int choice = Menu();
		if (choice == 1)
		{
			game();
		}
		else if (choice == 2)
		{
			printf("欢迎下次再来!\n");
			break;
		}
		else
		{
			printf("你的输入有误!\n");
		}
	}
	system("pause");
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值