2020-11-27

五子棋图型库文件源码

五子棋图型库头文件实现

但是在悔棋的时候有问题,导致不可以悔棋成功,如果有朋友能高抬贵手指点一二我将感激不尽。

//主函数
#include"manplay.h"
#include"machplay.h"
int main()
{
	initgraph(699, 696);//初始化图形系统
	initGame();
	while (1);//防止闪退
	return 0;
}

//头文件
#pragma once

#include<graphics.h>//图形库头文件

#include<mmsystem.h>//播放音乐头文件

#include<conio.h>//控制台输入输出

#include<stdlib.h>

#include<time.h>

#pragma comment(lib,"winmm.lib")//播放音乐库文件

HWND gc;//定义一个窗口控件

int flag = 0;//表示下棋次数

int board[15][15] = { 0 };//初始化棋盘的状态

int score[15][15] = { 0 };//初始化棋盘的分数

int rrhuiqi[2];//用一维数组记录人下棋的 x , y 的位置

int rjhuiqi[2][2];//用二维数组记录人机下棋的位置

int judgeChess(int a, int b);//判断输赢

void chessBorad();//绘画棋盘

void initGame();//进入游戏

void initStrat();//进入游戏初始化

void manplayChess();//人人对战

void machineplayChess();//人机对战

void chessNaive(int& x, int& y);//电脑获取最优解位置

void evaluateNaive();//用权值法评估空格分值

void regretChess();//人人对战重来

void regmachineChess();//人机对战重来

void surrWin(int);//投降

void getOver();//结束游戏关闭绘图

void machprintChess();//打印人机棋盘


#pragma once

#include"gobang.h"

#include"orther.h"

