五子棋C语言版本

五子棋C程序

#include <stdio.h>
#include <stdlib.h>

#include<windows.h>
#include<conio.h>
//getchar

#define n 15


char *map[2 * n + 1][2 * n + 1];
int w = 1, x = 1, y = 1, z = 1;//累计横竖正斜反邪四个方向的连续相同棋子数目
int Cx, Cy;//光标位置
int now;//玩家1,玩家2
int modle;
int I, J;//I J为下点坐标
int e,f;
int p,q;
int i, j;
double k=0,max,num,t;
double distance1,distance2;//遍历时,点到光标位置距离
int count = 0;
int input;


void windows1()
{
    
    
printf("** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n");
printf("** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**           ★★★★欢迎来到趣味五子棋游戏★★★★   **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**           ★★★模式1              模式2★★★     **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**           ★★方向键             键盘输入★★      **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("**            输入1选择方向键控制光标位置             **\n");
printf("**            输入2选择键盘输入控制光标位置           **\n");
printf("**                    输入0退出程序                   **\n");
printf("**                                                    **\n");
printf("**                                                    **\n");
printf("** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n");
printf("** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **\n");
}




char*getmap()
{
    
    
	for (i = 0; i<2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			if (i == 0)
			{
    
    
				if (j == 0)
					map[i][j] = ((char*)"┌");
				else if (j == 2 * n)
					map[i][j] = ((char*)"┐");
				else if (j % 2 == 0)
					map[i][j] = ((char*)"┬");
				else map[i][j] = ((char*)"─");
			}
			else if (i == 2 * n)
			{
    
    
				if (j == 0)
					map[i][j] = ((char*)"└");
				else if (j == 2 * n)
					map[i][j] = ((char*)"┘");
				else if (j % 2 == 0)
					map[i][j] = ((char*)"┴");
				else map[i][j] = ((char*)"─");
			}
			else if (i % 2 == 0)
			{
    
    
				if (j == 0)
					map[i][j] = ((char*)"├");
				else if (j == 2 * n)
					map[i][j] = ((char*)"┤");
				else if (j % 2 == 0)
					map[i][j] = ((char*)"┼");
				else map[i][j] = ((char*)"─");
			}
			else
			{
    
    
				if (j % 2 == 0)
					map[i][j] = ((char*)"│");
				else
					map[i][j] = ((char*)"  ");

			}
		}
	}
	return 0;
}
void printfmap()
{
    
    
	for (i = 0; i < 2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			printf("%s", map[i][j]);
		}
		printf("\n");
	}
}
void initialize()//初始化
{
    
    
	for (i = 0; i <= n; i++)
		for (j = 0; j <= n; j++)
	if (n % 2 == 0)//x,y初始化时必须为偶数
	{
    
    
		Cx = n;
		Cy = n;
	}

	else
	{
    
    
		Cx = n + 1;
		Cy = n + 1;
	}
	count = 0;
	now = 1;//玩家1先走
}
char* displaycursor()//显示光标,表示现在位置
{
    
    
	for (i = 0; i < 2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			if (i == Cx - 1 && j == Cy - 1) map[i][j] = ((char*)"┍");
			else if (i == Cx + 1 && j == Cy - 1) map[i][j] = ((char*)"┕");
			else if (i == Cx - 1 && j == Cy + 1) map[i][j] = ((char*)"┑");
			else if (i == Cx + 1 && j == Cy + 1) map[i][j] = ((char*)"┙");

		}
	}
	return 0;
}


char* clean1(int Cx, int Cy)
{
    
    
	for (i = 0; i < 2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			if (i == Cx - 1 && j == Cy + 3) map[i][j] = ((char*)"  ");
			if (i == Cx + 1 && j == Cy + 3) map[i][j] = ((char*)"  ");

		}
	}
	return 0;
}
char* clean2(int Cx, int Cy)
{
    
    
	for (i = 0; i < 2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			if (i == Cx - 3 && j == Cy - 1) map[i][j] = ((char*)"  ");
			if (i == Cx - 3 && j == Cy + 1) map[i][j] = ((char*)"  ");

		}
	}
	return 0;
}


