【C】少年时代的经典游戏:三子棋

一、首先,什么是三子棋

大家还记得下面这个东西

不同地方的孩纸们可能画的有些区别

如果你不知道什么是三子棋,那么请看下图


二、如何实现三子棋

(1)棋这类题目,一般要知道一下几点:

二维数组

一般用二维数组来完成。所有的棋子移动都是二元数组内元素的变化来完成的

移动问题。

用C语言实现三子棋,要有选点,判断选的点对不对,移动的点是否能移动(好比如说我的棋在那块,你可移动到这把我吃了= =)

判断获胜的问题。

这一点当然不必多说。

(2)本次实验所遇到的问题

①判断能否从一个点到另一个点就用了N次if else 语句,感觉比较麻烦

②一个点不能覆盖另一个点

③一个点,本来就无路可走了。

可是我选择了这个点,无法返回重新输入了。。。


(3)第三个问题的解决方法

如果选了一个无路可走的棋子,那么。。。重新开始吧


三、一些利用到的小知识点

1、清屏

每次棋子移动后,清理之前的屏幕,再输出来。

2、Sleep函数

每走1步,歇一秒。下棋是一个思考的过程,得有间歇

3、小音乐功能

利用转义字符“\a”的峰鸣声,来实现每走一步提示一下

四、未完成的东西:

1、无路可走棋子的解决问题

