龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

简单图形模拟吃豆游戏

时间:2009-12-22 15:42来源:未知 作者:admin 点击:
分享到:
这个程序主要是想了下怎么样让游戏中的敌人自己行走,但是又不会固定在两点往返徘徊,我用的方法是随机方向,而且走的一步不可以和前一部的方向相反,希望高手们多多指点.也希望高

这个程序主要是想了下怎么样让游戏中的敌人自己行走,但是又不会固定在两点往返徘徊,我用的方法是随机方向,而且走的一步不可以和前一部的方向相反,希望高手们多多指点.也希望高手们可以指教下编写简单游戏的一些技术.

/*上海工程技术大学 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:c");

   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();

  }

  

  

  

精彩图集

赞助商链接