char* clean3(int Cx, int Cy)
{
    
    
	for (i = 0; i < 2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			if (i == Cx - 1 && j == Cy - 3) map[i][j] = ((char*)"  ");
			if (i == Cx + 1 && j == Cy - 3) map[i][j] = ((char*)"  ");

		}
	}
	return 0;
}
char* clean5(int Cx, int Cy)
{
    
    
	for (i = 0; i < 2 * n + 1; i++)
	{
    
    
		for (j = 0; j < 2 * n + 1; j++)
		{
    
    
			if (i == Cx + 3 && j == Cy - 1) map[i][j] = ((char*)"  ");
			if (i == Cx + 3 && j == Cy + 1) map[i][j] = ((char*)"  ");

		}
	}
	return 0;
}

int check1()
{
    
    
	if (map[Cx][Cy] == map[Cx][Cy + 2] && map[Cx][Cy + 2] == map[Cx][Cy + 4] && map[Cx][Cy + 4] == map[Cx][Cy + 6] && map[Cx][Cy + 6] == map[Cx][Cy + 8]&& map[Cx][Cy] == map[Cx][Cy + 8])//右检查,从左端点开始
		return 1;
	if (map[Cx][Cy] == map[Cx][Cy -2] && map[Cx][Cy-2] == map[Cx][Cy-4] && map[Cx][Cy- 4] == map[Cx][Cy-6] && map[Cx][Cy-6] == map[Cx][Cy-8]&& map[Cx][Cy] == map[Cx][Cy - 8])//左检查,从右端点开始
		return 1;
	if (map[Cx][Cy] == map[Cx-2][Cy] && map[Cx-2][Cy] == map[Cx-4][Cy] && map[Cx-4][Cy] == map[Cx-6][Cy] && map[Cx-6][Cy] == map[Cx-8][Cy]&&map[Cx][Cy] == map[Cx - 8][Cy])//上检查
		return 1;
	if (map[Cx][Cy] == map[Cx+ 2][Cy] && map[Cx +2][Cy] == map[Cx+ 4][Cy] && map[Cx+ 4][Cy] == map[Cx+ 6][Cy] && map[Cx+6][Cy] == map[Cx +8][Cy]&&map[Cx][Cy] == map[Cx + 8][Cy])//下检查
		return 1;
	if (map[Cx][Cy] == map[Cx - 2][Cy-2] && map[Cx - 2][Cy-2] == map[Cx - 4][Cy-4] && map[Cx - 4][Cy-4] == map[Cx - 6][Cy-6] && map[Cx - 6][Cy-6] == map[Cx - 8][Cy-8]&&map[Cx][Cy] == map[Cx - 8][Cy - 8])//左上检查
		return 1;
	if (map[Cx][Cy] == map[Cx+2][Cy - 2] && map[Cx+ 2][Cy - 2] == map[Cx+ 4][Cy - 4] && map[Cx+4][Cy - 4] == map[Cx+6][Cy - 6] && map[Cx+ 6][Cy - 6] == map[Cx+8][Cy - 8]&&map[Cx][Cy]== map[Cx + 8][Cy - 8])//左下检查
		return 1;
	if (map[Cx][Cy] == map[Cx - 2][Cy+ 2] && map[Cx - 2][Cy+2] == map[Cx - 4][Cy+4] && map[Cx - 4][Cy+4] == map[Cx - 6][Cy+6] && map[Cx - 6][Cy+6] == map[Cx - 8][Cy+8]&&map[Cx - 6][Cy + 6] == map[Cx - 8][Cy + 8])//右上检查
		return 1;
	if (map[Cx][Cy] == map[Cx + 2][Cy+2] && map[Cx + 2][Cy+2] == map[Cx + 4][Cy+4] && map[Cx + 4][Cy+4] == map[Cx + 6][Cy+6] && map[Cx + 6][Cy+6] == map[Cx + 8][Cy+8]&&map[Cx + 6][Cy + 6] == map[Cx + 8][Cy + 8])//右下检查
		return 1;
	else
	return 0;
}
int check2()
{
    
    
	for (i = -4; i <= 4; i++)//上下
	{
    
    
		if (map[Cx + 2 * i][Cy] == map[Cx][Cy])
			w++;
		else w = 1;
	}
	if (w >5)//for循环是,I=0是w也++了,所以要减去这多加的一次
		return 1;
	for (i = -4; i <= 4; i++)//左右
	{
    
    
		if (map[Cx][Cy+2*i] == map[Cx][Cy])
			x++;
		else x= 1;
	}
	if (x>5)//for循环是,I=0是x也++了,所以要减去这多加的一次
		return 1;
	for (i = -4; i <= 4; i++)//2,4
	{
    
    
		if (map[Cx + 2 * i][Cy+2*i] == map[Cx][Cy])
			y++;
		else y = 1;
	}
	if (y>5)//for循环是,I=0是y也++了,所以要减去这多加的一次
		return 1;
	for (i = -4; i <= 4; i++)//1,3
	{
    
    
		if (map[Cx + 2 * i][Cy-2*i] == map[Cx][Cy])
			z++;
		else z= 1;
	}
	if (z>5)//for循环是,I=0是z也++了,所以要减去这多加的一次
		return 1;
	else
		return 0;
}
void operate1()
{
    
    
	input = _getch();
	if (input == 0X20)
	{
    
    
		if (now == 1)
		{
    
    
			if(map[Cx][Cy] != ((char*)"○"))
				map[Cx][Cy] = ((char*)"●");
			else input = _getch();
			now = 3 - now;
			count++;
		}
		else
		{
    
    
			if(map[Cx][Cy] != ((char*)"●"))
				map[Cx][Cy] = ((char*)"○");
			else input = _getch();
			now = 3 - now;
			count++;
		}
	}
	else if (input == 224)//0XE0
	{
    
    
		input = _getch();
		switch (input)//判断方向键方向并移动光标位置
		{
    
    
		case 75://0X48   左
			Cy = Cy - 2, clean1(Cx, Cy);
			break;
		case 80://0X4D  下
			Cx = Cx + 2, clean2(Cx, Cy);
			break;
		case 77: //0X50  右
			Cy = Cy + 2, clean3(Cx, Cy);
			break;
		case 72://0X4B   上
			Cx = Cx - 2, clean5(Cx, Cy);
			break;
		}
		if (Cx < 0)Cx = 2 * n + 1;//如果光标位置越界则移动到对侧
		if (Cy < 0)Cy = 2 * n + 1;
		if (Cx > 2 * n + 1)Cx = 0;
		if (Cy > 2 * n + 1)Cy = 0;
	}
}

