c语言免杀程序源码,【程序源码】用纯C语言实现坦克大战

/* time:2017/1/15 */

/* edit:www.dotcpp.com */

#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

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

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,'C:\\TC20\\BGI');

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

{

for(j=0;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<>

Playone.fire[k].direction=-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<>

amy[i].direction=amy[i].fire.direction=-1;

outtextxy(210,450,'Edit By www.dotcpp.com');

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

key_state[i]=key_pressed[i]=0;

OldInt9Handler=getvect(9);

setvect(9,NewInt9);

}

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;

int t=0;

randomize();

while(1)

{

for(i=0;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<>

{

if(Playone.fire[i].direction>0)

putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,11);

}

TimeDelay(500000);

for(i=0;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<>

{

if(Playone.fire[i].direction>0)

putpixel(100+Playone.fire[i].y*20,50+Playone.fire[i].x*20,0);

}

for(i=0;i<>

{

if(Playone.fire[i].direction<>

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

{

if(amy[j].direction<>

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

{

if(amy[i].direction<><>

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

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

{

if(amy[i].direction<>

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)

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;

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

amy[i].fireplay=random(4);

if(amy[i].fireplay==1&&amy[i].fire.direction<>

{

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

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

if(Playone.fire[i].direction<>

{

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

{

if(amy[i].direction<>

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

if(amy[i].direction<>

{

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;

}

}

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
游戏分里外两个部分组成,里部分(用户不可见) 通过里部分执行判断,地图数组更改,和各种值的改变。更改完里部分再根据相应变化更改表部分。(用户可视部分)表部分的打印通过gotoxy去到相应坐标再printf打印出字符,通过文本函数改变文字字体颜色与文字背景颜色与字符组合实现图形界面。 程序通过 计数器+循环判断 的思想,类似单核cpu的多线程实现(单线程在不同程序/函数间来回执行)省去了多线程。(具体过程在功能设计与描述有详细描述) 另AI实现与加强依赖于rand随机函数的运用,进一步强化AI,增加游戏乐趣 功能方面,游戏参考于80年代任天堂红白机(FC/FamilyComputer)上的游戏坦克大战(Battle City),包括地图,游戏模式等等(当时的游戏直接烧在电路板上)。所以游戏平衡方面已经有了很好的参考,无需再花大量时间测试平衡性。 但诸如地图中的树林元素,随机道具等没有实现。但较之原版,该游戏由C/C++编写PC运行,由字符界面实现游戏画面。原版一辆坦克的子弹未消失之前不能发射第二颗。导致子弹打击远处CD长,近处CD短。该游戏每个子弹都有相同CD,子弹未消失只要CD达到即可发射第二颗,第三颗…增加了真实性,相较于原版是个改进。且考虑到PC性能不一内置了游戏速度调整。玩家可根据PC性能调整至合适的速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值