中国象棋C++实现

使用C语言开发中国象棋的小游戏

Chess.cpp

// includes
#include<iostream>
#include<graphics.h>
using namespace std;

// 使用到的 WCHAR 字符
class CKind{
public:
	WCHAR ROOKS = *(_T("车"));
	WCHAR KNIGHTS = *_T("马");
	WCHAR ELEPHANTS = *_T("象");
	WCHAR MINISTERS = *_T("相");
	WCHAR MANDARINS = *_T("士");
	WCHAR GUARDS = *_T("仕");
	WCHAR KING = *_T("将");
	WCHAR GENERALS = *_T("帅");
	WCHAR CANNONS = *_T("炮");
	WCHAR PAWNS = *_T("卒");
	WCHAR SOLDIERS = *_T("兵");
	WCHAR PLAYER_1 = *_T("BLACK");
	WCHAR PLAYER_2 = *_T("RED");
};

// 落子点
class Grid{
	int x, y;
public:
	Grid(){};
	virtual WCHAR get_name(){ return NULL; }
	virtual void drowReady(int x, int y){}
	virtual void setPlayer(WCHAR player){}
	virtual WCHAR getPlayer(){ return NULL; }
	void set_xy(int x, int y)
	{
		this->x = x;
		this->y = y;
	}
	pair<int, int>get_xy()
	{
		pair<int, int>p(x, y);
		return p;
	}
};

// 棋子
class Chess :public Grid
{
	WCHAR player;
	WCHAR name;
public:
	Chess(WCHAR name)
	{
		this->name = name;
	}
	WCHAR get_name()
	{
		return name;
	}
	void setPlayer(WCHAR player)
	{
		this->player = player;
	}
	WCHAR getPlayer()
	{
		return player;
	}
	void drowReady(int x, int y)
	{
		setfillcolor(RGB(51, 205, 219));
		fillcircle(x, y, 27);
		RECT r = { x - 18, y - 18, x + 18, y + 18 };
		setbkcolor(RGB(51, 205, 219));
		if (player == *_T("BLACK"))
		{
			settextcolor(BLACK);
		}
		else
			settextcolor(RED);
		drawtext(name, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
	}
};

// 棋盘
class PaneBoard{
	CKind ckind;
	int PERLENGTH;//单位长度
	Grid *grid[10][9];
public:
	PaneBoard()
	{
		PERLENGTH = 60;
	}
	//开始游戏
	void startGame()
	{
		initPaneGrid();
		CreateMap();
		repaint();
		messagewhile();
		closegraph();
	}
	//初始化棋盘格
	void initPaneGrid()
	{
		for (int i = 0; i < 9; i++)
		{
			for (int j = 0; j < 10; j++)
			{
				grid[i][j] = NULL;
			}
		}
		//敌方
		grid[0][0] = new Chess(ckind.ROOKS);
		grid[0][1] = new Chess(ckind.KNIGHTS);
		grid[0][2] = new Chess(ckind.ELEPHANTS);
		grid[0][3] = new Chess(ckind.MANDARINS);
		grid[0][4] = new Chess(ckind.KING);
		grid[0][5] = new Chess(ckind.MANDARINS);
		grid[0][6] = new Chess(ckind.ELEPHANTS);
		grid[0][7] = new Chess(ckind.KNIGHTS);
		grid[0][8] = new Chess(ckind.ROOKS);
		grid[2][1] = new Chess(ckind.CANNONS);
		grid[2][7] = new Chess(ckind.CANNONS);
		for (int i = 0; i <= 8; i += 2)
		{
			grid[3][i] = new Chess(ckind.PAWNS);
		}
		//设置棋盘格坐标与属性
		for (int j = 0; j <= 8; j++)
		{
			grid[0][j]->set_xy(PERLENGTH*(j + 1), PERLENGTH);
			grid[0][j]->setPlayer(ckind.PLAYER_1);
		}
		grid[2][1]->set_xy(2 * PERLENGTH, 3 * PERLENGTH);
		grid[2][7]->set_xy(8 * PERLENGTH, 3 * PERLENGTH);
		grid[2][1]->setPlayer(ckind.PLAYER_1);
		grid[2][7]->setPlayer(ckind.PLAYER_1);
		for (int i = 0; i <= 8; i += 2)
		{
			grid[3][i]->set_xy((i + 1)* PERLENGTH, 4 * PERLENGTH);
			grid[3][i]->setPlayer(ckind.PLAYER_1);
		}
		//我方
		grid[9][0] = new Chess(ckind.ROOKS);
		grid[9][1] = new Chess(ckind.KNIGHTS);
		grid[9][2] = new Chess(ckind.MINISTERS);
		grid[9][3] = new Chess(ckind.GUARDS);
		grid[9][4] = new Chess(ckind.GENERALS);
		grid[9][5] = new Chess(ckind.GUARDS);
		grid[9][6] = new Chess(ckind.MINISTERS);
		grid[9][7] = new Chess(ckind.KNIGHTS);
		grid[9][8] = new Chess(ckind.ROOKS);
		grid[7][1] = new Chess(ckind.CANNONS);
		grid[7][7] = new Chess(ckind.CANNONS);
		for (int i = 0; i <= 8; i += 2)
		{
			grid[6][i] = new Chess(ckind.SOLDIERS);
		}
		//设置棋盘格坐标与属性
		for (int j = 0; j <= 8; j++)
		{
			grid[9][j]->set_xy(PERLENGTH*(j + 1), 10 * PERLENGTH);
			grid[9][j]->setPlayer(ckind.PLAYER_2);
		}
		grid[7][1]->set_xy(2 * PERLENGTH, 8 * PERLENGTH);
		grid[7][7]->set_xy(8 * PERLENGTH, 8 * PERLENGTH);
		grid[7][1]->setPlayer(ckind.PLAYER_2);
		grid[7][7]->setPlayer(ckind.PLAYER_2);
		for (int i = 0; i <= 8; i += 2)
		{
			grid[6][i]->set_xy((i + 1)* PERLENGTH, 7 * PERLENGTH);
			grid[6][i]->setPlayer(ckind.PLAYER_2);
		}
	}
	//创建窗口
	void CreateMap()
	{
		initgraph(10 * PERLENGTH, 11 * PERLENGTH);//单位宽度
		setbkcolor(WHITE);
		cleardevice();
	}

