c++ + opencv编写象棋(带源码)

在学习C++和opencv的过程中写了一个象棋来练习。

由于继承和多态还不熟练,所以没有用到。

       main.cpp文件,包含了主函数

#include "main.h"
extern bool click_go;
extern int start_x;
extern int start_y;
extern int end_x;
extern int end_y;

int main()
{
	namedWindow(WINDOW_NAME);
	setMouseCallback(WINDOW_NAME,On_mouse_digitizedPix);

	Chess chess;
	chess.chess_start();
	chess.initial_board();
	imshow(WINDOW_NAME,chess.print_chess());
	waitKey(1);
	while (!chess.judge_win())
	{
		Mat pic;
		chess.chess_start();
		if (!(start_x == end_x && start_y == end_y))
		{
			if (click_go)
			{
				pic = chess.move_chess();
				click_go = false;
			}
		
			if (!pic.empty())
			{
					imshow(WINDOW_NAME, pic);	
			}
		}
			
		waitKey(20);
	}
	imshow(WINDOW_NAME, chess.m_chessboard);
	waitKey(0);
}

  象棋.h文件,定义了一个Chess类

#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>
#include "实现汉字画入功能.h"

using namespace std;
using namespace cv;

constexpr auto WINDOW_NAME = "象棋";
typedef struct MyStruct
{
	Point everyposition;
	int iswho;
}point_iswho;



class Chess
{
public:
	bool isup;
	Point startborder;
	Rect rectborder;
	Mat m_chessboard;
	Mat m_startboard;
	int width;
	int m_iX;
	int m_iY;
	int word_distance;
	int word_big;
public:
	Chess();
	~Chess();
public:
	void chess_board();
	void initial_board();
	void chess_start();
	Mat print_chess();
	Mat move_chess();
	bool judge_win();



public:
	cv::Point chess;
	cv::Point car1;
	cv::Point car2;
	cv::Point horse1;
	cv::Point horse2;
	cv::Point elephant1;
	cv::Point elephant2;
	cv::Point corporal1;
	cv::Point corporal2;
	cv::Point general;
	cv::Point soldier1;
	cv::Point soldier2;
	cv::Point soldier3;
	cv::Point soldier4;
	cv::Point soldier5;
	cv::Point gun1;
	cv::Point gun2;
public:
	void f_car();
	void f_horse();
	void f_elephant();
	void f_corporal();
	void f_general();
	void f_soldieryou();
	void f_soldierme();
	void f_gun();
};

void On_mouse_digitizedPix(int event, int x, int y, int flags, void *r);


 象棋.cpp文件,将象棋类里声明的函数进行定义。包括一个鼠标回调函数

#include "象棋.h"

int start_x;
int start_y;
int end_x;
int end_y;
int radiu;
vector<vector<point_iswho>> point;
vector<vector<Point>> word_position;

bool click_go = false;

void On_mouse_digitizedPix(int event, int x, int y, int flags, void *r)
{
	int i = 0, j = 0;
	switch (event)
	{
		//左键按下消息
	case EVENT_LBUTTONDOWN:
	{	
		for (i = 0; i < 10; i++)
			for (j = 0; j < 9; j++)
			{
				if (x < point[i][j].everyposition.x + radiu &&
					x > point[i][j].everyposition.x - radiu &&
					y < point[i][j].everyposition.y + radiu &&
					y > point[i][j].everyposition.y - radiu)
				{
					start_x = i;
					start_y = j;
					cout << start_x << "  " << start_y << endl;

				}
			}
	}
	break;
	//左键抬起消息
	case EVENT_LBUTTONUP:
	{
		for (i = 0; i < 10; i++)
			for (j = 0; j < 9; j++)
			{
				if (x < point[i][j].everyposition.x + radiu &&
					x > point[i][j].everyposition.x - radiu &&
					y < point[i][j].everyposition.y + radiu &&
					y > point[i][j].everyposition.y - radiu)
				{
					end_x = i;
					end_y = j;
					cout << end_x << "  " << end_y << endl;
					click_go = true;
				}
			}
	}
	break;
	}
}



Chess::Chess()
{
	
}

void Chess::chess_board()
{
	m_chessboard = Mat(1280, 1280, CV_8UC3, Scalar(255, 255, 0));
	putText(m_chessboard, "Chinese chess", Point(280, 120), 5, 1.5, Scalar(0, 0, 0), 4);
	putText(m_chessboard, "Created by Zhang Zheyu", Point(380, 340), 5, 1, Scalar(0, 0, 0), 2);
	putText(m_chessboard, "Start Game", Point(280, 240), 4, 1, Scalar(0, 0, 0), 3);

	imshow(WINDOW_NAME, m_chessboard);
}

