C语言 五子棋 图形界面 人机对战

项目仓库:https://gitee.com/siwenzhi/gobang

内容

直接放当时的答辩PPT吧
其实每个页面都是一个小视频
C语言 五子棋 图形界面 人机对战_第1张图片
C语言 五子棋 图形界面 人机对战_第2张图片
C语言 五子棋 图形界面 人机对战_第3张图片
C语言 五子棋 图形界面 人机对战_第4张图片
C语言 五子棋 图形界面 人机对战_第5张图片
C语言 五子棋 图形界面 人机对战_第6张图片
C语言 五子棋 图形界面 人机对战_第7张图片
C语言 五子棋 图形界面 人机对战_第8张图片
C语言 五子棋 图形界面 人机对战_第9张图片

代码

#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"Winmm.lib")
using namespace std;

const int xx = 260;
const int yy = 200;
int box[18][18];
void menu();
void ai_game();
void go_game();
void game_help();
void game_about();
void game_out();
void draw();
void mousetest(); //字符串定位用
void yiyan();
int judge(int x, int y, int f);
char geyan[6][1000] = { {"先手要攻,后手要守"},{"以攻为守,以守待攻"},{"初盘争二,终局抢三"},
	{"留三不冲,变化万千"},{"连三连四,易见为明"} };

int main()
{
	menu();
	return 0;
}

void menu()
{

	char g_n[] = "2.双人游戏", g_h[] = "3.游戏帮助";
	char g_a[] = "4.关于我们", g_o[] = "5.退出游戏";
	HWND hwnd = initgraph(700, 700);
	SetWindowTextA(hwnd, "五子棋游戏-升达");
	setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
	cleardevice();  //用当前背景色清空画布
	settextcolor(BLACK);  //字体颜色
	settextstyle(30, 22, _T("Consolas"));   //字体高宽比(像素) 30/22 最佳

	outtextxy(xx, yy - 80, "1.人机对战");
	outtextxy(xx, yy, g_n);			// (247,192)   (495,240)  左上 右下 坐标
	outtextxy(xx, yy + 80, g_h);	//(247,273)   (495,315)  
	outtextxy(xx, yy + 160, g_a);	//(247,355)   (495,394)
	outtextxy(xx, yy + 240, g_o);	//(247,437)   (495,476)


	yiyan();/

	
	MOUSEMSG m;  // 获取鼠标信息

	while (true)
	{
		m = GetMouseMsg();

		if ((m.x >= 247 && m.x <= 495) && (m.y >= 114 && m.y <= 152) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(247, 114, 272, 114);  //左上
			line(247, 114, 247, 139);
			line(495, 152, 495, 127);  //右下
			line(495, 152, 470, 152);
		}
		else if ((m.x >= 247 && m.x <= 495) && (m.y >= 114 && m.y <= 152) && m.mkLButton)
		{
			ai_game(); break;
		}
		else
		{
			setcolor(RED);
			line(247, 114, 272, 114);  //左上
			line(247, 114, 247, 139);
			line(495, 152, 495, 127);  //右下
			line(495, 152, 470, 152);
		}

		if ((m.x >= 247 && m.x <= 495) && (m.y >= 192 && m.y <= 240) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(247, 192, 272, 192);  //左上
			line(247, 192, 247, 217);
			line(495, 240, 470, 240);  //右下
			line(495, 215, 495, 240);
		}
		else if ((m.x >= 247 && m.x <= 495) && (m.y >= 192 && m.y <= 240) && m.mkLButton)
		{
			go_game();  break;
		}
		else
		{
			setcolor(RED);
			line(247, 192, 272, 192);  //左上
			line(247, 192, 247, 217);
			line(495, 240, 470, 240);  //右下
			line(495, 215, 495, 240);
		}


		if ((m.x >= 247 && m.x <= 495) && (m.y >= 280 && m.y <= 315) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(247, 273, 272, 273);  //左上
			line(247, 273, 247, 298);
			line(495, 315, 495, 290);  //右下
			line(495, 315, 470, 315);

		}
		else if ((m.x >= 247 && m.x <= 495) && (m.y >= 280 && m.y <= 315) && m.mkLButton)
		{
			game_help(); break; //游戏帮助页
		}
		else
		{
			setcolor(RED);
			line(247, 273, 272, 273);  //左上
			line(247, 273, 247, 298);
			line(495, 315, 495, 290);  //右下
			line(495, 315, 470, 315);
		}

		if ((m.x >= 247 && m.x <= 495) && (m.y >= 355 && m.y <= 394) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(247, 355, 247, 380);  //左上
			line(247, 355, 272, 355);
			line(495, 394, 495, 369);  //右下
			line(495, 394, 470, 394);
		}
		else if ((m.x >= 247 && m.x <= 495) && (m.y >= 355 && m.y <= 394) && m.mkLButton)
		{
			game_about(); break;  //关于游戏页
		}
		else
		{
			setcolor(RED);
			line(247, 355, 247, 380);  //左上
			line(247, 355, 272, 355);
			line(495, 394, 495, 369);  //右下
			line(495, 394, 470, 394);
		}

		if ((m.x >= 247 && m.x <= 495) && (m.y >= 437 && m.y <= 476) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(247, 437, 247, 462);  //左上
			line(247, 437, 272, 437);
			line(495, 476, 495, 451);  //右下
			line(495, 476, 470, 476);
		}
		else if ((m.x >= 247 && m.x <= 495) && (m.y >= 437 && m.y <= 476) && m.mkLButton)
		{
			game_out(); break;  //退出页
		}
		else
		{
			setcolor(RED);
			line(247, 437, 247, 462);  //左上
			line(247, 437, 272, 437);
			line(495, 476, 495, 451);  //右下
			line(495, 476, 470, 476);
		}

		if ((m.x >= 100 && m.x <= 642) && (m.y >= 599 && m.y <= 622) && m.mkLButton)
		{
			yiyan();
		}
	}

	closegraph();
}