//人人对决函数
void manplayChess()
{
	MOUSEMSG m;//保存鼠标消息
	int x, y;
	int a = 0, b = 0;
	rectangle(550, 385, 628, 435);
	settextcolor(RED);
	setbkmode(0);
	outtextxy(560, 400, "黑棋下");
	while (1)
	{
		m = GetMouseMsg();

		for (int i = 1; i <= 15; i++)//每行15个交点可以下,每格长宽25
		{
			for (int j = 1; j <= 15; j++)
			{
				if (abs(m.x - (150 + (i * 25))) < 12 && abs(m.y - (150 + (j * 25))) < 12)//使得落子在交点上
				{
					x = 150 + i * 25;//第一条线在150,边边线不下,从第二条线开始即150
					y = 150 + j * 25;
					a = i;
					b = j;//用a,b记录鼠标点击位置方便后续判断
				}
			}

		}
		//下棋
		if (m.uMsg == WM_LBUTTONDOWN && (m.x > 162 && m.x < 537 && m.y >162 && m.y < 537))//鼠标消息为鼠标左键在棋盘区域内按下时
		{

			if (board[a][b] != 0)//不能重复下棋
			{
				MessageBox(NULL, "这里有棋子了请重新选择", "提示", MB_OK);//提示框,null为消息框没有拥有窗口
				continue;
			}
			if (flag % 2 == 0)//利用flag不断+1时奇偶性地不断变化来判断轮到哪个玩家下
			{
				clearrectangle(550, 385, 628, 435);
				rectangle(550, 385, 628, 435);
				settextcolor(YELLOW);
				setbkmode(OPAQUE);
				outtextxy(560, 400, "绿棋下");
				setfillcolor(BLACK);//当flag为偶数则黑棋下
				solidcircle(x, y, 10);//获得鼠标x,y为画一个圆的圆心,半径10
				board[a][b] = 1;//玩家1在棋盘的(a,b)位置下了棋,则设置board为1,表示该位置玩家1有棋
				//outtextxy(300, 600, "绿棋下");
			}
			else
			{
				clearrectangle(550, 385, 628, 435);
				rectangle(550, 385, 628, 435);
				settextcolor(YELLOW);
				setbkmode(OPAQUE);
				outtextxy(560, 400, "黑棋下");
				setfillcolor(GREEN);
				solidcircle(x, y, 10);
				board[a][b] = 2;//玩家2下棋记录为2
				//outtextxy(300, 600, "黑棋下");
			}

			flag++;//每次下一个棋,flag就加1
			rrhuiqi[0] = a;//利用一维数组来储存最近的一个落子点,rrhuiqi[0]记录落子点x值
			rrhuiqi[1] = b;//rrhuiqi[1]记录落子点y值

		}
		//悔棋 左键鼠标落在悔棋区域
		else if ((m.uMsg == WM_LBUTTONDOWN) && (m.x > 550 && m.x < 630 && m.y > 120 && m.y < 155))
		{
			if (board[a][b] != 0 && rrhuiqi[0] == a && rrhuiqi[1] == b)
			{//棋盘有子处且是最近的落子点,即只能是悔最近的棋子,不能无限悔棋,不能跨步悔棋
				board[a][b] = 0;//悔棋后重置board数组该点处为空
				chessBorad();//重绘棋盘上未落上一棋的局势
				for (int i = 0; i <= 14; i++)
				{
					for (int j = 0; j <= 14; j++)
					{
						if (board[i][j] == 1)
						{
							setfillcolor(BLACK);
							solidcircle(150 + (i * 25), 150 + (j * 25), 10);
						}
						if (board[i][j] == 2)
						{
							setfillcolor(GREEN);
							solidcircle(150 + (i * 25), 150 + (j * 25), 10);
						}

					}
				}
				flag--;//悔棋玩家再下一次
			}
			//无子或不在棋盘区域
			else
			{
				MessageBox(NULL, "悔棋失败", "提示", MB_OK);//提示框
				continue;
			}
		}
		if ((m.uMsg == WM_LBUTTONDOWN))
		{
			//投降
			if (m.x > 550 && m.x < 630 && m.y > 185 && m.y < 220)
			{
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				flag = 0;
				surrWin(flag % 2);
			}
			//重开
			if (m.x > 550 && m.x < 630 && m.y > 155 && m.y < 185)
			{
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				flag = 0;
				regretChess();
			}
		}
		if (judgeChess(a, b))//每下一子判断是否产生赢家
		{
			if ((flag - 1) % 2 == 1)//绿棋落子后产生赢家
			{
				MessageBox(NULL, "绿棋获胜", "游戏结束", MB_OK);
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				flag = 0;
				initGame();//进入游戏
			}
			else
			{
				MessageBox(NULL, "黑棋获胜", "游戏结束", MB_OK);
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				flag = 0;
				initGame();//进入游戏
			}
		}
		if (!judgeChess(a, b) && flag == 225)
		{
			MessageBox(NULL, "平局", "游戏结束", MB_OK);
			memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
			flag = 0;
			initGame();//进入游戏
		}
		//点击返回游戏初始化界面
		if ((m.uMsg == WM_LBUTTONDOWN) && m.x >= 500 && m.x <= 660 && m.y >= 90 && m.y <= 130)
		{
			memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
			flag = 0;
			initGame();//进入游戏
		}
	}
}

//判断输赢
int judgeChess(int a, int b)
{
	int i = 0, j = 0;//初始化,防止出现BUG
	int t = 2 - flag % 2;//玩家1时,board记录也为1,玩家2则board也为2
	for (i = a - 4, j = b; i <= a; i++)//判断横方向的5个棋子是否连成
	{
		if (i >= 0 && i <= 15 && t == board[i][j] && t == board[i + 1][j] && t == board[i + 2][j] && t == board[i + 3][j] && t == board[i + 4][j])
			return 1;
	}
	for (i = a, j = b - 4; j <= b; j++)//判断竖方向的5个棋子是否连成
	{
		if (j >= 0 && j <= 15 && t == board[i][j] && t == board[i][j + 1] && t == board[i][j + 2] && t == board[i][j + 3] && t == board[i][j + 4])
			return 1;
	}
	for (i = a - 4, j = b - 4; i <= a && j <= b; j++, i++)//判断斜左上方的5个棋子是否连成
	{
		if (j >= 0 && j <= 15 && i >= 0 && i <= 15 && t == board[i][j] && t == board[i + 1][j + 1] && t == board[i + 2][j + 2] && t == board[i + 3][j + 3] && t == board[i + 4][j + 4])
			return 1;
	}
	for (i = a + 4, j = b - 4; i >= a && j <= b; i--, j++)//判断斜右上方的5个棋子是否连成
	{
		if (j >= 0 && j <= 15 && i >= 0 && i <= 15 && t == board[i][j] && t == board[i - 1][j + 1] && t == board[i - 2][j + 2] && t == board[i - 3][j + 3] && t == board[i - 4][j + 4])
			return 1;
	}

	return 0;
}

