C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!

发布时间:2023-10-30 08:30

中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。

它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规则简明易懂。中国象棋在中国的群众中基础远远超过围棋,是普及最广的棋类项目,中国象棋已流传到十几个国家和地区。它使用方形格状棋盘,圆形棋子共有32个,红黑二色各有16个棋子,摆放和活动在交叉点上。双方交替行棋,先把对方的将(帅)“将死”的一方获胜。(摘取自百度百科)

\"C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!_第1张图片\"

那么我们今天,将用C语言来实现我们中国象棋游戏程序的开发,觉得对你有帮助的小伙伴记得先关注一波哦!

实现思路

我们可以用绘图技术绘制棋盘,枚举定义各种棋子,然后结构体数组,用来保存每一个点的信息。

重点是棋盘的绘制以及判断棋子是否可移动到目标位置,移动有两种可能,一是单纯移动,二是吃子移动。主要飞将的特殊规则。废话不多说,贴源码!

源码分享

#include
#include
#define INTERVAL 50  //前面的间隔
#define CHESS_GRID_SIZE 70  //格子宽度
#define ROW  10
#define COL  9
enum PIECES//枚举棋子
{
	車,馬,象,士,将,砲,卒,
	俥,马,相,仕,帥,炮,兵,
	SPACE,BEGIN,END
};
//红黑方棋子、
int redChess[] = { 車, 馬, 象, 士, 将, 砲, 卒};
int blackChess[] = { 俥, 马, 相, 仕, 帥, 炮, 兵 };
const char*chessName[] = { \"車\", \"馬\", \"象\", \"士\", \"将\", \"砲\", \"卒\", \"俥\", \"马\", \"相\", \"仕\", \"帥\", \"炮\", \"兵\" };
struct Chess//棋子属性
{
	int x;
	int y;
	int id;//哪个棋子
	int type;//是哪一方的棋子 红,黑?
	bool river;//判断小兵是否过了河
};
struct Chess  map[ROW][COL];//结构体数组,用来保存每一个点的信息
POINT begin = { -1, -1 }, end = { -1, -1 };//保存前后两次点击的数组下标
int state = BEGIN;
//初始化游戏数据
void GameInit()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			int chessname = SPACE;
			int mcolor = BLACK;
			//黑棋
			if (i <= 4)
			{
				mcolor = BLACK;
				//初始化第一行的棋子,
				if (i == 0)
				{
					if (k <= 4)
					{
						chessname = blackChess[k];
					}
					else
					{
						chessname = blackChess[8-k];
					}
				}
				//设置炮
				if (i == 2 && (k == 1 || k == 7))
				{
					chessname = blackChess[砲];
				}
				//设置小兵
				if (i == 3 && k % 2 == 0)
				{
					chessname = blackChess[卒];
				}

			}
			//紅棋
			else 
			{
				mcolor = RED;
				//初始化第一行的棋子,
				if (i == 9)
				{
					if (k <= 4)
					{
						chessname = redChess[k];
					}
					else
					{
						chessname = redChess[8 - k];
					}
				}
				//设置炮
				if (i == 7 && (k == 1 || k == 7))
				{
					chessname = redChess[炮];
				}
				//设置小兵
				if (i == 6 && k % 2 == 0)
				{
					chessname = redChess[兵];
				}
			}
			map[i][k].id = chessname;
			map[i][k].river = false;
			map[i][k].type = mcolor;
			map[i][k].x = k*CHESS_GRID_SIZE + INTERVAL;
			map[i][k].y = i*CHESS_GRID_SIZE + INTERVAL;
		}
	}
}
//游戏的绘制函数
void GameDraw()
{
	//设置背景颜色 red black 
	setbkcolor(RGB(252, 215, 162));
	cleardevice();

	//绘制棋盘
	setlinecolor(BLACK);
	setlinestyle(PS_SOLID, 2);
	for (int i = 0; i < 10; i++)
	{
		//画横线
		line(INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, 8 * CHESS_GRID_SIZE + INTERVAL, i*CHESS_GRID_SIZE + INTERVAL);
		//画竖线
		if (i < 9)
		{
			line(i*CHESS_GRID_SIZE + INTERVAL, INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE + INTERVAL);
		}
	}
	rectangle(INTERVAL - 5, INTERVAL - 5, 8 * CHESS_GRID_SIZE + INTERVAL+5, 5+9 * CHESS_GRID_SIZE + INTERVAL);
	//楚河汉界显示
	setfillcolor(RGB(252, 215, 162));
	fillrectangle(INTERVAL, 4 * CHESS_GRID_SIZE + INTERVAL, 8 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL);
	//显示文字
	char river[20] = \"楚河        汉界\";
	settextstyle(50, 0, \"楷体\");
	settextcolor(BLACK);
	setbkmode(TRANSPARENT);
	outtextxy(INTERVAL+100, 4 * CHESS_GRID_SIZE + INTERVAL+10, river);
	//画九宫格
		//画上面
	line(3 * CHESS_GRID_SIZE + INTERVAL, INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, 2 * CHESS_GRID_SIZE + INTERVAL);
	line(3 * CHESS_GRID_SIZE + INTERVAL, 2 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, INTERVAL);
	   //画下面
	line(3 * CHESS_GRID_SIZE + INTERVAL, 7 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE + INTERVAL);
	line(3 * CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE+INTERVAL,5*CHESS_GRID_SIZE+INTERVAL,7*CHESS_GRID_SIZE+INTERVAL);
	//画棋子
	settextstyle(30, 0, \"楷体\");
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			if (map[i][k].id != SPACE)
			{
				setlinecolor(map[i][k].type);
				fillcircle(map[i][k].x, map[i][k].y, 30);
				fillcircle(map[i][k].x, map[i][k].y, 25);
				settextcolor(map[i][k].type);
				outtextxy(map[i][k].x-10, map[i][k].y-10, chessName[map[i][k].id]);
			}
			
		}
	}
}
void MouseControl()
{
	if (MouseHit())
	{
		MOUSEMSG msg = GetMouseMsg();
		if (msg.uMsg == WM_LBUTTONDOWN)
		{
			//获取鼠标点击的数组的下标
			int row = (msg.y-INTERVAL)/CHESS_GRID_SIZE;
			int col = (msg.x-INTERVAL)/CHESS_GRID_SIZE;
			if (state == BEGIN)
			{
				state = END;
				begin.x = row;
				begin.y = col;
			}
			else if (state == END)
			{
				state = BEGIN;
				begin.x = row;
				begin.y = col;
			}
			printf(\"%d,%d  %d\\n\", row, col, state);
		}
	}
}
void chessMove()
{
	if (begin.x != -1 && end.x != -1 && !(begin.x == end.x &&begin.y == end.y))
	{
		map[end.x][end.y].id = map[begin.x][begin.y].id;
		map[end.x][end.y].type = map[begin.x][begin.y].type;
		map[end.x][end.y].river = map[begin.x][begin.y].river;
		map[begin.x][begin.y].id = SPACE;
	}

}
int main555()
{	
	//创建一个图形窗口
	initgraph(800,800,SHOWCONSOLE);
	GameInit();
	printf(\"欢迎来到顽石老师课堂,中国象棋\");
	BeginBatchDraw();
	while (1)
	{
		GameDraw();
		FlushBatchDraw();
		MouseControl();
		chessMove();
	}
	return 0;
}

以上就是分享的全部内容,希望对大家有所帮助!

自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,【点击进入】微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自

你可能感兴趣的

相关推荐

sqlite 客户端工具_C++跨平台库QT学习 使用嵌入式数据库SQLite

即时通讯发展前景怎么样?现在状态是如何

【UE4】【C++】【官方实例】代码实现创建Mesh

复盘|接口自动化测试框架建设的经验与教训

rh358 003 ansible部署双网卡绑定 DNS原理 bind正向解析

M1支持Windows arm_苹果首发ARM架构电脑芯片,将对PC格局带来哪些影响?

想了解关于 Redux 的这里都有

Linux 安装Mysql 常见错误及总结

企业如何选择最佳云服务提供商?

大数据学习之Hadoop生态圈(一)

React - Router的基本使用介绍

Qt读写Excel--QXlsx通过Document对象操作工作表3

Docker是什么?可以用Docker做什么?开发者可以使用Docker做什么?个人对Docker的理解?

JavaScript实现数据结构与算法(三)哈希表

Opencv学习笔记二——基本图像操作

深度学习中注意力机制的理解-Attention mechanism

mysql中的锁

v04.02 百图画鸿蒙(任务状态) | 内核最重要的状态迁移过程 | 画出鸿蒙骨骼系统

基于element-ui 动态换肤的代码详解

html/javascript实现简单的上传

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号