void ai_game()
{
	draw();
	memset(box, 0, sizeof(box)); //棋盘初始化 重要!!!!
	int yinyue = 0;
	int year1, year2, month1, month2, day1, day2, hour1, hour2, min1, min2, sec1, sec2;
	char charyear[10], charmonth[10], charday[10], charhour[10], charmin[10], charsec[10];
	time_t rawtime;
	struct tm* getime;
	time(&rawtime);
	getime = localtime(&rawtime);
	year1 = getime->tm_year + 1900;
	month1 = getime->tm_mon + 1;
	day1 = getime->tm_mday;
	hour1 = getime->tm_hour;
	min1 = getime->tm_hour;
	sec1 = getime->tm_sec;

	settextstyle(15, 10, _T("Consolas"));
	outtextxy(590, 182, "-人机对战-");
	outtextxy(599, 242, "开启音乐");
	outtextxy(599, 292, "返回菜单");
	outtextxy(599, 342, "退出游戏");

	int a, b, a1, b1,c=0,d=0,k=0,f=1; //行列坐标及其备份  k用来判断是否落子 以相应选择框  f=1 为黑 简单版固定为用户先落子
	setcolor(WHITE);  settextstyle(30, 22, _T("Consolas"));
	outtextxy(210, 630, "玩家执黑先行~");
	MOUSEMSG m, t;
	while (1)
	{
		m = GetMouseMsg();
		if ((m.x >= 40 && m.x <= 580) && (m.y >= 40 && m.y <= 580) && f )//判定鼠标位置在棋盘内 且 轮到玩家落子
		{
			a=(m.x + 18)/36; b=(m.y+18)/36; //行列坐标
			a1=a; b1=b;
			if (box[a][b] == 0 && f)
			{
				a = a * 36 + 4; b = b * 36 + 4;   //精确到十字线
				setcolor(YELLOW); //黄色选择框
				line(a - 8, b - 8, a - 13, b - 8); //左上
				line(a - 8, b - 8, a - 8, b - 13);
				line(a + 8, b - 8, a + 13, b - 8); //右上
				line(a + 8, b - 8, a + 8, b - 13);
				line(a - 8, b + 8, a - 13, b + 8); //左下
				line(a - 8, b + 8, a - 8, b + 13);
				line(a + 8, b + 8, a + 13, b + 8); //右下
				line(a + 8, b + 8, a + 8, b + 13);
				setcolor(RGB(255, 205, 150));
				if ((c != a || d != b) && (!k))   //没有落子则用原色覆盖选择框
				{
					
					line(c - 8, d - 8, c - 13, d - 8);//左上
					line(c - 8, d - 8, c - 8, d - 13);
					line(c + 8, d - 8, c + 13, d - 8); //右上
					line(c + 8, d - 8, c + 8, d - 13);
					line(c - 8, d + 8, c - 13, d + 8); //左下
					line(c - 8, d + 8, c - 8, d + 13);
					line(c + 8, d + 8, c + 13, d + 8);//右下
					line(c + 8, d + 8, c + 8, d + 13);
				}
				c = a; d = b; //分别复制a,b 响应选择框 
				if (m.mkLButton)
				{
					setlinecolor(BLACK); setfillcolor(BLACK); f = 0;
					fillcircle(a, b, 16);
					box[a1][b1] = 1;


					k = 1;
					int r = judge(a1, b1, 0);
					if (r==1)
					{
						srand((int)time(0));
						int suiji = rand() % 5;
						settextstyle(22, 18, _T("Consolas"));
						
						setcolor(RGB(255, 205, 150));
						setfillcolor(RGB(255, 205, 150));
						fillrectangle(210, 630, 460, 670);
						setcolor(YELLOW);
						outtextxy(80, 630, "小口诀-->");
						outtextxy(260, 630, geyan[suiji]); 

						setcolor(YELLOW);
						setbkcolor(RGB(255, 205, 150));
						fillrectangle(184, 120, 436, 440);//绘制结算框
						outtextxy(245, 125, "对局结束");
						settextstyle(22, 18, _T("Consolas"));
						outtextxy(243, 165, "玩家获胜");

						setcolor(BLACK);
						settextstyle(15, 10, _T("Consolas"));
						outtextxy(238, 200, "★★★对局详情★★★");

						time(&rawtime);
						getime = localtime(&rawtime);
						year2 = getime->tm_year + 1900;
						month2 = getime->tm_mon + 1;
						day2 = getime->tm_mday;
						hour2 = getime->tm_hour;
						min2 = getime->tm_hour;
						sec2 = getime->tm_sec;
						int dhour = 0, dmin = 0, dsec = 0, t1, t2;
						t1 = hour1 * 3600 + min1 * 60 + sec1;
						t2 = hour2 * 3600 + min2 * 60 + sec2;
						t2 = t2 - t1;
						dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
						sprintf_s(charhour, "%02d:", dhour);
						sprintf_s(charmin, "%02d:", dmin);
						sprintf_s(charsec, "%02d", dsec);
						outtextxy(215, 230, "对局用时:");
						outtextxy(307, 230, charhour);
						outtextxy(340, 230, charmin);
						outtextxy(373, 230, charsec);

						outtextxy(215, 260, "开始时间:");
						sprintf_s(charyear, "%d.", year1);
						sprintf_s(charmonth, "%02d.", month1);
						sprintf_s(charday, "%02d", day1);
						sprintf_s(charhour, "%02d:", hour1);
						sprintf_s(charmin, "%02d:", min1);
						sprintf_s(charsec, "%02d", sec1);
						outtextxy(307, 260, charyear);
						outtextxy(355, 260, charmonth);
						outtextxy(385, 260, charday);
						outtextxy(307, 280, charhour);
						outtextxy(340, 280, charmin);
						outtextxy(373, 280, charsec);

						outtextxy(215, 310, "结束时间:");
						sprintf_s(charyear, "%d.", year2);
						sprintf_s(charmonth, "%02d.", month2);
						sprintf_s(charday, "%02d", day2);
						sprintf_s(charhour, "%02d:", hour2);
						sprintf_s(charmin, "%02d:", min2);
						sprintf_s(charsec, "%02d", sec2);
						outtextxy(307, 310, charyear);
						outtextxy(355, 310, charmonth);
						outtextxy(385, 310, charday);
						outtextxy(307, 330, charhour);
						outtextxy(340, 330, charmin);
						outtextxy(373, 330, charsec);

						settextstyle(16, 13, _T("Consolas"));
						outtextxy(260, 364, "再来一局");
						outtextxy(260, 401, "退出游戏");

						break;
					}
					else
					{
						settextstyle(30, 22, _T("Consolas"));
						setcolor(WHITE); setfillcolor(WHITE);
						outtextxy(190, 630, "请等待电脑落子~");
					}
				}
				else
					k = 0;
			}
				
		}
		else if(!f)//该电脑落子了  a1,b1 是用户最后一个落子  这里要先判断用户是否已经连续三个子 及时围堵
		{
			f = 1;
			int nx, ny;
			//int ne[8][2] = { {0,1},{0,-1},{1,0},{-1,0},{-1,-1},{1,1},{-1,1},{1,-1} };
			
			int fff=0;
			if ( (a1 - 1 <= 0) || box[a1 - 1][b1] == 0) fff++;
			if ( (a1 + 1 > 16) || box[a1 + 1][b1] == 0) fff++;
			if ( (b1 - 1 <= 0) || box[a1][b1 - 1] == 0) fff++;
			if ( (b1 + 1 > 16) || box[a1][b1 + 1] == 0) fff++;
			if ((a1 - 1 <= 0) || (b1 - 1 <= 0) || box[a1 - 1][b1 - 1] == 0) fff++; //左上
			if ((a1 - 1 <= 0) || (b1 + 1 > 16) || box[a1 - 1][b1 + 1] == 0) fff++; //左下
			if ((a1 + 1 > 16) || (b1 + 1 > 16) || box[a1 + 1][b1 + 1] == 0) fff++; //右下
			if ((a1 + 1 > 16) || (b1 - 1 <= 0) || box[a1 + 1][b1 + 1] == 0) fff++; //右上


			if (fff == 8 && (a1-1>0) ) //右
			{
				box[a1 - 1][b1] = 2;
				nx = a1 - 1; ;
				ny = b1 ;
			}
			else if (fff == 8 && (a1 + 1 <= 16)) //左
			{
				box[a1 + 1][b1] = 2;
				nx = a1 + 1;
				ny = b1 ;
			}
			else if (fff == 8 && (b1 - 1 > 0)) //上
			{
				box[a1][b1 - 1] = 2;
				ny = b1 - 1; 
				nx = a1;
			}
			else if (fff == 8 && (b1 + 1 <= 16)) //下
			{
				box[a1][b1 + 1] = 2;
				ny = b1 + 1;
				nx = a1 ;
			}
			else if (fff == 8 && (a1 - 1 > 0) && (b1 - 1 > 0)) //左上
			{
				box[a1 - 1][b1 - 1] = 2;
				nx = a1 - 1;
				ny = b1 - 1; 
			}
			else if (fff == 8 && (a1 - 1 > 0) && (b1 + 1 <= 16)) //左下
			{
				box[a1 - 1][b1 + 1] = 2;
				nx = a1 - 1;
				ny = b1 + 1; 
			}
			else if (fff == 8 && (a1 + 1 <= 16) && (b1 - 1 > 0)) //右上
			{
				box[a1 + 1][b1 - 1] = 2;
				nx = a1 + 1; 
				ny = b1 - 1; 
			}
			else if (fff == 8 && (a1 + 1 <= 16) && (b1 + 1 <= 16)) //右下
			{
				box[a1 + 1][b1 + 1] = 2;
				nx = a1 + 1; 
				ny = b1 + 1; 
			}

			if (fff == 8)
			{
				int nx1=nx, ny1=ny;
				setlinecolor(WHITE); setfillcolor(WHITE);
				nx = nx * 36 + 4; ny = ny * 36 + 4;
				fillcircle(nx, ny, 16);
				
				int r = judge(nx1, ny1, f);
				if (r == 1)
				{
					srand((int)time(0));
					int suiji = rand() % 5;
					settextstyle(22, 18, _T("Consolas"));

					setcolor(RGB(255, 205, 150));
					setfillcolor(RGB(255, 205, 150));
					fillrectangle(210, 630, 460, 670);
					setcolor(YELLOW);
					outtextxy(80, 630, "小口诀-->");
					outtextxy(260, 630, geyan[suiji]); 

					setcolor(YELLOW);
					setbkcolor(RGB(255, 205, 150));
					fillrectangle(184, 120, 436, 440);//绘制结算框
					outtextxy(245, 125, "对局结束");
					settextstyle(22, 18, _T("Consolas"));
					outtextxy(243, 165, "电脑获胜");
					setcolor(BLACK);
					settextstyle(15, 10, _T("Consolas"));
					outtextxy(238, 200, "★★★对局详情★★★");
					time(&rawtime);
					getime = localtime(&rawtime);
					year2 = getime->tm_year + 1900;
					month2 = getime->tm_mon + 1;
					day2 = getime->tm_mday;
					hour2 = getime->tm_hour;
					min2 = getime->tm_hour;
					sec2 = getime->tm_sec;
					int dhour = 0, dmin = 0, dsec = 0, t1, t2;
					t1 = hour1 * 3600 + min1 * 60 + sec1;
					t2 = hour2 * 3600 + min2 * 60 + sec2;
					t2 = t2 - t1;
					dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
					sprintf_s(charhour, "%02d:", dhour);
					sprintf_s(charmin, "%02d:", dmin);
					sprintf_s(charsec, "%02d", dsec);
					outtextxy(215, 230, "对局用时:");
					outtextxy(307, 230, charhour);
					outtextxy(340, 230, charmin);
					outtextxy(373, 230, charsec);

					outtextxy(215, 260, "开始时间:");
					sprintf_s(charyear, "%d.", year1);
					sprintf_s(charmonth, "%02d.", month1);
					sprintf_s(charday, "%02d", day1);
					sprintf_s(charhour, "%02d:", hour1);
					sprintf_s(charmin, "%02d:", min1);
					sprintf_s(charsec, "%02d", sec1);
					outtextxy(307, 260, charyear);
					outtextxy(355, 260, charmonth);
					outtextxy(385, 260, charday);
					outtextxy(307, 280, charhour);
					outtextxy(340, 280, charmin);
					outtextxy(373, 280, charsec);

					outtextxy(215, 310, "结束时间:");
					sprintf_s(charyear, "%d.", year2);
					sprintf_s(charmonth, "%02d.", month2);
					sprintf_s(charday, "%02d", day2);
					sprintf_s(charhour, "%02d:", hour2);
					sprintf_s(charmin, "%02d:", min2);
					sprintf_s(charsec, "%02d", sec2);
					outtextxy(307, 310, charyear);
					outtextxy(355, 310, charmonth);
					outtextxy(385, 310, charday);
					outtextxy(307, 330, charhour);
					outtextxy(340, 330, charmin);
					outtextxy(373, 330, charsec);

					settextstyle(16, 13, _T("Consolas"));
					outtextxy(260, 364, "再来一局");
					outtextxy(260, 401, "退出游戏");

					break;
				}
				else
				{
					settextcolor(WHITE);
					outtextxy(190, 630, "   请玩家落子~");
					continue; /注意这里直接结束了
				}
			}

			struct aluo {
				int sum = 0, f;  // 0横  1竖 2左上右下 3右上左下
			}aii[4];
			int ss;

			aii[0].f = 0;  aii[0].sum = 0;  ss = 0; //横 
			for (int i = a1 - 3; i <= a1 + 3; i++)  
			{
				if (i <= 0) continue;
				if (i > 16)
				{
					aii[0].sum = max(aii[0].sum, ss);
					ss = 0;
					break;
				}
				if (box[i][b1] == 1) ss++;
				else
				{
					aii[0].sum = max(aii[0].sum, ss);
					ss = 0;
				}
			}

			aii[1].f = 1; aii[1].sum = 0;  ss = 0; //竖
			for (int i = b1 - 3; i <= b1 + 3; i++)
			{
				if (i <= 0) continue;
				if (i > 16)
				{
					aii[1].sum = max(aii[1].sum, ss);
					ss = 0;
					break;
				}
				if (box[a1][i] == 1) ss++;
				else
				{
					aii[1].sum = max(aii[1].sum, ss);
					ss = 0;
				}
			}

			aii[2].f = 2; aii[2].sum = 0; ss = 0;//左上右下
			for (int i = a1 - 3, j = b1 - 3; i <= a1 + 3; i++, j++)
			{
				if (i <= 0 || j <= 0 ) continue;
				if (i > 16 || j > 16)
				{
					aii[2].sum = max(aii[2].sum, ss);
					ss = 0;
					continue;
				}
				if (box[i][j] == 1) ss++;
				else
				{
					aii[2].sum = max(aii[2].sum, ss);
					ss = 0;
				}
			}

			aii[3].f = 3; aii[3].sum = 0; ss = 0; //左下右上
			for (int i = a1 - 3, j = b1 + 3; i <= a1 + 3; i++, j--)
			{
				if (i <= 0 || j <= 0) continue;
				if (i > 16 || j > 16)
				{
					aii[3].sum = max(aii[3].sum, ss);
					ss = 0;
					continue;
				}
				if (box[i][j] == 1) ss++;
				else
				{
					aii[3].sum = max(aii[3].sum, ss);
					ss = 0;
				}
			}

		
			for (int i = 0; i < 4; i++)
			{
				for (int j = i + 1; j < 4; j++)
				{
					if (aii[i].sum < aii[j].sum)
						swap(aii[i], aii[j]);
				}
			}

			int ff = 1;  // 0横  1竖 2左上右下 3右上左下
			for (int k = 0; k < 4; k++)
			{
				if (aii[k].f == 0)
				{
					for (int i = a1 - 1; i >= a1 - 3; i--)
					{
						if (i <= 0) break;
						if (box[i][b1] == 2) break;
						if (box[i][b1] == 0)
						{
							box[i][b1] = 2;
							nx = i; ny = b1;
							ff = 0; 
							break;
						}
					}
					if (ff)
					{
						for (int i = a1 + 1; i <= a1 + 3; i++)
						{
							if (i > 16) break;
							if (box[i][b1] == 2) break;
							if (box[i][b1] == 0)
							{
								box[i][b1] = 2;
								nx = i; ny = b1;
								ff = 0;
								break;
							}
						}
					}
					if (ff == 0) break;
				}
				else if (aii[k].f == 1)
				{
					for (int i = b1 - 1; i >= b1 - 3; i--)
					{
						if (i <= 0) break;
						if (box[a1][i] == 2) break;
						if (box[a1][i] == 0)
						{
							box[a1][i] = 2;
							nx = a1; ny = i;
							ff = 0; 
							break;
						}
					}
					if (ff)
					{
						for (int i = b1 + 1; i <= b1 + 3; i++)
						{
							if (i > 16) break;
							if (box[a1][i] == 2) break;
							if (box[a1][i] == 0)
							{
								box[a1][i] = 2;
								nx = a1; ny = i;
								ff = 0;
								break;
							}
						}
					}
					if (ff == 0) break;
				}
				else if (aii[k].f == 2)
				{
					for (int i = a1 - 1, j = b1 - 1; i >= a1 - 3; i--, j--)
					{
						if (i <= 0 || j <= 0) continue;
						if (box[i][j] == 2) break;
						if (box[i][j] == 0)
						{
							box[i][j] = 2;
							nx = i; ny = j;
							ff = 0;
							break;
						}
					}
					if (ff)
					{
						for (int i = a1 + 1, j = b1 + 1; i <= a1 + 3; i++, j++)
						{
							if (i > 16 || j > 16) continue;
							if (box[i][j] == 2) break;
							if (box[i][j] == 0)
							{
								box[i][j] = 2;
								nx = i; ny = j;
								ff = 0;
								break;
							}
						}
					}
					if (ff == 0) break;
				}
				else if (aii[k].f == 3)
				{
					for (int i = a1 - 1, j = b1 + 1; i >= a1 - 3; i--, j++)
					{
						if (i <= 0 || j > 16) continue;
						if (box[i][j] == 2) break;
						if (box[i][j] == 0)
						{
							box[i][j] = 2;
							nx = i; ny = j;
							ff = 0;
							break;
						}
					}
					if (ff)
					{
						for (int i = a1 + 1, j = b1 - 1; i <= a1 + 3; i++, j--)
						{
							if (i > 16 || j <= 0) continue;
							if (box[i][j] == 2) break;
							if (box[i][j] == 0)
							{
								box[i][j] = 2;
								nx = i; ny = j;
								ff = 0; 
								break;
							}
						}
					}
					if (ff == 0) break;
				}
			}

			if (ff == 0) //说明找到了合适的落子位置
			{
				int nx1 = nx, ny1 = ny;
				nx = nx * 36 + 4; ny = ny * 36 + 4;
				setlinecolor(WHITE); setfillcolor(WHITE);
				fillcircle(nx, ny, 16);
				int r = judge(nx1, ny1, f);
				if (r == 1)
				{
					srand((int)time(0));
					int suiji = rand() % 5;
					settextstyle(22, 18, _T("Consolas"));

					setcolor(RGB(255, 205, 150));
					setfillcolor(RGB(255, 205, 150));
					fillrectangle(210, 630, 460, 670);
					setcolor(YELLOW);
					outtextxy(80, 630, "小口诀-->");
					outtextxy(260, 630, geyan[suiji]);

					setcolor(YELLOW);
					setbkcolor(RGB(255, 205, 150));
					fillrectangle(184, 120, 436, 440);//绘制结算框
					outtextxy(245, 125, "对局结束");
					settextstyle(22, 18, _T("Consolas"));
					outtextxy(243, 165, "电脑获胜");
					setcolor(BLACK);
					settextstyle(15, 10, _T("Consolas"));
					outtextxy(238, 200, "★★★对局详情★★★");
					time(&rawtime);
					getime = localtime(&rawtime);
					year2 = getime->tm_year + 1900;
					month2 = getime->tm_mon + 1;
					day2 = getime->tm_mday;
					hour2 = getime->tm_hour;
					min2 = getime->tm_hour;
					sec2 = getime->tm_sec;
					int dhour = 0, dmin = 0, dsec = 0, t1, t2;
					t1 = hour1 * 3600 + min1 * 60 + sec1;
					t2 = hour2 * 3600 + min2 * 60 + sec2;
					t2 = t2 - t1;
					dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
					sprintf_s(charhour, "%02d:", dhour);
					sprintf_s(charmin, "%02d:", dmin);
					sprintf_s(charsec, "%02d", dsec);
					outtextxy(215, 230, "对局用时:");
					outtextxy(307, 230, charhour);
					outtextxy(340, 230, charmin);
					outtextxy(373, 230, charsec);

					outtextxy(215, 260, "开始时间:");
					sprintf_s(charyear, "%d.", year1);
					sprintf_s(charmonth, "%02d.", month1);
					sprintf_s(charday, "%02d", day1);
					sprintf_s(charhour, "%02d:", hour1);
					sprintf_s(charmin, "%02d:", min1);
					sprintf_s(charsec, "%02d", sec1);
					outtextxy(307, 260, charyear);
					outtextxy(355, 260, charmonth);
					outtextxy(385, 260, charday);
					outtextxy(307, 280, charhour);
					outtextxy(340, 280, charmin);
					outtextxy(373, 280, charsec);

					outtextxy(215, 310, "结束时间:");
					sprintf_s(charyear, "%d.", year2);
					sprintf_s(charmonth, "%02d.", month2);
					sprintf_s(charday, "%02d", day2);
					sprintf_s(charhour, "%02d:", hour2);
					sprintf_s(charmin, "%02d:", min2);
					sprintf_s(charsec, "%02d", sec2);
					outtextxy(307, 310, charyear);
					outtextxy(355, 310, charmonth);
					outtextxy(385, 310, charday);
					outtextxy(307, 330, charhour);
					outtextxy(340, 330, charmin);
					outtextxy(373, 330, charsec);

					settextstyle(16, 13, _T("Consolas"));
					outtextxy(260, 364, "再来一局");
					outtextxy(260, 401, "退出游戏");

					break;
				}
				else
				{
					settextcolor(WHITE);
					outtextxy(190, 630, "   请玩家落子~");

				}
					
			}

			
		}//ai落子结束 开始下一个循环

		if ((m.x >= 598 && m.x <= 681) && (m.y >= 241 && m.y <= 257) && !m.mkLButton)
		{
			setcolor(YELLOW); //黄色选择框
			line(598, 241, 598, 246);
			line(598, 241, 603, 241);
			line(681, 257, 681, 252);
			line(681, 257, 676, 257);
		}
		else if ((m.x >= 598 && m.x <= 681) && (m.y >= 241 && m.y <= 257) && m.mkLButton)
		{
			if (yinyue == 0)
			{
				mciSendString("open D:\\gobang\\1.mp3 alias jpmusic", NULL, 0, NULL);
				mciSendString("play jpmusic", NULL, 0, NULL);
				yinyue = 1;

				setcolor(RED);
				settextstyle(15, 10, _T("Consolas"));
				outtextxy(599, 242, "关闭音乐");
			}
			else
			{
				mciSendString("close jpmusic", NULL, 0, NULL);
				yinyue = 0;
				setcolor(RED);
				settextstyle(15, 10, _T("Consolas"));
				outtextxy(599, 242, "开启音乐");
			}
		}
		else
		{
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			line(598, 241, 598, 246);
			line(598, 241, 603, 241);
			line(681, 257, 681, 252);
			line(681, 257, 676, 257);

		}

		if ((m.x >= 598 && m.y <= 681) && (m.y >= 290 && m.y <= 307) && !m.mkLButton)
		{
			setcolor(YELLOW); //黄色选择框
			line(598, 290, 598, 294);
			line(598, 290, 603, 290);
			line(681, 307, 681, 302);
			line(681, 307, 676, 307);
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
		}
		else if ((m.x >= 598 && m.y <= 681) && (m.y >= 290 && m.y <= 307) && m.mkLButton)
		{
			mciSendString("close jpmusic", NULL, 0, NULL);
			menu(); return;
		}
		else
		{
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			line(598, 290, 598, 294);
			line(598, 290, 603, 290);
			line(681, 307, 681, 302);
			line(681, 307, 676, 307);

		}

		if ((m.x >= 598 && m.y <= 681) && (m.y >= 341 && m.y <= 358) && !m.mkLButton)
		{
			setcolor(YELLOW); //黄色选择框
			line(598, 341, 598, 346);
			line(598, 341, 603, 341);
			line(681, 358, 681, 353);
			line(681, 358, 676, 358);
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
		}
		else if ((m.x >= 598 && m.y <= 681) && (m.y >= 341 && m.y <= 358) && m.mkLButton)
		{
			mciSendString("close jpmusic", NULL, 0, NULL);
			game_out(); return;
		}
		else
		{
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			line(598, 341, 598, 346);
			line(598, 341, 603, 341);
			line(681, 358, 681, 353);
			line(681, 358, 676, 358);
		}
	}

	while (1)
	{
		m = GetMouseMsg();
		if ((m.x >= 257 && m.x <= 368) && (m.y >= 360 && m.y <= 381) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(257, 360, 257, 371); //对局清算 再来一局按钮  选择框左上
			line(257, 360, 268, 360);
			line(368, 381, 368, 370);
			line(357, 381, 368, 381);
		}
		else if ((m.x >= 257 && m.x <= 368) && (m.y >= 360 && m.y <= 381) && m.mkLButton)
		{
			menu();
			return;
		}
		else
		{
			setcolor(RED);
			line(257, 360, 257, 371); //对局清算 再来一局按钮  选择框恢复
			line(257, 360, 268, 360);
			line(368, 381, 368, 370);
			line(357, 381, 368, 381);
		}

		if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
			line(258, 399, 258, 410);
			line(368, 418, 368, 407);
			line(357, 418, 368, 418);
		}
		else if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && m.mkLButton)
		{
			game_out();
			return;
		}
		else
		{
			setcolor(RED);
			line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
			line(258, 399, 258, 410);
			line(368, 418, 368, 407);
			line(357, 418, 368, 418);
		}

		if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(78, 630, 89, 630);
			line(78, 630, 78, 641);
			line(586, 654, 586, 643);
			line(586, 654, 575, 654);
		}
		else if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && m.mkLButton)
		{
			game_help(); return;
		}
		else
		{
			setcolor(RED);
			line(78, 630, 89, 630);
			line(78, 630, 78, 641);
			line(586, 654, 586, 643);
			line(586, 654, 575, 654);
		}
	}
}


