用超级简单的C语言实现人机五子棋(键盘控制)

*声明:*这是我第一次发博客,我是大一新生,只学习了谭浩强著作的C语言程序设计,水平有限,有不足的地方,欢迎社区大佬指点。

设计原因

这个五子棋是c语言结课后要求我们制作的小游戏,开始一点思路也没有,借助CSDN我学习到了一些思路(借助出处已标明),也有我原创的部分(统计棋子数,判断优先级,人机判定)。说实话CSDN上真的有很多五子棋的设计,但是对于浅学C语言的我来说有些看不懂,所以我想设计一个初学者可以看得懂的小程序。

借用,改写出处

感谢社区大佬们的展示,分享

void Board_print();(借用原出处48-146行)

原作者:行者三个石
出处:https://blog.csdn.net/qq_33706673/article/details/78702710?utm_source=app&app_version=4.5.2
遵循 CC 4.0 BY-SA 版权协议

void getKey();(借用原出处239-311行)
void setPos(int x,int y);(借用原出处115-123行)

原作者:Tjohn9
出处:https://blog.csdn.net/Tjohn9/article/details/104487442?utm_source=app&app_version=4.5.2
遵循 CC 4.0 BY-SA 版权协议

程序运行展示

用超级简单的C语言实现人机五子棋(键盘控制)_第1张图片
用超级简单的C语言实现人机五子棋(键盘控制)_第2张图片
用超级简单的C语言实现人机五子棋(键盘控制)_第3张图片

编译器

VS2010学习版,运行系统win10
win7棋盘显示会有问题,删除Board_print()函数中各字符后的空格即可

游戏说明

程序运行后请开大写键。
玩家1:方向键控制,回车下棋
玩家2:WASD控制,空格下棋
Backspace键:返回主菜单
Q:退出游戏
R:重新开始游戏
T:悔棋(人机对战悔棋请连续按两次)
V:定位光标在棋盘中央

机器判断代码

void robot()//值越小,优先级越高
{
     
	int M=5,c=0,MD=5,u=0;
	int jiluh,jilul,jiluc,jiluhh,jilull;
	jiluc=Color;
	//if(m<=4)  加上if语句限定,人机难度降低,但计算量大大减小
	//{
     
		Color=(Color+1)%2;//先判断玩家的优先级
		m=5;
		for(h=0;h<=(H-1);h++)//遍历一行棋盘
		{
     
			for(l=0;l<=(L-1);l++)//遍历一列棋盘
			{
     
				if(Color==qipan[h-1][l]||Color==qipan[h+1][l]||Color==qipan[h][l+1]||Color==qipan[h][l-1]||Color==qipan[h-1][l-1]||Color==qipan[h+1][l+1]||Color==qipan[h-1][l+1]||Color==qipan[h+1][l-1])//只有当附近有颜色相同的棋子时才会被输出,减少计算量
				{
     
					if(2==qipan[h][l])
					{
     
						if((h-1)>=0&&(h+1)<=(H-1)&&(l-1)>=0&&(l+1)<=(L-1))
						{
     
							qipan[h][l]=Color;
							judge();
							qipan[h][l]=2;
							if(MD>=m)//取玩家的最高优先级
							{
     
								MD=m;
								jiluhh=h;
								jilull=l;
								u=1;
							}
						}
					}
				}
			}
		}
	//}
	m=5;
	Color=(Color+1)%2;//再判断自己的优先级
	for(h=0;h<=(H-1);h++)
	{
     
		for(l=0;l<=(L-1);l++)
		{
     
			if(Color==qipan[h-1][l]||Color==qipan[h+1][l]||Color==qipan[h][l+1]||Color==qipan[h][l-1]||Color==qipan[h-1][l-1]||Color==qipan[h+1][l+1]||Color==qipan[h-1][l+1]||Color==qipan[h+1][l-1])
			{
     
				if(2==qipan[h][l])
				{
     
					if((h-1)>=0&&(h+1)<=(H-1)&&(l-1)>=0&&(l+1)<=(L-1))
					{
     
						qipan[h][l]=Color;
						judge();
						qipan[h][l]=2;
						if(M>=m)//取本方的最高优先级
						{
     
							M=m;
							jiluh=h;
							jilul=l;
						}
					}
				}
			}
		}
	}
	if(MD<M)//对手的优先级高于本方
	{
     
		m=MD;
		h=jiluhh;
		l=jilull;
		Color=jiluc;
	}
	else if(MD>M)//对手的优先级低于本方
	{
     
		m=M;
		h=jiluh;
		l=jilul;
		Color=jiluc;
	}
	else if(MD==M)//对手优先级等于本方
	{
     
				
		if(X==1)//机器先手
		{
     
			m=M;
			h=jiluh;
			l=jilul;
			Color=jiluc;
		}
		else if(X==0)//玩家先手
		{
     
			if(u==0)//玩家此时无合适的棋子
			{
     
				m=M;
				h=jiluh;
				l=jilul;
				Color=jiluc;
			}
			else if(u==1)//玩家有合适的棋子
			{
     
				m=MD;
				h=jiluhh;
				l=jilull;
				Color=jiluc;
			}
		}
	}
	//printf("%d,%d",h,l);检查输出结果
	//getchar();
}