void Chess::initial_board()
{
	point[0][0].iswho = 1;
	point[0][1].iswho = 2;
	point[0][2].iswho = 3;
	point[0][3].iswho = 4;
	point[0][4].iswho = 5;
	point[0][5].iswho = 6;
	point[0][6].iswho = 7;
	point[0][7].iswho = 8;
	point[0][8].iswho = 9;
	point[2][1].iswho = 10;
	point[2][7].iswho = 11;
	point[3][0].iswho = 12;
	point[3][2].iswho = 13;
	point[3][4].iswho = 14;
	point[3][6].iswho = 15;
	point[3][8].iswho = 16;

	point[9][0].iswho = 17;
	point[9][1].iswho = 18;
	point[9][2].iswho = 19;
	point[9][3].iswho = 20;
	point[9][4].iswho = 21;
	point[9][5].iswho = 22;
	point[9][6].iswho = 23;
	point[9][7].iswho = 24;
	point[9][8].iswho = 25;
	point[7][1].iswho = 26;
	point[7][7].iswho = 27;
	point[6][0].iswho = 28;
	point[6][2].iswho = 29;
	point[6][4].iswho = 30;
	point[6][6].iswho = 31;
	point[6][8].iswho = 32;
}

Mat Chess::print_chess()
{
	for(int i=0;i<10;i++)
		for (int j = 0; j < 9; j++)
		{
			if (point[i][j].iswho == 1)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "车", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 2)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "马", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 3)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "相", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 4)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "士", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 5)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "将", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 6)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "士", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 7)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "相", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 8)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "马", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 9)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "车", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 10)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "炮", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 11)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "炮", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 12)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "卒", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 13)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "卒", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 14)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "卒", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 15)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "卒", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 16)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "卒", word_position[i][j], Scalar(0, 0, 0), word_big, "楷体", false, false);
			}



			if (point[i][j].iswho == 17)
			{	
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "车", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 18)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "马", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 19)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "象", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 20)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "士", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 21)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "帅", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 22)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "士", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 23)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "象", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 24)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "马", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 25)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "车", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 26)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "炮", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 27)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "炮", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 28)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "兵", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 29)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "兵", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 30)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "兵", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 31)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "兵", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
			if (point[i][j].iswho == 32)
			{
				circle(m_startboard, point[i][j].everyposition, radiu, Scalar(189, 215, 239), -1);
				putTextZH(m_startboard, "兵", word_position[i][j], Scalar(0, 0, 255), word_big, "楷体", false, false);
			}
		}		
	
	m_startboard.copyTo(m_chessboard);
	return m_chessboard;
	//imshow(WINDOW_NAME, m_chessboard);
	//waitKey(1);
}

Mat Chess::move_chess()
{
	if (end_x > 10 || end_x < 0 || end_y > 9 || end_y < 0 ||
		(point[start_x][start_y].iswho > 1 &&
		point[start_x][start_y].iswho <= 16 &&
		point[end_x][end_y].iswho > 1 &&
		point[end_x][end_y].iswho <= 16) || (point[start_x][start_y].iswho > 17 
		&& point[start_x][start_y].iswho <= 32 
		&& point[end_x][end_y].iswho > 17 
		&& point[end_x][end_y].iswho <= 32))
	{
		putTextZH(m_startboard, "此位置不能落子", Point(startborder.x + width * 8 + 40,100), Scalar(0, 0, 0), 30, "楷体", false, false);
	}
	else
	{
		
		if (point[start_x][start_y].iswho == 1 ||
			point[start_x][start_y].iswho == 9 ||
			point[start_x][start_y].iswho == 17 ||
			point[start_x][start_y].iswho == 25)
		{
			f_car();
		}
		if (point[start_x][start_y].iswho == 2 ||
			point[start_x][start_y].iswho == 8 ||
			point[start_x][start_y].iswho == 18 ||
			point[start_x][start_y].iswho == 24)
		{
			f_horse();
		}
		if (point[start_x][start_y].iswho == 3 ||
			point[start_x][start_y].iswho == 7 ||
			point[start_x][start_y].iswho == 19 ||
			point[start_x][start_y].iswho == 23)
		{
			f_elephant();
		}
		if (point[start_x][start_y].iswho == 4 ||
			point[start_x][start_y].iswho == 6 ||
			point[start_x][start_y].iswho == 20 ||
			point[start_x][start_y].iswho == 22)
		{
			f_corporal();
		}
		if (point[start_x][start_y].iswho == 10 ||
			point[start_x][start_y].iswho == 11 ||
			point[start_x][start_y].iswho == 26 ||
			point[start_x][start_y].iswho == 27)
		{
			f_gun();
		}
		if (point[start_x][start_y].iswho == 5 ||
			point[start_x][start_y].iswho == 21 )
		{
			f_general();
		}
		if (point[start_x][start_y].iswho >= 12 &&
			point[start_x][start_y].iswho <= 16)
		{
			f_soldieryou();
		}
		if (point[start_x][start_y].iswho >= 28 &&
			point[start_x][start_y].iswho <= 32)
		{
			f_soldierme();
		}								
		
		click_go = false;

		return print_chess();
	}	
}