	//重绘棋盘
	void repaint()
	{
		setbkcolor(WHITE);
		cleardevice();
		setlinecolor(BLACK);
		setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 3);
		line(PERLENGTH - 5, PERLENGTH - 5, PERLENGTH * 9 + 5, PERLENGTH - 5);
		line(PERLENGTH - 5, PERLENGTH - 5, PERLENGTH - 5,PERLENGTH*10+5);
		line(PERLENGTH - 5, PERLENGTH * 10 + 5, PERLENGTH * 9 + 5, PERLENGTH * 10 + 5);
		line(PERLENGTH * 9 + 5, PERLENGTH * 10 + 5, PERLENGTH * 9 + 5, PERLENGTH - 5);
		setlinestyle(PS_SOLID | PS_JOIN_BEVEL, 2);
		for (int i = 1; i <= 10; i++)
		{
			line(PERLENGTH, i*PERLENGTH, 9 * PERLENGTH, i*PERLENGTH);
		}
		for (int i = 1; i <= 9; i++)
		{
			line(i*PERLENGTH, PERLENGTH, i* PERLENGTH, 5 * PERLENGTH);
			line(i*PERLENGTH, 6 * PERLENGTH, i* PERLENGTH, 10 * PERLENGTH);
		}
		line(PERLENGTH, 5 * PERLENGTH, PERLENGTH, 6 * PERLENGTH);
		line(9 * PERLENGTH, 5 * PERLENGTH, 9 * PERLENGTH, 6 * PERLENGTH);
		line(4 * PERLENGTH, PERLENGTH, 6 * PERLENGTH, 3 * PERLENGTH);
		line(4 * PERLENGTH, 3 * PERLENGTH, 6 * PERLENGTH, PERLENGTH);
		line(4 * PERLENGTH, 8 * PERLENGTH, 6 * PERLENGTH, 10 * PERLENGTH);
		line(4 * PERLENGTH, 10 * PERLENGTH, 6 * PERLENGTH, 8 * PERLENGTH);
		settextcolor(RED);
		settextstyle(PERLENGTH * 2 / 3, 0, _T("楷体"));
		RECT r = { 2 * PERLENGTH, 5 * PERLENGTH, 4 * PERLENGTH, 6 * PERLENGTH };
		drawtext(_T("楚河"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		r = { 6 * PERLENGTH, 5 * PERLENGTH, 8 * PERLENGTH, 6 * PERLENGTH };
		drawtext(_T("汉界"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		for (int i = 3; i <= 7; i += 2)
		{
			//敌方
			line(i * PERLENGTH - 3, 4 * PERLENGTH - 3, i * PERLENGTH - 3, 4 * PERLENGTH - 10);
			line(i * PERLENGTH - 3, 4 * PERLENGTH - 3, i * PERLENGTH - 10, 4 * PERLENGTH - 3);
			line(i * PERLENGTH - 3, 4 * PERLENGTH + 3, i * PERLENGTH - 3, 4 * PERLENGTH + 10);
			line(i * PERLENGTH - 3, 4 * PERLENGTH + 3, i * PERLENGTH - 10, 4 * PERLENGTH + 3);
			line(i * PERLENGTH + 3, 4 * PERLENGTH - 3, i * PERLENGTH + 3, 4 * PERLENGTH - 10);
			line(i * PERLENGTH + 3, 4 * PERLENGTH - 3, i * PERLENGTH + 10, 4 * PERLENGTH - 3);
			line(i * PERLENGTH + 3, 4 * PERLENGTH + 3, i * PERLENGTH + 3, 4 * PERLENGTH + 10);
			line(i * PERLENGTH + 3, 4 * PERLENGTH + 3, i * PERLENGTH + 10, 4 * PERLENGTH + 3);
			//我方
			line(i * PERLENGTH - 3, 7 * PERLENGTH - 3, i * PERLENGTH - 3, 7 * PERLENGTH - 10);
			line(i * PERLENGTH - 3, 7 * PERLENGTH - 3, i * PERLENGTH - 10, 7 * PERLENGTH - 3);
			line(i * PERLENGTH - 3, 7 * PERLENGTH + 3, i * PERLENGTH - 3, 7 * PERLENGTH + 10);
			line(i * PERLENGTH - 3, 7 * PERLENGTH + 3, i * PERLENGTH - 10, 7 * PERLENGTH + 3);
			line(i * PERLENGTH + 3, 7 * PERLENGTH - 3, i * PERLENGTH + 3, 7 * PERLENGTH - 10);
			line(i * PERLENGTH + 3, 7 * PERLENGTH - 3, i * PERLENGTH + 10, 7 * PERLENGTH - 3);
			line(i * PERLENGTH + 3, 7 * PERLENGTH + 3, i * PERLENGTH + 3, 7 * PERLENGTH + 10);
			line(i * PERLENGTH + 3, 7 * PERLENGTH + 3, i * PERLENGTH + 10, 7 * PERLENGTH + 3);
		}
		for (int i = 2; i <= 8; i += 6)
			for (int j = 3; j <= 8; j += 5)
			{
			line(i * PERLENGTH - 3, j * PERLENGTH - 3, i * PERLENGTH - 3, j * PERLENGTH - 10);
			line(i * PERLENGTH - 3, j * PERLENGTH - 3, i * PERLENGTH - 10, j * PERLENGTH - 3);
			line(i * PERLENGTH - 3, j * PERLENGTH + 3, i * PERLENGTH - 3, j * PERLENGTH + 10);
			line(i * PERLENGTH - 3, j * PERLENGTH + 3, i * PERLENGTH - 10, j * PERLENGTH + 3);
			line(i * PERLENGTH + 3, j * PERLENGTH - 3, i * PERLENGTH + 3, j * PERLENGTH - 10);
			line(i * PERLENGTH + 3, j * PERLENGTH - 3, i * PERLENGTH + 10, j * PERLENGTH - 3);
			line(i * PERLENGTH + 3, j * PERLENGTH + 3, i * PERLENGTH + 3, j * PERLENGTH + 10);
			line(i * PERLENGTH + 3, j * PERLENGTH + 3, i * PERLENGTH + 10, j * PERLENGTH + 3);
			}
		for (int j = 4; j <= 7; j += 3)
		{
			line(PERLENGTH + 3, j * PERLENGTH - 3, PERLENGTH + 3, j * PERLENGTH - 10);
			line(PERLENGTH + 3, j * PERLENGTH - 3, PERLENGTH + 10, j * PERLENGTH - 3);
			line(PERLENGTH + 3, j * PERLENGTH + 3, PERLENGTH + 3, j * PERLENGTH + 10);
			line(PERLENGTH + 3, j * PERLENGTH + 3, PERLENGTH + 10, j * PERLENGTH + 3);
		}
		for (int j = 4; j <= 7; j += 3)
		{
			line(9 * PERLENGTH - 3, j * PERLENGTH - 3, 9 * PERLENGTH - 3, j * PERLENGTH - 10);
			line(9 * PERLENGTH - 3, j * PERLENGTH - 3, 9 * PERLENGTH - 10, j * PERLENGTH - 3);
			line(9 * PERLENGTH - 3, j * PERLENGTH + 3, 9 * PERLENGTH - 3, j * PERLENGTH + 10);
			line(9 * PERLENGTH - 3, j * PERLENGTH + 3, 9 * PERLENGTH - 10, j * PERLENGTH + 3);
		}
		for (int i = 0; i <10; i++)
		{
			for (int j = 0; j < 9; j++)
			{
				if (grid[i][j] != NULL)
				{
					pair<int, int>p = grid[i][j]->get_xy();
					int x = p.first; int y = p.second;
					setfillcolor(RGB(200, 220, 250));
					setbkcolor(RGB(200, 220, 250));
					fillcircle(x, y, 27);
					RECT r = { x - 18, y - 18, x + 18, y + 18 };
					if (grid[i][j]->getPlayer() == *_T("BLACK"))
					{
						settextcolor(BLACK);
					}
					else
						settextcolor(RED);
					drawtext(grid[i][j]->get_name(), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
				}
			}
		}
	}

	//进入消息循环
	void messagewhile()
	{
		MOUSEMSG msg;
		bool isReady = false;
		pair<int, int>p;
		pair<int, int>readyChess;
		int next = 1;//1表示红方下棋
		while (1)
		{
			msg = GetMouseMsg();
			switch (msg.uMsg)
			{
			case WM_LBUTTONDOWN:
				if (isChoose(msg.x, msg.y))
				{
					p = translate(msg.x, msg.y);//将所选坐标转化为棋盘格索引
					if (isReady)//如果已经有棋子被激活
					{
						if (p.first == readyChess.first&&p.second == readyChess.second)//激活之后选的是自己;
						{
							isReady = false;
							repaint();
							break;
						}
						else if (grid[p.first][p.second] == NULL)//激活之后选了一个空位置
						{
							if (!isTrueWay(grid[readyChess.first][readyChess.second]->get_name(), readyChess.first, readyChess.second, p.first, p.second))break;
							grid[p.first][p.second] = grid[readyChess.first][readyChess.second];
							pair<int, int>change = compute_xy(p.first, p.second);
							grid[p.first][p.second]->set_xy(change.first, change.second);
							grid[readyChess.first][readyChess.second] = NULL;
							isReady = false;
							repaint();
							next = !next;
							break;
						}
						else if (grid[p.first][p.second] != NULL)//激活之后,所选位置已有棋子
						{
							if (grid[p.first][p.second]->getPlayer() == grid[readyChess.first][readyChess.second]->getPlayer())//该位置是己方棋子
							{
								repaint();
								pair<int, int>xy = compute_xy(p.first, p.second);//根据索引计算真实坐标
								grid[p.first][p.second]->drowReady(xy.first, xy.second);//将棋子改为激活状态
								readyChess.first = p.first;//记录被激活棋子的棋盘格索引
								readyChess.second = p.second;
								isReady = true;
								break;
							}
							if (grid[p.first][p.second]->getPlayer() != grid[readyChess.first][readyChess.second]->getPlayer())//该位置是敌方棋子
							{
								if (!isTrueWay(grid[readyChess.first][readyChess.second]->get_name(), readyChess.first, readyChess.second, p.first, p.second))break;
								grid[p.first][p.second] = grid[readyChess.first][readyChess.second];
								pair<int, int>change = compute_xy(p.first, p.second);
								grid[p.first][p.second]->set_xy(change.first, change.second);
								grid[readyChess.first][readyChess.second] = NULL;
								isReady = false;
								repaint();
								next = !next;
								break;
							}
						}
					}
					else//如果没有棋子被激活
					{
						if (!haveChess(p.first, p.second))break;//如果所选位置没有棋子
						else
						{
							if (next && grid[p.first][p.second]->getPlayer() == *_T("BLACK"))break;
							if (!next && grid[p.first][p.second]->getPlayer() == *_T("RED"))break;
							pair<int, int>xy = compute_xy(p.first, p.second);//根据索引计算真实坐标
							grid[p.first][p.second]->drowReady(xy.first, xy.second);//将棋子改为激活状态
							readyChess.first = p.first;//记录被激活棋子的棋盘格索引
							readyChess.second = p.second;
							isReady = true;
						}
					}
				}
				break;
			}
		}
	}

	//棋盘格索引转化为真实坐标
	pair<int, int>compute_xy(int i, int j)
	{
		pair<int, int>p((j + 1)*PERLENGTH, (i + 1)*PERLENGTH);
		return p;
	}

	//判断是否选中棋盘格
	bool isChoose(int x, int y)
	{
		if (x > PERLENGTH / 2 && x<(10 * PERLENGTH - PERLENGTH / 2) && y>PERLENGTH / 2 && y < (11 * PERLENGTH - PERLENGTH / 2))
			return true;
		else
			return false;
	}

	//若选中棋盘格,将所选中的坐标转化为棋盘格索引
	pair<int, int>translate(int x, int y)
	{
		int X = x / PERLENGTH;
		int Y = y / PERLENGTH;
		int mx = x%PERLENGTH;
		int my = y%PERLENGTH;
		if (mx < PERLENGTH / 2)X--;
		if (my < PERLENGTH / 2)Y--;
		pair<int, int>p(Y, X);
		return p;
	}

	//判断所选棋盘格是否有棋子
	bool haveChess(int i, int j)
	{
		if (grid[i][j] == NULL)
			return false;
		else return true;
	}
	//判断走法是否正确
	bool isTrueWay(WCHAR name, int row, int col, int _row, int _col)
	{
		//车的限制
		if (name == ckind.ROOKS)
		{
			if (row != _row&&col != _col)return false;
			if (row == row)
			{
				if (col > _col)
				{
					for (int i = _col + 1; i < col; i++)
					{
						if (grid[row][i] != NULL)
							return false;
					}

				}
				else
				{
					for (int i = col + 1; i < _col; i++)
					{
						if (grid[row][i] != NULL)
							return false;
					}

				}
			}
			if (col == _col)
			{
				if (row > _row)
				{
					for (int i = _row + 1; i < row; i++)
					{
						if (grid[i][col] != NULL)
							return false;
					}
				}
				else
				{
					for (int i = row + 1; i < _row; i++)
					{
						if (grid[i][col] != NULL)
							return false;
					}

				}
			}
		}
		//马的限制
		else if (name == ckind.KNIGHTS)
		{
			if ((col - _col)*(col - _col) + (row - _row)*(row - _row) != 5)return false;
			//row-1,col//row+1,col//row,col-1//row,col+1//四个位置中的一个
			else if ((row - 1 - _row) *(row - 1 - _row) + (col - _col)*(col - _col) == 2)
			{
				if (grid[row - 1][col] != NULL)return false;
			}
			else if ((row + 1 - _row) *(row + 1 - _row) + (col - _col)*(col - _col) == 2)
			{
				if (grid[row + 1][col] != NULL)return false;
			}
			else if ((row - _row)*(row - _row) + (col - 1 - _col)*(col - 1 - _col) == 2)
			{
				if (grid[row][col - 1] != NULL)return false;
			}
			else if ((row - _row)*(row - _row) + (col + 1 - _col)*(col + 1 - _col) == 2)
			{
				if (grid[row][col + 1] != NULL)return false;
			}
		}
		//象的限制
		else if (name == ckind.ELEPHANTS)
		{
			if (_row > 4)return false;
			else if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 8)return false;
			else if (grid[(row + _row) / 2][(col + _col) / 2] != NULL)return false;
		}

		//相的限制
		else if (name == ckind.MINISTERS)
		{
			if (_row < 5)return false;
			else if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 8)return false;
			else if (grid[(row + _row) / 2][(col + _col) / 2] != NULL)return false;
		}

		//士的限制
		else if (name == ckind.MANDARINS)
		{
			if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 2)return false;
			else if (_row > 2 || _col < 3 || _col>5)return false;
		}

		//仕的限制
		else if (name == ckind.GUARDS)
		{
			if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 2)return false;
			else if (_row <7 || _col < 3 || _col>5)return false;
		}

		//将的限制
		else if (name == ckind.KING)
		{
			if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 1)return false;
			else if (_row > 2 || _col < 3 || _col>5)return false;
		}
		//帅的限制
		else if (name == ckind.GENERALS)
		{
			if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 1)return false;
			else if (_row < 7 || _col < 3 || _col>5)return false;
		}