//人人对战重来
void regretChess()
{
	chessBorad();
	manplayChess();
}


#pragma once

#include"gobang.h"

#include"orther.h"

//每个空子的评估函数 权值法
//需要对人落子和电脑已落子进行评价。人落子电脑要堵,电脑自己落子要做成5子
void evaluateNaive()
{
	memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
	int number1, number2, empty;//number1为方向上人子数,number2为方向上电脑子数,empty为空子数
	for (int x = 0; x <= 14; ++x)
	{
		for (int y = 0; y <= 14; ++y)
		{
			if (board[x][y] == 0)//评估每个空子
			{
				for (int i = -1; i <= 1; ++i)
				{
					for (int j = -1; j <= 1; ++j)//每个空位的8个方向
					{
						if (!(i == 0 && j == 0))//0,0不动不用算 
						{
							int k = 0;//初始化,防止出现BUG
							number1 = 0, number2 = 0, empty = 0;
							//对人落子评分(要对人所下的子进行围堵,玩家在这儿落子后的估分越高,电脑就越有必要下在这儿,来打破玩家的意图) 
							//每个方向上的正方向
							for (k = 1; k <= 5; ++k)
								if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 1)
									++number1;
								else if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 0)
								{
									++empty;
									break;
								}
								else
									break;
							//每个方向上的反方向
							for (k = -1; k >= -5; --k)
								if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 1)
									++number1;
								else if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 0)
								{
									++empty;
									break;
								}
								else
									break;
							if (number1 == 1)
								score[x][y] += 1;	//人若下该空子,就两子了,那么不管死活都是+1
							else if (number1 == 2)
							{
								if (empty == 1)
									score[x][y] += 5;	//三子,死,+5
								else if (empty == 2)
									score[x][y] += 10;//三子,活,+10	 
							}
							else if (number1 == 3)
							{
								if (empty == 1)
									score[x][y] += 20;//形成死四,+20
								else if (empty == 2)
									score[x][y] += 100;//形成活四,+100 
							}
							else if (number1 == 4)
								score[x][y] += 1000;//五子,+1000
								//对电脑落子评分(我自己下了这个空子,会怎样)
							empty = 0;
							for (k = 1; k <= 5; ++k)
								if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 2)
									++number2;
								else if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 0)
								{
									++empty;
									break;
								}
								else
									break;
							for (k = -1; k >= -5; --k)
								if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 2)
									++number2;
								else if (x + i * k >= 0 && x + i * k <= 14 && y + j * k >= 0 && y + j * k <= 14 && board[x + i * k][y + j * k] == 0)
								{
									++empty;
									break;
								}
								else
									break;//碰到边
							if (number2 == 0)
								score[x][y] += 1;	//电脑若下了该空子,就一子了,那么不管死活都是+1 
							else if (number2 == 1)
								score[x][y] += 2;	//两子,+2 
							else if (number2 == 2)
							{
								if (empty == 1)
									score[x][y] += 8;	//三子,死,+8
								else if (empty == 2)
									score[x][y] += 30;//三子,活,+30	
							}
							else if (number2 == 3)
							{
								if (empty == 1)
									score[x][y] += 50;//四子,死,+50 
								else if (empty == 2)
									score[x][y] += 200;//四子,活,+200 
							}
							else if (number2 == 4)
								score[x][y] += 10000;	//五子,+10000 
						}
					}
				}
			}
		}
	}
}

//电脑获取最优解位置
void chessNaive(int& x, int& y)
{
	//搜的是当前的第一个最优解 
	evaluateNaive();
	int maxpos = 0;
	for (int i = 0; i <= 14; ++i)
	{
		for (int j = 0; j <= 14; ++j)
		{
			if (score[i][j] > maxpos)
			{
				maxpos = score[i][j];
				x = i;
				y = j;//找出分数最高的点,记录并返回
			}
		}
	}
}