void go_game()
{
	int yinyue = 0;
	int a, b,f=1,c=0,d=0,a1,b1,k=0; //f标志黑白与用户 ,c,d分别复制a,b 响应选择框
	int z1 = 0, z2 = 0;
	char z3[100], z4[100];
	draw();
	memset(box, 0, sizeof(box));//初始化棋盘为0 
	//jishi();

	int year1, year2, month1, month2, day1, day2,hour1,hour2,min1,min2,sec1,sec2;
	char charyear[10], charmonth[10], charday[10], charhour[10], charmin[10], charsec[10];
	time_t rawtime;
	struct tm *getime;
	time(&rawtime);
	getime = localtime(&rawtime);
	year1 = getime->tm_year + 1900;
	month1 = getime->tm_mon + 1;
	day1 = getime->tm_mday;
	hour1 = getime->tm_hour;
	min1 = getime->tm_hour;
	sec1 = getime->tm_sec;

	settextstyle(20, 15, _T("Consolas"));  //落子计数
	outtextxy(595, 40, "先后手");
	settextstyle(15, 10, _T("Consolas"));
	outtextxy(595, 73, "玩家A先-黑");
	outtextxy(595, 95, "玩家B后-白"); //白子个数
	settextstyle(20, 15, _T("Consolas"));  //落子计数
	outtextxy(595, 150, "落子数");
	settextstyle(15, 10, _T("Consolas"));
	sprintf_s(z3, "%d", z1);
	outtextxy(595, 180, "玩家A:");
	outtextxy(655, 180, z3);
	outtextxy(595, 202, "玩家B:"); //白子个数
	sprintf_s(z4, "%d", z2);
	outtextxy(655, 202, z4);

	outtextxy(590, 262, "-双人对战-");
	outtextxy(599, 302, "开启音乐");
	outtextxy(599, 352, "返回菜单"); 
	outtextxy(599, 402, "退出游戏"); 

	MOUSEMSG m,t;  // 获取鼠标信息
	while (true)   //大循环 落子 鼠标相应 输赢判断
	{
		
		m = GetMouseMsg();
		if ( (m.x >= 40 && m.x <= 580) && (m.y >= 40 && m.y <= 580))  //落子及鼠标相应
		{
			a = (m.x + 18) / 36; b = (m.y + 18) / 36; //行列坐标
			a1 = a; b1 = b;
			if (box[a][b]==0) //如果该位置没有子,则可选择
			{
				a = a * 36 + 4; b = b * 36 + 4;   //精确到十字线
				setcolor(YELLOW); //黄色选择框
				line(a - 8, b - 8, a - 13, b - 8); //左上
				line(a - 8, b - 8, a - 8, b - 13);
				line(a + 8, b - 8, a + 13, b - 8); //右上
				line(a + 8, b - 8, a + 8, b - 13);
				line(a - 8, b + 8, a - 13, b + 8); //左下
				line(a - 8, b + 8, a - 8, b + 13);
				line(a + 8, b + 8, a + 13, b + 8); //右下
				line(a + 8, b + 8, a + 8, b + 13);
				setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
				if ( (c != a || d != b) && (!k) )
				{
					line(c - 8, d - 8, c - 13, d - 8);//左上
					line(c - 8, d - 8, c - 8, d - 13);
					line(c + 8, d - 8, c + 13, d - 8); //右上
					line(c + 8, d - 8, c + 8, d - 13);
					line(c - 8, d + 8, c - 13, d + 8); //左下
					line(c - 8, d + 8, c - 8, d + 13);
					line(c + 8, d + 8, c + 13, d + 8);//右下
					line(c + 8, d + 8, c + 8, d + 13);
				}
				c = a; d = b; //分别复制a,b 响应选择框 
				if (m.mkLButton)
				{
					if (f)  //f=1 为黑
					{
						setlinecolor(BLACK); setfillcolor(BLACK); f = 0;
						fillcircle(a, b, 16);
						box[a1][b1] = 1;
						z1++; sprintf_s(z3, "%d", z1);
						settextstyle(15, 10, _T("Consolas"));
						setcolor(BLACK);  setfillcolor(BLACK);
						outtextxy(655, 180, z3); //黑子个数

						settextstyle(30, 22, _T("Consolas"));
						setcolor(WHITE); setfillcolor(WHITE);
						outtextxy(210, 630, "请玩家B落子");
					}
					else
					{
						setlinecolor(WHITE); setfillcolor(WHITE);  f = 1;
						fillcircle(a, b, 16);
						box[a1][b1] = 2; // 白为2
						z2++; sprintf_s(z4, "%d", z2);
						setcolor(WHITE);  setfillcolor(BLACK);
						settextstyle(15, 10, _T("Consolas"));
						outtextxy(655, 202, z4);

						settextstyle(30, 22, _T("Consolas"));
						setcolor(BLACK);  setfillcolor(BLACK);
						outtextxy(210, 630, "请玩家A落子");
						

					}
					
					 k = 1;
				}
				else
					k = 0;
			}
		} 

		if ((m.x >= 598 && m.x <= 681) && (m.y >= 00 && m.y <= 318) && !m.mkLButton) //开启关闭音乐
		{
			setcolor(YELLOW); //黄色选择框
			line(598, 300, 598, 305);
			line(598, 300, 603, 300);
			line(681, 318, 681, 313);
			line(681, 318, 676, 318);
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
		}
		else if ((m.x >= 598 && m.x <= 681) && (m.y >= 00 && m.y <= 318) && m.mkLButton)
		{
			if (yinyue == 0)
			{
				mciSendString("open D:\\gobang\\1.mp3 alias jpmusic", NULL, 0, NULL);
				mciSendString("play jpmusic", NULL, 0, NULL);
				yinyue = 1;

				setcolor(RED);
				settextstyle(15, 10, _T("Consolas"));
				outtextxy(599, 302, "关闭音乐");
				setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			}
			else
			{
				mciSendString("close jpmusic", NULL, 0, NULL);
				yinyue = 0;
				setcolor(RED);
				settextstyle(15, 10, _T("Consolas")); 
				outtextxy(599, 302, "开启音乐");
				setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			}

		}
		else
		{
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			line(598, 300, 598, 305);
			line(598, 300, 603, 300);
			line(681, 318, 681, 313);
			line(681, 318, 676, 318);
		}

		if ((m.x >= 598 && m.x <= 681) && (m.y >= 351 && m.y <= 367) && !m.mkLButton) //返回菜单
		{
			setcolor(YELLOW); //黄色选择框
			line(598, 351, 598, 356);
			line(598, 351, 603, 351);
			line(681, 367, 681, 362);
			line(681, 367, 676, 367);
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
		}
		else if ((m.x >= 598 && m.x <= 681) && (m.y >= 351 && m.y <= 367) && m.mkLButton)
		{
			if(yinyue==1)
				mciSendString("close jpmusic", NULL, 0, NULL);
			menu();  return;
		}
		else
		{
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			line(598, 351, 598, 356);
			line(598, 351, 603, 351);
			line(681, 367, 681, 362);
			line(681, 367, 676, 367);

		}

		if ((m.x >= 598 && m.y <= 681) && (m.y >= 401 && m.y <= 417) && !m.mkLButton) //退出游戏
		{
			setcolor(YELLOW); //黄色选择框
			line(598, 401, 598, 406);
			line(598, 401, 603, 401);
			line(681, 417, 681, 412);
			line(681, 417, 676, 417);
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
		}
		else if ((m.x >= 598 && m.y <= 681) && (m.y >= 401 && m.y <= 417) && m.mkLButton)
		{
			if (yinyue == 1)
				mciSendString("close jpmusic", NULL, 0, NULL);
			game_out(); return;
		}
		else
		{
			setcolor(RGB(255, 205, 150)); //用原色覆盖选择框
			line(598, 401, 598, 406);
			line(598, 401, 603, 401);
			line(681, 417, 681, 412);
			line(681, 417, 676, 417);
		}

		if (k)
		{
			int r = 0;
			srand((int)time(0));
			int suiji = rand() % 5;
			settextstyle(22, 18, _T("Consolas"));
			setcolor(YELLOW); 
			 r = judge(a1, b1,f); //传入落子坐标
			 if (r == 1 && f == 1)
			 {
				 setcolor(RGB(255, 205, 150));
				 setfillcolor(RGB(255, 205, 150));
				 fillrectangle(210, 630, 460, 670);
				 setcolor(YELLOW);
				 outtextxy(80, 630, "小口诀-->");
				 outtextxy(260, 630, geyan[suiji]); //用户B
				 break;
			 }
			 else if (r == 1 && f == 0)
			 {
				 setcolor(RGB(255, 205, 150));
				 setfillcolor(RGB(255, 205, 150));
				 fillrectangle(210, 630, 460, 670);
				 setcolor(YELLOW);
				 outtextxy(80, 630, "小口诀-->");
				 outtextxy(260, 630, geyan[suiji]); // 黑棋为用户A
				 break;
			 }
		}
	} 
	//一方胜利则对局(循环)结束
	setcolor(YELLOW);
	setbkcolor(RGB(255, 205, 150)); 
	fillrectangle(184, 120, 436, 440);//绘制结算框
	outtextxy(237, 125, "对局结束");
	settextstyle(22, 18, _T("Consolas"));
	if (f == 1)
		outtextxy(243, 165, "玩家A胜");
	else
		outtextxy(243, 165, "玩家B胜");
	setcolor(BLACK);
	settextstyle(15, 10, _T("Consolas"));
	outtextxy(238, 200, "★★★对局详情★★★");

	time(&rawtime);
	getime = localtime(&rawtime);
	year2 = getime->tm_year + 1900;
	month2 = getime->tm_mon + 1;
	day2 = getime->tm_mday;
	hour2 = getime->tm_hour;
	min2 = getime->tm_hour;
	sec2 = getime->tm_sec;
	int dhour = 0, dmin = 0, dsec = 0,t1,t2;
	t1 = hour1 * 3600 + min1 * 60 + sec1;
	t2 = hour2 * 3600 + min2 * 60 + sec2;
	t2 = t2 - t1;
	dhour = t2 / 3600; dmin = (t2 - dhour * 3600) / 60; dsec = t2 - dhour * 3600 - dmin * 60;
	sprintf_s(charhour, "%02d:", dhour);
	sprintf_s(charmin, "%02d:", dmin);
	sprintf_s(charsec, "%02d", dsec);
	outtextxy(215, 230, "对局用时:"); 
	outtextxy(307, 230, charhour);
	outtextxy(340, 230, charmin);
	outtextxy(373, 230, charsec);
	
	outtextxy(215, 260, "开始时间:");
	sprintf_s(charyear, "%d.", year1);
	sprintf_s(charmonth, "%02d.", month1);
	sprintf_s(charday, "%02d", day1);
	sprintf_s(charhour, "%02d:", hour1);
	sprintf_s(charmin, "%02d:", min1);
	sprintf_s(charsec, "%02d", sec1);
	outtextxy(307, 260, charyear);
	outtextxy(355, 260, charmonth);
	outtextxy(385, 260, charday);
	outtextxy(307, 280, charhour);
	outtextxy(340, 280, charmin);
	outtextxy(373, 280, charsec);

	outtextxy(215, 310, "结束时间:");
	sprintf_s(charyear, "%d.", year2);
	sprintf_s(charmonth, "%02d.", month2);
	sprintf_s(charday, "%02d", day2);
	sprintf_s(charhour, "%02d:", hour2);
	sprintf_s(charmin, "%02d:", min2);
	sprintf_s(charsec, "%02d", sec2);
	outtextxy(307, 310, charyear);
	outtextxy(355, 310, charmonth);
	outtextxy(385, 310, charday);
	outtextxy(307, 330, charhour);
	outtextxy(340, 330, charmin);
	outtextxy(373, 330, charsec);  

	settextstyle(16, 13, _T("Consolas"));
	outtextxy(260, 364, "再来一局");
	outtextxy(260, 401, "退出游戏");


	while (1)
	{
		m = GetMouseMsg();
		if (  (m.x >= 257 && m.x <= 368)  && (m.y>=360 && m.y<=381) &&  !m.mkLButton)
		{
			setcolor(YELLOW);
			line(257, 360, 257, 371); //对局清算 再来一局按钮  选择框左上
			line(257, 360, 268, 360);
			line(368, 381, 368, 370);
			line(357, 381, 368, 381);
		}
		else if ((m.x >= 257 && m.x <= 368) && (m.y >= 360 && m.y <= 381) && m.mkLButton)
		{
			menu();
			return;
		}
		else
		{
			setcolor(RED);
			line(257, 360, 257, 371); //对局清算 再来一局按钮  选择框恢复
			line(257, 360, 268, 360);
			line(368, 381, 368, 370);
			line(357, 381, 368, 381);
		}

		if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
			line(258, 399, 258, 410);
			line(368, 418, 368, 407);
			line(357, 418, 368, 418);
		}
		else if ((m.x >= 258 && m.x <= 368) && (m.y >= 399 && m.y <= 418) && m.mkLButton)
		{
			game_out();
			return;
		}
		else
		{
			setcolor(RED);
			line(258, 399, 269, 399);// 对局清算 退出游戏 选择框
			line(258, 399, 258, 410);
			line(368, 418, 368, 407);
			line(357, 418, 368, 418);
		}

		if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(78, 630, 89, 630);
			line(78, 630, 78, 641);
			line(586, 654, 586, 643);
			line(586, 654, 575, 654);
		}
		else if ((m.x >= 78 && m.x <= 586) && (m.y >= 630 && m.y <= 654) && m.mkLButton)
		{
			game_help(); return;
		}
		else
		{
			setcolor(RED);
			line(78, 630, 89, 630);
			line(78, 630, 78, 641);
			line(586, 654, 586, 643);
			line(586, 654, 575, 654);
		}
	}
	// 双人对战函数 结束
}


