#include
#include
#include
#include
//2墙壁,1可以移动地方,3自己,4敌人,0是豆子
inta[15][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,1,0,2,
2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2,
2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2,
2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2,
2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2,
2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,
2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2,
2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2,
2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2,
2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2,
2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2,
2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2,
2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};//数组就是地图
struct play //游戏中人物的结构体
{
int x;
int y;
};
struct play you,them[5];
int sum=0;//统计吃的豆子个数,吃满50颗就算胜利
int xx[5][2];//判定敌人方向
HDC hdc;
HWND hwnd;
HPENhpenblack,hpengreen,hpenpurple,hpenyellow,hpenred;
HBRUSHhbrushblack,hbrushpurple;
//敌人的移动方向
void movethem(struct play *them)
{
int i,loop;
srand((unsigned) time(NULL));
for(i=0;i<5;i++)
{
//只要控制者在身边就立即靠上去
if(you.x==them[i].x && (them[i].y+1)==you.y)
them[i].y++;
else if(you.x==them[i].x&&(them[i].y-1)==you.y)
them[i].y--;
else if(you.y==them[i].y&&(them[i].x+1)==you.x)
them[i].x++;
else if(you.y==them[i].y&&(them[i].x-1)==you.x)
them[i].x--;
else
{
loop:
xx[i][0]=rand()%4+1;//这里的方向采取随机赋值,原则是新的方向不可以和原来的方向相反
if(xx[i][0]==1 && xx[i][1]==2 || xx[i][0]==2
&& xx[i][1]==1)
goto loop;
if(xx[i][0]==3 && xx[i][1]==4 || xx[i][0]==4
&& xx[i][1]==3)
goto loop;
xx[i][1]=xx[i][0];
if(xx[i][0]==1)//四个方向
{
them[i].x--;
if(a[them[i].y][them[i].x]==2)//假如碰墙壁的话就回到原来的地方等待随机的方向
{
them[i].x++;
goto loop;
}
}
else if(xx[i][0]==2)
{
them[i].x++;
if(a[them[i].y][them[i].x]==2)
{
them[i].x--;
goto loop;
}
}
else if(xx[i][0]==3)
{
them[i].y++;
if(a[them[i].y][them[i].x]==2)
{
them[i].y--;
goto loop;
}
}
else if(xx[i][0]==4)
{
them[i].y--;
if(a[them[i].y][them[i].x]==2)
{
them[i].y++;
goto loop;
}
}
}
}
}
//敌人移动
void fun(struct play *them)
{
int i;
SelectObject(hdc,hpenblack);//把敌人的老位置删除
for(i=0;i<5;i++)
{
MoveToEx(hdc,them[i].x*20+100+9,them[i].y*20+100,NULL);
AngleArc(hdc,them[i].x*20+100,them[i].y*20+100,9,0,360);
}
movethem(them);//根据控制者的位置来决定敌人的移动方向
SelectObject(hdc,hpengreen);//新位置重画敌人
for(i=0;i<5;i++)
{
MoveToEx(hdc,them[i].x*20+100+9,them[i].y*20+100,NULL);
AngleArc(hdc,them[i].x*20+100,them[i].y*20+100,9,0,360);
}
}
//赢的画面
void win()
{
char ch[]={"YOU WIN!"};
system("cls");
SelectObject(hdc,hbrushblack);
SelectObject(hdc,hpengreen);
Rectangle(hdc,100, 100, 450, 350);//画框
SetBkColor(hdc,RGB(0,0,0));
SetTextColor(hdc,RGB(0,255,0));
TextOut(hdc,200,200,ch,strlen(ch)+1);
Sleep(2000);
// system("pause");
exit(0);
}
//输的画面
void lose()
{
char ch[]={"GAME OVER!"};
system("cls");
SelectObject(hdc,hbrushblack);
SelectObject(hdc,hpenred);
Rectangle(hdc,100, 100, 450, 350);//画框
SetBkColor(hdc,RGB(0,0,0));
SetTextColor(hdc,RGB(255,0,0));
TextOut(hdc,200,200,ch,strlen(ch)+1);
Sleep(2000);
// system("pause");
exit(0);
}
//判断是否失败
void loseyes()
{
int i;
for(i=0;i<5;i++)
if(them[i].x==you.x && them[i].y==you.y)
lose();
}
//吃豆子后删除
void drawblackdou(int x,int y)
{
SelectObject(hdc,hpenblack);
MoveToEx(hdc,100+x*20+3,100+y*20,NULL);
AngleArc(hdc,100+x*20,100+y*20,3,0,360);//删除豆子
sum++;//吃到豆子后就加一
a[y][x]=1;//1,代表平地,吃到后这里就成为普通平地
}
//游戏玩法:当任意按下键时,游戏启动,敌人随机移动,自己开始躲避敌人和墙壁,尽可能多的吃豆豆
void play()
{
int i;
while(1)
{
fun(them);//处理敌人
for(i=0;i<5;i++)
if(them[i].x==you.x && them[i].y==you.y);
loseyes();//判定是否失败,被抓
for(i=0;i<10;i++)
{
Sleep(100);//sleep()控制自己的移动速度,即按键的识别速度;i的最大值与sleep()的乘积控制敌人的最大移动速度
SelectObject(hdc,hpenblack);//把自己原来位置的人给删除掉
MoveToEx(hdc,100+you.x*20+9,100+you.y*20,NULL);
AngleArc(hdc,100+you.x*20,100+you.y*20,9,0,360);
if(GetKeyState(VK_ESCAPE)<0)
break;
if(GetKeyState(VK_LEFT)<0)//这里开始的判定主要是是否吃到豆子和碰到墙壁
{
you.x--;
if(a[you.y][you.x]==2)//2是代表墙壁
you.x++;
if(a[you.y][you.x]==0)//0是代表豆子
drawblackdou(you.x,you.y);
}
if(GetKeyState(VK_RIGHT)<0)
{
you.x++;
if(a[you.y][you.x]==2)
you.x--;
if(a[you.y][you.x]==0)
drawblackdou(you.x,you.y);
}
if(GetKeyState(VK_DOWN)<0)
{
you.y++;
if(a[you.y][you.x]==2)
you.y--;
if(a[you.y][you.x]==0)
drawblackdou(you.x,you.y);
}
if(GetKeyState(VK_UP)<0)
{
you.y--;
if(a[you.y][you.x]==2)
you.y++;
if(a[you.y][you.x]==0)
drawblackdou(you.x,you.y);
}
if(sum==50)
win();
SelectObject(hdc,hpenred);//执行了一次键盘后再画出自己的位置
MoveToEx(hdc,100+you.x*20+9,100+you.y*20,NULL);
AngleArc(hdc,100+you.x*20,100+you.y*20,9,0,360);
loseyes();//主动送人头
}
}
}
//初始化界面
void init()
{
char ch_start[]={"GAME START!"};
char ch_note[]={"ESC-exit/press any key to
continue"};
hwnd=GetConsoleWindow();
hdc=GetDC(hwnd);
hpenblack=CreatePen(PS_SOLID,1,RGB(0,0,0));
hpengreen=CreatePen(PS_SOLID,1,RGB(0,255,0));
hpenpurple=CreatePen(PS_SOLID,1,RGB(255,0,255));
hpenyellow=CreatePen(PS_SOLID,1,RGB(255,255,0));
hpenred=CreatePen(PS_SOLID,1,RGB(255,0,0));
hbrushpurple=CreateSolidBrush(RGB(255,0,255));
hbrushblack=CreateSolidBrush(RGB(0,0,0));
SelectObject(hdc,hbrushblack);
SelectObject(hdc,hpengreen);
Rectangle(hdc,100, 100, 450, 350);//画框
SetTextColor(hdc,RGB(0,255,0));
SetBkColor(hdc,RGB(0,0,0));
TextOut(hdc,200,200,ch_start,strlen(ch_start));
TextOut(hdc,130,300,ch_note,strlen(ch_note)+1);
system("pause");
system("cls");
}
//画图
void begin()
{
int i,j;
for(i=0;i<15;i++)
for(j=0;j<20;j++)
if(a[i][j]==2)//代表墙壁
{
SelectObject(hdc,hpenpurple);
SelectObject(hdc,hbrushpurple);
Rectangle(hdc,100+j*20-10,100+i*20+10,100+j*20+10,100+i*20-10);//20*20的实心正方块,x/y方向步进也是20
}
else if(a[i][j]==3)//代表自己
{
SelectObject(hdc,hpenred);
MoveToEx(hdc,100+j*20+9,100+i*20,NULL);
AngleArc(hdc,100+j*20,100+i*20,9,0,360);
}
else if(a[i][j]==4)//代表敌人
{
SelectObject(hdc,hpengreen);
MoveToEx(hdc,100+j*20+9,100+i*20,NULL);
AngleArc(hdc,100+j*20,100+i*20,9,0,360);
}
else if(a[i][j]==0)//代表豆子
{
SelectObject(hdc,hpenyellow);
MoveToEx(hdc,100+j*20+3,100+i*20,NULL);
AngleArc(hdc,100+j*20,100+i*20,3,0,360);
}
you.x=9;you.y=5;//自己和敌人在a[][]数组中的下标
them[0].x=15;them[0].y=2;
them[1].x=1;them[1].y=4;
them[2].x=16;them[2].y=8;
them[3].x=13;them[3].y=12;
them[4].x=7;them[4].y=13;
// system("pause");
}
main()
{
init();//示进入游戏初始界面
begin();//画图
play();
}