在学习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_