头文件game.h

void Board_print();//打印棋盘
void Player();//显示当前哪个玩家下棋
void Board_initialize();//棋盘的初始化
void setting();//设置
void Board_setting();//棋盘规模设置
void menu();//菜单
void menu_choice()//菜单选择界面;
void color();//更改控制窗颜色
void game();//人人对战模式
void judge();//判断全局局势,判断输赢
void judge_shangxia();//统计纵向棋子数,判断纵向输赢
void judge_zuoyou();//统计横向棋子数,判断横向输赢
void judge_zuoshangyouxia();//统计从左上到右下棋子数,判断左上到右下输赢
void judge_youshangzuoxia();//统计从右上到左下棋子数,判断右上到左下输赢
void getKey();//获取用户下棋的位置
void huiqi();//悔棋
void setPos(int x,int y);//控制光标移动
void AIgame();//人机对战游戏
void robot();//机器判断
void robot_first();//机器先手
void player_first();//玩家先手

全部代码

#include
#include
#include
#include
#include
#include"game.h"
#define A 20//设置默认棋盘规模行
#define B 20//设置默认棋盘规模列
int h=0,l=0;
int H=0,L=0;
int d = 0;
int o = 0;
char qipan[200][200];
int Color=1;//棋子颜色
int k;
int m=5;//总优先级
int MM=5;//小范围的优先级
int I=0,J=0;//光标位置
int key,ch,get;
int zuo1=0,you1=0,shang1=0,xia1=0;
int zuo2=0,you2=0,shang2=0,xia2=0;
int zuoshang1=0,zuoshang2=0,youxia1=0,youxia2=0;
int youshang1=0,youshang2=0,zuoxia1=0,zuoxia2=0;
int hang[1000],lie[1000];//悔棋函数记录的步骤
int g=0,e=0,j=0;//悔棋函数记录
int b=0;
int X=0;
int  youxi=0;//游戏模式记录
char a1[]="######      *AI  GObang*      ######";//菜单打印
char a2[]="####################################";//菜单打印
char a3[]="   ####################################";//菜单打印
void menu()
{
     
	int right=strlen(a2)-1;
	int left=0;
	int i=0;
	while(left+5<=right-5)
	{
     
		a2[right-5]=a1[right-5];
		a2[left+5]=a1[left+5];
		left++;
		right--;
		printf("\n\n\n\n\n\n\n");
		printf("%s\n",a3);
		printf("   ");
		printf("%s\n",a2);
		printf("   ######                        ######\n");
		printf("   ######      1.人机对战        ######\n");
		printf("   ######      2.双人对弈        ######\n");
		printf("   ######      3.游戏设置        ######\n");
		printf("   ######      0.退出游戏        ######\n");
		printf("%s\n",a3);
		printf("%s\n",a3);
		printf("   ################# MADE BY ##########\n");
		printf("   #########################  高三金 ##\n");
		printf("%s\n\n\n",a3);
		printf("   ***PS:本程序所有指令皆按回车键确认***\n");
		printf("   *********制作时间:2021.3.10**********\n\n");
		Sleep(100);
		i++;
		if(i<13)
		{
     
			system("cls");
		}
	}
	printf("快选择呀:");
	menu_choice();
} 
/* 
    ####################################
	#####       *AIbang*         #######
    #####                        #######
	#####      1.人机对战        #######
	#####      2.双人对弈        #######
	#####      3.游戏设置        #######
    #####      0.退出游戏        #######
    ####################################
	####################################
	################# MADE BY ##########
	#########################  高三金 ##
	####################################*/



