WEB开发网
开发学院软件开发C++ 简单图形模拟吃豆游戏 阅读

简单图形模拟吃豆游戏

 2008-03-08 12:27:46 来源:WEB开发网   
核心提示:这个程序主要是想了下怎么样让游戏中的敌人自己行走,但是又不会固定在两点往返徘徊,我用的方法是随机方向,而且走的一步不可以和前一部的方向相反,希望高手们多多指点.也希望高手们可以指教下编写简单游戏的一些技术./*上海工程技术大学 02211031 朱昀, email: milo_zy@sohu.com*/#include
这个程序主要是想了下怎么样让游戏中的敌人自己行走,但是又不会固定在两点往返徘徊,我用的方法是随机方向,而且走的一步不可以和前一部的方向相反,希望高手们多多指点.也希望高手们可以指教下编写简单游戏的一些技术. /*上海工程技术大学 02211031 朱昀, email: milo_zy@sohu.com*/ #include "graphics.h"
#include "stdlib.h"
#include "dos.h"
#include "bios.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define ENTER 0x1c0d
/*2墙壁,1可以移动地方,3自己,4敌人*/
int a[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,0,0,0,1,0,1,0,0,0,1,1,1,1,1,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];/*判定敌人方向用的结构体*/
int false=0;
void TimeDelay(unsigned long microsec) /*延时函数 传入微秒数*/
{
 union REGS r;
 r.h.ah=0x86;
 r.x.cx=microsec>>16;
 r.x.dx=microsec;
 int86(0x15,&r,&r);
}
drawblackdou(int x,int y)/*吃豆子的函数*/
 begain()/*开始函数*/
{int i,j;
 sleep(1);
 for(i=0;i<15;i++)
  for(j=0;j<20;j++)
  if(a[i][j]==2)/*代表墙壁*/
   {
   setfillstyle(SOLID_FILL,BLUE);
   bar(100+j*20-10,100+i*20+10,100+j*20+10,100+i*20-10);
   }
  else if(a[i][j]==3)/*代表自己*/
   {
   setcolor(RED);
   circle(100+j*20,100+i*20,9);
   }
  else if(a[i][j]==4)/*代表敌人*/
   {
   setcolor(GREEN);
   circle(100+j*20,100+i*20,9);
   }
  else if(a[i][j]==0)/*代表豆子*/
  {
   setcolor(YELLOW);
   circle(100+j*20,100+i*20,3);
  }
 you.x=5;you.y=9;/*敌人也自己的开始坐标*/
 them[0].x=2;them[0].y=15;
 them[1].x=4;them[1].y=1;
 them[2].x=8;them[2].y=16;
 them[3].x=12;them[3].y=13;
 them[4].x=13;them[4].y=7;
}
void movethem(struct play *them)/*敌人移动的过程*/
{int i,loop;
 randomize();
 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]==2xx[i][0]==2&&xx[i][1]==1)
   goto loop;
  if(xx[i][0]==3&&xx[i][1]==4xx[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].x][them[i].y]==2)/*假如碰墙壁的话就回到原来的地方等待随机的方向*/
   {them[i].x++;goto loop;}
  }
  else if(xx[i][0]==2)
  {them[i].x++;
   if(a[them[i].x][them[i].y]==2)
   {them[i].x--;goto loop;}
  }
  else if(xx[i][0]==3)
  {them[i].y++;
   if(a[them[i].x][them[i].y]==2)
   {them[i].y--;goto loop;}
  }
  else if(xx[i][0]==4)
  {them[i].y--;
   if(a[them[i].x][them[i].y]==2)
   {them[i].y++;goto loop;}
  }
  }
 }
}
fun(struct play *them)/*移动中的判定*/
{
 int i;
 setcolor(0);/*把敌人的老位置删除*/
  for(i=0;i<5;i++)
   circle(them[i].y*20+100,them[i].x*20+100,9);
  movethem(them);/*根据控制者的位置来决定敌人的移动方向*/
}
win()/*胜利的话*/
{
 cleardevice();
 settextstyle(0,0,4);
 while(!kbhit())
 {
  setcolor(rand()%13+1);
  outtextxy(200,200,"YOU WIN!");
  delay(1000);
 }
}
false1()/*失败画面*/
{
 cleardevice();
 settextstyle(0,0,4);
 while(!kbhit())
 {
  setcolor(rand()%13+1);
  outtextxy(180,200,"GAME OVER!");
  delay(1000);
 }
}
loseyes()/*判定是否失败*/
{int i;
 for(i=0;i<5;i++)
  if(them[i].x==you.x&&them[i].y==you.y)
  false=1;/*假如失败的话*/
}
 main()
{int gd=DETECT,gm;
 int key,i;
 initgraph(&gd,&gm,"c:\tc");
  cleardevice();
 begain();/*开始画面*/
 while(1)
 {
  while(!kbhit())
  {
  setcolor(GREEN);/*重画敌人*/
  for(i=0;i<5;i++)
  circle(them[i].y*20+100,them[i].x*20+100,9);
  TimeDelay(280000);
  fun(them);/*处理敌人*/
  for(i=0;i<5;i++)
  if(them[i].x==you.x&&them[i].y==you.y)
  false=1;/*假如失败的话*/
  loseyes();/*判定是否失败*/
  if(false)
   break;
  }
  if(false)
   break;
  key=bioskey(0);
  setcolor(0);/*把自己原来位置的人给删除掉*/
  circle(100+you.y*20,100+you.x*20,9);
  if(key==ESC)
   break;
  else if(key==UP)/*这里开始的判定主要是是否吃到豆子和碰到墙壁*/
   {you.x--;
   if(a[you.x][you.y]==2) you.x++;
   else if(a[you.x][you.y]==0)
   drawblackdou(you.x,you.y);}
  else if(key==DOWN)
   {you.x++;if(a[you.x][you.y]==2) you.x--;
   else if(a[you.x][you.y]==0)
   drawblackdou(you.x,you.y);}
  else if(key==RIGHT)
   {you.y++;if(a[you.x][you.y]==2) you.y--;
   else if(a[you.x][you.y]==0)    drawblackdou(you.x,you.y);}
  else if(key==LEFT)
   {you.y--;if(a[you.x][you.y]==2) you.y++;
   else if(a[you.x][you.y]==0)
   drawblackdou(you.x,you.y);}
   if(sum==50)
    break;
  setcolor(RED);/*执行了一次键盘后再画出自己的位置*/
  circle(100+you.y*20,100+you.x*20,9);
  loseyes();/*自己走上去碰到敌人的可能*/
  if(false)
   break;
 }
 if(sum==50)/*吃满豆子了*/
 
 if(false)
 
 closegraph();
}


Tags:简单 图形 模拟

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接