论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: 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,游戏,试题,问答,编译,视频教程

简单坦克大战

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

今天下午赶出来的,还有很多东西要不要加进去我自己还没决定,因为有些东西以前练过了,而有些东西没练过,还有很多不足之处.
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>
#include <bios.h>
#define KEY_ESC 0x01
#define KEY_SPACE 0x39
#define KEY_UP 0x48
#define KEY_LEFT 0x4b
#define KEY_RIGHT 0x4d
#define KEY_DOWN 0x50
/*1石头,2砖块,3水,5老家,8玩家,9敌人*/
int map[20][20]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                 1,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                 1,0,2,2,2,2,0,0,2,2,2,2,0,0,0,0,0,0,0,1,
   1,0,0,0,0,0,0,0,2,0,0,2,0,1,1,1,1,0,0,1,
                 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
   1,2,2,2,2,2,2,2,0,0,0,0,0,0,0,2,2,0,0,1,
   1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,1,
                 1,0,1,1,1,1,3,3,3,3,0,0,0,0,0,0,0,2,0,1,
                 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                 1,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,
   1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,3,3,3,0,1,
                 1,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,1,
                 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                 1,0,0,0,0,3,3,3,1,1,1,1,1,1,1,0,0,0,0,1,
                 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
                 1,0,2,2,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,1,
                 1,0,2,2,0,0,0,0,2,2,2,0,0,0,2,2,0,0,0,1,
                 1,0,0,0,0,0,0,8,2,5,2,0,0,0,0,0,0,0,0,1,
   1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