void menu_choice()
{
     
	int x=0;
	scanf("%d",&x);
	switch(x)
	{
     
	case 1:
		Board_initialize();
		AIgame();break;
	case 2:
		getchar();
		Board_initialize();
		game();break;
	case 3:
		setting();break;
	case 0:
		system("exit");break;
	default:
		printf("摇摇脑袋,有没有听见大海的声音?有这个选项吗?\n");
		printf("请重新输入:");
		menu_choice();
		break;
	}
}
void Board_initialize()
{
     	
	Color=1;
	for(h=0;h<H;h++)
		for(l=0;l<L;l++)
			qipan[h][l]=2;
}
void color()
{
     
	char a[11] = "\"color 02\"";
	a[7] = a[7]+d;
	a[8] = a[8]+o;
	if(a[8]>57)
	{
     
		a[8]=a[8]+7;
	}
	if(a[8]>70)
	{
     
		a[8]=a[8]-23;
		d=1;
	}
	if(a[7]>57)
	{
     
		a[7]=a[7]+7;
	}
	if(a[7]>69)
	{
     
		a[7]=a[7]-23;
		o=0;
	}
	//printf("%s\n", a);  检查输出颜色字号
	//system(a);
	printf("\n颜色已更改为色号%s\n  继续游戏请按回车键\n",a);
	o++;
	d++;
}
void setting()
{
     
	int y=0;
	printf("1.更改颜色  2.棋盘规模(默认20*20)  3.返回主菜单\n");
	scanf("%d",&y);
	switch(y)
	{
     
	case 1:
		color();
		while(1)
		{
     
			if(getchar()=='\n')
			{
     
				setting();
				break;
			}
		}
		break;
	case 2:
		Board_setting();
		while(1)
		{
     
			if(getchar()=='\n')
			{
     
				setting();
				break;
			}
		}
		break;
	case 3:
		system("cls");
		menu();
		break;
	default:
		printf("逗我玩呢?有这个选项吗?\n请重新选择\n");
		setting();
		break;
	}
}
void Board_setting()
{
     
	printf("请输入棋盘规格(默认20*20):");
	scanf("%d*%d",&H,&L);	
	for(h=0;h<H;h++)
        for(l=0;l<L;l++)
            qipan[h][l]=2;
	printf("\n已将棋盘规格修改为%d*%d\n  继续游戏请按回车键\n",H,L);
	getchar();
}
void huiqi()
{
     
	if((hang[g]==0&&lie[e]==0)||(g!=0&&e!=0))
	{
     
		g--,e--;
	}
	h=hang[g];
	l=lie[e];
	if(g==1&&e==1)
	{
     
		b=0;
	}

	//printf("%d,%d",h,l);
	//getchar();
	
	qipan[h][l]=2;

	
	//printf("%d",Color);
	/*printf("%d,%d",h,l);*/
	if(j!=0)
	{
     
		Color=(Color+1)%2;
		j--;
	}
	//printf("%d",Color);
	//getchar();
}
 void setPos(int x,int y)
{
     
	HANDLE a;//句柄HANDLE 
  	COORD c;//COORD是个结构体 ,有两个成员int X与int Y 
	  c.X=x;
	  c.Y=y;
	  a=GetStdHandle(STD_OUTPUT_HANDLE);
	  SetConsoleCursorPosition(a,c);
}
void getKey()
{
     
	while(1)
	{
     
		key=getch();
		if(key==13||key==32)
		{
     
			break;
		}
		switch(key)
		{
     
		//↑
		case 72:
		case 87:
				J--;
				setPos(I,J);
				break;
		
		// ↓
		case 80:
		case 83:
				J++;
				setPos(I,J);
				break;
		
		// ←
		case 75:
		case 65:
				I-=2;
				setPos(I,J);
				break;
		
		// →
		case 77:
		case 68:
				I+=2;
				setPos(I,J); 
				break;
		//返回菜单Backspace
		case 8:
			menu();
			break;
		//退出游戏Q	
		case 81:
			system("exit");
			break;
		//重开游戏R
		case 82:
			if(youxi==1)
			{
     
				Board_initialize();
				game();
			}
			else if(youxi==2)
			{
     
				Board_initialize();
				player_first();
			}
			else if(youxi==3)
			{
     
				Board_initialize();
				robot_first();
			}
			break;
		//悔棋T
		case 84:
			huiqi();
			if(youxi==1)
			{
     
				game();
			}
			else if(youxi==2)
			{
     
				player_first();
			}
			else if(youxi==3)
			{
     
				robot_first();
			}
			break;
		//定位V
		case 86:
			if(youxi==1)
			{
     
				game();
			}
			else if(youxi==2)
			{
     
				player_first();
			}
			else if(youxi==3)
			{
     
				robot_first();
			}
			break;
		}
	}
}
void judge_shangxia()    //统计上下棋子数
{
     
	/*printf("%d,%d,%d",qipan[h-1][l],qipan[h+1][l],Color);*/
	if(qipan[h-1][l]==Color&&qipan[h+1][l]==Color&&h!=0&&h!=(H-1))
	{
     
		int i=0;		
		int j=0;
		shang1=0,shang2=0,xia1=0,xia2=0;
		while(qipan[h-1][l]==Color&&h!=0)
		{
     
			if(Color==1)
			{
     
				shang1++;
			}
			else
			{
     
				shang2++;
			}
			i++;
			h--;
		}
		h=h+i;



		while(qipan[h+1][l]==Color&&h!=(H-1))
		{
     
			if(Color==1)
			{
     
				xia1++;
			}
			else
			{
     
				xia2++;
			}
			j++;
			h++;
		}
		h=h-j;
	}
		//printf("%d,%d,%d,%d,%d,%d,%d,%d",shang1,shang2,xia1,xia2,zuo1,zuo2,you1,you2);
		//getchar();
		if((shang1+xia1)>=4)
		{
     
			m=1;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((shang2+xia2)>=4)
		{
     
			m=2;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((shang1+xia1)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((shang2+xia2)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((shang1+xia1)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((shang2+xia2)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		m=MM;
}

void judge_zuoyou()  //统计左右棋子数
{
     
	if(qipan[h][l-1]==Color&&qipan[h][l+1]==Color&&l!=0&&l!=(L-1))
	{
     
		int i=0;
		int j=0;
		zuo1=0,zuo2=0,you1=0,you2=0;
		while(qipan[h][l-1]==Color&&l!=0)
		{
     
			if(Color==1)
			{
     
				zuo1++;
			}
			else
			{
     
				zuo2++;
			}
			i++;
			l--;
		}
		l=l+i;



		while(qipan[h][l+1]==Color&&l!=(L-1))
		{
     
			if(Color==1)
			{
     
				you1++;
			}
			else
			{
     
				you2++;
			}
			j++;
			l++;
		}
		l=l-j;
	}

		if((zuo1+you1)>=4)
		{
     
			m=1;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuo2+you2)>=4)
		{
     
			m=2;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuo1+you1)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuo2+you2)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuo1+you1)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuo2+you2)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}

}

void judge_zuoshangyouxia()  //统计从左上到右下棋子数
{
     
	if(qipan[h-1][l-1]==Color&&qipan[h+1][l+1]==Color&&l!=0&&h!=0&&l!=(L-1)&&h!=(H-1))
	{
     
		int i=0;
		int j=0;
		zuoshang1=0,zuoshang2=0,youxia1=0,youxia2=0;
		while(qipan[h-1][l-1]==Color&&l!=0&&h!=0)
		{
     
			if(Color==1)
			{
     
				zuoshang1++;
			}
			else
			{
     
				zuoshang2++;
			}
			i++;
			h--;
			l--;
		}
		h=h+i;
		l=l+i;



		while(qipan[h+1][l+1]==Color&&l!=(L-1)&&h!=(H-1))
		{
     
			if(Color==1)
			{
     
				youxia1++;
			}
			else
			{
     
				youxia2++;
			}
			j++;
			h++;
			l++;
		}
		h=h-j;
		l=l-j;
	}

		if((zuoshang1+youxia1)>=4)
		{
     
			m=1;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuoshang2+youxia2)>=4)
		{
     
			m=2;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuoshang1+youxia1)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuoshang2+youxia2)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuoshang1+youxia1)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((zuoshang2+youxia2)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
}