//人机下棋
void machineplayChess()
{
	MOUSEMSG m;//保存鼠标消息
	int x = 0, y = 0;
	int a = 0, b = 0;
	while (1)
	{
		if (flag % 2 == 0)
		{
			m = GetMouseMsg();
			clearrectangle(550, 385, 628, 435);
			rectangle(550, 385, 628, 435);
			settextcolor(YELLOW);
			setbkmode(OPAQUE);
			outtextxy(560, 400, "玩家下");
			for (int i = 0; i <= 14; i++)
			{
				for (int j = 0; j <= 14; j++)
				{
					if (abs(m.x - (150 + (i * 25))) < 12 && abs(m.y - (150 + (j * 25))) < 12)
					{
						x = 150 + i * 25;
						y = 150 + j * 25;
						a = i;
						b = j;
					}
				}
			}
			//人下棋
			if (m.uMsg == WM_LBUTTONDOWN && (m.x > 160 && m.x < 557 && m.y >162 && m.y < 557))
			{
				if (board[a][b] != 0)//不能重复下棋
				{
					MessageBox(NULL, "这里有棋子了请重新选择", "提示", MB_OK);//提示框
					continue;
				}
				setfillcolor(BLACK);
				solidcircle(x, y, 10);//获得鼠标x,y为画一个圆的圆心,半径10
				board[a][b] = 1;
				flag++;//每次下一个棋,flag就加1
				rjhuiqi[0][0] = a;
				rjhuiqi[0][1] = b;
				if (judgeChess(a, b))
				{
					MessageBox(NULL, "玩家获胜", "游戏结束", MB_OK);
					memset(board, 0, sizeof(board));
					memset(score, 0, sizeof(score));
					flag = 0;
					initGame();//进入游戏
				}
				if (!judgeChess(a, b) && flag == 225)
				{
					MessageBox(NULL, "平局", "游戏结束", MB_OK);
					memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
					memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
					flag = 0;
					initGame();//进入游戏
				}
			}
			if ((m.uMsg == WM_LBUTTONDOWN))
			{
				//投降
				if (m.x > 550 && m.x < 630 && m.y > 185 && m.y < 220)
				{
					memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
					memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
					flag = 0;
					surrWin(flag % 2);
				}
				//人机对战重开
				if (m.x > 550 && m.x < 630 && m.y > 155 && m.y < 185)
				{
					//全部重置
					memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
					memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
					flag = 0;
					regmachineChess();
				}
			}
			//人悔棋
			if ((m.uMsg == WM_LBUTTONDOWN) && (m.x > 550 && m.x < 630 && m.y > 120 && m.y < 155))
			{

				if (board[a][b] != 0 && (rjhuiqi[0][0] == a && rjhuiqi[0][1] == b))
				{
					board[a][b] = 0;
					board[rjhuiqi[1][0]][rjhuiqi[1][1]] = 0;//电脑下的上一步也退回
					chessBorad();
					for (int i = 0; i <= 14; i++)
					{
						for (int j = 0; j <= 14; j++)
						{
							if (board[i][j] == 1)
							{
								setfillcolor(BLACK);
								solidcircle(150 + (i * 25), 150 + (j * 25), 10);
							}
							if (board[i][j] == 2)
							{
								setfillcolor(GREEN);
								solidcircle(150 + (i * 25), 150 + (j * 25), 10);
							}

						}
					}
					flag -= 2;//人和电脑都退
				}
				else
				{
					MessageBox(NULL, "不可悔棋", "提示", MB_OK);//提示框
					continue;
				}
			}
			//人机返回大厅
			if ((m.uMsg == WM_LBUTTONDOWN) && m.x >= 450 && m.x <= 625 && m.y >= 50 && m.y <= 100)
			{
				//全部重置
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
				flag = 0;
				initGame();
			}
		}

		if (flag % 2 == 1)
		{
			clearrectangle(550, 385, 628, 435);
			rectangle(550, 385, 628, 435);
			settextcolor(YELLOW);
			setbkmode(OPAQUE);
			outtextxy(560, 400, "电脑下");
			chessNaive(a, b);//评估人下的每一个棋子
			setfillcolor(GREEN);
			solidcircle(150 + a * 25, 150 + b * 25, 10);
			board[a][b] = 2;
			flag++;
			rjhuiqi[1][0] = a;//人机悔棋记录坐标,rjhuiqi[1][0]记录x坐标,rjhuiqi[1][1] = b记录y坐标
			rjhuiqi[1][1] = b;
			if (judgeChess(a, b))
			{
				MessageBox(NULL, "电脑获胜", "游戏结束", MB_OK);
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
				flag = 0;
				initGame();//进入游戏
			}
			if (!judgeChess(a, b) && flag == 225)
			{
				MessageBox(NULL, "平局", "游戏结束", MB_OK);
				memset(board, 0, sizeof(board));//清空board数组,即把sizeof(board)长度的board数组里的值全为0
				memset(score, 0, sizeof(score));//清空score数组,即把sizeof(score)长度的score数组里的值全为0
				flag = 0;
				initGame();//进入游戏
			}
		}
	}
}