bool Chess::judge_win()
{
	bool if_have = true;
	int a = 0, b = 0;
	for(int i=0;i<10;i++)
		for (int j = 0; j < 9; j++)
		{
			if (point[i][j].iswho == 5)
				a = 1;
			if (point[i][j].iswho == 21)
				b = 1;
		}
	if (a == 1 && b == 1)
		if_have = false;
			
	return if_have;
}

void Chess::chess_start()
{
	word_distance = 10;
	word_big = 40;
	width = 70;
	radiu = 30;
	startborder.x = 60;
	startborder.y = 60;
	rectborder = Rect(50, 50, startborder.x * 0.4 + 8 * width, startborder.y * 1.4 + 8 * width);

	//初始化棋盘中每一个点的坐标
	//point.resize(10, vector < Point_iswho>(9));
	for (int i = 0; i < 5; i++) {
		vector<point_iswho> positions;
		vector<Point> words;
		for (int j = 0; j < 9; j++)
		{
			point_iswho position;
			Point word;
			position.everyposition.x = startborder.x + width * j;
			position.everyposition.y = startborder.y + width * i;
			word.x = position.everyposition.x - word_big / 2;
			word.y = position.everyposition.y - word_big / 2;
			position.iswho = 0;
			//[i][j].everyposition = (position);
			//point[i][j].iswho = 0;
			positions.push_back(position);
			words.push_back(word);
		}
		point.push_back(positions);
		word_position.push_back(words);
	}
	for (int i = 5; i < 10; i++)
	{
		vector<point_iswho> positions;
		vector<Point> words;
		for (int j = 0; j < 9; j++)
		{
			point_iswho position;
			Point word;
			position.everyposition.x = startborder.x + width * j;
			position.everyposition.y = startborder.y * 2 + width * (i - 1);
			word.x = position.everyposition.x - word_big / 2;
			word.y = position.everyposition.y - word_big / 2;
			position.iswho = 0;
			//[i][j].everyposition = (position);
			//point[i][j].iswho = 0;
			positions.push_back(position);
			words.push_back(word);
		}
		point.push_back(positions);
		word_position.push_back(words);
	}
	//初始化棋盘
	m_startboard = cv::Mat(1280, 1280, CV_8UC3, cv::Scalar(255, 0, 0));
	rectangle(m_startboard, rectborder, Scalar(0, 0, 0), 4);
	for (int i = 0; i < 5; i++)
		line(m_startboard, cv::Point(startborder.x, startborder.y + i * width), cv::Point(startborder.x + 8 * width, startborder.y + i * width), cv::Scalar(0, 0, 0), 2);
	for (int i = 0; i < 5; i++)
	{
		line(m_startboard, cv::Point(startborder.x, startborder.y * 2 + 4 * width + i * width), cv::Point(startborder.x + 8 * width, startborder.y * 2 + 4 * width + i * width), cv::Scalar(0, 0, 0), 2);
	}
	for (int i = 0; i < 7; i++)
	{
		line(m_startboard, cv::Point(startborder.x + (i + 1) * width, startborder.y), cv::Point(startborder.x + (i + 1) * width, startborder.y + 4 * width), cv::Scalar(0, 0, 0), 2);
		line(m_startboard, cv::Point(startborder.x + (i + 1) * width, startborder.y * 2 + 4 * width), cv::Point(startborder.x + (i + 1) * width, startborder.y * 2 + 8 * width), cv::Scalar(0, 0, 0), 2);
	}
	line(m_startboard, startborder, cv::Point(startborder.x, startborder.y * 2 + 8 * width), cv::Scalar(0, 0, 0), 2);
	line(m_startboard, cv::Point(startborder.x + 8 * width, startborder.y), cv::Point(startborder.x + 8 * width, startborder.y * 2 + 8 * width), cv::Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + 3 * width, startborder.y), Point(startborder.x + 5 * width, startborder.y + 2 * width), Scalar(0, 0, 0), 1);
	line(m_startboard, Point(startborder.x + 3 * width, startborder.y + 2 * width), Point(startborder.x + 5 * width, startborder.y), Scalar(0, 0, 0), 1);

	line(m_startboard, Point(startborder.x + 3 * width, startborder.y * 2 + 6 * width), Point(startborder.x + 5 * width, startborder.y * 2 + 8 * width), Scalar(0, 0, 0), 1);
	line(m_startboard, Point(startborder.x + 3 * width, startborder.y * 2 + 8 * width), Point(startborder.x + 5 * width, startborder.y * 2 + 6 * width), Scalar(0, 0, 0), 1);

	putTextZH(m_startboard, "楚 河", cv::Point(startborder.x * 1.1 + width, startborder.y * 0.55 + 4 * width + startborder.y / 2), cv::Scalar(0, 0, 0), 50, "楷体", false, false);
	putTextZH(m_startboard, "汉 界", cv::Point(startborder.x * 1.1 + width * 5, startborder.y * 0.55 + 4 * width + startborder.y / 2), cv::Scalar(0, 0, 0), 50, "楷体", false, false);


	line(m_startboard, Point(startborder.x + width / 5, startborder.y + 3 * width - width / 15), Point(startborder.x + width / 15, startborder.y + 3 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width / 15, startborder.y + 3 * width - width / 5), Point(startborder.x + width / 15, startborder.y + 3 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width / 5, startborder.y + 3 * width + width / 15), Point(startborder.x + width / 15, startborder.y + 3 * width + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width / 15, startborder.y + 3 * width + width / 15), Point(startborder.x + width / 15, startborder.y + 3 * width + width / 5), Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + width / 5, startborder.y * 2 + 5 * width - width / 15), Point(startborder.x + width / 15, startborder.y * 2 + 5 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width / 15, startborder.y * 2 + 5 * width - width / 5), Point(startborder.x + width / 15, startborder.y * 2 + 5 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width / 5, startborder.y * 2 + 5 * width + width / 15), Point(startborder.x + width / 15, startborder.y * 2 + 5 * width + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width / 15, startborder.y * 2 + 5 * width + width / 15), Point(startborder.x + width / 15, startborder.y * 2 + 5 * width + width / 5), Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + 8 * width - width / 5, startborder.y + 3 * width - width / 15), Point(startborder.x + 8 * width - width / 15, startborder.y + 3 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + 8 * width - width / 15, startborder.y + 3 * width - width / 5), Point(startborder.x + 8 * width - width / 15, startborder.y + 3 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + 8 * width - width / 5, startborder.y + 3 * width + width / 15), Point(startborder.x + 8 * width - width / 15, startborder.y + 3 * width + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + 8 * width - width / 15, startborder.y + 3 * width + width / 15), Point(startborder.x + 8 * width - width / 15, startborder.y + 3 * width + width / 5), Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + 8 * width - width / 5, startborder.y * 2 + 5 * width - width / 15), Point(startborder.x + 8 * width - width / 15, startborder.y * 2 + 5 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + 8 * width - width / 15, startborder.y * 2 + 5 * width - width / 5), Point(startborder.x + 8 * width - width / 15, startborder.y * 2 + 5 * width - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + 8 * width - width / 5, startborder.y * 2 + 5 * width + width / 15), Point(startborder.x + 8 * width - width / 15, startborder.y * 2 + 5 * width + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + 8 * width - width / 15, startborder.y * 2 + 5 * width + width / 15), Point(startborder.x + 8 * width - width / 15, startborder.y * 2 + 5 * width + width / 5), Scalar(0, 0, 0), 2);


	for (int i = 1; i < 4; i++)
	{
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 5, startborder.y + width * 3 - width / 15), Point(startborder.x + width * 2 * i - width / 15, startborder.y + width * 3 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 15, startborder.y + width * 3 - width / 5), Point(startborder.x + width * 2 * i - width / 15, startborder.y + width * 3 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 5, startborder.y + width * 3 + width / 15), Point(startborder.x + width * 2 * i - width / 15, startborder.y + width * 3 + width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 15, startborder.y + width * 3 + width / 15), Point(startborder.x + width * 2 * i - width / 15, startborder.y + width * 3 + width / 5), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 5, startborder.y + width * 3 - width / 15), Point(startborder.x + width * 2 * i + width / 15, startborder.y + width * 3 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 15, startborder.y + width * 3 - width / 5), Point(startborder.x + width * 2 * i + width / 15, startborder.y + width * 3 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 5, startborder.y + width * 3 + width / 15), Point(startborder.x + width * 2 * i + width / 15, startborder.y + width * 3 + width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 15, startborder.y + width * 3 + width / 15), Point(startborder.x + width * 2 * i + width / 15, startborder.y + width * 3 + width / 5), Scalar(0, 0, 0), 2);
	}
	for (int i = 1; i < 4; i++)
	{
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 5, startborder.y * 2 + width * 5 - width / 15), Point(startborder.x + width * 2 * i - width / 15, startborder.y * 2 + width * 5 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 15, startborder.y * 2 + width * 5 - width / 5), Point(startborder.x + width * 2 * i - width / 15, startborder.y * 2 + width * 5 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 5, startborder.y * 2 + width * 5 + width / 15), Point(startborder.x + width * 2 * i - width / 15, startborder.y * 2 + width * 5 + width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i - width / 15, startborder.y * 2 + width * 5 + width / 15), Point(startborder.x + width * 2 * i - width / 15, startborder.y * 2 + width * 5 + width / 5), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 5, startborder.y * 2 + width * 5 - width / 15), Point(startborder.x + width * 2 * i + width / 15, startborder.y * 2 + width * 5 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 15, startborder.y * 2 + width * 5 - width / 5), Point(startborder.x + width * 2 * i + width / 15, startborder.y * 2 + width * 5 - width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 5, startborder.y * 2 + width * 5 + width / 15), Point(startborder.x + width * 2 * i + width / 15, startborder.y * 2 + width * 5 + width / 15), Scalar(0, 0, 0), 2);
		line(m_startboard, Point(startborder.x + width * 2 * i + width / 15, startborder.y * 2 + width * 5 + width / 15), Point(startborder.x + width * 2 * i + width / 15, startborder.y * 2 + width * 5 + width / 5), Scalar(0, 0, 0), 2);
	}
	line(m_startboard, Point(startborder.x + width * 7 - width / 5, startborder.y + width * 2 - width / 15), Point(startborder.x + width * 7 - width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 - width / 15, startborder.y + width * 2 - width / 5), Point(startborder.x + width * 7 - width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 - width / 5, startborder.y + width * 2 + width / 15), Point(startborder.x + width * 7 - width / 15, startborder.y + width * 2 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 - width / 15, startborder.y + width * 2 + width / 15), Point(startborder.x + width * 7 - width / 15, startborder.y + width * 2 + width / 5), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 5, startborder.y + width * 2 - width / 15), Point(startborder.x + width * 7 + width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 15, startborder.y + width * 2 - width / 5), Point(startborder.x + width * 7 + width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 5, startborder.y + width * 2 + width / 15), Point(startborder.x + width * 7 + width / 15, startborder.y + width * 2 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 15, startborder.y + width * 2 + width / 15), Point(startborder.x + width * 7 + width / 15, startborder.y + width * 2 + width / 5), Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + width * 7 - width / 5, startborder.y * 2 + width * 6 - width / 15), Point(startborder.x + width * 7 - width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 - width / 15, startborder.y * 2 + width * 6 - width / 5), Point(startborder.x + width * 7 - width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 - width / 5, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width * 7 - width / 15, startborder.y * 2 + width * 6 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 - width / 15, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width * 7 - width / 15, startborder.y * 2 + width * 6 + width / 5), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 5, startborder.y * 2 + width * 6 - width / 15), Point(startborder.x + width * 7 + width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 15, startborder.y * 2 + width * 6 - width / 5), Point(startborder.x + width * 7 + width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 5, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width * 7 + width / 15, startborder.y * 2 + width * 6 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width * 7 + width / 15, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width * 7 + width / 15, startborder.y * 2 + width * 6 + width / 5), Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + width - width / 5, startborder.y + width * 2 - width / 15), Point(startborder.x + width - width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width - width / 15, startborder.y + width * 2 - width / 5), Point(startborder.x + width - width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width - width / 5, startborder.y + width * 2 + width / 15), Point(startborder.x + width - width / 15, startborder.y + width * 2 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width - width / 15, startborder.y + width * 2 + width / 15), Point(startborder.x + width - width / 15, startborder.y + width * 2 + width / 5), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 5, startborder.y + width * 2 - width / 15), Point(startborder.x + width + width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 15, startborder.y + width * 2 - width / 5), Point(startborder.x + width + width / 15, startborder.y + width * 2 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 5, startborder.y + width * 2 + width / 15), Point(startborder.x + width + width / 15, startborder.y + width * 2 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 15, startborder.y + width * 2 + width / 15), Point(startborder.x + width + width / 15, startborder.y + width * 2 + width / 5), Scalar(0, 0, 0), 2);

	line(m_startboard, Point(startborder.x + width - width / 5, startborder.y * 2 + width * 6 - width / 15), Point(startborder.x + width - width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width - width / 15, startborder.y * 2 + width * 6 - width / 5), Point(startborder.x + width - width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width - width / 5, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width - width / 15, startborder.y * 2 + width * 6 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width - width / 15, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width - width / 15, startborder.y * 2 + width * 6 + width / 5), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 5, startborder.y * 2 + width * 6 - width / 15), Point(startborder.x + width + width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 15, startborder.y * 2 + width * 6 - width / 5), Point(startborder.x + width + width / 15, startborder.y * 2 + width * 6 - width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 5, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width + width / 15, startborder.y * 2 + width * 6 + width / 15), Scalar(0, 0, 0), 2);
	line(m_startboard, Point(startborder.x + width + width / 15, startborder.y * 2 + width * 6 + width / 15), Point(startborder.x + width + width / 15, startborder.y * 2 + width * 6 + width / 5), Scalar(0, 0, 0), 2);

}