void judge_youshangzuoxia()  //统计从右上到左下棋子数
{
     
	if(qipan[h-1][l+1]==Color&&qipan[h+1][l-1]==Color&&h!=0&&l!=(L-1)&&h!=(H-1)&&l!=0)
	{
     
		int i=0;
		int j=0;
		youshang1=0,youshang2=0,zuoxia1=0,zuoxia2=0;
		while(qipan[h-1][l+1]==Color&&h!=0&&l!=(L-1))
		{
     
			if(Color==1)
			{
     
				youshang1++;
			}
			else
			{
     
				youshang2++;
			}
			i++;
			h--;
			l++;
		}
		h=h+i;
		l=l-i;



		while(qipan[h+1][l-1]==Color&&h!=(H-1)&&l!=0)
		{
     
			if(Color==1)
			{
     
				zuoxia1++;
			}
			else
			{
     
				zuoxia2++;
			}
			j++;
			h++;
			l--;
		}
		h=h-j;
		l=l+j;
	}

		if((youshang1+zuoxia1)>=4)
		{
     
			m=1;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((youshang2+zuoxia2)>=4)
		{
     
			m=2;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((youshang1+zuoxia1)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((youshang2+zuoxia2)==3)
		{
     
			m=3;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((youshang1+zuoxia1)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
		if((youshang2+zuoxia2)==2)
		{
     
			m=4;
			if(MM>=m)
			{
     
				MM=m;
			}
		}
}

void judge()
{
     
	shang1=0,shang2=0,xia1=0,xia2=0,zuo1=0,zuo2=0,you1=0,you2=0,MM=5;
	zuoshang1=0,zuoshang2=0,youxia1=0,youxia2=0,youshang1=0,youshang2=0,zuoxia1=0,zuoxia2=0;
	judge_shangxia();
	if(qipan[h-1][l]==Color&&h!=0)
	{
     
		h--;
		if(h==0)
		{
     
			if(Color==1)
			{
     
				shang1++;
			}
			else if(Color==0)
			{
     
				shang2++;
			}
		}
		judge_shangxia();
		h++;			
	}
	if(qipan[h+1][l]==Color&&h!=(H-1))
	{
     
		h++;
		if(h==(H-1))
		{
     
			if(Color==1)
			{
     
				xia1++;
			}
			else
			{
     
				xia2++;
			}
		}
		judge_shangxia();
		h--;
	}



	judge_zuoyou();
	if(qipan[h][l-1]==Color&&l!=0)
	{
     
		l--;
		if(l==0)
		{
     
			if(Color==1)
			{
     
				zuo1++;
			}
			else if(Color==0)
			{
     
				zuo2++;
			}
		}
		judge_zuoyou();
		l++;	
	}
	if(qipan[h][l+1]==Color&&l!=(L-1))
	{
     
		l++;
		if(l==(L-1))
		{
     
			if(Color==1)
			{
     
				you1++;
			}
			else
			{
     
				you2++;
			}
		}
		judge_zuoyou();
		l--;
	}


	judge_zuoshangyouxia();
	if(qipan[h-1][l-1]==Color&&h!=0&&l!=0)
	{
     
		h--;
		l--;
		if(h==0||l==0)
		{
     
			if(Color==1)
			{
     
				zuoshang1++;
			}
			else if(Color==0)
			{
     
				zuoshang2++;
			}
		}
		judge_zuoshangyouxia();
		h++;
		l++;
	}
	if(qipan[h+1][l+1]==Color&&h!=(H-1)&&l!=(L-1))
	{
     
		h++;
		l++;
		if(h==(H-1)||l==(L-1))
		{
     
			if(Color==1)
			{
     
				youxia1++;
			}
			else
			{
     
				youxia2++;
			}
		}
		judge_zuoshangyouxia();
		h--;
		l--;
	}




	judge_youshangzuoxia();
	if(qipan[h-1][l+1]==Color&&h!=0&&l!=(L-1))
	{
     
		h--;
		l++;
		if(h==0||l==(L-1))
		{
     
			if(Color==1)
			{
     
				youshang1++;
			}
			else if(Color==0)
			{
     
				youshang2++;
			}
		}
		judge_youshangzuoxia();
		h++;
		l--;
	}
	if(qipan[h+1][l-1]==Color&&h!=(H-1)&&l!=0)
	{
     
		h++;
		l--;
		if(h==(H-1)||l==0)
		{
     
			if(Color==1)
			{
     
				zuoxia1++;
			}
			else
			{
     
				zuoxia2++;
			}
		}
		judge_youshangzuoxia();
		h--;
		l++;
	}
	m=MM;
}




void game()
{
     
	youxi=1;
	system("cls");
	Board_print();
	//h=J;
	//l=I/2;

	//printf("%d,%d",h,l);
	/*getchar();*/
	Player();
	I=L-2;J=(H/2-1);
	while(1)
	{
     
		//I=0;J=(H/2);
		setPos(I,J);
		getKey();
			h=J;
			l=I/2;			
			if(qipan[h][l]!=2)
			{
     
				//setPos(0,0);
				system("cls");
				Board_print();
				Player();
				h=J;
				l=I/2;			
				//printf("%d,%d\n",h,l);检查输出坐标位置	
				
				if(h<0 || h>=H || l<0 || l>=L)
				{
     
					I=L-2;J=(H/2-1);
					for(k=0;k<=L/4;k++)
					{
     
						printf(" ");
					}
					printf("******超出了棋盘的范围,请重新输入!******\n");
				}
				else
				{
     
					for(k=0;k<=L/3;k++)
					{
     
						printf(" ");
					}
					printf("******此处已有棋子,不能覆盖哦!******\n");
				}
				continue;
			}

			system("cls");
			qipan[h][l]=Color;
			/*printf("%d",qipan[h-1][l]);*/
			judge();

			//printf("%d",m);
			//getchar();


			Board_print();
			h=J;
			l=I/2;
			//printf("%d,%d",h,l);
			//getchar();
			hang[g]=h;
			lie[e]=l;
			g++,e++,j++;
			
			//printf("%d",m);
			//getchar();
			if(m==1)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,●赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				again1:
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					game();
					break;
				case 89:
					color();
					Board_initialize();
					game();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					game();
					break;
				case 81:
					system("exit");
					break;
				default:
					goto again1;
					break;
				}
				break;
			}

			if(m==2)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,○赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					game();
					break;
				case 89:
					color();
					Board_initialize();
					game();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					game();
					break;
				case 81:
					system("exit");
					break;
				default:
					goto again1;
					break;
				}
				break;
			}
			Color=(Color+1)%2;
			Player();

	}
	
}

void Player()
{
     
	if(Color==1)
	{
     
		for(k=0;k<=L/3;k++)
		{
     
			printf(" ");
		}
		printf("******请●玩家下棋******\n");
	}
	if(Color==0)
	{
     
		for(k=0;k<=L/3;k++)
		{
     
			printf(" ");
		}
		printf("******请○玩家下棋******\n");
	}
}

void Board_print()
{
     
	int jiluhang=h,jilulei=l;
	for(h=1;h<=H;h++)
        {
     
            if(h==1) //第1行
            {
     
				
                //第1行,第1列
                if(qipan[h-1][0]==1)
                    printf("●");
                if(qipan[h-1][0]==0)
                    printf("○");
                if(qipan[h-1][0]==2)
                    printf("┌ ");
				//第1行,第2-(L-1)列
                for(l=2;l<=(L-1);l++)
                {
     
					/*qipan[h-1][3]=0;*/
                    if(qipan[h-1][l-1]==1)
                        printf("●");
                    if(qipan[h-1][l-1]==0)
                        printf("○");
                    if(qipan[h-1][l-1]==2)
                        printf("┬ ");
                }
				//出内循环 第1行,最后一个
                if(qipan[h-1][l-1]==1)
                    printf("●");
                if(qipan[h-1][l-1]==0)
                    printf("○");
                if(qipan[h-1][l-1]==2)
                    printf("┐ ");
				printf("\n");
			}
            if(h<=(H-1) && h>=2)//第2-(H-1)行
            {
     
                //第2-(H-1)行,第1列
                if(qipan[h-1][0]==1)
                    printf("●");
                if(qipan[h-1][0]==0)
                    printf("○");
                if(qipan[h-1][0]==2)
                    printf("├ ");
				//第2-(H-1)行,第2-(L-1)列
                for(l=2;l<=(L-1);l++)
                {
     
                    if(qipan[h-1][l-1]==1)
                        printf("●");
                    if(qipan[h-1][l-1]==0)
                        printf("○");
                    if(qipan[h-1][l-1]==2)
                        printf("┼ ");
                }
				//出内循环 第2-(H-1)行,最后一个
                if(qipan[h-1][l-1]==1)
                    printf("●");
                if(qipan[h-1][l-1]==0)
                    printf("○");
                if(qipan[h-1][l-1]==2)
                    printf("┤ ");
				printf("\n");
			}
            if(h==H)//最后一行
            {
     
                if(qipan[h-1][0]==1)
                    printf("●");
                if(qipan[h-1][0]==0)
                    printf("○");
                if(qipan[h-1][0]==2)
                    printf("└ ");
                //最后一行,第2-(L-1)个
                for(l=2;l<=(L-1);l++)
                {
     
                    if(qipan[h-1][l-1]==1)
                        printf("●");
                    if(qipan[h-1][l-1]==0)
                        printf("○");
                    if(qipan[h-1][l-1]==2)
                        printf("┴ ");
                }
                //出内循环 最后一行,最后一个
                if(qipan[h-1][l-1]==1)
                    printf("●");
                if(qipan[h-1][l-1]==0)
                    printf("○");
                if(qipan[h-1][l-1]==2)
                    printf("┘ ");
				printf("\n");
            }
	}
	h=jiluhang;
	l=jilulei;
}

void robot()
{
     
	int M=5,c=0,MD=5,u=0;
	int jiluh,jilul,jiluc,jiluhh,jilull;
	jiluc=Color;
	//if(m<=4)  加上if语句限定,人机难度降低,但计算量大大减小
	//{
     
		Color=(Color+1)%2;
		m=5;
		for(h=0;h<=(H-1);h++)
		{
     
			for(l=0;l<=(L-1);l++)
			{
     
				if(Color==qipan[h-1][l]||Color==qipan[h+1][l]||Color==qipan[h][l+1]||Color==qipan[h][l-1]||Color==qipan[h-1][l-1]||Color==qipan[h+1][l+1]||Color==qipan[h-1][l+1]||Color==qipan[h+1][l-1])
				{
     
					if(2==qipan[h][l])
					{
     
						if((h-1)>=0&&(h+1)<=(H-1)&&(l-1)>=0&&(l+1)<=(L-1))
						{
     
							qipan[h][l]=Color;
							judge();
							//printf("%d,%d,%d,%d\n",h,l,m,MD);
							//getchar();
							qipan[h][l]=2;
							if(MD>=m)
							{
     
								MD=m;
								jiluhh=h;
								jilull=l;
								u=1;
							}
						}
					}
				}
			}
		}
	//}
	m=5;
	Color=(Color+1)%2;
	for(h=0;h<=(H-1);h++)
	{
     
		for(l=0;l<=(L-1);l++)
		{
     
			if(Color==qipan[h-1][l]||Color==qipan[h+1][l]||Color==qipan[h][l+1]||Color==qipan[h][l-1]||Color==qipan[h-1][l-1]||Color==qipan[h+1][l+1]||Color==qipan[h-1][l+1]||Color==qipan[h+1][l-1])
			{
     
				if(2==qipan[h][l])
				{
     
					if((h-1)>=0&&(h+1)<=(H-1)&&(l-1)>=0&&(l+1)<=(L-1))
					{
     
						qipan[h][l]=Color;
						judge();
						qipan[h][l]=2;
						if(M>=m)
						{
     
							M=m;
							jiluh=h;
							jilul=l;
						}
					}
				}
			}
		}
	}
	//printf("%d,%d,%d,%d,%d,%d,%d,%d",MD,M,m,X,jiluh,jilul,jiluhh,jilull);
	//getchar();
	//getchar();
	if(MD<M)
	{
     
		m=MD;
		h=jiluhh;
		l=jilull;
		Color=jiluc;
	}
	else if(MD>M)
	{
     
		m=M;
		h=jiluh;
		l=jilul;
		Color=jiluc;
	}
	else if(MD==M)
	{
     
				
		if(X==1)
		{
     
			m=M;
			h=jiluh;
			l=jilul;
			Color=jiluc;
		}
		else if(X==0)
		{
     
			if(u==0)
			{
     
				m=M;
				h=jiluh;
				l=jilul;
				Color=jiluc;
			}
			else if(u==1)
			{
     
				m=MD;
				h=jiluhh;
				l=jilull;
				Color=jiluc;
			}
		}
	}
	//printf("%d,%d",h,l);
	//getchar();
}
void robot_first()
{
     
	youxi=3;
	system("cls");
	I=L-2;J=(H/2-1);
	h=J;
	l=I/2;
	Board_print();
	Player();
	while(1)
	{
     
		while(1)
		{
     
			//I=0;J=(H/2);
			setPos(I,J);
			getKey();
			h=J;
			l=I/2;			
			if(qipan[h][l]!=2)
			{
     
				//setPos(0,0);
				system("cls");
				Board_print();
				Player();
				h=J;
				l=I/2;			
				//printf("%d,%d\n",h,l);检查输出坐标位置	
				
				if(h<0 || h>=H || l<0 || l>=L)
				{
     
					I=L-2;J=(H/2-1);
					for(k=0;k<=L/4;k++)
					{
     
						printf(" ");
					}
					printf("******超出了棋盘的范围,请重新输入!******\n");
				}
				else
				{
     
					for(k=0;k<=L/3;k++)
					{
     
						printf(" ");
					}
					printf("******此处已有棋子,不能覆盖哦!******\n");
				}
				continue;
			}
			break;
	}
			system("cls");
			qipan[h][l]=Color;
			/*printf("%d",qipan[h-1][l]);*/
			judge();
			Board_print();//打印玩家局势
			h=J;
			l=I/2;
			//printf("%d",m);
			//getchar();
			hang[g]=h;
			lie[e]=l;
			g++,e++,j++;
			Color=(Color+1)%2;

			if(m==1)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,●赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				}
				break;
			}

			if(m==2)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,○赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				}
				break;
			}

			
			robot();
			qipan[h][l]=Color;
			hang[g]=h;
			lie[e]=l;
			g++,e++,j++;
			system("cls");
			Board_print();//打印总局势
			//printf("%d,%d,%d",m,h,l);
			//getchar();
			judge();
			//printf("%d,%d,%d",m,h,l);
			//getchar();
			if(m==1)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,●赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				}
				break;
			}

			if(m==2)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,○赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				}
				break;
			}	
			Color=(Color+1)%2;
			Player();
		
	}
}
void player_first()
{
     
	youxi=2;
	system("cls");
	I=L-2;J=(H/2-1);
	h=J;
	l=I/2;
	Board_print();
	Player();
	while(1)
	{
     
		while(1)
		{
     
			//I=0;J=(H/2);
			setPos(I,J);
			getKey();
			h=J;
			l=I/2;			
			if(qipan[h][l]!=2)
			{
     
				//setPos(0,0);
				system("cls");
				Board_print();
				Player();
				h=J;
				l=I/2;			
				//printf("%d,%d\n",h,l);检查输出坐标位置	
				
				if(h<0 || h>=H || l<0 || l>=L)
				{
     
					I=L-2;J=(H/2-1);
					for(k=0;k<=L/4;k++)
					{
     
						printf(" ");
					}
					printf("******超出了棋盘的范围,请重新输入!******\n");
				}
				else
				{
     
					for(k=0;k<=L/3;k++)
					{
     
						printf(" ");
					}
					printf("******此处已有棋子,不能覆盖哦!******\n");
				}
				continue;
			}
			break;
	}
			system("cls");
			qipan[h][l]=Color;
			/*printf("%d",qipan[h-1][l]);*/
			judge();
			Board_print();//打印玩家局势
			h=J;
			l=I/2;
			//printf("%d,%d",h,l);
			//getchar();
			hang[g]=h;
			lie[e]=l;
			g++,e++,j++;
			Color=(Color+1)%2;

			if(m==1)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,●赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				again:
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				default:
					goto again;
					break;
				}
				break;
			}

			if(m==2)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,○赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				default:
					goto again;
					break;
				}
				break;
			}

			if(b==0)
			{
     
				h=h+1;
				l=l-1;
				b++;
			}
			else if(b>0)
			{
     
				robot();
				b=1;
			}
			//printf("%d,%d,%d,%d",m,h,l,Color);
			//getchar();
			qipan[h][l]=Color;
			hang[g]=h;
			lie[e]=l;
			g++,e++,j++;
			system("cls");
			Board_print();//打印总局势
			judge();
			//printf("%d,%d,%d,%d",m,h,l,Color);
			//getchar();
			if(m==1)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,●赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				default:
					goto again;
					break;
				}
				break;
			}

			if(m==2)
			{
     
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("******恭喜,○赢了******\n");
				for(k=0;k<=L/3;k++)
				{
     
					printf(" ");
				}
				printf("重新游戏请按R  游戏设置(更改颜色请按Y,棋盘规模请按F) 退出游戏请按Q \n");
				ch=getch();
				switch(ch)
				{
     
				case 82:
					Board_initialize();
					AIgame();
					break;
				case 89:
					color();
					Board_initialize();
					AIgame();
					break;
				case 70:
					Board_setting();
					Board_initialize();
					AIgame();
					break;
				case 81:
					system("exit");
					break;
				default:
					goto again;
					break;
				}
				break;
			}	
			Color=(Color+1)%2;
			Player();
	}
}
void AIgame()
{
     
	system("cls");
	printf("您是否要当先手?  Y.那必须  N.算了,你先\n");
	AI:
	get=getch();
	switch(get)
	{
     
	case 89:
		X=0;
		b=0;
		player_first();
		break;
	case 78:
		X=1;
		system("cls");
		I=L-2;J=(H/2-1);
		h=J;
		l=I/2;
		qipan[h][l]=Color;
		Color=(Color+1)%2;
		robot_first();
		break;
	case 8:
		menu();
		break;
	default:
		goto AI;
		break;
	}

}

	

int main()
{
     
	H=A,L=B;
	system("color 06");
	Board_initialize();
	menu();
	return 0;

你可能感兴趣的:(大学,程序设计,c语言,c语言,游戏)