大二的软件工程小白,自己摸索着写了一套简单的中国象棋程序,写的第二款游戏,屎山代码,还请大家多多包涵。希望能找到一同讨论编程的朋友。
游戏的界面
#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");
}
游戏的代码,有亿点点简陋,希望大家提出改进意见。