int judge(int x, int y,int f)
{
	int i, j, s;
	if (f)  //f=1 说明落子为白子,接下来判box是否为2
		f = 2;
	else
		f = 1;
	for (i = x - 4, s = 0; i <= x + 4; i++) //横向判断
	{
		if (i > 16 || i < 0)
			continue; //排除越界
		if (box[i][y] == f)
			s++;
		else
			s = 0;
		if (s == 5)
			return 1;
	}
	for (i = y - 4, s = 0; i <= y + 4; i++)
	{
		if (i > 16 || i < 0)
			continue;
		if (box[x][i] == f)
			s++;
		else
			s = 0;
		if (s == 5)
			return 1;
	}
	for (i = x - 4, j = y + 4, s = 0; i <= x + 4 && j >= y - 4; i++, j--)  //左下->右上判断
	{
		if (x < 0 || x>16 || j < 0 || j>16)
			continue;
		if (box[i][j] == f)
			s++;
		else
			s = 0;
		if (s == 5)
			return 1;
	}
	for (i = x - 4, j = y - 4, s = 0; i <= x + 4 && j <= y + 4; i++, j++)
	{
		if (x < 0 || x>16 || j < 0 || j>16)
			continue;
		if (box[i][j] == f)
			s++;
		else
			s = 0;
		if (s == 5)
			return 1; 
	} 
}
void game_help()
{
	setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
	cleardevice();  //用当前背景色清空画布
	//setbkcolor(RGB(143, 178, 201)); //设置当前设备绘图背景色。
	cleardevice();  //用当前背景色清空画布
	settextcolor(BLACK);  //字体颜色

	int f = 0;
	MOUSEMSG m;
	while (1)
	{
		m = GetMouseMsg();
		if (f == 0)
		{
			rectangle(0, 0, 700, 700);
			setcolor(BLACK); 
			settextstyle(30, 22, _T("Consolas"));
			outtextxy(120, 30, "  *****游戏帮助*****  ");
			settextstyle(28, 20, _T("Consolas"));
			outtextxy(270, 110, "人机对战");
			outtextxy(270, 330, "双人对战");
			settextstyle(22, 15, _T("Consolas"));
			outtextxy(160, 160, "由玩家执黑子先行,电脑执白子");
			outtextxy(160, 220, "双方先完成五子连续者获胜^_^");
			setcolor(BLUE);
			outtextxy(5, 270, " -------------------------------------------- ");
			setcolor(BLACK);
			settextstyle(22, 15, _T("Consolas"));
			outtextxy(160, 380, "玩家A执黑子先行,玩家B执白子");
			outtextxy(160, 440, "双方先完成五子连续者获胜^_^");
			outtextxy(210, 550, "小口诀         返回");

			if ((m.x >= 212 && m.x <= 302) && (m.y >= 550 && m.y <= 572) && !m.mkLButton)
			{
				setcolor(YELLOW);
				line(212, 550, 212, 555);
				line(212, 550, 217, 550);
				line(302, 572, 302, 567);
				line(302, 572, 297, 572);
				setcolor(RGB(255, 205, 150));
			}
			else if ((m.x >= 212 && m.x <= 302) && (m.y >= 550 && m.y <= 572) && m.mkLButton)
			{
				f = 1;
				setfillcolor(RGB(255, 205, 150));
				fillrectangle(0, 0, 700, 700);
			}
			else
			{
				setcolor(RGB(255, 205, 150));
				line(212, 550, 212, 555);
				line(212, 550, 217, 550);
				line(302, 572, 302, 567);
				line(302, 572, 297, 572);

			}

			if ((m.x >= 433 && m.x <= 497) && (m.y >= 550 && m.y <= 571) && !m.mkLButton)
			{
				setcolor(YELLOW);
				line(433, 550, 433, 555);
				line(433, 550, 438, 550);
				line(497, 571, 497, 566);
				line(497, 571, 492, 571);
				setcolor(RGB(255, 205, 150));
			}
			else if ((m.x >= 433 && m.x <= 497) && (m.y >= 550 && m.y <= 571) && m.mkLButton)
			{
				menu(); return;
			}
			else
			{
				setcolor(RGB(255, 205, 150));
				line(433, 550, 433, 555);
				line(433, 550, 438, 550);
				line(497, 571, 497, 566);
				line(497, 571, 492, 571);
			}
		}
		else
		{
			setcolor(BLACK);
			settextstyle(30, 22, _T("Consolas"));
			outtextxy(120, 30, "  *****游戏帮助*****  ");
			settextstyle(28, 20, _T("Consolas"));
			outtextxy(230, 110, "五子棋小口诀");
			settextstyle(22, 15, _T("Consolas"));
			outtextxy(70, 170, "先手要攻,后手要守,以攻为守,以守待攻");
			outtextxy(70, 230, "初盘争二,终局抢三,留三不冲,变化万千");
			outtextxy(70, 290, "多个先手,细算次先,五子要点,次序在前");
			outtextxy(70, 350, "斜线为阴,直线为阳,阴阳结合,防不胜防");
			outtextxy(70, 410, "连三连四,易见为明,跳三跳四,暗剑深藏");
			outtextxy(290, 480, "更多教程");
			outtextxy(168, 550, "玩法简介         回到菜单");

			if ((m.x >= 288 && m.x <= 412) && (m.y >= 477 && m.y <= 501) && !m.mkLButton)
			{
				setcolor(YELLOW);
				line(288, 477, 288, 482);
				line(288, 477, 293, 477);
				line(412, 501, 412, 496);
				line(412, 501, 407, 501);
				setcolor(RGB(255, 205, 150));
			}
			else if ((m.x >= 288 && m.x <= 412) && (m.y >= 477 && m.y <= 501) && m.mkLButton)
			{
				system("start https://www.bilibili.com/video/BV1Qt411n7Y4?from=search&seid=17013933518128012201");
			}
			else
			{
				setcolor(RGB(255, 205, 150));
				line(288, 477, 288, 482);
				line(288, 477, 293, 477);
				line(412, 501, 412, 496);
				line(412, 501, 407, 501);
			}

			if ((m.x >= 167 && m.x <= 285) && (m.y >= 547 && m.y <= 571) && !m.mkLButton)
			{
				setcolor(YELLOW);
				line(167, 547, 167, 552);
				line(167, 547, 172, 547);
				line(285, 571, 285, 566);
				line(285, 571, 280, 571);
				setcolor(RGB(255, 205, 150));
			}
			else if ((m.x >= 167 && m.x <= 285) && (m.y >= 547 && m.y <= 571) && m.mkLButton)
			{
				f = 0;
				setfillcolor(RGB(255, 205, 150));
				fillrectangle(0, 0, 700, 700);
			}
			else
			{
				setcolor(RGB(255, 205, 150));
				line(167, 547, 167, 552);
				line(167, 547, 172, 547);
				line(285, 571, 285, 566);
				line(285, 571, 280, 571);
			}

			if ((m.x >= 423 && m.x <= 543) && (m.y >= 548 && m.y <= 569) && !m.mkLButton)
			{
				setcolor(YELLOW);
				line(423, 548, 423, 553);
				line(423, 548, 428, 548);
				line(543, 569, 543, 564);
				line(543, 569, 538, 569);
				setcolor(RGB(255, 205, 150));
			}
			else if ((m.x >= 423 && m.x <= 543) && (m.y >= 548 && m.y <= 569) && m.mkLButton)
			{
				menu(); return;
			}
			else
			{
				setcolor(RGB(255, 205, 150));
				line(423, 548, 423, 553);
				line(423, 548, 428, 548);
				line(543, 569, 543, 564);
				line(543, 569, 538, 569);

			}
		}
	}
}