2、机器人暂无下棋功能,需手动输入(如果机器人选择了无路可走的棋子,游戏要重新开始多少次啊大哭

3、If else 用的过多,看起来太费事,而且一不小心就会写错。(之前已经调试N次错误在这个地方)

五、代码块(未完):

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void Print_Chess(); 
int check(int x);
void change();
void Play(); 
void Robort_change();
int che[3][3] = { 1, 1, 1, 0, 0, 0, 2, 2, 2 };//游戏用到的函数为全局变量数组 
void Print_Chess()//用来打印棋盘 
{
	system("cls"); //清屏 
	int i = 0;
	int j = 0;
	printf("\t\t=============少年经典三子棋====================\n\n\n");
	for (; i<3; i++)
	{
		printf("\t\t\t\t");
		for (j = 0; j<3; j++)
		{
			if (che[i][j] == 1)
				printf("○ ");
			else if (che[i][j] == 2)
				printf("● ");
			else if (che[i][j] == 0)
				printf("※ ");
			else
				break;
		}
		printf("\n");
	}
}
int check(int x)//判断是否有人获胜 
{	
	int a = 1;
	if (che[0][0] == x)
	{
		if ((che[0][0] == che[1][1]) && (che[1][1] == che[2][2]))
		{	
			a = 0;
		}
		else if ((che[0][0] == che[1][0]) && (che[1][0] == che[2][0]))
		{
			a = 0;
		}
		else if ((x == 2) && (che[0][0] == che[0][1]) && (che[0][1] == che[0][2]))
		{
			a = 0;//防止白点在起始位置获胜 
		}
		else
			a =  1; //没有人赢,返回1 
	}
	else if (che[0][1] == x)
	{
		if ((che[0][1] == che[1][1]) && (che[1][1] == che[2][1]))
			a = 0;
		else
			a = 1;//没有人赢,返回1 
	}
	else if (che[0][2] == x)
	{
		if (che[1][2] == x && che[2][2] == x)
			a = 0;
		else if (che[1][1] == x && che[2][1] == x)
			a =  0;
		else
			a = 1;
	}
	else if (che[1][0] == x)
	{
		if (che[1][1] == x&&che[1][2] == x)
			a =  0;
		else
			a =  1;
	}
	else if (che[2][0] == x)
	{
		if (che[2][1] == x&&che[2][2] == x)
		{
			if (x == 1)
			{
				printf("%d", x); a = 0;
			}//不让黑子在起始位置获胜 
			else
				a = 1;
		}
	}
	else
		a = 1;
	return a;
}
void change()//黑棋 
{
	int i = 0;
	int j = 0;
	int m = -666;
	int n = 0;
	int ch = 0;
	do{
		printf("\n玩家1:请输入要移动的棋子的坐标:\n");
		scanf("%d %d", &i, &j);
		if (che[i][j] == 2)
		{		
			printf("\n请输入需要到的坐标:\n");	
			while (ch == 0)
			{
				if (m != -666)
				{
					printf("输入有误,重新开始游戏!");
					Play();
				}
				scanf("%d %d", &m, &n);
				if (m<0 || n<0 || m>2 || n>2)
					ch = 0;
				else if (che[m][n] != 0)
					ch = 0;
				else if (m == 0 && n == 0 && i == 1 && j == 1)//从(1,1)走到(0,0) 
					ch = 1;
				else if (m == 1 && n == 1 && i == 0 && j == 0)//从(0,0)走到(1,1) 
					ch = 1;
				else if (m == 1 && n == 1 && i == 2 && j == 2)//从(2,2)走到(1,1) 
					ch = 1;
				else if (m == 2 && n == 2 && i == 1 && j == 1)//从(1,1)走到(2,2)
					ch = 1;
				else if (m == 0 && n == 2 && i == 1 && j == 1)//从(1,1)到(0,2)
					ch = 1;
				else if (i == 0 && j == 2 && m == 1 && n == 1)//从(0,2)走到(1,1)
					ch = 1;
				else if (m == 2 && n == 0 && i == 1 && j == 1)//从(1,1)到(2,0)
					ch = 1;
				else if (i == 2 && j == 0 && m == 1 && n == 1)//从(2,0)走到(1,1)
					ch = 1;
				else if (i == m && (((j - n) == 1) || ((n - j) == 1)))
					ch = 1;
				else if (j == n && (((i - m) == 1) || ((m - 1) == 1)))
					ch = 1;
				else
					ch = 0;
			}
		}
	} while (che[i][j] != 2);
	che[i][j] = 0;
	che[m][n] = 2;
}
void Robort_change()//白棋 
{
	int i = 0;
	int j = 0;
	int m = -666;
	int n = 0;
	int ch = 0;
	do{
		printf("\n玩家2:请输入要移动的棋子的坐标:\n");
		scanf("%d %d", &i, &j);
		if (che[i][j] == 1)
		{	
			printf("\n请输入需要到的坐标:\n");
			while (ch == 0)
			{	
				if (m != -666)
				{	
					printf("输入有误,重新开始游戏!");
					Play();
				}
				scanf("%d %d", &m, &n);
				if (m<0 || n<0 || m>2 || n>2)
					ch = 0;
				else if (che[m][n] != 0)
					ch = 0;
				else if (m == 0 && n == 0 && i == 1 && j == 1)//从(1,1)走到(0,0) 
					ch = 1;
				else if (m == 1 && n == 1 && i == 0 && j == 0)//从(0,0)走到(1,1) 
					ch = 1;
				else if (m == 1 && n == 1 && i == 2 && j == 2)//从(2,2)走到(1,1) 
					ch = 1;
				else if (m == 2 && j == 2 && i == 1 && j == 1)//从(1,1)走到(2,2) 
					ch = 1;
				else if (m == 0 && n == 2 && i == 1 && j == 1)//从(1,1)到(0,2)
					ch = 1;
				else if (i == 0 && j == 2 && m == 1 && n == 1)//从(0,2)走到(1,1)
					ch = 1;
				else if (m == 2 && n == 0 && i == 1 && j == 1)//从(1,1)到(2,0)
					ch = 1;
				else if (i == 2 && j == 0 && m == 1 && n == 1)//从(2,0)走到(1,1)
					ch = 1;
				else if (i == m && (((j - n) == 1) || ((n - j) == 1)))
					ch = 1;
				else if (j == n && (((i - m) == 1) || ((m - i) == 1)))
					ch = 1;
				else
					ch = 0;
			}
		}
	} while (che[i][j] != 1);
	che[i][j] = 0;
	che[m][n] = 1;
}
void Play()//开始游戏
{	
	int num = 0;
	while (1)
	{
		Print_Chess();
		if (num % 2 == 0)
		{
			change();
			num++;
			if (check(2) == 0)
			{	
				Print_Chess();
				printf("\n\t\t\t\tThe winner is Black!\n\n\n");
				break;
			}
		}
		else
		{	
			Robort_change();
			num++;
			if (check(1) == 0)
			{	
				Print_Chess();
				printf("\n\t\t\t\tThe winner is White!\n\n\n");
				break;
			}
		}
		Sleep(1000);
		Print_Chess();
		printf("\a");
	}
} 
int main()
{
	Print_Chess();
	Play();
	system("pause");
	return 0;
}

六、游戏界面



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值