struct f
{
 int x;
 int y;
 int direction;
};
struct play
{
 int x;/*行坐标*/
 int y;/*列坐标*/
 int direction;/*方向*/
 struct f fire[5];/*5颗子弹*/
 int score;/*分数*/
}Playone;
struct a
{
 int x;
 int y;
 int color;
 int direction;
 int directiontwo;/*用来判定走的路是否往返*/
 int fireplay;/*是否攻击的变量,随机生成*/
 struct f fire;
}amy[5];/*敌人的结构体,其实可以添加不同的颜色来表示不同种类的坦克*/
char key_state[128],key_pressed[128];
void Init();/*图象驱动开始*/
void End();/*图象驱动结束*/
void DrawMap();/*画地图*/
void DrawWater(int x,int y);/*画水*/
void DrawBrick(int x,int y);/*画砖*/
void DrawTone(int x,int y);/*画石头*/
void DrawHome(int x,int y);/*画老家*/
void DrawBlack(int x,int y);/*去除内容*/
void DrawPlay(int x,int y);/*画玩家*/
void DrawAmy(int x,int y,int i);/*画敌人*/
void Score();/*输出分数*/
void GamePlay();/*玩游戏过程*/
void GameOver();/*游戏失败*/
void TimeDelay(unsigned long microsec); /*延时函数 传入微秒数*/
int GetKey(int ScanCode);/*这里开始都是按键函数*/
void interrupt far (*OldInt9Handler)();
void far interrupt NewInt9();
void InstallKeyboard();
void ShutDownKeyboard();
void main(void)
{
 Init();
 DrawMap();
 GamePlay();
 End();
}
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);
}
void Init()/*图象驱动开始*/
{int gd=DETECT,gm;
 initgraph(&gd,&gm,"d:\\tc\\tc");
 cleardevice();
 InstallKeyboard();
}
void End()/*图象驱动结束*/
{
 ShutDownKeyboard();
 closegraph();
}
void DrawTone(int x,int y)/*画石头*/
{
setfillstyle(SOLID_FILL,7);
bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
}
void DrawWater(int x,int y)/*画水*/
{
 setfillstyle(SOLID_FILL,BLUE);
 bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
}
void DrawBrick(int x,int y)/*画砖*/
{
setfillstyle(SOLID_FILL,6);
bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
setcolor(15);
line(100+x*20-9,50+y*20-4,100+x*20+9,50+y*20-4);
line(100+x*20-9,50+y*20+4,100+x*20+9,50+y*20+4);
line(100+x*20-4,50+y*20-9,100+x*20-4,50+y*20+9);
line(100+x*20+4,50+y*20-9,100+x*20+4,50+y*20+9);
}
void DrawHome(int x,int y)/*画老家*/
{
 setcolor(0);
 setfillstyle(SOLID_FILL,GREEN);
 fillellipse(100+x*20,50+y*20,9,9);
}
void DrawBlack(int x,int y)/*去除内容*/
{
 setcolor(0);
 setfillstyle(SOLID_FILL,0);
 bar(100+x*20-9,50+y*20-9,100+x*20+9,50+y*20+9);
}
void DrawPlay(int x,int y)/*画玩家*/
{
 setcolor(4);/*玩家为红色*/
 circle(100+x*20,50+y*20,7);
 switch(Playone.direction)/*判定玩家方向*/
 {
 case 1:line(100+x*20,50+y*20,100+x*20,50+y*20-9);break;/*上*/
 case 2:line(100+x*20,50+y*20,100+x*20+9,50+y*20);break;/*右*/
 case 3:line(100+x*20,50+y*20,100+x*20,50+y*20+9);break;/*下*/
 case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/
 }
}
void DrawAmy(int x,int y,int i)/*画敌人*/
{
 if(amy[i].color==12)
 setcolor(12);
 else if(amy[i].color==13)
 setcolor(13);
 else/*这里是判定三种颜色的坦克*/
 setcolor(14);
 circle(100+x*20,50+y*20,7);
 switch(amy[i].direction)/*判定玩家方向*/
 {
 case 1:line(100+x*20,50+y*20,100+x*20,50+y*20-9);break;/*上*/
 case 2:line(100+x*20,50+y*20,100+x*20+9,50+y*20);break;/*右*/
 case 3:line(100+x*20,50+y*20,100+x*20,50+y*20+9);break;/*下*/
 case 4:line(100+x*20,50+y*20,100+x*20-9,50+y*20);break;/*左*/
 }
}
void Score()/*输出分数*/
{
 char s[10];
 Playone.score+=10;
 sprintf(s,"%d",Playone.score);
 setfillstyle(SOLID_FILL,0);
 bar(550,100,640,130);
 settextstyle(0,0,2);
 setcolor(YELLOW);
 outtextxy(550,115,s);
}
void DrawMap()/*画地图*/
{int i,j,k;
 for(i=0;i<20;i++)
  {
  for(j=0;j<20;j++)
   if(map[i][j]==1)
    DrawTone(j,i);
   else if(map[i][j]==2)
    DrawBrick(j,i);
   else if(map[i][j]==3)
    DrawWater(j,i);
   else if(map[i][j]==5)
    DrawHome(j,i);
   else if(map[i][j]==8)
    {
    Playone.x=i;
    Playone.y=j;
    Playone.direction=1;
    DrawPlay(j,i);
    for(k=0;k<5;k++)
    Playone.fire[k].direction=-1;/*5颗子弹的方向都为-1,表示不存在*/
    }
   else if(map[i][j]==9)
   {
   amy[0].x=1;amy[0].y=1;amy[0].direction=amy[0].directiontwo=3;/*第一个敌人*/
   amy[0].color=12;
   DrawAmy(j,i,0);
   }
  }
 for(i =1;i<5;i++)/*敌人都没出现*/
 amy[i].direction=amy[i].fire.direction=-1;
 outtextxy(210,450,"2003.10.1 milo_zy");
 settextstyle(0,0,2);/*首次输出得分*/
 setcolor(9);
 outtextxy(525,80,"Score");
 setcolor(YELLOW);
 outtextxy(550,115,"0");
}
void far interrupt NewInt9(void)
{
 unsigned char ScanCode,temp;
 ScanCode=inportb(0x60);
 temp=inportb(0x61);
 outportb(0x61,temp | 0x80);
 outportb(0x61,temp & 0x7f);
 if(ScanCode&0x80)
   {
    ScanCode&=0x7f;
    key_state[ScanCode]=0;
   }
else
   {
    key_state[ScanCode]=1;
    key_pressed[ScanCode]=1;
   }
 outportb(0x20,0x20);
}

void InstallKeyboard(void)
{
 int i;
 for(i=0;i<128;i++)
 key_state[i]=key_pressed[i]=0;
 OldInt9Handler=getvect(9);         /*中断向量值*/
 setvect(9,NewInt9);                /*中断程序NewInt9地址存入指定的中断向量表中INT 09H*/
}

void ShutDownKeyboard(void)
{
 setvect(9,OldInt9Handler);
}