Chess::~Chess()
{
}


void Chess::f_car()
{
	int x1 = start_x, y1 = start_y, x2 = start_x, y2 = start_y;

	while (x1 > 0)
	{
		--x1;
		if (!point[x1][start_y].iswho == 0)
			break;
	}
	while (y1 > 0)
	{
		--y1;
		if (!point[start_x][y1].iswho == 0)
			break;
	}

	while (x2 < 9)
	{
		++x2;
		if (!point[x2][start_y].iswho == 0)
			break;
	}
	while (y2 < 8)
	{
		++y2;
		if (!point[start_x][y2].iswho == 0)
			break;
	}
	if (start_x == end_x && end_y <= y2 && end_y >= y1 ||
		start_y == end_y && end_x <= x2 && end_x >= x1)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else
	{
		cout << "10" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}


}

void Chess::f_horse()
{	
	if (end_x == start_x + 1 && end_y == start_y + 2 && point[start_x][start_y + 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x + 2 && end_y == start_y + 1 && point[start_x + 1][start_y].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x + 1 && end_y == start_y - 2 && point[start_x][start_y - 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x + 2 && end_y == start_y - 1 && point[start_x + 1][start_y].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}

	else if (end_x == start_x - 1 && end_y == start_y + 2 && point[start_x][start_y + 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x - 2 && end_y == start_y + 1 && point[start_x - 1][start_y].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x - 1 && end_y == start_y - 2 && point[start_x][start_y - 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x - 2 && end_y == start_y - 1 && point[start_x - 1][start_y].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else
	{
		cout << "1" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}


}

void Chess::f_elephant()
{
	if (end_x == start_x + 2 && end_y == start_y + 2 && start_x + 1 < 10 && start_y + 1 < 9 && point[start_x + 1][start_y + 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x + 2 && end_y == start_y - 2 && start_x + 1 < 10 && start_y - 1 > -1 && point[start_x + 1][start_y - 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x - 2 && end_y == start_y + 2 && start_x - 1 > -1 && start_y + 1 < 9 && point[start_x - 1][start_y + 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (end_x == start_x - 2 && end_y == start_y - 2 && start_x - 1 > -1 && start_y - 1 > -1 && point[start_x - 1][start_y - 1].iswho == 0)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else
	{
		cout << "2" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}
}

void Chess::f_corporal()
{
	if (end_x >= 7 && end_x <= 9 && end_y >= 3 && end_y <= 5 ||
		end_x >= 0 && end_x <= 2 && end_y >= 3 && end_y <= 5)
	{
		cout << "0" << endl;
		if (end_x == start_x + 1 && end_y == start_y + 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x + 1 && end_y == start_y - 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x - 1 && end_y == start_y - 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x - 1 && end_y == start_y + 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else
		{
			cout << "3" << endl;
			putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
		}
	}
	else
	{
		cout << "4" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}
}

void Chess::f_general()
{
	if (end_x >= 7 && end_x <= 9 && end_y >= 3 && end_y <= 5 ||
		end_x >= 0 && end_x <= 2 && end_y >= 3 && end_y <= 5)
	{
		cout << "0" << endl;
		if (end_x == start_x + 1 && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x - 1 && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x && end_y == start_y - 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x && end_y == start_y + 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else
		{
			cout << "5" << endl;
			putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
		}
	}
	else
	{
		cout << "6" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}
}

void Chess::f_soldieryou()
{
	if (start_x < 5)
	{
		if (end_x == start_x + 1 && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else
		{
			cout << "7" << endl;
			putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
		}
	}
	else if(start_x >= 5)
	{
		if (end_x == start_x + 1 && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x && end_y == start_y + 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x && end_y == start_y - 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else
		{
			cout << "7" << endl;
			putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
		}
	}
	
	else
	{
		cout << "7" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}
}

void Chess::f_soldierme()
{
	if (start_x > 4)
	{
		if (end_x == start_x - 1 && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
	}
	else if (start_x <= 4)
	{
		if (end_x == start_x - 1 && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x && end_y == start_y + 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else if (end_x == start_x && end_y == start_y - 1)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
		else
		{
			cout << "8" << endl;
			putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
		}
	}
	else
	{
		cout << "8" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}
}

void Chess::f_gun()
{
	int x1 = start_x, y1 = start_y, x2 = start_x, y2 = start_y;
	int a = 0, s = 0, d = 0, w = 0;

	while (x1 > 0)
	{
		--x1;
		if (!point[x1][start_y].iswho == 0)
		{
			w = 1;
			break;
		}
			
	}
	while (y1 > 0)
	{
		--y1;
		if (!point[start_x][y1].iswho == 0)
		{
			a = 1;
			break;
		}		
	}

	while (x2 < 9)
	{
		++x2;
		if (!point[x2][start_y].iswho == 0)
		{
			s = 1;
			break;
		}		
	}
	while (y2 < 8)
	{
		++y2;
		if (!point[start_x][y2].iswho == 0)
		{
			d = 1;
			break;
		}		
	}
	if (start_x == end_x && end_y <= y2 && end_y >= y1 ||
		start_y == end_y && end_x <= x2 && end_x >= x1)
	{
		point[end_x][end_y].iswho = point[start_x][start_y].iswho;
		point[start_x][start_y].iswho = 0;
	}
	else if (w && start_y == end_y && end_x < start_x)
	{
		cout << "1" << endl;

		int x = x1;
		while (x > 0)
		{
			--x;
			if (!point[x][start_y].iswho == 0)
				break;
		}
		if (end_x == x && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
	}
	else if (s && start_y == end_y && start_x < end_x)
	{
		cout << "2" << endl;

		int x = x2;
		while (x < 9)
		{
			++x;
			if (!point[x][start_y].iswho == 0)
				break;
		}
		if (end_x == x && end_y == start_y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
	}
	else if (a && start_x == end_x && start_y > end_y)
	{
		cout << "3" << endl;

		int y = y1;
		while (y > 0)
		{
			--y;
			if (!point[start_x][y].iswho == 0)
				break;
		}
		if (end_x == start_x && end_y == y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
	}
	else if (d && start_x == end_x && start_y < end_y)
	{
		cout << "4" << endl;

		int y = y2;
		while (y < 8)
		{
			++y;
			if (!point[start_x][y].iswho == 0)
				break;
		}
		if (end_x == start_x && end_y == y)
		{
			point[end_x][end_y].iswho = point[start_x][start_y].iswho;
			point[start_x][start_y].iswho = 0;
		}
	}
	else
	{
		cout << "9" << endl;
		putTextZH(m_startboard, "此棋子没有这种走法", Point(startborder.x + width * 8 + 40, 150), Scalar(0, 0, 0), 30, "楷体", false, false);
	}

}




 实现汉字画入功能.cpp 为了在Mat中写入汉字,在网上查找的一段代码来实现这个功能

#include "实现汉字画入功能.h"



void GetStringSize(HDC hDC, const char* str, int* w, int* h)

{

	SIZE size;

	GetTextExtentPoint32A(hDC, str, strlen(str), &size);

	if (w != 0) *w = size.cx;

	if (h != 0) *h = size.cy;

}



void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize, const char* fn, bool italic, bool underline)

{

	CV_Assert(dst.data != 0 && (dst.channels() == 1 || dst.channels() == 3));



	int x, y, r, b;

	if (org.x > dst.cols || org.y > dst.rows) return;

	x = org.x < 0 ? -org.x : 0;

	y = org.y < 0 ? -org.y : 0;



	LOGFONTA lf;

	lf.lfHeight = -fontSize;

	lf.lfWidth = 0;

	lf.lfEscapement = 0;

	lf.lfOrientation = 0;

	lf.lfWeight = 5;

	lf.lfItalic = italic;   //斜体

	lf.lfUnderline = underline; //下划线

	lf.lfStrikeOut = 0;

	lf.lfCharSet = DEFAULT_CHARSET;

	lf.lfOutPrecision = 0;

	lf.lfClipPrecision = 0;

	lf.lfQuality = PROOF_QUALITY;

	lf.lfPitchAndFamily = 0;

	strcpy_s(lf.lfFaceName, fn);



	HFONT hf = CreateFontIndirectA(&lf);

	HDC hDC = CreateCompatibleDC(0);

	HFONT hOldFont = (HFONT)SelectObject(hDC, hf);



	int strBaseW = 0, strBaseH = 0;

	int singleRow = 0;

	char buf[1 << 12];

	strcpy_s(buf, str);

	char *bufT[1 << 12];  // 这个用于分隔字符串后剩余的字符,可能会超出。

	//处理多行

	{

		int nnh = 0;

		int cw, ch;



		const char* ln = strtok_s(buf, "\n", bufT);

		while (ln != 0)

		{

			GetStringSize(hDC, ln, &cw, &ch);

			strBaseW = max(strBaseW, cw);

			strBaseH = max(strBaseH, ch);



			ln = strtok_s(0, "\n", bufT);

			nnh++;

		}

		singleRow = strBaseH;

		strBaseH *= nnh;

	}



	if (org.x + strBaseW < 0 || org.y + strBaseH < 0)

	{

		SelectObject(hDC, hOldFont);

		DeleteObject(hf);

		DeleteObject(hDC);

		return;

	}



	r = org.x + strBaseW > dst.cols ? dst.cols - org.x - 1 : strBaseW - 1;

	b = org.y + strBaseH > dst.rows ? dst.rows - org.y - 1 : strBaseH - 1;

	org.x = org.x < 0 ? 0 : org.x;

	org.y = org.y < 0 ? 0 : org.y;



	BITMAPINFO bmp = { 0 };

	BITMAPINFOHEADER& bih = bmp.bmiHeader;

	int strDrawLineStep = strBaseW * 3 % 4 == 0 ? strBaseW * 3 : (strBaseW * 3 + 4 - ((strBaseW * 3) % 4));



	bih.biSize = sizeof(BITMAPINFOHEADER);

	bih.biWidth = strBaseW;

	bih.biHeight = strBaseH;

	bih.biPlanes = 1;

	bih.biBitCount = 24;

	bih.biCompression = BI_RGB;

	bih.biSizeImage = strBaseH * strDrawLineStep;

	bih.biClrUsed = 0;

	bih.biClrImportant = 0;



	void* pDibData = 0;

	HBITMAP hBmp = CreateDIBSection(hDC, &bmp, DIB_RGB_COLORS, &pDibData, 0, 0);



	CV_Assert(pDibData != 0);

	HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp);



	//color.val[2], color.val[1], color.val[0]

	SetTextColor(hDC, RGB(255, 255, 255));

	SetBkColor(hDC, 0);

	//SetStretchBltMode(hDC, COLORONCOLOR);



	strcpy_s(buf, str);

	const char* ln = strtok_s(buf, "\n", bufT);

	int outTextY = 0;

	while (ln != 0)

	{

		TextOutA(hDC, 0, outTextY, ln, strlen(ln));

		outTextY += singleRow;

		ln = strtok_s(0, "\n", bufT);

	}

	uchar* dstData = (uchar*)dst.data;

	int dstStep = dst.step / sizeof(dstData[0]);

	unsigned char* pImg = (unsigned char*)dst.data + org.x * dst.channels() + org.y * dstStep;

	unsigned char* pStr = (unsigned char*)pDibData + x * 3;

	for (int tty = y; tty <= b; ++tty)

	{

		unsigned char* subImg = pImg + (tty - y) * dstStep;

		unsigned char* subStr = pStr + (strBaseH - tty - 1) * strDrawLineStep;

		for (int ttx = x; ttx <= r; ++ttx)

		{

			for (int n = 0; n < dst.channels(); ++n) {

				double vtxt = subStr[n] / 255.0;

				int cvv = vtxt * color.val[n] + (1 - vtxt) * subImg[n];

				subImg[n] = cvv > 255 ? 255 : (cvv < 0 ? 0 : cvv);

			}



			subStr += 3;

			subImg += dst.channels();

		}

	}



	SelectObject(hDC, hOldBmp);

	SelectObject(hDC, hOldFont);

	DeleteObject(hf);

	DeleteObject(hBmp);

	DeleteDC(hDC);

}

 实现汉字画入功能.h,由于命名空间出现冲突问题,将一部分代码分开



#ifndef PUTTEXT_H_

#define PUTTEXT_H_



#include <windows.h>

#include <string>

#include <opencv2/opencv.hpp>



using namespace cv;



void GetStringSize(HDC hDC, const char* str, int* w, int* h);

void putTextZH(Mat &dst, const char* str, Point org, Scalar color, int fontSize,

	const char *fn = "Arial", bool italic = false, bool underline = false);



#endif // PUTTEXT_H_

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值