论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

跳蚤tc版爱心吃豆

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:46:40

美工用了tbf,程序以前写好后没整理过,所以也就这么发上来了,但是注释还是有的,有爱好的朋友可以交流下,因为敌人可以设置得再聪明点,emial:milo_zy@sohu.com.假如这里的附件有问题请到唯c原创找相关附件.

/*

吃豆程序

上海工程技术大学 02211 朱昀*/

#include <graphics.h>
#include <math.h>
#include "myinclude.h"
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define HOME 0x4700
#define END 0x4f00
#define SPACE 0x3920
#define ESC 0x011b
#define ENTER 0x1c0d
#define N 6/*敌人的数量*/
struct PLay
{
 double x;/*图形模式下的具体坐标*/
 double y;
 int i,j;/*转化后的坐标*/
 int life;/*生命*/
 int mode;/*判定8种样子*/
 int move;/*判定是否按键移动*/
 int flag;/*当跟踪性的敌人只有一个方向可走时,调用chang时需要变下方向*/
}play,amy[N];
char str[10];
int tbfPLAY[30][30];/*显示玩家*/
int tbfAMY[30][30];/*敌人1*/
int tbfAMY1[30][30];/*敌人2*/
int tbfFOOD[30][30];/*食物*/
int tbfWALL[30][30];/*墙壁*/
int score;/*得分*/
int WINNUM;/*要多少分才过关的标志*/
int GUAN;/*第几关的标志*/
double SPEED=9.0;/*地图中,0是食物,2是墙壁,-1空地*/
int MAP2[14][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
   2,-1,0,0,0,0,0,0,-1,0,0,0,0,-1,-1,-1,0,0,0,2,
   2,0,0,2,2,2,2,2,2,-1,-1,2,2,2,2,2,2,0,0,2,
   2,0,-1,0,0,-1,-1,0,0,-1,0,-1,0,-1,0,-1,-1,0,0,2,
   2,0,2,2,2,0,0,-1,0,2,0,0,-1,-1,0,2,2,2,0,2,
   2,-1,-1,0,-1,-1,0,2,0,-1,0,0,2,-1,0,0,-1,-1,-1,2,
   2,-1,-1,0,0,2,0,2,0,-1,-1,0,2,0,0,2,-1,2,0,2,
   2,-1,-1,0,-1,2,0,2,2,2,0,-1,2,0,0,2,-1,2,0,2,
   2,2,2,0,-1,2,0,2,-1,-1,0,-1,2,-1,-1,2,-1,-1,0,2,
   2,0,-1,0,0,2,0,2,2,2,2,2,2,0,-1,2,0,2,0,2,
   2,-1,2,0,0,2,0,0,-1,-1,-1,0,-1,-1,0,2,0,2,0,2,
   2,0,-1,-1,-1,2,0,0,-1,-1,-1,0,0,-1,-1,2,0,-1,0,2,
   2,-1,-1,-1,-1,-1,-1,2,-1,0,-1,-1,-1,-1,-1,0,0,-1,0,2,
   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*第一关的地图*/
int MAP3[14][20]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
   2,-1,0,0,-1,-1,-1,0,0,-1,0,-1,-1,-1,-1,0,0,0,0,2,
   2,0,2,0,2,2,0,2,0,2,-1,2,2,0,0,2,2,0,0,2,
   2,-1,0,0,-1,-1,-1,0,0,0,-1,-1,0,-1,-1,-1,0,2,0,2,
   2,-1,2,-1,2,0,-1,-1,0,0,-1,0,-1,-1,0,2,0,0,0,2,
   2,0,2,0,2,-1,0,2,0,0,-1,0,2,0,0,2,0,0,0,2,
   2,0,2,0,2,-1,0,0,-1,-1,-1,0,2,-1,0,2,0,2,0,2,
   2,0,0,0,2,-1,0,2,0,0,-1,0,2,0,-1,2,0,-1,0,2,
   2,-1,2,0,2,-1,0,2,0,0,-1,0,2,0,0,2,0,2,0,2,
   2,-1,2,0,2,0,0,2,2,2,0,0,2,0,0,2,0,2,0,2,
   2,-1,0,0,0,0,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,0,2,0,2,
   2,0,2,2,0,2,0,2,0,2,0,2,2,2,0,0,2,2,0,2,
   2,0,-1,-1,-1,0,0,-1,-1,0,0,-1,-1,0,0,0,-1,-1,-1,2,
   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*第二关的地图*/
int MAP[14][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,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,
   2,-1,2,0,-1,-1,0,0,0,2,0,0,0,0,0,0,0,0,2,2,
   2,-1,-1,0,0,0,2,-1,-1,0,0,0,2,2,2,0,0,0,-1,2,
   2,-1,-1,0,0,0,-1,-1,2,2,0,2,2,2,2,2,0,0,-1,2,
   2,-1,-1,0,2,0,-1,-1,2,2,-1,2,2,2,2,2,2,0,-1,2,
   2,-1,2,0,2,2,2,2,2,2,2,-1,2,2,2,2,2,0,-1,2,
   2,-1,-1,0,0,2,2,2,2,2,2,2,2,2,2,2,0,0,-1,2,
   2,-1,-1,0,0,0,0,2,2,2,-1,-1,-1,-1,0,2,2,0,-1,2,
   2,-1,-1,2,0,0,0,0,0,2,2,2,0,0,0,0,0,0,-1,2,
   2,-1,-1,0,2,2,0,0,0,0,2,0,0,2,0,2,0,0,-1,2,
   2,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,2,-1,-1,2,
   2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,
   2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*第三关的地图*/
void Init();/*图形驱动*/
void Close();/*图形驱动*/
void GameBegain();/*开始选择画面*/
void DrawBrick(int,int);/*画砖*/
void DrawFirst();/*开始画面*/
void GamePlay();/*游戏具体函数*/
void DrawFood(int,int);/*画食物*/
void ClrPlay();/*去掉玩家或敌人原来的地方*/
void AmyClr(int n);/*去掉敌人原来的地方*/
void TbfMode();/*玩家的变化*/
void AmyMode(int n);/*敌人的变化*/
void AmyMode1(int n);/*跟踪性敌人的变化*/
void AmyClockTime(int);/*控制时间间断*/
void AmyModeChange(int);/*敌人移动*/
void AmyModeChange1(int);/*敌人跟踪移动*/
void PlayModeChange();/*玩家自动变化*/
int UMove(int);/*四个方向单独判定是否敌人可以移动*/
int DMove(int);
int RMove(int);
int LMove(int);
void Ugo(int);/*四发方向敌人的直线移动*/
void Dgo(int);
void Rgo(int);
void Lgo(int);
int AmyRight(int);/*判定敌人是否碰到死路*/
int PUMove();/*四个方向判定玩家是否可以走路*/
int PDMove();
int PRMove();
int PLMove();
void PUgo();/*四发方向玩家的直线移动*/
void PDgo();
void PRgo();
void PLgo();
int PlayRight();/*判定玩家是否碰到死路*/
void GameWin();/*胜利*/
void GameOver();/*游戏失败*/
void PrintScore();
void Chinese();/*显示中文*/
void MapCopy(int (*a)[20],int (*b)[20]);/*转换地图*/
void TongJi();/*计算要多少分才可以过关*/
void main()
{
 Init();
 GameBegain();
 GamePlay();
 Close();
}
void Chinese()/*显示中文*/
{
 int i;
 char str[]={
 /* 以下是 '吃' 的 48点阵宋体 字模,288 byte */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,
0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,
0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x70,
0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
0x00,0x01,0x00,0xE0,0x00,0x00,0x0C,0x03,
0x80,0xE0,0x00,0x00,0x0F,0xFF,0xC0,0xC0,
0x00,0x40,0x0E,0x03,0x81,0x80,0x00,0xE0,
0x0E,0x03,0x81,0xFF,0xFF,0xF0,0x0E,0x03,
0x83,0x00,0x00,0x00,0x0E,0x03,0x83,0x00,
0x00,0x00,0x0E,0x03,0x86,0x00,0x00,0x00,
0x0E,0x03,0x84,0x00,0x00,0x00,0x0E,0x03,
0x8C,0x00,0x00,0x00,0x0E,0x03,0x98,0x00,
0x00,0x00,0x0E,0x03,0x90,0x00,0x18,0x00,
0x0E,0x03,0xA0,0x 00,0x3C,0x00,0x0E,0x03,
0xC7,0xFF,0xFE,0x00,0x0E,0x03,0x80,0x00,
0x78,0x00,0x0E,0x03,0x80,0x00,0xF0,0x00,
0x0E,0x03,0x80,0x00,0xE0,0x00,0x0E,0x03,
0x80,0x01,0xC0,0x00,0x0E,0x03,0x80,0x03,
0x80,0x00,0x0E,0x03,0x80,0x07,0x00,0x00,
0x0E,0x03,0x80,0x0F,0x00,0x00,0x0F,0xFF,
0x80,0x1E,0x00,0x00,0x0E,0x03,0x80,0x1C,
0x00,0x00,0x0E,0x03,0x80,0x38,0x00,0x00,
0x0E,0x03,0x80,0x70,0x00,0x40,0x0E,0x03,
0x00,0xE0,0x00,0x40,0x0E,0x00,0x01,0xE0,
0x00,0x60,0x0C,0x00,0x01,0xC0,0x00,0x60,
0x00,0x00,0x03,0x80,0x00,0x60,0x00,0x00,
0x07,0x00,0x00,0x60,0x00,0x00,0x07,0x00,
0x00,0x60,0x00,0x00,0x07,0x00,0x00,0x60,
0x00,0x00,0x07,0x00,0x00,0x70,0x00,0x00,
0x07,0x00,0x00,0xF8,0x00,0x00,0x03,0xFF,
0xFF,0xF0,0x00,0x00,0x01,0xFF,0xFF,0xF0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/* 以下是 '豆' 的 48点阵宋体 字模,288 byte */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
0x07,0x80,0x03,0xFF,0xFF,0xFF,0xF8,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
0x00,0x00,0x08,0x00,0x00,0x30,0x00,0x00,
0x1C,0x00,0x00,0x3F,0xFF,0xFF,0xFE,0x00,
0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x38,
0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,
0x18,0x00,0x00,0x38,0x00,0x00,0x18,0x00,
0x00,0x38,0x00,0x00,0x18,0x00,0x00,0x38,
0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,
0x18,0x00,0x00,0x38,0x00,0x00,0x18,0x00,
0x00,0x38,0x00,0x00,0x18,0x00,0x00,0x3F,
0xFF,0xFF,0xF8,0x00,0x00,0x38,0x00,0x00,
0x18,0x00,0x00,0x38,0x00,0x00,0x18,0x00,
0x00,0x38,0x00,0x01,0x00,0x00,0x00,0x04,
0x00,0x01,0x80,0x00,0x00,0x03,0x00,0x01,
0xE0,0x00,0x00,0x03,0x80,0x03,0xE0,0x00,
0x00,0x01,0xC0,0x03,0xC0,0x00,0x00,0x00,
0xC0,0x03,0x80,0x00,0x00,0x00,0xE0,0x07,
0x00,0x00,0x00,0x00,0xF0,0x07,0x00,0x00,
0x00,0x00,0x70,0x06,0x00,0x00,0x00,0x00,
0x70,0x0C,0x00,0x00,0x00,0x00,0x70,0x0C,
0x00,0x00,0x00,0x00,0x60,0x18,0x00,0x60,
0x00,0x00,0x00,0x10,0x00,0xF0,0x3F,0xFF,
0xFF,0xFF,0xFF,0xF8,0x10,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
 for(i=0;i<576;i+=288)
 HZ48(260+i/4,100,48,48,0,str+i);
 for(i=0;i<576;i+=288)
 HZ48(258+i/4,100,48,48,RED,str+i);
}
void GameBegain()/*开始选择画面*/
{
 int flag=0;
 int s=0;
 int key;
 int namex,namey;
 GUAN=1;/*一开始先玩第一关*/
 InputTbf("heart.tbf",tbfFOOD);
 namex=5;namey=440;
 setfillstyle(SOLID_FILL,7);
 bar(0,0,640,480);
 Chinese();
 play.x=10;play.y=220;
 HZ12(150,300,15,0,"请先调整游戏速度,左键为减速,右键为加速,回车游戏开始");
 while(1)
 {
  while(!kbhit())
  {
  if(s==3)
  {
  sound(250);
  bar(play.x-30,play.y-30,play.x+30,play.y+30);
  if(flag==1)
  {InputTbf("r1.tbf",tbfPLAY);flag=0;}
  else
  {InputTbf("r2.tbf",tbfPLAY);flag=1;}
  PrintTbf(play.x,play.y,tbfPLAY,15);
  play.x+=30;
  if(play.x>640)
  play.x=10;
  s=0;
  }
  HZ12(namex,namey,17,BLACK,"唯c联盟 朱昀");
  AmyClockTime(0);/*测试时间间隔*/
  if(s==1)
  {
  HZ12(namex,namey,17,7,"唯c联盟 朱昀");
  namex+=20;
  }
  if(namex>640&&s==1)
  namex=10;
  nosound();
  s++;
  }
  key=bioskey(0);
  if(key==RIGHT&&SPEED>2)
  SPEED-=1;
  else if(key==LEFT&&SPEED<50)
  SPEED+=1;
  else if(key==ENTER)
  break;
 }
}
void Init()
{
 int gd=DETECT,gm;
 registerbgidriver(EGAVGA_driver);/*独立模式*/
 initgraph(&gd,&gm,"d:\\tc\\tc");
 randomize();
}
int timeflag=0;/*移动间隔的判定变量*/
void AmyClockTime(int n)/*时间间隔*/
{
 clock_t old,new;
 if(n==0)
 timeflag++;
 old=clock();
 while(1)
 {
 new=clock();
 if(n==0)
  {
  if((fabs(new-old)/SPEED)>=0.15)
  break;
  }
 else
  {
  if((fabs(new-old)/SPEED)>=0.05)
   break;
  }
 }
}
void ClrPlay()/*去掉玩家原来的地方*/
{
 setfillstyle(SOLID_FILL,7);
 setcolor(7);
 bar(30+play.x*30-9,40+play.y*30-9,30+play.x*30+9,40+play.y*30+9);
 setcolor(GREEN);
}
void AmyClr(int n)/*去掉敌人原来的地方*/
{
setfillstyle(SOLID_FILL,7);
 setcolor(7);
 bar(30+amy[n].x*30-9,40+amy[n].y*30-9,30+amy[n].x*30+9,40+amy[n].y*30+9);
}
void TbfMode()/*玩家的变化*/
{
 switch(play.mode)
 {
 case 1:InputTbf("r1.tbf",tbfPLAY);break;
 case 2:InputTbf("r2.tbf",tbfPLAY);break;
 case 3:InputTbf("d1.tbf",tbfPLAY);break;
 case 4:InputTbf("d2.tbf",tbfPLAY);break;
 case 5:InputTbf("l1.tbf",tbfPLAY);break;
 case 6:InputTbf("l2.tbf",tbfPLAY);break;
 case 7:InputTbf("u1.tbf",tbfPLAY);break;
 case 8:InputTbf("u2.tbf",tbfPLAY);break;
 }
 PrintTbf((int)(30+play.x*30-14),(int)(40+play.y*30-14),tbfPLAY,7);
}
void AmyMode(int n)/*敌人的变化*/
{ switch(amy[n].mode)
 {
 case 1:InputTbf("ar1.tbf",tbfAMY);break;
 case 2:InputTbf("ar2.tbf",tbfAMY);break;
 case 3:InputTbf("ad1.tbf",tbfAMY);break;
 case 4:InputTbf("ad2.tbf",tbfAMY);break;
 case 5:InputTbf("al1.tbf",tbfAMY);break;
 case 6:InputTbf("al2.tbf",tbfAMY);break;
 case 7:InputTbf("au1.tbf",tbfAMY);break;
 case 8:InputTbf("au2.tbf",tbfAMY);break;
 }
 PrintTbf((int)(30+amy[n].x*30-14),(int)(40+amy[n].y*30-14),tbfAMY,7);
}
void AmyMode1(int n)/*敌人的变化*/
{ switch(amy[n].mode)
 {
 case 1:InputTbf("aar1.tbf",tbfAMY1);break;
 case 2:InputTbf("aar2.tbf",tbfAMY1);break;
 case 3:InputTbf("aad1 .tbf",tbfAMY1);break;
 case 4:InputTbf("aad2.tbf",tbfAMY1);break;
 case 5:InputTbf("aal1.tbf",tbfAMY1);break;
 case 6:InputTbf("aal2.tbf",tbfAMY1);break;
 case 7:InputTbf("aau1.tbf",tbfAMY1);break;
 case 8:InputTbf("aau2.tbf",tbfAMY1);break;
 }
 PrintTbf((int)(30+amy[n].x*30-14),(int)(40+amy[n].y*30-14),tbfAMY1,7);
}
int UMove(int i)
{
 int flag=0;
 if(MAP[amy[i].i-1][amy[i].j]==2&&amy[i].y-amy[i].i<0.1)
 flag++;
 if(amy[i].y-amy[i].i<0.1&&amy[i].x-amy[i].j>0.1&&MAP[amy[i].i-1][amy[i].j+1]==2)
 flag++;
 return flag;
}
int PUMove()
{
 int flag=0;
 if(MAP[play.i-1][play.j]==2&&play.y-play.i<0.1)
 flag++;
 if(play.y-play.i<0.1&&play.x-play.j>0.1&&MAP[play.i-1][play.j+1]==2)
 flag++;
 return flag;
}
int DMove(int i)
{
 int flag=0;
 if(MAP[amy[i].i+1][amy[i].j]==2)
 flag++;
 if(amy[i].y-amy[i].i<0.1&&amy[i].x-amy[i].j>0.1&&MAP[amy[i].i+1][amy[i].j+1]==2)
 flag++;
 return flag;
}
int PDMove()
{
 int flag=0;
 if(MAP[play.i+1][play.j]==2)
 flag++;
 if(play.y-play.i<0.1&&play.x-play.j>0.1&&MAP[play.i+1][play.j+1]==2)
 flag++;
 return flag;
}
int RMove(int i)
{
 int flag=0;
 if(MAP[amy[i].i][amy[i].j+1]==2)/*右边不能走的情况*/
 flag++;
 if(amy[i].y-amy[i].i>0&&amy[i].x-amy[i].j<0.1&&MAP[amy[i].i+1][amy[i].j+1]==2)
 flag++;
 return flag;
}
int PRMove()
{
 int flag=0;
 if(MAP[play.i][play.j+1]==2)/*右边不能走的情况*/
 flag++;
 if(play.y-play.i>0&&play.x-play.j<0.1&&MAP[play.i+1][play.j+1]==2)
 flag++;
 return flag;
}
int LMove(int i)
{
 int flag=0;
  if(amy[i].x-amy[i].j<0.1&&amy[i].y-amy[i].i<0.1&&MAP[amy[i].i][amy[i].j-1]==2)
 flag++;
 if(amy[i].x-amy[i].j<0.1&&amy[i].y-amy[i].i>0.1&&MAP[amy[i].i+1][amy[i].j-1]==2)
 flag++;
 if(amy[i].x-amy[i].j<0.1&&amy[i].y-amy[i].i>0.1&&MAP[amy[i].i][amy[i].j-1]==2)
 flag++;
 return flag;
}
int PLMove()
{
 int flag=0;
  if(play.x-play.j<0.1&&play.y-play.i<0.1&&MAP[play.i][play.j-1]==2)
 flag++;
 if(play.x-play.j<0.1&&play.y-play.i>0.1&&MAP[play.i+1][play.j-1]==2)
 flag++;
 if(play.x-play.j<0.1&&play.y-play.i>0.1&&MAP[play.i][play.j-1]==2)
 flag++;
 return flag;
}
int AmyRight(int i)/*判定敌人是否碰到死路*/
{
 int flag=0;
 flag+=UMove(i);
 flag+=RMove(i);
 flag+=DMove(i);
 flag+=LMove(i);
 return flag;
}
int PlayRight()/*判定me是否碰到死路*/
{
 int flag=0;
 flag+=PUMove();
 flag+=PRMove();
 flag+=PDMove();
 flag+=PLMove();
 return flag;
}
void Rgo(int i)/*让敌人笔直往右边移动*/
{
  amy[i].x+=0.5;
  if(amy[i].mode==2)
  amy[i].mode=1;
  else if(amy[i].mode==1)
  amy[i].mode=2;
}
void PRgo()
{
  play.x+=0.5;
  if(play.mode==2)
  play.mode=1;
  else if(play.mode==1)
  play.mode=2;
  else play.mode=2;
}
void Dgo(int i)
{
   amy[i].y+=0.5;
  if(amy[i].mode==3)
  amy[i].mode=4;
  else if(amy[i].mode==4)
  amy[i].mode=3;
}
void PDgo()
{
  play.y+=0.5;
  if(play.mode==3)
 play.mode=4;
  else if(play.mode==4)
  play.mode=3;
  else play.mode=4;
}
void Lgo(int i)
{
   amy[i].x-=0.5;
   if(amy[i].mode==5)
   amy[i].mode=6;
   else if(amy[i].mode==6)
   amy[i].mode=5;
}
void PLgo()
{
    play.x-=0.5;
   if(play.mode==5)
   play.mode=6;
   else if(play.mode==6)
   play.mode=5;
   else play.mode=6;
}
void Ugo(int i)
{
  amy[i].y-=0.5;
  if(amy[i].mode==7)
  amy[i].mode=8;
  else if(amy[i].mode==8)
  amy[i].mode=7;
}
void PUgo()
{
  play.y-=0.5;
  if(play.mode==7)
  play.mode=8;
  else if(play.mode==8)
  play.mode=7;
  else play.mode=8;
}
void AmyModeChange1(int i)/*敌人跟踪移动*/
{
  int flag;
  /*往右跟踪*/
  if(amy[i].i==play.i&&amy[i].y==play.y)
  {
   flag=1;
   if(amy[i].j<=16&&MAP[i][amy[i].j+1]==2&&play.j>amy[i].j)
    flag=0;
   if(amy[i].j>=3&&MAP[i][amy[i].j-1]==2&&play.j<amy[i].j)
    flag=0;
   if(flag)
   {
   if(amy[i].x>play.x&&LMove(i)==0)
    {
      if(amy[i].mode==5||amy[i].mode==6)
      Lgo(i);
      else
      {amy[i].x-=0.5;amy[i].mode=6;}
      return;
    }
  else if(RMove(i)==0)
    {
      if(amy[i].mode==1||amy[i].mode==2)
      Rgo(i);
      else
      {amy[i].x+=0.5;amy[i].mode=2;}
      return;
    }
   }
  }
  if(amy[i].j==play.j&&amy[i].x==play.x)/*上下跟踪*/
  {
   flag=1;
   if(amy[i].i>2&&MAP[amy[i].i-1][amy[i].j]==2&&amy[i].i>play.i)
    flag=0;
   if(amy[i].i<11&&MAP[amy[i].i+1][amy[i].j]==2&&amy[i].i<play.i)
    flag=0;
   if(flag)
   {
   if(UMove(i)==0&&amy[i].y>play.y)
   {
    if(amy[i].mode>6)
    Ugo(i);
    else
    {amy[i].y-=0.5;amy[i].mode=8;}
    return;
   }
   else if(DMove(i)==0)
   {
    if(amy[i].mode==3||amy[i].mode==4)
    Dgo(i);
    else
    {amy[i].y+=0.5;amy[i].mode=4;}
    return;
   }
   }
  }
  amy[i].flag=1;
  AmyModeChange(i);/*没办法跟踪就让敌人乱走*/
  amy[i].flag=0;
}
void PlayModeChange()/*玩家自动变化*/
{int randflag,flag;
 if(play.mode<3&&PRMove()==0)/*右边笔直走*/
 {
  PRgo();
  return;
 }
 else if((play.mode==3||play.mode==4)&&PDMove()==0)/*下不变化*/
 {
  PDgo();
  return;
 }
 else if((play.mode==5||play.mode==6)&&PLMove()==0)/*左不变*/
 {
   PLgo();
   return;
 }
 else if(play.mode>6&&PUMove()==0)/*上不变*/
 {
  PUgo();
  return;
 }
 flag=1;
 while(flag)
 {
 randflag=random(4)+1;
 if(randflag==1)/*右边*/
  {
  if(PRMove()!=0)
   continue;
  PRgo();
  flag=0;
  }
 else if(randflag==2)/*下方*/
  {
  if(PDMove()!=0)
   continue;
  PDgo();
  flag=0;
  }
 else if(randflag==3)/*左边走*/
  {
   if(PLMove()!=0)
    continue;
   PLgo();
   flag=0;
  }
 else if(randflag==4)/*往上走*/
 {
  if(PUMove()!=0)
   continue;
  PUgo();
  flag=0;
  }
 }
}
void AmyModeChange(int i)/*敌人的变化*/
{
 int randflag,flag;
 if(amy[i].mode<3&&RMove(i)==0)/*右边笔直走*/
 {
  Rgo(i);
  return;
 }
 else if((amy[i].mode==3||amy[i].mode==4)&&DMove(i)==0)/*下不变化*/
 {
  Dgo(i);
  return;
 }
 else if((amy[i].mode==5||amy[i].mode==6)&&LMove(i)==0)/*左不变*/
 {
   Lgo(i);
   return;
 }
 else if(amy[i].mode>6&&UMove(i)==0)/*上不变*/
 {
  Ugo(i);
  return;
 }
  if(a my[i].flag==1)
  {
   switch(amy[i].mode)
  {
  case 1:
  case 2:amy[i].mode=6;break;
  case 3:
  case 4:amy[i].mode=8;break;
  case 5:
  case 6:amy[i].mode=2;break;
  case 7:
  case 8:amy[i].mode=4;break;
  }
  amy[i].flag=0;
  }
 flag=1;
 while(flag)
 {
 randflag=random(4)+1;
 if(randflag==1)/*右边*/
  {
  if(AmyRight(i)<8)
   {
   if(amy[i].mode==5||amy[i].mode==6)
   continue;
   }
  if(RMove(i)!=0)
   continue;
  amy[i].x+=0.5;
  if(amy[i].mode==2)
  amy[i].mode=1;
  else if(amy[i].mode==1)
  amy[i].mode=2;
  else
  amy[i].mode=2;
  flag=0;
  }
 else if(randflag==2)/*下方*/
  {
  if(AmyRight(i)<8)
   {
   if(amy[i].mode>6)
    continue;
   }
  if(DMove(i)!=0)
   continue;
  amy[i].y+=0.5;
  if(amy[i].mode==3)
  amy[i].mode=4;
  else if(amy[i].mode==4)
  amy[i].mode=3;
  else
  amy[i].mode=4;
  flag=0;
  }
 else if(randflag==3)/*左边走*/
  {
   if(LMove(i)!=0)
    continue;
   amy[i].x-=0.5;
   if(amy[i].mode==5)
   amy[i].mode=6;
   else if(amy[i].mode==6)
   amy[i].mode=5;
   else amy[i].mode=6;
   flag=0;
  }
 else if(randflag==4)/*往上走*/
 {
  if(UMove(i)!=0)
   continue;
  amy[i].y-=0.5;
  if(amy[i].mode==7)
  amy[i].mode=8;
  else if(amy[i].mode==8)
  amy[i].mode=7;
  else
  amy[i].mode=8;
  flag=0;
  }
 }
}
void DrawBrick(int x,int y)/*画砖*/
{
setfillstyle(SOLID_FILL,6);
bar(30+x*30-14,40+y*30-14,30+x*30+14,40+y*30+14);
setcolor(15);
line(30+x*30-9-5,40+y*30-4-1,30+x*30+9+5,40+y*30-4-1);
line(30+x*30-9-5,40+y*30+4+1,30+x*30+9+5,40+y*30+4+1);
line(30+x*30-4-1,40+y*30-9-5,30+x*30-4-1,40+y*30+9+5);
line(30+x*30+4+1,40+y*30-9-5,30+x*30+4+1,40+y*30+9+5);
}
void DrawFood(int x,int y)/*画食物*/
{

 PrintTbf(30+x*30-14,40+y*30-14,tbfFOOD,7);
}
void DrawFirst()/*开始画面*/
{
 int i,j;
 setfillstyle(SOLID_FILL,7);
 bar(0,0,640,480);
 for(i=0;i<14;i++)
  for(j=0;j<20;j++)
   if(MAP[i][j]==2)/*砖头*/
    DrawBrick(j,i);
   else if(MAP[i][j]==0)
    DrawFood(j,i);/*画心,这里作为食物处理*/
}
void GameWin()/*胜利*/
{
  int key;
  TbfMode();
  InputTbf("esmile.tbf",tbfAMY);
  DrawFrame(220,190,420,250,7);
  HZ12(280,195,19,0,"你胜利了!");
  PrintTbf(300,215,tbfAMY,RED);
  while(1)
  {
  key=bioskey(0);
  if(key==ENTER)
   break;
  }
}
void GameOver()/*游戏失败*/
{
  int key,i,j;
  for(i=1;i<=16;i+=2)
  {
  if(i>7)
   j=i-9+1;
  else
   j=i;
  ClrPlay();
  play.mode=j;
  TbfMode();
  for(j=0;j<N;j++)
  {
   if(amy[j].x==play.x&&amy[j].y==play.y)/*与玩家碰在一起的敌人不显示出来*/
    continue;
   else if(j<3)
   AmyMode(j);
   else
   AmyMode1(j);
  }
  for(j=0;j<4;j++)
  {
  if(j!=0)
   sound(50*(16-i));
  AmyClockTime(0);
  }
  nosound();
  }
  InputTbf("ecry.tbf",tbfAMY);
  DrawFrame(220,190,420,250,7);
  HZ12(280,195,19,0,"你失败了!");
  PrintTbf(300,215,tbfAMY,RED);
  while(1)
  {
  key=bioskey(0);
  if(key==ENTER)
   break;
  }
}
void MapCopy(int (*a)[20],int (*b)[20])/*转换地图*/
{
 int i,j;
 for(i=0;i<14;i++)/*交换地图*/
 {
  for(j=0;j<20;j++)
   a[i][j]=b[i][j];
 }
}
void PrintScore()
{
 setfillstyle(SOLID_FILL,7);
 bar(140,0,200,25);
 HZ12(80,8,20,0,"得分:");
 sprintf(str,"%d",score);
 setcolor(0);
 outtextxy(150,10,str);/*显示得分*/
}
void TongJi()/*计算要多少分才可以过关*/
{
 int i,j;
 WINNUM=0;/*统计需要多少分数才过关*/
 for(i=0;i<14;i++)
  for(j=0;j<20;j++)
   if(MAP[i][j]==0)
   WINNUM++;
}
void GamePlay()/*游戏的具体过程*/
{
 int key;
 int i;
 int foodi,foodj,foodflag;/*判定是敌人走过的地方是否要重新显示心*/
 DrawFirst();/*显示当前地图*/
 TongJi();/*统计要多少分才及格*/
 timeflag=0;
 play.x=1;/*玩家初值*/
 play.y=1;
 play.life=1;
 play.mode=2;
 play.move=0;
 amy[0].y=1;/*敌人的初始坐标以及方向*/
 amy[0].x=18;
 amy[0].mode=6;
 amy[1].y=12;
 amy[1].x=1;
 amy[1].mode=2;
 amy[2].y=12;
 amy[2].x=18;
 amy[2].mode=6;
 amy[3].y=8;
 amy[3].x=10;
 amy[3].mode=8;
 amy[4].y=5;
 amy[4].x=5;
 amy[4].mode=6;
 amy[5].y=8;
 amy[5].x=13;
 amy[5].mode=8;
 for(i=0;i<N;i++)
 amy[i].flag=0;
 score=0;/*一开始的分数*/
 while(1)
 {
  for(i=0;i<N;i++)/*玩家撞敌人*/
  {
  if(play.x==amy[i].x&&play.y==amy[i].y)
  {play.life=0;break;}
  }
 if(play.life==0)/*玩家移动后碰到敌人死去*/
 {
  GameOver();
  break;
 }
 play.j=play.x;/*玩家计算i,j坐标*/
 play.i=play.y;
 if(MAP[play.i][play.j]==0&&play.x-play.j<0.1&&play.y-play.i<0.1)/*吃到一个食物*/
 {
 score++;
 PrintScore();
 TbfMode();
 for(i=0;i<N;i++)
 {
 if(i<3) AmyMode(i);
 else AmyMode1(i);
 }
 MAP[play.i][play.j]=-1;/*吃到食物后变为空地*/
 }
  if(score==WINNUM)/*玩家胜利*/
 {
  GameWin();
  break;
 }
 if(play.move==0)/*假如有变化就重新显示*/
 {
 PrintScore();
 TbfMode();
 play.move=1;
 }
 while(1)/*敌人自动移动*/
 {
  for(i=0;i<N;i++)/*amy meet player*/
  {
   if(play.x==amy[i].x&&play.y==amy[i].y)
    {play.life=0;break;}
  }
  if(play.life==0)/*敌人自动的过程中碰到玩家*/
   break;
  if(timeflag==3)/*敌人和玩家都改自动移动的时候*/
  {
    sound(250);/*敌人移动的时候有声音*/
    for(i=0;i<N;i++)/*first must clear*/
    AmyClr(i);
    for(i=0;i<N;i++)/*显示所有敌人*/
    {
    foodflag=0;/*表示没食物*/
    amy[i].j=amy[i].x;
    amy[i].i=amy[i].y;
    foodi=amy[i].i;/*food x,y*/
    foodj=amy[i].j;
    if(MAP[amy[i].i][amy[i].j]==0)
    foodflag=1;
    if(foodflag)
    DrawFood(foodj,foodi);
    if(i<3)
    AmyModeChange(i);/*这里是没跟踪功能的敌人*/
    else
    AmyModeChange1(i);/*厉害的敌人*/
    if(i<3)
    AmyMode(i);/*普通的敌人*/
    else
    AmyMode1(i);/*厉害的敌人*/
    }
    TbfMode();
    timeflag=0;
    for(i=0;i<N;i++)/*敌人碰到玩家*/
   {
   if(play.x==amy[i].x&&play.y==amy[i].y)
    {play.life=0;break;}
   }
   if(play.life==0)/*敌人自动的过程中碰到玩家*/
    break;
    if(kbhit())/*按键盘跳出循环*/
    {
     key=bioskey(0);
     AmyClockTime(0);
     nosound();/*取消声音*/
     break;
    }
     ClrPlay();
     PlayModeChange();/*玩家自动变化*/
     TbfMode();
     for(i=0;i<N;i++)
     {
     if(i<3)
     AmyMode(i) ;
     else
     AmyMode1(i);
     }
     play.j=play.x;/*玩家计算i,j坐标*/
     play.i=play.y;
      for(i=0;i<N;i++)/*amy meet player*/
     {
     if(play.x==amy[i].x&&play.y==amy[i].y)
      {
      play.life=0;break;
      }
     }
     if(i<N)
      break;
     if(MAP[play.i][play.j]==0&&play.x-play.j<0.1&&play.y-play.i<0.1)/*吃到一个食物*/
     {
     score++;
     PrintScore();
     TbfMode();
     MAP[play.i][play.j]=-1;/*吃到食物后变为空地*/
     for(i=0;i<N;i++)
     {
     if(i<3)
     AmyMode(i);
     else
     AmyMode1(i);
     }
    }
    if(score==WINNUM)/*自动移动过程中胜利*/
     break;
  }
  AmyClockTime(0);
  nosound();/*取消声音*/
 }
 nosound();
  if(score==WINNUM)/*玩家胜利*/
 {
  GameWin();
  break;
 }
 if(play.life==0)/*游戏失败*/
 {
  GameOver();
  break;
 }
 if(key==ESC)
  break;
 else if(key==RIGHT)/*右边移动*/
 {
  if(PRMove()!=0)
  continue;
  ClrPlay();
  PRgo();
  play.move=0;
 }
 else if(key==LEFT)/*左边移动*/
 {
 if(PLMove()!=0)
  continue;
 ClrPlay();
 play.move=0;
 PLgo();
 }
 else if(key==UP)/*上键盘移动*/
 {
 if(PUMove()!=0)
  continue;
 ClrPlay();
 play.move=0;
 PUgo();
 }
 else if(key==DOWN)/*下键盘移动*/
 {
  if(PDMove()!=0)
   continue;
  ClrPlay();
  play.move=0;
  PDgo();
  }
 }
  if(GUAN==1&&score==WINNUM)/*过了第一关继续过第二关*/
  {
   GUAN++;
   MapCopy(MAP,MAP2);
   score=0;
   timeflag=0;
   GamePlay();
  }
   if(GUAN==2&&score==WINNUM)/*过了第二关继续过第三关*/
  {
   GUAN++;
   MapCopy(MAP,MAP3);
   score=0;
   timeflag=0;
   GamePlay();
  }
}
void Close()
{
 closegraph();
}

点这里下载
上一篇:{应用}打砖块程序 人气:6316
下一篇:{应用}TC写的“泡泡堂”(1) 人气:6817
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058