用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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务