int GetKey(int ScanCode)
{
 int res;
 res=key_state[ScanCode]|key_pressed[ScanCode];
 key_pressed[ScanCode]=0;
 return res;
}
void GameOver()/*游戏失败*/
{
 setcolor(0);
 setfillstyle(SOLID_FILL,0);/*把老家给去除*/
 fillellipse(100+9*20,50+18*20,9,9);
 nosound();
 setcolor(RED);
  settextstyle(0,0,4);
 outtextxy(150,5,"GAME OVER");
 while(1)
 {
  if(GetKey(KEY_ESC))
  break;
 }
}
void GamePlay()/*玩游戏的过程*/
{
 int i,j,lose=0;/*lose是1的时候表示失败*/
 int t=0;
 randomize();
 while(1)
 {
  for(i=0;i<5;i++)/*画敌人的子弹*/
   {
    if(amy[i].fire.direction>0)
      putpixel(100+amy[i].fire.y*20,50+amy[i].fire.x*20,11);
   }
  for(i=0;i<=4;i++)/*画玩家子弹*/
    {
    if(Playone.fire[i].direction>0)/*大于0表示玩家子弹存在*/
    putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,11);
    }
  TimeDelay(500000);/*要害的时间改动*/
  for(i=0;i<5;i++)/*去敌人的子弹*/
   {
    if(amy[i].fire.direction>0)
      putpixel(100+amy[i].fire.y*20,50+amy[i].fire.x*20,0);
   }
  for(i=0;i<=4;i++)/*去玩家除子弹*/
   {
    if(Playone.fire[i].direction>0)
    putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,0);
  }
  for(i=0;i<=4;i++)/*玩家子弹位置的变化*/
   {
    if(Playone.fire[i].direction<0)
     continue;
    if(Playone.fire[i].direction==1)
     {Playone.fire[i].x--;Playone.fire[i].y=Playone.fire[i].y;}
    else if(Playone.fire[i].direction==2)
     {Playone.fire[i].y++;Playone.fire[i].y=Playone.fire[i].y;}
    else if(Playone.fire[i].direction==3)
     {Playone.fire[i].x++;Playone.fire[i].y=Playone.fire[i].y;}
    else if(Playone.fire[i].direction==4)
     {Playone.fire[i].y--;Playone.fire[i].y=Playone.fire[i].y;}
    /*打到石头或者砖头的情况下减少子弹*/
    if(map[Playone.fire[i].x][Playone.fire[i].y]==1)/*打到石头*/
     Playone.fire[i].direction=-1;/*子弹消失*/
    if(map[Playone.fire[i].x][Playone.fire[i].y]==2)/*打到砖头*/
     {
      Playone.fire[i].direction=-1;
      DrawBlack(Playone.fire[i].y,Playone.fire[i].x);/*砖头打掉*/
      map[Playone.fire[i].x][Playone.fire[i].y]=0;/*被打掉的地方变成可走的地方*/
     }
    if(map[Playone.fire[i].x][Playone.fire[i].y]==5)/*自己打到老家*/
     {lose=1;break;}
    for(j=0;j<5;j++)
     {
     if(amy[j].direction<0)/*不存在的不判定*/
      continue;
     if(amy[j].x==Playone.fire[i].x&&amy[j].y==Playone.fire[i].y)/*打中敌人*/
     {
     Playone.fire[i].direction=-1;
     DrawBlack(Playone.fire[i].y,Playone.fire[i].x);
     map[Playone.fire[i].x][Playone.fire[i].y]=0;/*被打掉的地方变成可走的地方*/
     amy[j].fire.direction=amy[j].direction=-1;/*这个敌人消失*/
     Score();/*输出得分*/
     }
    }
   }