		//炮的限制
		else if (name == ckind.CANNONS)
		{
			int t;
			if (row != _row&&col != _col)return false;
			if (row == _row)
			{
				int t = 0;
				if (col > _col)
				{
					for (int i = _col + 1; i < col; i++)
					{
						if (grid[row][i] != NULL)++t;
					}

					if (grid[_row][_col] == NULL&&t != 0)return false;
					if (grid[_row][_col] != NULL&&t != 1)return false;
				}
				else
				{
					for (int i = col + 1; i < _col; i++)
					{
						if (grid[row][i] != NULL)++t;
					}
					cout << t;
					if (grid[_row][_col] == NULL&&t != 0)return false;
					if (grid[_row][_col] != NULL&&t != 1)return false;
				}
			}
			if (col == _col)
			{
				t = 0;
				if (row > _row)
				{
					for (int i = _row + 1; i < row; i++)
					{
						if (grid[i][col] != NULL)++t;
					}
					cout << t << endl;
					if (grid[_row][_col] == NULL&&t != 0)return false;
					if (grid[_row][_col] != NULL&&t != 1)return false;
				}
				else
				{
					for (int i = row + 1; i < _row; i++)
					{
						if (grid[i][col] != NULL)++t;
					}
					cout << t << endl;
					if (grid[_row][_col] == NULL&&t != 0)return false;
					if (grid[_row][_col] != NULL&&t != 1)return false;
				}
			}
		}