void operate2()
{
    
    
        printf("请输入坐标\n");
		scanf("%d%d", &I, &J);
	if (now == 1)
		{
    
    
			if (map[2*I][2*J] != ((char*)"○"))
				map[2*I][2*J] = ((char*)"●");
				 now = 3 - now;
			count++;
		}

		Cx=I,Cy=J;
		e=Cx,f=Cy;
    if(now==2)
    {
    
    
		    AI();
		    if (map[2*e][2*f] != ((char*)"●"))
			map[2*e][2*f] = ((char*)"○");

			count++;
    }

    now = 3 - now;
}

void operate3()
{
    
    

    printf("请输入横纵坐标\n");
    scanf("%d%d",&p,&q);
    if((p<0||p>15)||(q<0||q>15))
    {
    
    
        printf("请重新输入!\n");
         scanf("%d%d",&p,&q);
    }
    //Cx=2*p;Cy=2*q;
    if (now ==1)
		{
    
    
			if (map[2*p][2*q] != ((char*)"○"))
				map[2*p][2*q] = ((char*)"●");
			count++;
		}
		check1();
		check2();
    if (now ==2)
		{
    
    
		    if(map[2*p][2*q] != ((char*)"●"))
			map[2*p][2*q]=((char*)"○");
			count++;
		}
		check1();
		check2();
		now = 3 - now;
}