//人机对战重来
void regmachineChess()
{
	machprintChess();
	machineplayChess();
}

//打印人机棋盘
void machprintChess()
{
	loadimage(NULL, "背景.jpg", 699, 699);

	setlinecolor(RED);//画线条为红色

	for (int i = 175; i < 550; i += 25)//循环画线
	{
		line(i, 175, i, 525);//画线函数,画竖线:第一个点(i,175),第二个点(i,525)
		line(175, i, 525, i);//画横线,第一个点(175,i),第二个点(525,i)
	}
	setfillcolor(BLACK);
	solidcircle(350, 350, 4);
	solidcircle(250, 250, 4);
	solidcircle(450, 250, 4);
	solidcircle(250, 450, 4);
	solidcircle(450, 450, 4);
	settextstyle(20, 0, "宋体");
	settextcolor(RED);
	setbkmode(0);//去掉玩家背景
	outtextxy(500, 30, "玩家:黑棋");
	outtextxy(500, 60, "电脑:绿棋");
	outtextxy(500, 90, "返回进入游戏界面");
	setlinecolor(RED);
	rectangle(550, 120, 630, 220);
	line(550, 155, 630, 155);
	line(550, 185, 630, 185);
	outtextxy(565, 130, "悔 棋");
	outtextxy(565, 160, "重 来");
	outtextxy(565, 190, "投 降");
}

#pragma once

#include"gobang.h"

//进入游戏
void initGame()
{
	initStrat();
	HWND hWnd = GetHWnd();//获取窗口句柄,即窗口的唯一标识符
	SetWindowText(hWnd, "五子棋游戏");//改变窗口标题
	IMAGE backgrand;//创建一个图像对象
	loadimage(&backgrand, "背景.jpg", 699, 699);//装载光标,图标,位图,此为装载游戏大厅背景图
	putimage(0, 0, &backgrand);//在屏幕上输出一个位图
	MOUSEMSG m;		// 定义鼠标消息 
}

//绘画棋盘
void chessBorad()
{
	loadimage(NULL, "背景.jpg", 699, 699);

	setlinecolor(RED);//画线条为红色

	for (int i = 175; i < 550; i += 25)//循环画线
	{
		line(i, 175, i, 525);//画线函数,画竖线:第一个点(i,175),第二个点(i,525)
		line(175, i, 525, i);//画横线,第一个点(175,i),第二个点(525,i)
	}
	setfillcolor(BLACK);
	solidcircle(350, 350, 4);
	solidcircle(250, 250, 4);
	solidcircle(450, 250, 4);
	solidcircle(250, 450, 4);
	solidcircle(450, 450, 4);
	settextstyle(20, 0, "宋体");
	settextcolor(RED);
	setbkmode(0);//去掉玩家背景
	outtextxy(500, 30, "玩家1:黑棋");
	outtextxy(500, 60, "玩家2:绿棋");
	outtextxy(500, 90, "返回进入游戏界面");
	setlinecolor(RED);
	rectangle(550, 120, 630, 220);
	line(550, 155, 630, 155);
	line(550, 185, 630, 185);
	outtextxy(565, 130, "悔 棋");
	outtextxy(565, 160, "重 来");
	outtextxy(565, 190, "投 降");
}

