您好,欢迎来到刀刀网。
搜索
您的当前位置:首页用c做的简单的坦克大战小游戏

用c做的简单的坦克大战小游戏

来源:刀刀网


用c做的简单的坦克大战小游戏(给初学者点动力)

#include

#include

#include

#include

#include

#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:\\\c\\\c\");

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

作者:c闲人 2004-8-20 00:42 回复此发言

--------------------------------------------------------------------------------

2 用c做的简单的坦克大战小游戏(给初学者点动力)

}

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\

setfillstyle(SOLID_FILL,0);

bar(550,100,0,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;

作者:c闲人 2004-8-20 00:42 回复此发言

--------------------------------------------------------------------------------

3 用c做的简单的坦克大战小游戏(给初学者点动力)

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); 量表中INT 09H*/

}

void ShutDownKeyboard(void)

/*中断向量值*/

/*中断程序NewInt9地址存入指定的中断向

{

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++)/*敌人子弹位置的变化*/

作者:c闲人 2004-8-20 00:42 回复此发言

--------------------------------------------------------------------------------

4 用c做的简单的坦克大战小游戏(给初学者点动力)

{

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;/*子弹方向与敌人方向一致*/

作者:c闲人 2004-8-20 00:42 回复此发言

--------------------------------------------------------------------------------

5 用c做的简单的坦克大战小游戏(给初学者点动力)

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;/*找到一个后就出循环*/

}

}

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.com 版权所有 湘ICP备2022005869号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务