注册了好久,放上我的第一篇博客吧,写了一个作业小游戏:井字棋

代码用c写的,算法比较丑陋

#include <stdio.h>


int s1;   
int s2;                  //人棋子
int w;                   //电脑棋子
int n = 9;               //存放棋盘空位置数量


void Intro()      //游戏简介
{
	printf("\t\t\t\t\t程序员:demon咔咔");
	printf("\n【游戏规则:由最先在任意一条直线上成功连接成三个标记的一方获胜】\n\n");
	printf("棋盘:\n");
	printf(" 1 | 2 | 3\n");
	printf("----------\n");
	printf(" 4 | 5 | 6\n");
	printf("----------\n");
	printf(" 7 | 8 | 9\n");
}


int Judge(int a[])                  //判断是否胜利
{
	     if(a[1]!=0 && a[1]==a[2] && a[2]==a[3]) return 1;
	else if(a[4]!=0 && a[4]==a[5] && a[5]==a[6]) return 1;
	else if(a[7]!=0 && a[7]==a[8] && a[8]==a[9]) return 1;
	else if(a[1]!=0 && a[1]==a[4] && a[4]==a[7]) return 1;
	else if(a[2]!=0 && a[2]==a[5] && a[5]==a[8]) return 1;
	else if(a[3]!=0 && a[3]==a[6] && a[6]==a[9]) return 1;
	else if(a[1]!=0 && a[1]==a[5] && a[5]==a[9]) return 1;
	else if(a[3]!=0 && a[3]==a[5] && a[5]==a[7]) return 1;
	return 0;
}
void Show(int a[])
{
	int i;
	char temp[10]={0};
	
	for (i=1;i<10;i++)          //棋子转换
	{
			 if (a[i]>0)    temp[i]=88;		
		else if (a[i]<0)	temp[i]=79;		
	}
printf("\n %c | %c | %c\n",temp[1],temp[2],temp[3]);
	printf("-----------\n");
	printf(" %c | %c | %c\n",temp[4],temp[5],temp[6]);
	printf("-----------\n");
	printf(" %c | %c | %c\n",temp[7],temp[8],temp[9]);
}


void Checker(int a[],int x)           //显示棋盘
{
	
	
	Show(a);
	
	n--;                //剩余空位置个数


	if(x==2)
	{
		printf("你赢了\n");
		getchar();
	}


	else if(x==3)
	{
		printf("你输了\n");
		getchar();
	}
}


int People1(int a[])                   //人走棋
{
	int num;
	while(1)
	{
		printf("\nPLAYER1选择位置放置棋子:");
		scanf("%d",&num);
		getchar();                
		if(num>0 && num<10 && a[num]==0)
		{	
			a[num]=s1;
			if(Judge(a))
			{
				Checker(a,2);
				return 1;
			}
			else
			{
				n--;
				return 0;
			}
		}
		else
			printf("输入有误\n");
	}
}
int People2(int a[])                   //人走棋
{
	int num;
	while(1)
	{
		printf("\nPLAYER2选择位置放置棋子:");
		scanf("%d",&num);
		getchar();                
		if(num>0 && num<10 && a[num]==0)
		{	
			a[num]=s2;
			if(Judge(a))
			{
				Checker(a,2);
				return 1;
			}
			else
			{
				n--;
				return 0;
			}


		}
		else
			printf("输入有误\n");
	}
}
int Max(int temp[])       //比较胜率大小
{
	int i,max=1;
	for (i=2;i<10;i++)
	{
		if(temp[max]<temp[i])
			max=i;
	}
	return max;
		
}


int Computer(int a[])            //电脑走棋
{
	int i;
	int temp[10]={0};    //胜率计数器
	if(n<=6)                //输赢情况有可能发生了
	{
		for(i=1;i<10;i++)           //电脑能赢,就赢
		{
			if(a[i]==0)
			{
				a[i]=w;
				if(Judge(a))
				{
					Checker(a,3);
					return 1;           //1标示分出胜负
				}
				else
					a[i]=0;
			}
		}
		for (i=1;i<10;i++)          //电脑不能赢,人能赢,就堵
		{
			if(a[i]==0)
			{	
				a[i]=s1;
				if(Judge(a))
				{
					a[i]=w;
					Checker(a,0);
					return 0;
				}
				else
					a[i]=0;
			}
		}
	}
	//共八种胜利情况,计算九个格子的胜率
	if( (a[1]==0 || a[1]==w) && (a[2]==0 || a[2]==w) && (a[3]==0 || a[3]==w) )	
	{	temp[1]++;	temp[2]++;  temp[3]++;  }
		
	if( (a[4]==0 || a[4]==w) && (a[5]==0 || a[5]==w) && (a[6]==0 || a[6]==w) )	
	{	temp[4]++;	temp[5]++;  temp[6]++;	}
		
	if( (a[7]==0 || a[7]==w) && (a[8]==0 || a[8]==w) && (a[9]==0 || a[9]==w) )	
	{	temp[7]++;	temp[8]++;  temp[9]++;	}
	
	if( (a[1]==0 || a[1]==w) && (a[4]==0 || a[4]==w) && (a[7]==0 || a[7]==w) )	
	{	temp[1]++;	temp[4]++;  temp[7]++;	}
	
	if( (a[2]==0 || a[2]==w) && (a[5]==0 || a[5]==w) && (a[8]==0 || a[8]==w) )	
	{	temp[2]++;	temp[5]++;  temp[8]++;	}
	
	if( (a[3]==0 || a[3]==w) && (a[6]==0 || a[6]==w) && (a[9]==0 || a[9]==w) )	
	{	temp[3]++;	temp[6]++;  temp[9]++;	}


	if( (a[1]==0 || a[1]==w) && (a[5]==0 || a[5]==w) && (a[9]==0 || a[9]==w) )	
	{	temp[1]++;	temp[5]++;  temp[9]++;	}
	
	if( (a[3]==0 || a[3]==w) && (a[5]==0 || a[5]==w) && (a[7]==0 || a[7]==w) )	
	{	temp[3]++;	temp[5]++;  temp[7]++;	}
	
	for (i=1;i<10;i++)       //将走过的格子胜率除去
	{
		if(a[i]!=0)
			temp[i]=-1;
	}
	a[Max(temp)]=w;  //选择最高胜率
	Checker(a,0);
	return 0;
}


void main()
{
	int a[10] = {0};       //存放棋子
	int num;
	int temp;
	Intro();
	while(1)              //输入错误,继续输入
	{
		n = 9;
		printf("\n1 P v E   2- P V P   0--退出游戏\n");
		printf("\n【菜单选择】:");
		scanf("%d",&num);
		getchar();      //接收回车
		if (num == 0)	
		{
			printf("游戏结束\n");
			getchar();
			return;
		}
		
		else if(num == 1)                //人先走
		{
			s1=1;w=-1;
			while(n>0)			
			{
				temp=People1(a);
				if (temp == 1)
					return;


				if(n==0)           //人是最后一步
					break;


				temp=Computer(a);
				if (temp == 1)
					return;
			}
			printf("和棋\n");    //棋盘走完
			getchar();
			return;
		}
		else if (num == 2)         //电脑先走
		{
			s1=-1;s2=1;
			while (n>0)
			{
				temp=People1(a);
				if (temp == 1)
					return;


				Show(a);
				if(n==0)           //电脑是最后一步
					break;
				
				temp=People2(a);
				if (temp == 1)
					return;
				Show(a);


			}
			printf("和棋\n");
			getchar();
			return;
		}
		else
			printf("输入有误\n");
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值