void game_about()
{

	IMAGE img_gitee,img_sd;
	loadimage(&img_gitee, "D:\\gobang\\gitee_70_21.png");
	loadimage(&img_sd, "D:\\gobang\\sd_30_24.png");
	
	setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
	cleardevice();  //用当前背景色清空画布
	settextcolor(BLACK);  //字体颜色
	settextstyle(30, 22, _T("Consolas"));   //字体高宽比(像素) 30/22 最佳
	outtextxy(150, 50, "*****关于我们*****");

	settextstyle(25, 14, _T("Consolas"));
	outtextxy(110, 130, "一个简单的五子棋小程序......");
	outtextxy(110, 170, "本程序使用基于c++的easyx图形库编写!");
	outtextxy(110, 210, "所有源码已上传至");
	putimage(340, 210, &img_gitee);
	outtextxy(110, 250, "期待你的到来  点击进入......");

	outtextxy(310, 540, "返回");

	setcolor(BLUE);
	settextstyle(25, 14, _T("Consolas"));
	outtextxy(110, 290, "https://gitee.com/siwenzhi/gobang");

	outtextxy(90, 340, " ---------------作者---------------- ");
	settextcolor(BLACK);
	outtextxy(90, 390, " 司三三    郑四四    赵五五    张六六");
	putimage(105, 440, &img_sd);
	outtextxy(140, 440, "郑州学前班幼儿园大学  信息工程学院");

	MOUSEMSG m;  // 获取鼠标信息
	while (true)
	{
		m = GetMouseMsg();
		if ((m.x >= 107 && m.x <= 577) && (m.y >= 290 && m.y <= 318) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(107, 290, 107, 300);  //左上
			line(107, 290, 117, 290);
			line(577, 318, 577, 308);  //右下
			line(577, 318, 567, 318);
		}
		else if ((m.x >= 107 && m.x <= 577) && (m.y >= 290 && m.y <= 318) && m.mkLButton)
		{
			system("start https://gitee.com/siwenzhi/gobang");
		}
		else
		{
			setcolor(RGB(255, 205, 150));
			line(107, 290, 107, 300);  //左上
			line(107, 290, 117, 290);
			line(577, 318, 577, 308);  //右下
			line(577, 318, 567, 318);
		}

		if ((m.x >= 310 && m.x <= 366) && (m.y >= 541 && m.y <= 564) && !m.mkLButton)
		{
			setcolor(YELLOW);
			line(310, 541, 310, 546);  //左上
			line(310, 541, 315, 541);
			line(366, 564, 366, 559);
			line(366, 564, 361, 564);
		}
		else if ((m.x >= 310 && m.x <= 366) && (m.y >= 541 && m.y <= 564) && m.mkLButton)
		{
			setcolor(RGB(255, 205, 150));
			menu();  return;
		}
		else
		{
			setcolor(BLUE);
			line(310, 541, 310, 546);  //左上
			line(310, 541, 315, 541);
			line(366, 564, 366, 559);
			line(366, 564, 361, 564);
		}
	}
}