void AI()           //电脑下子 *p *q返回下子坐标
{
    
    
	for (i= 0; i<=15; i++)
		for (j= 0; j<=15;j++)
			if ((map[2*i][2*j]!=(char*)"●")&&(map[2 *i][2 *j]!=(char*)"○")) //历遍棋盘,遇到空点则计算价值,取最大价值点下子。
			{
    
    
			          t=value();
                    if(t>=max)
				{
    
    
					e = 2*i; f= 2*j; max = k;
			    }
			}

}
 int value()//Cx,Cy为玩家1输入的坐标
 {
    
    
				distance1 =(2*i-Cx)*(2*i-Cx)+(2*j-Cy)*(2*j-Cy);
	            if (distance1 >128)  k = 0;
	            if (distance1<=4) k=5.0;
                if (distance1>4&&distance1<=8)  k =4.2;
	            if (distance1>8&&distance1<=16)  k =4;
                if (distance1>8 && distance1<= 32)  k =3;
	            if (distance1>32 && distance1 <=64)  k = 2;
	            if (distance1>64&& distance1 <=128)  k =1;

	            return k;
 }
int judge()
{
    
    
		if ((check1()==1||check2()==1)&&map[Cx][Cy] == ((char*)"●"))
		{
    
    
			printf("                恭喜黑方获得胜利\n");
			return 1;
		}
		else if ((check1()==1||check2()==1)&&map[Cx][Cy]==((char*)"○"))
		{
    
    
			printf("                恭喜白方获得胜利\n");
			return 1;
		}
		else if (count == (n + 1)*(n + 1))
		{
    
    
			printf("                        平局!\n");
			return 1;
		}
	else printf(" \n");
	return 0;
}



void rungame1()//人人博弈游戏运行
{
    
    
	initialize();//now=1
	displaycursor();
	getmap();//fairly standard
	while (1) //开始无限回合的死循环,直到出现胜利跳出
	{
    
    
		system("cls");//清屏
		displaycursor();
		printfmap();
		operate1();
		if (judge() == 1)
		{
    
    
			Sleep(1000);
			rungame1();
		}
	}

}

void rungame2()//人机大战,玩家1为人,玩家2为电脑
{
    
    
	initialize();//now=1
	getmap();
	while (1) //开始无限回合的死循环,直到出现胜利跳出
	{
    
    
		system("cls");//清屏
		printfmap();
		operate2();
		if (judge() == 1)
		{
    
    
			Sleep(1000);
			rungame2();
		}
	}

}
void rungame3()//键盘输入
{
    
    
    initialize();//now=1
	getmap();
	while (1) //开始无限回合的死循环,直到出现胜利跳出
	{
    
    
		system("cls");//清屏
		printfmap();
		operate3();
		if (judge() == 1)
		{
    
    
			Sleep(2000);
			rungame3();
		}
	}


}

void rungame()
{
    
    
	windows1();
	scanf("%d", &modle);
	switch (modle)
	{
    
    
	case 1:   rungame1(); break;
	case 2:   rungame2();  break;
	case 3:   rungame3(); break;
	case 0:               break;
	default:              break;
	}

}

int main()
{
    
    
	system("title 简易五子棋");//设置标题
	system("mode con cols=63lines=63");//设置窗口大小
	system("color 7C");//设置颜色
	rungame();
	return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41982200/article/details/109194475
今日推荐