///////////////////////////////////////////////////////////
// 程序名称:华容道古典版
// 编译环境:Visual C++ 2010/6.0,EasyX_2011惊蛰版
// 程序编写:自然向日葵 1164359890@qq.com
// 最后更新:2012-2-2
//
////////////////////////////////////////////////////////////
//游戏中用0表示空地,字符表示人物
////////////////////////////////////////////////////////////
#include <graphics.h> //EasyX绘图库
#include <cstring>
#include <cstdio>
/************************全局变量****************************/
IMAGE img[10], im[4][5]; //定义图片
MOUSEMSG m; //定义鼠标
char zuobiao[4][5]; //坐标,用来承接是否有人物 0为空 1为有
int x, y; //鼠标位置
int sum, X, Y;
/************************函数声明****************************/
void load(void); //加载图片
void blank(void); //空地的绘制
void caocao(int a, int b); //曹操的绘制
void guanyu(int a, int b); //关羽的绘制
void huangzhong(int a, int b); //黄忠的绘制
void machao(int a, int b); //马超的绘制
void zhangfei(int a, int b); //张飞的绘制
void zhaoyun(int a, int b); //赵云的绘制
void bing(int a, int b); //小兵的绘制
void jizhong(char c, int a, int b); //竖将的绘制
void move(void); //控制移动
bool shenglipd(void); //胜利判定
int choose(); //选择关卡
void guanqia(int a); //各个关卡的绘制
/************************函数定义****************************/
void load(void) //加载图片
{
loadimage(&img[0], "图片\\曹操.jpg"); //曹操
loadimage(&img[1], "图片\\关羽.jpg"); //关羽
loadimage(&img[2], "图片\\黄忠.jpg"); //黄忠
loadimage(&img[3], "图片\\马超.jpg"); //马超
loadimage(&img[4], "图片\\张飞.jpg"); //张飞
loadimage(&img[5], "图片\\赵云.jpg"); //赵云
loadimage(&img[6], "图片\\小兵.jpg"); //小兵
loadimage(&img[7], "图片\\出口.jpg"); //出口
loadimage(&img[8], "图片\\标题界面.jpg"); //标题界面
loadimage(&img[9], "图片\\版本.jpg"); //版本
loadimage(&im[0][0], "图片\\背景\\0,0.jpg");
loadimage(&im[0][1], "图片\\背景\\0,1.jpg");
loadimage(&im[0][2], "图片\\背景\\0,2.jpg");
loadimage(&im[0][3], "图片\\背景\\0,3.jpg");
loadimage(&im[0][4], "图片\\背景\\0,4.jpg");
loadimage(&im[1][0], "图片\\背景\\1,0.jpg");
loadimage(&im[1][1], "图片\\背景\\1,1.jpg");
loadimage(&im[1][2], "图片\\背景\\1,2.jpg");
loadimage(&im[1][3], "图片\\背景\\1,3.jpg");
loadimage(&im[1][4], "图片\\背景\\1,4.jpg");
loadimage(&im[2][0], "图片\\背景\\2,0.jpg");
loadimage(&im[2][1], "图片\\背景\\2,1.jpg");
loadimage(&im[2][2], "图片\\背景\\2,2.jpg");
loadimage(&im[2][3], "图片\\背景\\2,3.jpg");
loadimage(&im[2][4], "图片\\背景\\2,4.jpg");
loadimage(&im[3][0], "图片\\背景\\3,0.jpg");
loadimage(&im[3][1], "图片\\背景\\3,1.jpg");
loadimage(&im[3][2], "图片\\背景\\3,2.jpg");
loadimage(&im[3][3], "图片\\背景\\3,3.jpg");
loadimage(&im[3][4], "图片\\背景\\3,4.jpg"); //背景
}
void blank(void) //空地的绘制
{
int a, b;
for(a = 0; a <= 3; a++)
{
for(b = 0; b <= 4; b++)
{
if(zuobiao[a][b] == 0)
putimage(a * 80, b * 80, &im[a][b]);
}
}
}
void caocao(int a, int b) //曹操的绘制
{
putimage(a * 80, b * 80, &img[0]);
zuobiao[a][b] = 'c';
zuobiao[a + 1][b] = 'c';
zuobiao[a][b + 1] = 'c';
zuobiao[a + 1][b + 1] = 'c';
}
void guanyu(int a, int b) //关羽的绘制
{
putimage(a * 80, b * 80, &img[1]);
zuobiao[a][b] = 'g';
zuobiao[a + 1][b] = 'g';
}
void huangzhong(int a, int b) //黄忠的绘制
{
putimage(a * 80, b * 80, &img[2]);
zuobiao[a][b] = 'h';
zuobiao[a][b + 1] = 'h';
}
void machao(int a, int b) //马超的绘制
{
putimage(a * 80, b * 80, &img[3]);
zuobiao[a][b] = 'm';
zuobiao[a][b + 1] = 'm';
}
void zhangfei(int a, int b) //张飞的绘制
{
putimage(a * 80, b * 80, &img[4]);
zuobiao[a][b] = 'f';
zuobiao[a][b + 1] = 'f';
}
void zhaoyun(int a, int b) //赵云的绘制
{
putimage(a * 80, b * 80, &img[5]);
zuobiao[a][b] = 'y';
zuobiao[a][b + 1] = 'y';
}
void bing(int a, int b) //小兵的绘制
{
putimage(a * 80, b * 80, &img[6]);
zuobiao[a][b] = 'b';
}
void jizhong(char c, int a, int b) //竖将的绘制
{
switch(c)
{
case 'h':huangzhong(a,b); break;
case 'm':machao(a,b); break;
case 'f':zhangfei(a,b); break;
case 'y':zhaoyun(a,b);
}
}
void move(void) //控制移动
{
int x1, y1, a, b, a1, b1;
char c, fx = 0; //判断方向
bool sign = true;
x = m.x;
y = m.y;
if(m.mkLButton)
{
x1 = m.x;
y1 = m.y;
if(y1 >= 400)
y1 = 399;
a = x1 / 80; //点击单元格坐标
b = y1 / 80;
c = zuobiao[a][b];
while(1)
{
x = m.x;
y = m.y;
m = GetMouseMsg();
if(m.mkLButton == 0 || (((x - x1) >= 40 || (x - x1) <= -40) || ((y - y1) >= 40 || (y - y1 <= -40))) && (m.y<400))
break;
}
x = m.x;
y = m.y; //方向判定
if(x - x1 >= 40)
fx = 'r';
if(x - x1 <= -40)
fx = 'l';
if(y - y1 >= 40)
fx = 'd';
if(y - y1 <= -40)
fx = 'u';
if(fx != 0 && zuobiao[a][b] != 0) //选定坐标
{
switch(zuobiao[a][b])
{
case 'c': //若选中曹操时
{
if(zuobiao[a - 1][b - 1] == 'c')
{
a1 = a - 1;
b1 = b - 1;
} //找左上点坐标
if(zuobiao[a + 1][b - 1] == 'c')
{
a1 = a;
b1 = b - 1;
}
if(zuobiao[a - 1][b + 1] == 'c')
{
a1 = a - 1;
b1 = b;
}
if(zuobiao[a + 1][b + 1] == 'c')
{
a1 = a;
b1 = b;
}
zuobiao[a1][b1] = 0;
zuobiao[a1 + 1][b1] = 0;
zuobiao[a1][b1 + 1] = 0;
zuobiao[a1 + 1][b1 + 1] = 0;
if(X != a1 || Y != b1)
sum++;
switch(fx) //各方向
{
case 'r':
if(a1 <= 1 && zuobiao[a1 + 2][b1] == 0 && zuobiao[a1 + 2][b1 + 1] == 0) //看右边是否空地
{
caocao(a1 += 1, b1);
blank();
}
else
{
caocao(a1, b1);
sign = 0;
if(X != a1 || Y != b1)
sum--;
}
break;
case 'l':
if(a1 >= 1 && zuobiao[a1 - 1][b1] == 0 && zuobiao[a1 - 1][b1 + 1] == 0)
{
caocao(a1 -= 1, b1);
blank();
}
else
{
caocao(a1, b1);
sign = 0;
if(X != a1 || Y != b1)
sum--;
}
break;
case 'u':
if(b1 >= 1 && zuobiao[a1][b1 - 1] == 0 && zuobiao[a1 + 1][b1 - 1] == 0)
{
caocao(a1, b1 -= 1);
blank();
}
else
{
caocao(a1, b1);
sign = 0;
if(X != a1 || Y != b1)
sum--;
}
break;
case 'd':
if(b1 <= 2 && zuobiao[a1][b1 + 2] == 0 && zuobiao[a1 + 1][b1 + 2] == 0)
{
caocao(a1, b1 += 1);
blank();
}
else
{
caocao(a1, b1);
sign = 0;
if(X != a1 || Y != b1)
sum--;
}
break;
}
break;
}
case 'g': //关羽
{
if((a == 1 && zuobiao[a - 1][b] == 'g') || (a == 0))
{
a1 = 0;
b1 = b;
}
else if((a == 1 && zuobiao[a + 1][b] == 'g') || (a == 2 && zuobiao[a + 1][b] != 'g'))
{
a1 = 1;
b1 = b;
}
if((a == 2 && zuobiao[a + 1][b] == 'g') || a == 3)
{
a1 = 2;
b1 = b;
}
zuobiao[a1][b1] = 0;
zuobiao[a1 + 1][b1] = 0;
if(X != a1 || Y != b1)
sum++;
switch(fx)
{
case 'r':
if(a1 <= 1 && zuobiao[a1 + 2][b1] == 0)
{
guanyu(a1 += 1, b1);
blank();
}
else
{
guanyu(a1, b1);
sign = false;
if(X != a1 || Y != b1)
sum--;
}
break;
case 'l':
if(a1 >= 1 && zuobiao[a1 - 1][b1] == 0)
{
guanyu(a1 -= 1, b1);
blank();
}
else
{
guanyu