for(i=0;i<5;i++)/*敌人子弹位置的变化*/
   {
    if(amy[i].direction<0||amy[i].fire.direction<0)
     continue;
    if(amy[i].fire.direction==1)
     {amy[i].fire.x--;amy[i].fire.y=amy[i].fire.y;}
    else if(amy[i].fire.direction==2)
     {amy[i].fire.y++;amy[i].fire.x=amy[i].fire.x;}
    else if(amy[i].fire.direction==3)
     {amy[i].fire.x++;amy[i].fire.y=amy[i].fire.y;}
    else if(amy[i].fire.direction==4)
     {amy[i].fire.y--;amy[i].fire.x=amy[i].fire.x;}
    /*打到石头或者砖头的情况下减少子弹*/
    if(map[amy[i].fire.x][amy[i].fire.y]==1)/*打到石头*/
     amy[i].fire.direction=-1;/*子弹消失*/
    if(map[amy[i].fire.x][amy[i].fire.y]==2)/*打到砖头*/
     {
      amy[i].fire.direction=-1;
      DrawBlack(amy[i].fire.y,amy[i].fire.x);/*砖头打掉*/
      map[amy[i].fire.x][amy[i].fire.y]=0;/*被打掉的地方变成可走的地方*/
     }
    if(map[amy[i].fire.x][amy[i].fire.y]==5)/*敌人打到老家*/
     {lose=1;break;}
    if(amy[i].fire.x==Playone.x&&amy[i].fire.y==Playone.y)/*打中玩家*/
    {
     for(j=0;j<5;j++)
     Playone.fire[j].direction=-1;/*玩家子弹都消失*/
     amy[i].fire.direction=-1;
     DrawBlack(amy[i].fire.y,amy[i].fire.x);
     map[amy[i].fire.x][amy[i].fire.y]=0;/*被打掉的地方变成可走的地方*/
     lose=1;break;/*好人被打掉后就失败*/
    }
   }
  nosound();
  for(i=0;i<5;i++)/*敌人方向随机的改变*/
  {
   if(amy[i].direction<0)
    continue;
   while(1)
   {
    amy[i].directiontwo=random(4)+1;
    if(amy[i].direction==1&&amy[i].directiontwo==3)
     continue;
    if(amy[i].direction==3&&amy[i].directiontwo==1)
     continue;
    if(amy[i].direction==2&&amy[i].directiontwo==4)
     continue;
    if(amy[i].direction==4&&amy[i].directiontwo==2)/*这里4个if是判定有没有往返走*/
     continue;
    if(amy[i].directiontwo==3&&(map[amy[i].x+1][amy[i].y]==3||map[amy[i].x+1][amy[i].y]==1||map[amy[i].x+1][amy[i].y]==2))
     continue;
    if(amy[i].directiontwo==1&&(map[amy[i].x-1][amy[i].y]==3||map[amy[i].x-1][amy[i].y]==1||map[amy[i].x-1][amy[i].y]==2))
     continue;
    if(amy[i].directiontwo==2&&(map[amy[i].x][amy[i].y+1]==3||map[amy[i].x][amy[i].y+1]==1||map[amy[i].x][amy[i].y+1]==2))
     continue;
    if(amy[i].directiontwo==4&&( map[amy[i].x][amy[i].y-1]==3||map[amy[i].x][amy[i].y-1]==1||map[amy[i].x][amy[i].y-1]==2))
     continue;/*以上4个是是否碰到了墙壁或者水什么的*/
    DrawBlack(amy[i].y,amy[i].x);/*把原来的地方擦掉*/
    amy[i].direction=amy[i].directiontwo;
    if(amy[i].direction==1)
    {amy[i].x--;amy[i].y=amy[i].y;}
    if(amy[i].direction==3)
    {amy[i].x++;amy[i].y=amy[i].y;}
    if(amy[i].direction==2)
    {amy[i].y++;amy[i].x=amy[i].x;}
    if(amy[i].direction==4)
    {amy[i].y--;amy[i].x=amy[i].x;}
    if(amy[i].x==Playone.x&&amy[i].y==Playone.y)/*相撞*/
      lose=1;
    if(map[amy[i].x][amy[i].y]==5)/*敌人撞到老家*/
      lose=1;
    DrawAmy(amy[i].y,amy[i].x,i);/*画敌人*/
    if(amy[i].fire.direction<0)
    amy[i].fireplay=random(4);
    if(amy[i].fireplay==1&&amy[i].fire.direction<0)/*发射*/
    {
     amy[i].fire.direction=amy[i].direction;/*子弹方向与敌人方向一致*/
     amy[i].fire.x=amy[i].x;
     amy[i].fire.y=amy[i].y;
    }
    break;
   }
  }
  if(lose)/*因为失败而跳出循环显示失败*/
   {GameOver();break;}
  if(GetKey(KEY_ESC))
   break;
  if(GetKey(KEY_UP))/*往上*/
   {
    if(Playone.direction==1&&map[Playone.x-1][Playone.y]!=1&&map[Playone.x-1][Playone.y]!=2)
    {
      if(map[Playone.x-1][Playone.y]==3)
      continue;
      DrawBlack(Playone.y,Playone.x);/*这个if是移动,前提是方向与按下的到向一致*/
      Playone.x--;
      Playone.direction=1;
      DrawPlay(Playone.y,Playone.x);
    }
    else/*只调整炮头方向*/
    {
     DrawBlack(Playone.y,Playone.x);
     Playone.direction=1;
     DrawPlay(Playone.y,Playone.x);
    }
   }
  else if(GetKey(KEY_DOWN))/*往下*/
   {
    if(Playone.direction==3&&map[Playone.x+1][Playone.y]!=1&&map[Playone.x+1][Playone.y]!=2)
    {
    if(map[Playone.x+1][Playone.y]==3)
    continue;
    DrawBlack(Playone.y,Playone.x);
    Playone.x++;
    Playone.direction=3;
    DrawPlay(Playone.y,Playone.x);
    }
    else
    {
     DrawBlack(Playone.y,Playone.x);
     Playone.direction=3;
     DrawPlay(Playone.y,Playone.x);
    }
   }
   if(GetKey(KEY_RIGHT))/*往右*/
   {
    if(Playone.direction==2&&map[Playone.x][Playone.y+1]!=1&&map[Playone.x][Playone.y+1]!=2)
    {
    if(map[Playone.x][Playone.y+1]==3)
    continue;
    DrawBlack(Playone.y,Playone.x);
    Playone.y++;
    Playone.direction=2;
    DrawPlay(Playone.y,Playone.x);
    }
  else
    {
     DrawBlack(Playone.y,Playone.x);
     Playone.direction=2;
     DrawPlay(Playone.y,Playone.x);
    }
   }
   if(GetKey(KEY_LEFT))/*往左*/
   {
    if(Playone.direction==4&&map[Playone.x][Playone.y-1]!=1&&map[Playone.x][Playone.y-1]!=2)
    {
    if(map[Playone.x][Playone.y-1]==3)
    continue;
    DrawBlack(Playone.y,Playone.x);
    Playone.y--;
    Playone.direction=4;
    DrawPlay(Playone.y,Playone.x);
    }
   else
    {
     DrawBlack(Playone.y,Playone.x);
     Playone.direction=4;
     DrawPlay(Playone.y,Playone.x);
    }
   }
        if(GetKey(KEY_SPACE))/*发射子弹*/
   {
    for(i=0;i<5;i++)/*用循环来找是否有子弹可以用*/
     if(Playone.fire[i].direction<0)
    {
     sound(300);
     Playone.fire[i].direction=Playone.direction;/*子弹方向与坦克方向一致*/
     Playone.fire[i].x=Playone.x;
     Playone.fire[i].y=Playone.y;
     break;/*找到后就跳出循环*/
    }
   }
   if(map[Playone.x][Playone.y]==5)/*玩家自己撞到老家*/
    lose=1;
   for(i=0;i<5;i++)/*判定是否因自己控制撞到敌人*/
   {
   if(amy[i].direction<0)
    continue;
   if(amy[i].x==Playone.x&&amy[i].y==Playone.y)/*相撞*/
      lose=1;
   }
   if(lose)/*因为失败而跳出循环显示失败*/
   {GameOver();break;}
   t++;/*加到一定的程序就出现新的敌人*/
   if(t==30) /*到了增加敌人的时候*/
   {t=0;
    for(i=0;i<5;i++)
    if(amy[i].direction<0)
    {
     amy[i].direction=amy[i].directiontwo=3;
     amy[i].x=1;
     amy[i].y=random(3);/*方向随机*/
     if(amy[i].y==0)
     amy[i].y=1;
     else if(amy[i].y==1)
     amy[i].y=9;
     else/*这里和上面的两个判定是判定敌人的初始位置*/
     amy[i].y=18;
     amy[i].color=random(3)+12;/*颜色随机*/
     DrawAmy(amy[i].y,amy[i].x,i);
     break;/*找到一个后就出循环*/
   }
  }
 }
}

上一篇:{实例}递归找迷宫 人气:4670
下一篇:{实例}一个二分法查找的图形演示程序 人气:7853
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058