void game_out()
{
	setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。
	cleardevice();  //用当前背景色清空画布
	settextcolor(BLACK);  //字体颜色
	settextstyle(30, 22, _T("Consolas"));   //字体高宽比(像素) 30/22 最佳
	outtextxy(150, 80, "*****退出游戏*****");

	settextstyle(25, 14, _T("Consolas"));
	outtextxy(260, 140, "你不爱我了嘛");
	IMAGE img_out;
	loadimage(&img_out, "D:\\gobang\\out.jpg");
	putimage(140, 220, &img_out);
	outtextxy(230, 500, "再来一局     退出");
	yiyan();
	MOUSEMSG m;  // 获取鼠标信息
	while (true)
	{
		m = GetMouseMsg();
		if ((m.x >= 129 && m.x <= 592) && (m.y >= 210 && m.y <= 461) && !m.mkLButton)
		{
			setcolor(YELLOW); //图片
			line(129, 210, 129, 235);  //左上
			line(129, 210, 154, 210);
			line(592, 461, 592, 436);  //右下
			line(592, 461, 567, 461);
		}
		else if ((m.x >= 129 && m.x <= 592) && (m.y >= 210 && m.y <= 461) && m.mkLButton)
		{
			system("start https://gitee.com/siwenzhi/gobang");
			//暂时做跳转码云,后续可以改成多个图片轮换
		}
		else
		{
			setcolor(RED);
			line(129, 210, 129, 235);  //左上
			line(129, 210, 154, 210);
			line(592, 461, 592, 436);  //右下
			line(592, 461, 567, 461);
		}

		if ((m.x >= 225 && m.x <= 348) && (m.y >= 495 && m.y <= 528) && !m.mkLButton)
		{
			setcolor(YELLOW); //再来一局 
			line(225, 495, 225, 510);  //左上
			line(225, 495, 240, 495);
			line(348, 528, 348, 513);  //右下
			line(348, 528, 333, 528);
		}
		else if ((m.x >= 225 && m.x <= 348) && (m.y >= 495 && m.y <= 528) && m.mkLButton)
		{
			menu(); break;  //暂定跳转到主菜单
		}
		else
		{
			setcolor(RED);
			line(225, 495, 225, 510);  //左上
			line(225, 495, 240, 495);
			line(348, 528, 348, 513);  //右下
			line(348, 528, 333, 528);
		}

		if ((m.x >= 407 && m.x <= 459) && (m.y >= 497 && m.y <= 528) && !m.mkLButton)
		{
			setcolor(YELLOW); //退出 
			line(407, 497, 407, 512);  //左上
			line(407, 497, 422, 497);
			line(474, 528, 474, 513);  //右下
			line(459, 528, 474, 528);
		}
		else if ((m.x >= 407 && m.x <= 459) && (m.y >= 497 && m.y <= 528) && m.mkLButton)
		{
			closegraph();
			return;   
		}
		else
		{
			setcolor(RED);
			line(407, 497, 407, 512);  //左上
			line(407, 497, 422, 497);
			line(474, 528, 474, 513);  //右下
			line(459, 528, 474, 528);
		}

		if ((m.x >= 100 && m.x <= 642) && (m.y >= 599 && m.y <= 622) && m.mkLButton)
		{
			yiyan();
		}
	}
	
}
void draw()
{
	int i;
	setbkcolor(RGB(255, 205, 150)); //设置当前设备绘图背景色。 原棕色
	cleardevice();  //用当前背景色清空画布
	setcolor(RED);
	settextstyle(20, 14, _T("Consolas"));

	for (i = 40; i <= 580; )
	{
		line(40, i, 580, i); //竖线
		line(i, 40, i, 580); //横线
		i += 36;
	}
	settextstyle(19, 13, _T("Consolas"));
	char a[10]; int b=1;
	for (i = 35; i <=323; i+=36)
	{
		sprintf_s(a, "%d", b);
		outtextxy(i, 11, a);
		b++;
	} //使用循环存在部分数字不能正对网格线,不够美观
	settextstyle(18, 10, _T("Consolas")); 
	outtextxy(352, 12, "10");
	outtextxy(389, 12, "11");
	outtextxy(425, 12, "12");
	outtextxy(462, 12, "13");
	outtextxy(495, 12, "14");
	outtextxy(530, 12, "15");
	outtextxy(563, 12, "16");  
	//竖向字母坐标
	settextstyle(19, 13, _T("Consolas"));
	outtextxy(12, 33, "A");
	outtextxy(12, 70, "B");
	outtextxy(12,102, "C");
	outtextxy(12, 138, "D");
	outtextxy(12, 174, "E");
	outtextxy(12, 210, "F");
	outtextxy(12, 241, "G");
	outtextxy(12, 278, "H");
	outtextxy(12, 318, "I");
	outtextxy(12, 355, "J");
	outtextxy(12, 390, "K");
	outtextxy(12, 425, "L");
	outtextxy(12, 458, "M");
	outtextxy(12, 495, "N");
	outtextxy(12, 530, "O");
	outtextxy(12, 565, "P");
}
void yiyan()
{
	char yanyan[][500] = { {"绿树阴浓夏日长,楼台倒影入池塘"},{"荷叶罗裙一色裁,芙蓉向脸两边开"},{"  悠悠洛阳道,此会在何年"},{"   湖上西风斜日,荷花落尽红英   "},{"白日放歌须纵酒,青春作伴好还乡"},
		{"     镜湖三百里,菡萏发荷花        "},{"接天莲叶无穷碧,映日荷花别样红"},{"     端午临中夏,时清日复长        "},{"     万壑树参天,千山响杜鹃        "},{"     清晨入古寺,初日照高林        "},
		{"朱门几处看歌舞,犹恐春阴咽管弦"},{"     竹色溪下绿,荷花镜里香         "},{"飞花两岸照船红,百里榆堤半日风"},{"      波面澄霞,兰艇采香去            "},{"    阳春布德泽,万物生光辉         "},
		{"    荷风送香气,竹露滴清响          "},{"清江一曲抱村流,长夏江村事事幽"},{"    荷花开后西湖好,载酒来时      "},{"若耶溪傍采莲女,笑隔荷花共人语"},{"     春游芳草地,夏赏绿荷池        "} };
		//20个
		settextcolor(BLACK);  //字体颜色
		settextstyle(22, 18, _T("Consolas"));   //字体高宽比(像素) 30/22 最佳
		srand((int)time(0));
		int yansui = rand() % 20;

		//outtextxy(100, 600, yanyan[0]);
		//outtextxy(100, 600, yanyan[2]);

		outtextxy(100, 600, yanyan[yansui]);

		settextcolor(BLACK);  //字体颜色
		settextstyle(30, 22, _T("Consolas"));   //字体高宽比(像素) 30/22 最佳
}
void mousetest()
{
	MOUSEMSG m;  // 获取鼠标信息
	char a[10], b[10];
	while (true)
	{
		m = GetMouseMsg();
		if (m.mkLButton)
		{
			sprintf_s(a, "%d", m.x);
			sprintf_s(b, "%d", m.y);
			outtextxy(500, 500, a);
			outtextxy(500, 600, b);
		}
	}
}

你可能感兴趣的:(杂项,c++,c,程序设计,五子棋)