• 欢迎访问C语言网www.dotcpp.com 比赛栏每月有奖月赛!举办比赛联系QQ:2045302297
  • 问题反馈、粉丝交流 QQ群327452739 蓝桥杯训练群:113766799 申请群时请备注排名里的昵称
  • C语言研究中心 为您提供有图、有料、解渴的C语言专题! 欢迎讨论!

用纯C语言实现坦克大战

项目源码 CTO 68534次浏览 19个评论

好久没给大家看有意思的C语言实现的代码了,今天给大家分享一个C语言实现坦克大战的游戏源码,依旧是纯C语言,点c文件,但是是在TC的环境下,运行效果截图如下:

 

用纯C语言实现坦克大战

 

上下左右控制方向,空格为发射炮弹,还带声音哦!
用纯C语言实现坦克大战

 

小编亲自没有问题,大家可以自行上机实验,编译器下载见

C/C++开发和学习人员必备工具下载集合(含助手及破解补丁)

 

下面上代码!

 

 
/* time:2017/1/15 */
/* edit:www.dotcpp.com */
#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

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<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;
 }
 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,"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<128;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<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)
 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)
 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<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);
 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;
 }
 }
}
}

 

代码较长,大家可以分段复制,如发现问题欢迎随时留言!

 

有好东西记得分享哦!

C语言网提供「C语言、C++、算法竞赛」在线课程,全部由资深研发工程师或ACM金牌大佬亲授课,更科学、全面的课程体系,以在线视频+在线评测的学习模式学习,学练同步,拒绝理论派,真正学会编程!还有奖学金等增值福利等你!

C语言网, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明用纯C语言实现坦克大战
喜欢 (316)
[jinyangH@aliyun.com]
分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
(19)个小伙伴在吐槽
  1. #include G:\c.代码\2331\main.c|2|fatal error: graphics.h: No such file or directory|
    安生2017-02-09 21:55 回复
    • 是TC编译器吗?
      word2017-02-11 13:42 回复
    • 显然你没有安装graphic库,c标准库是没有的,没有这个库你无法在黑框里弄图形什么的。
      averyboy2017-03-05 10:54 回复
      • 那怎么弄这个库
        sf2017-12-25 20:54 回复
  2. 有点问题
    2017-03-03 16:43 回复
  3. #include #include 这两个为啥有问题呢
    海底大鳄鱼2017-11-10 18:22 回复
  4. 游戏编程有视频教程吗?
    游小鱼2017-11-11 21:48 回复
  5. Can't find include file .出现这种问题,该怎么办?
    anyunbing2017-11-15 20:39 回复
  6. 作者微信多少?我这有十三行显示错误,求联系方式联系下
    李军2017-11-28 08:54 回复
  7. 你没发图片文件能运行尼玛啊
    杰哥2019-02-04 16:50 回复
  8. 你没发图片文件能运行尼玛啊
    escapee2019-07-08 07:56 回复
    • TC中自带graphics图形库, 这程序实时绘制图形,又不是基于位图的游戏, 要什么图片(图像)文件. 另外, 现在用TC写图形程序在windows中run的话, 一般会黑屏挂掉, 要用dosbox之类的来模拟运行 本人已经试过以上程序,OK的
      lei2019-07-08 11:48 回复
      • 如何在dosbox下运行tc有教程吗?
        smily2019-08-05 23:37 回复
  9. 今天刚下好的TC
    z2019-11-10 17:21 回复
  10. 只能用TC编译器嘛?
    绫歌泣夜2019-11-17 16:53 回复
  11. 请问,在TC中,怎么运行这个代码(第一次接触TC),这个代码应该写在哪里?
    xingo2020-01-12 00:41 回复
    • 你可以Alt+r或者Ctrl+F9
      pfy2020-01-22 17:36 回复
    • 你可以Alt+r(可能还要个回车)或者Ctrl+F9
      pfy2020-01-22 17:37 回复
    • 你可以Alt+r(可能还要个回车)或者Ctrl+F9, Alt+F5可以看到运行效果
      pfy2020-01-22 17:39 回复