//进入游戏初始化
void initStrat()
{
	int cont = 0;
	loadimage(NULL, "背景.jpg", 699, 696);
	cleardevice();
	settextcolor(RED);					//设置文字颜色
	settextstyle(100, 0, "宋体");		//设置字体大小、宽度、字体
	outtextxy(100, 100, "欢乐五子棋");
	setlinecolor(RED);
	rectangle(230, 250, 470, 520);//画方框
	rectangle(240, 260, 460, 510);
	line(240, 340, 460, 340);
	line(240, 430, 460, 430);//画直线
	settextstyle(40, 0, "欢乐五子棋");
	outtextxy(270, 280, "人机大战");
	outtextxy(270, 370, "双人对战");
	outtextxy(270, 450, "退出系统");
	setlinecolor(WHITE);
	settextcolor(WHITE);
	outtextxy(600, 25, "音乐");
	circle(580, 45, 15);

	IMAGE gc;
	loadimage(&gc, "背景.jpg");
	putimage(220, 696, &gc);

	while (true)
	{
		MOUSEMSG m;
		m = GetMouseMsg();
		if (m.uMsg == WM_LBUTTONDOWN)
		{
			if (m.x > 250 && m.x < 450 && m.y > 250 && m.y < 340)  //玩家对战区域		
			{
				machprintChess();   //棋盘界面初始化
				machineplayChess();//人机对战
			}
			if (m.x > 250 && m.x < 450 && m.y > 340 && m.y < 440)  //人机对战区域	
			{
				chessBorad();  //棋盘界面初始化
				manplayChess();//人人对战
			}
			if (m.x >= 580 && m.x <= 610 && m.y >= 45 && m.y <= 75)  //音乐开区域		
			{
				mciSendString(TEXT(" open 于梓贝 - 处处吻 (钢琴版).mp3 alias mysong"), NULL, 0, NULL);
				mciSendString(TEXT("play mysong"), NULL, 0, NULL);//设置背景音乐  多媒体控制接口
			}
			if (m.x >= 580 && m.x <= 610 && m.y >= 45 && m.y <= 75)  //音乐关区域		
			{
				mciSendString("pause 于梓贝 - 处处吻 (钢琴版).mp3", NULL, 0, NULL);
			}
			if (m.x > 250 && m.x < 450 && m.y > 440 && m.y < 520)
			{
				//退出系统
				exit(0);
			}
		}
	}
}

//投降
void surrWin(int x)
{
	initgraph(699, 696);
	cleardevice();//清除图形屏幕
	if (x == 1)
	{
		settextcolor(RED);//字体颜色
		settextstyle(55, 0, "欢乐五子棋");
		outtextxy(360, 200, "黑棋获胜");
	}
	else
	{
		settextcolor(RED);
		settextstyle(55, 0, "欢乐五子棋");
		outtextxy(250, 200, "绿棋获胜");
	}

	settextcolor(WHITE);
	settextstyle(30, 0, "欢乐五子棋");
	outtextxy(300, 420, "返回游戏界面");
	outtextxy(500, 570, " 结束游戏");

	while (1)
	{
		int ID;
		MOUSEMSG n;
		n = GetMouseMsg();
		switch (n.uMsg)
		{
		case WM_LBUTTONDOWN:
			if (n.x <= 500 && n.x >= 300 && n.y <= 450 && n.y >= 410)
				initStrat();
			if (n.x <= 600 && n.x >= 500 && n.y <= 600 && n.y >= 560)
			{
				gc = GetHWnd();    //弹窗前置
				ID = MessageBox(gc, "是否关闭游戏?", "", MB_YESNO);
				if (ID == IDYES)
					getOver();
			}

		}
	}
}

//结束游戏关闭绘图
void getOver()
{
	initgraph(500, 500);//背景大小
	settextcolor(RED);//字体颜色
	settextstyle(100, 0, "欢乐五子棋");//设置字体
	outtextxy(120, 200, "再见!");
	Sleep(900);
	closegraph(); // 关闭绘图窗口
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值