“坦克⼤战”⼩游戏(C语⾔)源代码及其详解注释
“坦克⼤战”⼩游戏(C语⾔)源代码及其详解注释
运⾏实现之后的图⽚结果如下:
笔记
1.敌⼈必须先移动再创造,不然会出现⼫体复活。
原因:敌⼈死亡之后,中⼼点是⽆法再次定位的,敌⼈刷新的那⼀帧会出现两个中⼼点。
解决⽅法:再主函数⾥把敌⼈移动的函数放在创造敌⼈的函数之前。
2.敌⼈⼦弹和玩家⼦弹相撞时,必定只会有⼀⽅的⼦弹消失,看概率。
原因:两⽅⼦弹相撞只会有⼀⽅的⼦弹先到达另⼀⽅的前⾯然后消失,跟⼦弹移动速度(停留时间)有关。
解决⽅法:把⼦弹的消失判定点往前加⼀个点来判断是否是敌⽅的⼦弹(暂时不解决)
3.敌⼈发射⼦弹时,有时候会出现发射⼦弹的⽅向和敌⼈的⽅向不⼀致。
原因:敌⼈转向时是先改变⽅向,下⼀次移动时再转过去,⼦弹发射的时间被卡在了两者之间。
解决⽅法:将发射⼦弹写在移动的⾥⾯,这样会改变敌⼈射击的频率,移动的条件符合,再判断射击条件,两者都符合才会射击。(不优)
添加⼀个坦克属性来设置坦克预备转向。
4.敌⼈的⼦弹在接近玩家附近⼀格时,玩家向反⽅向移动会消除⼦弹,反之相同。(触发⼏率很⼩)
原因:玩家移动的时候会把之前的所在的⼀条三个格⼦全都清零。
解决⽅法:暂⽆
5.当玩家的前⽅是敌⽅坦克时,⽆法发射⼦弹,反之相同。不能贴脸射击。
原因:发射⼦弹的条件是坦克的前⽅⽆阻挡物,才会⽣成⼦弹,在⼦弹⽣成之后才会飞⾏和击毁。
解决⽅法:在发射⼦弹时添加条件判断。(不优,感觉会影响游戏体验)
6.敌⼈A和B的⾏动模式是⼀样的,可以把他们的移动写在⼀个函数⾥,但是运⾏的时候会出错只有⼀个坦克会动。
原因:函数传⼊的参数是在函数⾥改变了不会影响外⾯的参数,这需要⽤到指针。
7.敌⼈坦克在移动的时候会被⾃⼰的⼦弹挡住然后转向,玩家也是(⼏率很⼩,不过不影响游戏)
#pragma warning(disable:4996)
#include<stdio.h>
#include<iostream>
#include<conio.h>
#include<time.h>
#include<windows.h>
#include<graphics.h>
#define ROW 48
int map[ROW][ROW];//正⽅形的地图
int refresh;//记录当前刷新的次数
int FlyBullet_P_C, FlyBullet_E_C;//控制玩家和敌⼈⼦弹的飞⾏速度
struct Tank{//坦克的参数
int x;//横向坐标
int y;//纵向坐标
int dir;//⽅向
int rdir;//预备转向
int dirt;//记录转向的时间
int dirc;//控制转向频率
int life;//坦克的⽣命
int maxl;//坦克最⼤⽣命值
int dietime;//坦克的死亡时间
int str;//⼦弹的伤害
int mt;//记录移动时间
int mc; //控制移动速度
int st;//记录射击时间
int sc;//控制射速
int score;//击败敌⼈的得分/玩家积累的分数
int shape[3][3];//坦克的外形
} player, enemyA, enemyB, enemyC, enemyD, enemyE;//创建玩家敌⼈
int Player[3][3]{ {0,2,0},
{2,4,2},
{2,2,2} };//玩家的坦克
int empty[3][3];//空数组⽤于转向
struct CreatePoint {//敌⼈的刷新点
int x;//刷新点横向坐标
int y;//纵向坐标
}cp[5];
int propbox;//道具编号;
int propt, propc;//记录,控制道具刷新时间
int propflag;//判断场上是否有道具
//游戏开始时的初始化
void GameStart() {
initgraph(640, 480);//窗⼝⼤⼩
setbkcolor(WHITE);//背景颜⾊
memset(map, 0, sizeof(map));//初始化数组为0
for (int i = 0; i < ROW; i++) map[0][i] = map[ROW - 1][i] = 1;
for (int i = 1; i < ROW - 1; i++) map[i][0] = map[i][ROW - 1] = 1;
for (int y = 0; y < ROW; y++) {//y轴向下
for (int x = 0; x < ROW; x++) {//x轴向右
if (map[y][x]) {
setlinecolor(BLACK);
setfillcolor(RGB(213, 222, 217));
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
}
}
}
refresh = 0;
map[45][23] = 4;//玩家的出⽣点
player.life = 3;
player.score = 0;
player.dir = 1;
player.str = 1;
< = 3;
player.sc = 10;
player.maxl = 3;
FlyBullet_P_C = 1;
FlyBullet_E_C = 3;
enemyA.life = enemyB.life = enemyC.life = enemyD.life = enemyE.life = -1;
enemyA.dir = enemyB.dir = enemyC.dir = enemyD.dir = enemyE.dir = 2;
enemyA.rdir = enemyB.rdir = enemyC.rdir = enemyD.rdir = enemyE.rdir = 2;
int Enemy[3][3]{ {15,15,0},
{0,20,15},
{15,15,0} };//敌⼈的坦克
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (Enemy[i][j]) {
enemyA.shape[i][j] = Enemy[i][j];//敌⼈A 中⼼为20 外壳为15
enemyB.shape[i][j] = Enemy[i][j] + 1;//敌⼈B 中⼼为21 外壳为16
enemyC.shape[i][j] = Enemy[i][j] + 2;//敌⼈C 中⼼为22 外壳为17
enemyD.shape[i][j] = Enemy[i][j] + 3;//敌⼈D 中⼼为23 外壳为18
enemyE.shape[i][j] = Enemy[i][j] + 4;//敌⼈E 中⼼为24 外壳为19
}
}
}
//地图地形
for (int i = 0; i < 5; i++) map[10][10 + i] = map[37][10 + i] = map[10][37 - i] = map[37][37 - i] = 1; for (int i = 0; i < 4; i++) map[11 + i][10] = map[36 - i][10] = map[11 + i][37] = map[36 - i][37] = 1; map[23][23] = map[23][24] = map[24][23] = map[24][24] = 1;
//初始化敌⼈的刷新点
cp[0].x = 2;
cp[0].y = 2;
cp[1].x = 24;
cp[1].y = 2;
cp[2].x = 45;
cp[2].y = 2;
cp[3].x = 2;
cp[3].y = 23;
cp[4].x = 45;
cp[4].y = 23;
//道具的刷新率
propt = 0;
propc = 300;
propflag = -1;
}
//绘制地图
void DrawMap() {
for (int y = 1; y < ROW-1; y++) {//y轴向下
for (int x = 1; x < ROW-1; x++) {//x轴向右
switch (map[y][x]) {
case 0:break;
case 1:
setlinecolor(BLACK);
setlinestyle(NULL, 1);
setfillcolor(RGB(213,222,217));//灰⾊
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;//墙壁
case 2://玩家坦克的外壳
case 4://玩家的中⼼点
setlinecolor(BLACK);
setlinestyle(NULL, 1);
setfillcolor(RGB(0, 140, 158));//青蓝⾊
setfillcolor(RED);
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;
case 18://敌⼈D的外壳
case 17://敌⼈C的外壳
setlinecolor(BLACK);
setlinestyle(NULL, 1);
setfillcolor(RGB(89, 79, 79));//褐⾊
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;
case 16://敌⼈B的外壳
case 15://敌⼈A的外壳
setlinecolor(BLACK);
setlinestyle(NULL, 1);
setfillcolor(RGB(85, 98, 112));//深灰⾊
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;
case 24://敌⼈E的中⼼点
setlinecolor(BLACK);
setlinestyle(NULL, 2);
switch (enemyE.life) {
case 0:setfillcolor(RGB(255, 255, 255)); break;
case 1:setfillcolor(RGB(255, 0, 0)); break;
case 2:setfillcolor(RGB(255, 165, 0)); break;
case 3:setfillcolor(RGB(255, 255, 0)); break;
case 4:setfillcolor(RGB(0, 255, 0)); break;
case 5:setfillcolor(RGB(0, 255, 255)); break;
case 6:setfillcolor(RGB(0, 0, 255)); break;
生命源代码免费漫画case 7:setfillcolor(RGB(160, 32, 240)); break;
}
【】fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);//边框填充矩形 break;
case 23://敌⼈D的中⼼点
setlinecolor(BLACK);
setlinestyle(NULL, 2);
switch (enemyD.life) {
case 0:setfillcolor(RGB(255, 255, 255)); break;
case 1:setfillcolor(RGB(255, 0, 0)); break;
case 2:setfillcolor(RGB(255, 165, 0)); break;
case 3:setfillcolor(RGB(255, 255, 0)); break;
case 4:setfillcolor(RGB(0, 255, 0)); break;
case 5:setfillcolor(RGB(0, 255, 255)); break;
case 6:setfillcolor(RGB(0, 0, 255)); break;
case 7:setfillcolor(RGB(160, 32, 240)); break;
}
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;
case 22://敌⼈C的中⼼点
setlinecolor(BLACK);
setlinestyle(NULL, 2);
switch (enemyC.life) {
case 0:setfillcolor(RGB(255, 255, 255)); break;
case 1:setfillcolor(RGB(255, 0, 0)); break;
case 2:setfillcolor(RGB(255, 165, 0)); break;
case 3:setfillcolor(RGB(255, 255, 0)); break;
case 4:setfillcolor(RGB(0, 255, 0)); break;
case 5:setfillcolor(RGB(0, 255, 255)); break;
case 6:setfillcolor(RGB(0, 0, 255)); break;
case 7:setfillcolor(RGB(160, 32, 240)); break;
}
switch (enemyB.life) {
case 0:setfillcolor(RGB(255, 255, 255)); break;
case 1:setfillcolor(RGB(255, 0, 0)); break;
case 2:setfillcolor(RGB(255, 165, 0)); break;
case 3:setfillcolor(RGB(255, 255, 0)); break;
case 4:setfillcolor(RGB(0, 255, 0)); break;
case 5:setfillcolor(RGB(0, 255, 255)); break;
case 6:setfillcolor(RGB(0, 0, 255)); break;
case 7:setfillcolor(RGB(160, 32, 240)); break;
}
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;
case 20://敌⼈A的中⼼点
setlinecolor(BLACK);
setlinestyle(NULL, 2);
switch (enemyA.life) {
case 0:setfillcolor(RGB(255, 255, 255)); break;//⿊
case 1:setfillcolor(RGB(255, 0, 0)); break;//红
case 2:setfillcolor(RGB(255, 165, 0)); break;//橙
case 3:setfillcolor(RGB(255, 255, 0)); break;//黄
case 4:setfillcolor(RGB(0, 255, 0)); break;//绿
case 5:setfillcolor(RGB(0, 255, 255)); break;//青
case 6:setfillcolor(RGB(0, 0, 255)); break;//蓝
case 7:setfillcolor(RGB(160, 32, 240)); break;//紫
}
fillrectangle(x * 10, y * 10 + 10, x * 10 + 10, y * 10);
break;
case 5://玩家向上的⼦弹
case 6://玩家向右的⼦弹
case 7://玩家向下的⼦弹
case 8://玩家向左的⼦弹
setlinecolor(BLACK);
setlinestyle(NULL, 1);
circle(x * 10 + 5, y * 10 + 5, 3);//空⼼圆玩家的⼦弹
break;
case 11://敌⼈向上的⼦弹
case 12://敌⼈向右的⼦弹
case 13://敌⼈向下的⼦弹
case 14://敌⼈向左的⼦弹
setlinecolor(BLACK);
setlinestyle(NULL, 1);
setfillcolor(BLACK);
fillcircle(x * 10 + 5, y * 10 + 5, 3);//⿊⾊实⼼圆敌⼈的⼦弹 break;
case 25://装道具的盒⼦
switch (propbox) {
case 1:
setlinecolor(BLACK);
setlinestyle(NULL, 2);
setfillcolor(RED);
fillcircle(x * 10 + 5, y * 10 + 5, 5);
break;
case 2:
setlinecolor(BLACK);
setlinestyle(NULL, 2);
setfillcolor(RGB(242, 196, 90));
fillcircle(x * 10 + 5, y * 10 + 5, 5);
break;
case 3:
setlinecolor(BLACK);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论