		//卒的限制
		else if (name == ckind.PAWNS)
		{
			if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 1)return false;
			else if (row < 5)
			{
				if (_row <= row)
					return false;
			}
			else if (row >= 5)
			{
				if (_row < row)
					return false;
			}
		}
		//兵的限制
		else if (name == ckind.SOLDIERS)
		{
			if ((row - _row)*(row - _row) + (col - _col)*(col - _col) != 1)return false;
			else if (row > 4)
			{
				if (_row >= row)
					return false;
			}
			else if (row <= 4)
			{
				if (_row > row)
					return false;
			}
		}
		return true;
	}
};
void main()
{
	PaneBoard paneBoard;
	paneBoard.startGame();
	system("pause");
}

效果图如下:

在这里插入图片描述

代码有待优化,欢迎评论区交流,更多小游戏项目可见如下地址:
https://gitee.com/liaochengliang/CPP_Practice

  • 20
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
中国象棋C++代码 #include "chess_zn.h" QTcpSocket * Chess_ZN::client = new QTcpSocket; QUndoStack * Chess_ZN::undoStack = new QUndoStack(); int Chess_ZN::second = 120; bool Chess_ZN::isTurn = false; Chess_ZN::Chess_ZN(QWidget *parent) : QWidget(parent) { init(); initElse(); } void Chess_ZN::initElse(){ treeitem = 1; timer=new QTimer; portmap=0; isConn = true; start = false; isTimer = false; isSearch = false; connect(timer,SIGNAL(timeout()),this,SLOT(stopWatch())); connect(wigettree[1],SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(getInfo(QTreeWidgetItem*))); connect(wigettree[0],SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(connectToHost_PK(QTreeWidgetItem*))); connect(client,SIGNAL(connected()),this,SLOT(connected())); //连接一旦断开 connect(client,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(error(QAbstractSocket::SocketError ))); connect(client,SIGNAL(readyRead()),this,SLOT(readyRead())); peer = new PeerManager(this); peer->setServerPort(10001); items=wigettree[1]->currentItem(); item_pk=wigettree[0]->currentItem(); item_pk_info=wigettree[0]->currentItem(); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[8], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[9], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[10], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),action2[11], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[0], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[1], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[2], SLOT(setEnabled(bool))); connect(undoStack, SIGNAL(canUndoChanged(bool)),button[3], SLOT(setEnabled(bool))); timer->start(1000); createUndoView(); isChoose = true; tableeditor=new TableEditor("users"); } void Chess_ZN::createUndoView() { undoVie
好的,以下是一个简单的 C++ 代码示例,实现中国象棋人机对战的基本功能: ```c++ #include <iostream> #include <vector> using namespace std; // 棋子结构体 struct ChessPiece { string name; // 名称 string color; // 颜色 int x, y; // 位置 }; // 棋盘类 class ChessBoard { public: ChessBoard() { // 初始化棋盘 for (int i = 0; i < 10; i++) { for (int j = 0; j < 9; j++) { board[i][j] = ' '; } } } // 显示棋盘 void display() { for (int i = 0; i < 10; i++) { for (int j = 0; j < 9; j++) { cout << board[i][j] << " "; } cout << endl; } } // 初始化棋子 void initPieces() { // 红方 pieces.push_back({"车", "红", 0, 0}); pieces.push_back({"马", "红", 0, 1}); pieces.push_back({"象", "红", 0, 2}); pieces.push_back({"士", "红", 0, 3}); pieces.push_back({"将", "红", 0, 4}); pieces.push_back({"士", "红", 0, 5}); pieces.push_back({"象", "红", 0, 6}); pieces.push_back({"马", "红", 0, 7}); pieces.push_back({"车", "红", 0, 8}); pieces.push_back({"炮", "红", 2, 1}); pieces.push_back({"炮", "红", 2, 7}); pieces.push_back({"兵", "红", 3, 0}); pieces.push_back({"兵", "红", 3, 2}); pieces.push_back({"兵", "红", 3, 4}); pieces.push_back({"兵", "红", 3, 6}); pieces.push_back({"兵", "红", 3, 8}); // 黑方 pieces.push_back({"车", "黑", 9, 0}); pieces.push_back({"马", "黑", 9, 1}); pieces.push_back({"象", "黑", 9, 2}); pieces.push_back({"士", "黑", 9, 3}); pieces.push_back({"将", "黑", 9, 4}); pieces.push_back({"士", "黑", 9, 5}); pieces.push_back({"象", "黑", 9, 6}); pieces.push_back({"马", "黑", 9, 7}); pieces.push_back({"车", "黑", 9, 8}); pieces.push_back({"炮", "黑", 7, 1}); pieces.push_back({"炮", "黑", 7, 7}); pieces.push_back({"兵", "黑", 6, 0}); pieces.push_back({"兵", "黑", 6, 2}); pieces.push_back({"兵", "黑", 6, 4}); pieces.push_back({"兵", "黑", 6, 6}); pieces.push_back({"兵", "黑", 6, 8}); // 将棋子放置到棋盘上 for (int i = 0; i < pieces.size(); i++) { int x = pieces[i].x; int y = pieces[i].y; board[x][y] = pieces[i].name[0]; } } // 获取指定位置的棋子 ChessPiece getPiece(int x, int y) { for (int i = 0; i < pieces.size(); i++) { if (pieces[i].x == x && pieces[i].y == y) { return pieces[i]; } } return {"", "", -1, -1}; } // 移动棋子 void movePiece(int x1, int y1, int x2, int y2) { ChessPiece piece = getPiece(x1, y1); board[x1][y1] = ' '; board[x2][y2] = piece.name[0]; for (int i = 0; i < pieces.size(); i++) { if (pieces[i].x == x1 && pieces[i].y == y1) { pieces[i].x = x2; pieces[i].y = y2; } } } // 判断是否可以移动 bool canMove(int x1, int y1, int x2, int y2) { ChessPiece p1 = getPiece(x1, y1); ChessPiece p2 = getPiece(x2, y2); if (p1.color == p2.color) { return false; // 同色棋子不可互相吃 } // 判断棋子的走法是否合法 // 略... return true; } private: char board[10][9]; // 棋盘 vector<ChessPiece> pieces; // 棋子 }; int main() { ChessBoard chessBoard; chessBoard.initPieces(); chessBoard.display(); chessBoard.movePiece(3, 0, 4, 0); chessBoard.display(); return 0; } ``` 这段代码使用了 C++ 的面向对象思想,定义了棋盘类 ChessBoard 和棋子结构体 ChessPiece,对棋盘的初始化、棋子的移动、棋盘的显示等操作进行了封装。其中,initPieces() 函数初始化了棋子的位置,movePiece() 函数移动棋子,canMove() 函数判断棋子是否可以移动。在主函数中,先初始化棋盘和棋子,然后显示棋盘,移动了一个兵,再次显示棋盘。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值