easyx图形库开发的c语言中国象棋

大二的软件工程小白,自己摸索着写了一套简单的中国象棋程序,写的第二款游戏,屎山代码,还请大家多多包涵。希望能找到一同讨论编程的朋友。

游戏的界面 

#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<graphics.h>
#include<conio.h>
#pragma once
#define W 50//每个网格的宽
#define H 50//高
#define K 100//留的边界长度
#define R 20//棋子的R
#define BR 25//选中后棋子的面积扩大
int play=1;//当前操作者
int map[10][9];//地图
void drawqi(int i,int k);//下面是定义的函数
void qi(int i, char title[1]);
void draw();
int get();
struct qizi//棋子结构体
{
	int x=0;//坐标
	int y=0;
	int zy=0;//棋子的阵营
	int zl=0;//种类
	int d = 0;//当前棋子的状态,1是死了,0是没死
}q[32];
bool Timer(int ms, int id)//一个计时器
{
	static int start[5];
	int end = clock();
	if (end - start[id] >= ms)
	{
		start[id] = end;
		return true;
	}
	return false;
}
void initqi()//红0黑1,左上00//初始化棋子的位置
{
	for (int i = 0; i < 4; i++)
	{
		q[i].x = i;
		q[i].y = 0;
		q[i].zl = i + 1;
		q[i].zy = 1;
		map[q[i].y][q[i].x] = i;
		q[i + 4].x = 8 - i;
		q[i + 4].y = 0;
		q[i + 4].zl = i + 1;
		q[i + 4].zy = 1;
		map[q[i + 4].y][q[i+4].x] = i + 4;

		q[i + 16].x = i;
		q[i + 16].y = 9;
		q[i + 16].zl = i + 1;
		q[i + 16].zy = 0;
		map[q[i + 16].y][q[i + 16].x] = i + 16;
		q[i + 20].x = 8 - i;
		q[i + 20].y = 9;
		q[i + 20].zl = i + 1;
		q[i + 20].zy = 0;
		map[q[i + 20].y][q[i + 20].x] = i + 20;
	}
	for (int i = 0; i < 5; i++)
	{
		q[i + 8].x = i*2;
		q[i + 8].y = 3;
		q[i + 8].zl = 0;
		q[i + 8].zy = 1;
		map[q[i + 8].y][q[i + 8].x] = i + 8;
		q[i + 24].x = i * 2;
		q[i + 24].y = 6;
		q[i + 24].zl = 0;
		q[i + 24].zy = 0;
		map[q[i + 24].y][q[i + 24].x] = i + 24;
	}
	for (int i = 0; i < 2; i++)
	{
		q[i + 13].x = 1 + i * 6;
		q[i + 13].y = 2;
		q[i + 13].zl = 5;
		q[i + 13].zy = 1;
		map[q[i + 13].y][q[i + 13].x] = i + 13;
		q[i + 29].x = 1 + i * 6;
		q[i + 29].y = 7;
		q[i + 29].zl = 5;
		q[i + 29].zy = 0;
		map[q[i + 29].y][q[i + 29].x] = i + 29;
	}
	q[15].x = 4;
	q[15].y = 0;
	q[15].zl = 6;
	q[15].zy = 1;
	map[0][4] = 15;
	q[31].x = 4;
	q[31].y = 9;
	q[31].zl = 6;
	q[31].zy = 0;
	map[9][4] = 31;
}
void wuxiao()//在屏幕上方显示一些内容
{
	settextcolor(RED);
	settextstyle(36, 0, "行书");
	char title[] = "这不是个有效的地点";
	int space = (getwidth() - textwidth(title)) / 2;
	outtextxy(space, 20, title);
}
void moveqi(int bianhao,int x1,int y1)//通过输入进来的坐标实现棋子的移动
{
	if (map[y1][x1] != -1)//如果移动时目的地有棋
	{
		q[map[y1][x1]].d = 1;
		q[map[y1][x1]].x = -1;
		q[map[y1][x1]].y = -1;
	}
    map[q[bianhao].y][q[bianhao].x] = -1;
	map[y1][x1] = bianhao;
	q[bianhao].y = y1;
	q[bianhao].x = x1;
	
	play = (play + 1) % 2;
}
void move(int x, int y, int x1, int y1)//根据鼠标点击的地点判断是否可进行移动,可以就用moveqi();
{
	int bianhao = map[y][x];
	int w=1;
	switch (q[bianhao].zl)
	{
	    case 0:
		{
			if (q[bianhao].zy == 1)
			{
				if (y < 5 && y1 == y + 1&&x==x1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (y >= 5)
				{
					if (x == x1 - 1 && y == y1)
					{
                        moveqi(bianhao, x1, y1);
					}
					else if (x == x1 + 1 && y == y1)
					{
						moveqi(bianhao ,x1, y1);
					}
					else if (y == y1 - 1&&x==x1)
					{
						moveqi(bianhao, x1, y1);
					}
				}
			}
			else
			{
				if (y > 4 && y1 == y - 1 && x == x1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (y <= 4)
				{
					if (x == x1 - 1 && y == y1)
					{
						moveqi(bianhao, x1, y1);
					}
					else if (x == x1 + 1 && y == y1)
					{
						moveqi(bianhao, x1, y1);
					}
					else if (y == y1 + 1 && x == x1)
					{
						moveqi(bianhao, x1, y1);
					}
				}
			}
		}
		break;
		case 1:
		{
			if (x == x1)
			{
				if (y > y1)
				{
					for (int i = y - 1; i > y1; i--)
					{
						if (map[i][x] > -1)
						{
							w = 0;
							break;
						}
					}
					if (w)
					{
						moveqi(bianhao, x1, y1);
					}

				}
				if (y < y1)
				{
					for (int i = y + 1; i < y1; i++)
					{
						if (map[i][x] > -1)
						{
							w = 0;
							break;
						}
					}
					if (w)
					{
						moveqi(bianhao, x1, y1);
					}

				}
			}
			else if (y == y1)
			{
				if (x > x1)
				{
					for (int i = x - 1; i > x1; i--)
					{
						if (map[y][i] > -1)
						{
							w = 0;
							break;
						}
					}
					if (w)
					{
						moveqi(bianhao, x1, y1);
					}

				}
				if (x < x1)
				{
					for (int i = x + 1; i < x1; i++)
					{
						if (map[y][i] > -1)
						{
							w = 0;
							break;
						}
					}
					if (w)
					{
						moveqi(bianhao, x1, y1);
					}

				}
			}
			break;
		}
		case 2:
			if (map[y][x-1]==-1)
			{
				printf("左\n");
				if (  x == x1 + 2 && y == y1 - 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if ( x == x1 + 2 && y == y1 + 1)
				{
					moveqi(bianhao, x1, y1);
				}
			}
		    if (map[y][x + 1] == -1)
			{
				printf("右\n");
				if (  x == x1 - 2 && y == y1 - 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if ( x == x1 - 2 && y == y1 + 1)
				{
					moveqi(bianhao, x1, y1);
				}
			}
			if (map[y - 1][x] == -1 )
			{
				printf("s\n");
				if ( x == x1 - 1 && y == y1 + 2)
				{

					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 1 && y == y1 + 2)
				{
					moveqi(bianhao, x1, y1);
				}

			}
			if (map[y + 1][x] == -1 )
			{
				printf("x\n");
				if (x == x1 - 1 && y == y1 - 2)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 1 && y == y1 - 2)
				{
					moveqi(bianhao, x1, y1);
				}
			}
			break;
		case 3:
			if (q[bianhao].zy == 0)
			{
                if ( x == x1 - 2 && y==y1-2&&map[y + 1][x + 1] == -1)
			    {
					printf("ss");
				    moveqi(bianhao, x1, y1);
			    }
				else if (x == x1 + 2 && y == y1 + 2 && map[y - 1][x - 1] == -1 && y != 5)
				{
					printf("dd");
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 - 2 && y == y1 + 2 && map[y - 1][x + 1] == -1 &&y!=5)
				{
					printf("ff");
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 2 && y == y1 - 2 && map[y + 1][x - 1] == -1 )
				{
					printf("gg");
					moveqi(bianhao, x1, y1);
				}
			}
			if (q[bianhao].zy == 1)
			{
				if (x == x1 - 2 && y == y1 - 2 && map[y + 1][x + 1] == -1&&y!=4)
				{
			
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 2 && y == y1 + 2 && map[y - 1][x - 1] == -1 )
				{
				
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 - 2 && y == y1 + 2 && map[y - 1][x + 1] == -1)
				{
			
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 2 && y == y1 - 2 && map[y + 1][x - 1] == -1&&y!=4)
				{
					
					moveqi(bianhao, x1, y1);
				}
			}
			break;
		case 4:

			if (q[bianhao].zy == 1&&x1<=5&&x1>=3&&y1<=2)
			{
				
				if (x == x1 + 1 && y == y1 + 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 - 1 && y == y1 - 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 1 && y == y1 - 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 - 1 && y == y1 + 1)
				{
					moveqi(bianhao, x1, y1);
				}
			}
			else if (q[bianhao].zy == 0 && x1 <= 5 && x1 >= 3 && y1 >= 7)
			{
				if (x == x1 + 1 && y == y1 + 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 - 1 && y == y1 - 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 + 1 && y == y1 - 1)
				{
					moveqi(bianhao, x1, y1);
				}
				else if (x == x1 - 1 && y == y1 + 1)
				{
					moveqi(bianhao, x1, y1);
				}
			}
			break;
		case 5:
			if (x == x1)
			{
				if (y > y1)
				{
					for (int i = y - 1; i > y1; i--)
					{
						if (map[i][x] > -1)
						{
							w++;
						}
					}
					if (w == 2 || (w == 1 && map[y1][x1] == -1))
					{
						moveqi(bianhao, x1, y1);
					}
				}
				else if (y < y1)
				{
					for (int i = y + 1; i < y1; i++)
					{
						if (map[i][x] > -1)
						{
							w++;
						}
					}
					if (w == 2 || (w == 1&&map[y1][x1]==-1))
					{
						moveqi(bianhao, x1, y1);
					}
					
				}
			}
			else if (y == y1)
			{
				if (x > x1)
				{
					for (int i = x - 1; i > x1; i--)
					{
						if (map[y][i] > -1)
						{
							w++;
						}
					}
					if (w == 2 || (w == 1 && map[y1][x1] == -1))
					{
						moveqi(bianhao, x1, y1);
					}
				}
				else if (x < x1)
				{
					for (int i = x + 1; i < x1; i++)
					{
						if (map[y][i] > -1)
						{
							w++;
						}
					}
					if (w == 2|| (w == 1 && map[y1][x1] == -1))
					{
						moveqi(bianhao, x1, y1);
					}

				}
			}
			break;
		case 6:
			if (q[bianhao].zy == 1&&x1<=5&&x1>=3&&y1<=2)
			{
				for (int i = -1; i <= 1; i += 2)
				{
					if (x == x1 && y == y1 + i)
					{
						moveqi(bianhao, x1, y1);
					}
					else if (x == x1 + i && y == y1)
					{
						moveqi(bianhao, x1, y1);
					}
				}
			}
			else if (q[bianhao].zy == 0 && x1 <= 5 && x1 >= 3 && y1 >= 7)
			{
				for (int i = -1; i <= 1; i += 2)
				{
					if (x == x1 && y == y1 + i)
					{
						moveqi(bianhao, x1, y1);
					}
					else if (x == x1 + i && y == y1)
					{
						moveqi(bianhao, x1, y1);
					}
				}
			}
			break;
	}
}

int get()//进行鼠标点击的函数,并且返回点击的坐标
{
	MOUSEMSG msg;
	int x, y;
	int z;
	while (1)
	{
        msg = GetMouseMsg();		
        if (msg.mkLButton == true&&Timer(200,0))
		{
			x = (msg.x - K + R / 2) / W;
			y = (msg.y - K + R / 2) / H;
			z = y * 10 + x;
			if (x >= 0 && x <= 8 && y >= 0 && y <= 9)
			{
				printf("(%d,%d)", x, y);
	            break;
			}
		}

	}
	return z;
}
void chaozuo()//对鼠标点击的地方进行判断是否是有效的
{
	int x, y, x1, y1;
	int z;
	int k=1;
	while (k)
	{
		z = get();
		x = z % 10;
		y = z / 10;
		if (map[y][x] == -1 || (play == 1 && map[y][x] < 16) || (play == 0 && map[y][x] >= 16) )
		{
			wuxiao();
		}
		else
		{
			drawqi(map[y][x], 1);
			while (1)
			{
				z = get();
				printf("z  ");
				x1 = z % 10;
				y1 = z / 10;
				 if (x == x1 && y1 == y)
				{
					break;
				}
				else if (map[y1][x1]>-1&&q[map[y][x]].zy == q[map[y1][x1]].zy)
				{
					wuxiao();
				}
				else
				{
					move(x,y,x1,y1);
					break;
				}
			}
		}
		break;
	}
	
	

	
}
void init()//各种东西的初始化
{

	initgraph(600, 700,1);//50*9*50*10
	setbkcolor(WHITE);
	cleardevice();
	setlinecolor(BLACK);
	for (int i = 0; i < 9; i++)
	{
		line(K + i * W, K, K + i * W, K+H*4);//竖线
		line(K + i * W, K +5*H, K + i * W, K  + H *9);
	}
	for (int i = 0; i < 10; i++)
	{
        line(K, K + i * W, K  + W * 8, K + i * W);//横线
	}
	for (int i = 0; i <= 7; i += 7)
	{
		line(3 * W + K, i * H + K, 5 * W + K, (2 + i) * H + K);
		line(3 * W + K, (2 + i) * H + K, 5 * W + K, i * H + K);
	}
	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 9; j++)
		{
			map[i][j] = -1;
			printf("%d\t", map[i][j]);
		}
		puts("");
	}

    initqi();
	for (int i = 0; i < 32; i++)
	{
		drawqi(i,0);
	}
}
void draw()//每走一步都刷新屏幕并重新显示
{
	BeginBatchDraw();
	cleardevice();
	setlinecolor(BLACK);
	for (int i = 0; i < 9; i++)
	{
		line(K + i * W, K, K + i * W, K + H * 4);//竖线
		line(K + i * W, K + 5 * H, K + i * W, K + H * 9);
	}
	for (int i = 0; i < 10; i++)
	{
		line(K, K + i * W, K + W * 8, K + i * W);//横线
	}
	for (int i = 0; i <= 7; i += 7)
	{
        line(3*W+K, i*H+K, 5*W+K, (2+i)*H+K);
	    line(3*W+K, (2+i)*H+K, 5*W+K, i*H+K);
	}
	
	for (int i = 0; i < 32; i++)
	{
		if(q[i].d==0)
		drawqi(i,0);
	}
	settextcolor(RED);
	if (play == 1)
	{
	
		settextstyle(36, 0, "行书");
		char title[] = "红方行棋";
		int space = (getwidth() - textwidth(title)) / 2;
		outtextxy(space, 20, title);
	}
	else {
		settextstyle(36, 0, "行书");
		char title[] = "黑方行棋";
		int space = (getwidth() - textwidth(title)) / 2;
		outtextxy(space, 20, title);
	}
	EndBatchDraw();
}
void qi(int i,char title[1])//这是显示棋子的函数
{
	settextstyle(20, 0, "行书");
	setfillcolor(WHITE);
	fillcircle(K+q[i].x*W, K+q[i].y*H, R);
	circle(K + q[i].x * W, K + q[i].y * H, R-2);
	circle(K + q[i].x * W, K + q[i].y * H, R);
	outtextxy(K + q[i].x * W - textwidth(title) / 2, K + q[i].y * H - textheight(title) / 2, title);
}
void bigqi(int i, char title[1])//这是显示选中棋子的函数
{
	settextstyle(30, 0, "行书");
	setfillcolor(WHITE);
	fillcircle(K + q[i].x * W, K + q[i].y * H, BR);
	circle(K + q[i].x * W, K + q[i].y * H, BR - 2);
	circle(K + q[i].x * W, K + q[i].y * H, BR);
	outtextxy(K + q[i].x * W - textwidth(title) / 2, K + q[i].y * H - textheight(title) / 2, title);
}
void drawqi(int i,int k)//这是判断打印什么棋子的函数
{
	if (q[i].zy == 0)
	{
		settextcolor(RED);
	}
	else
	{
		settextcolor(BLACK);
	}
	switch (q[i].zl)
	{
	case 0:
		if (q[i].zy == 0)
		{
			{char title0[] = "兵";
			if (k == 0)
			{
				qi(i, title0);
			}
			else
			{
				bigqi(i, title0);
			}
			}
		}
		else
		{
			{char title0[] = "卒";
			if (k == 0)
			{
				qi(i, title0);
			}
			else
			{
				bigqi(i, title0);
			}}
		}
	    break;
	case 1:
	{char title0[] = "车";
	if (k == 0)
	{
		qi(i, title0);
	}
	else
	{
		bigqi(i, title0);
	} }
		break;
	case 2:
	{char title0[] = "马";
	if (k == 0)
	{
		qi(i, title0);
	}
	else
	{
		bigqi(i, title0);
	} }
		break;
	case 3:
		if (q[i].zy == 0)
		{
			{char title0[] = "相";
			if (k == 0)
			{
				qi(i, title0);
			}
			else
			{
				bigqi(i, title0);
			}; }
		}
		else
		{
			{char title0[] = "象";
			if (k == 0)
			{
				qi(i, title0);
			}
			else
			{
				bigqi(i, title0);
			} }
		}
		break;
	case 4:
	{char title0[] = "士";
	if (k == 0)
	{
		qi(i, title0);
	}
	else
	{
		bigqi(i, title0);
	}}
		break;
	case 5:
	{char title0[] = "炮";
	if (k == 0)
	{
		qi(i, title0);
	}
	else
	{
		bigqi(i, title0);
	}}
		break;
	case 6:
		if (q[i].zy == 0)
		{
			{char title0[] = "帅";
			if (k == 0)
			{
				qi(i, title0);
			}
			else
			{
				bigqi(i, title0);
			} }
		}
		else
		{
			{char title0[] = "将";
			if (k == 0)
			{
				qi(i, title0);
			}
			else
			{
				bigqi(i, title0);
			} }
		}
		break;
	}
	


}
int main()//这是主函数
{
	init();
	while (1)
	{
		chaozuo();
		draw();
	}

	system("pause");
}

游戏的代码,有亿点点简陋,希望大家提出改进意见。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值