基于C语言和EasyX图形库的简单飞行射击小游戏

基本游戏逻辑介绍

  本次编写的游戏是一个空战小游戏,实现了一些简单的游戏功能。如主菜单和子菜单游戏界面均通过鼠标点击进行操作,通过按键来控制游戏角色的移动以及技能的释放。
下面简单的介绍一下游戏的大概流程和思路。 首先,对于游戏中的个体,存在着很多的信息,所以我们定义不同的结构体来存储这些个体的各种信息,如是否存活、子弹等级、敌机的种类、PH值等。关于easyx图形库就不做过多的介绍,大家可以自行去了解
游戏先进入主菜单,通过循环来实现获取鼠标信息,在通过判定鼠标是否点击以及点击的位置,达到选择不同功能的效果。选择开始游戏后跳出主菜单循环,进入游戏循环,通过定义不同的功能函数来实现角色的移动、图片的刷新、以及一部分简单的动态效果。通过GetKeyState()函数来判断用户是否按下移动键。进行移动,改变图片坐标位置。再产生敌机和敌机子弹,敌机和子弹的移动(通过改变坐标实现移动),判定是否被子弹击中或者与敌机碰撞。最后调用画地图的函数,将所有的图片画出。游戏死亡之后、暂停、退出等的功能与主菜单同理,通过鼠标控制(使用goto语句实现返回主菜单、重新开始游戏)。游戏还有能保存游戏分数的最好历史记录,涉及一些简单的文件操作。

在编写过程中遇见的一些坑

  • 在图片的打印中会有闪烁的问题,这里使用双缓冲解决BeginBatchDraw();FlushBatchDraw();
  • 在实现暂停功能时,会有暂停的图片呈现,建议将图片设置成窗口大小,当你暂停时的图片比地图更小时,会有鼠标操作不灵敏的问题(若能解决建议还是比地图小一些),即需要点击多次才可能触发你的判断。
  • 敌机和子弹需要使用透明贴图,所以需要掩码图和原图来实现透明贴图。如
putimage(minePlan.x, minePlan.y, &minebit[0], NOTSRCERASE);
putimage(minePlan.x, minePlan.y, &mine[0], SRCINVERT);

参考链接:如何制作掩码图

  • 多种音效同时播放需要使用简单的多线程,否则会导致游戏卡顿。如背景音效和爆炸音效同时播放。请读者自行查阅资料。
  • 动态爆炸的实现,当使用多线程实现时,有爆炸闪烁的效果(这个问题还未解决),可以在打印图片的函数中实现。原理:每次图刷新都会打印爆炸的图片(地图刷新的速度很快),通过控制打印不同的图片实现爆炸效果(需要控制图片更新的时间),类似于通过快速翻动画在纸上的图片达到动态的效果,具体操作,参考代码。

头文件代码

头文件定义代码,函数的声明较少是因为在主文件中用到的函数较少,大多数函数的调用在AirGame.cpp中

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//文件操作的头文件sprintf()函数
#include<stdlib.h>
#include<conio.h>#include<windows.h> //GetKeyState()函数需要
#include<mmsystem.h>//playSound()函数需要.包含多媒体设备接口库
#include<math.h>//rand()随机函数需要#pragma 
comment(lib,"Winmm.lib")//导入Winmm.lib库,让歌曲可以播放
#include<graphics.h>//easyx图形库的头文件
#include<process.h>#define NUM 20 //敌机数组数量
#define WIDTH 600	//地图宽600  
#define HEIGHT 700	//高700		
#define N  15//子弹数量
#define BOSSBUL 100//boss子弹量
#undef UNICODE //解决loadimage()的加载出问题的问题  
//定义我方飞机和敌方飞机坐标血量,子弹等...
typedef struct role//我方飞机
{	
int x;	//确定在图中的坐标	
int y;	
int type;	//我方飞机子弹等级	
int kind;	//我方飞机种类	
int live;	//飞机是否存活	
int score; //存储分数
}Role;
typedef struct enemy  //敌机
{	
int x;	//确定在图中的坐标	
int y;	
int type;	//敌机飞机种类.	
int live;	//飞机是否存活	
int HP;		//血量
char shot;	//表示飞机是否发射过子弹
}Enemy; 
typedef struct _bullte //子弹
{	int x;	//确定在图中的坐标	
int y;	
int live;	//子弹是否存活	
char shot;	//导弹是否发射
}Bullte; 
typedef struct ico	//图标
{	
int x;	//确定在图中的坐标	
int y;	
int live;	//飞机、子弹是否存活	
}Ico;
char PlayKeyboard(char c);
void texiao();
void image(IMAGE *map1, Role *minePlan);//图片加载//飞机移动
int keyDown(IMAGE* map1, int speed);//画出飞机移动后的地图
void drowGame();
void planMove(char c,IMAGE *mine);char GameOver();//游戏结束后 void DataConserve();//保存数据并退出 void  OutScore(int number);//输出数字图片 int timeout();//暂停函数 int  Datadir();//记录查看

Main.cpp代码

#include"airHead.h"
//定义图片变量
IMAGE map1, mine[2],map[7],tubiao[10], shuzi[3], shuziyama[3];
Role minePlan;//定义我方飞机
DWORD t1, t2,t3,t4,t5,t6,t7,t8;//什么变量
IMAGE enemy2[5], enemy2yanma[5];
int img_x, img_y;
//IMAGE tu[2];
int Num[7], count = 0;
int MainMenu()
{MOUSEMSG m, m2, m3, m4;//定义鼠标变量while (1)//主菜单操作{putimage(0, 0, &map[0]);FlushBatchDraw();m = GetMouseMsg();if (m.uMsg == WM_LBUTTONDOWN)//当鼠标左键按下{if (m.x > 230 && m.x < 371 && m.y>46 && m.y < 83)//选择角色{putimage(0, 0, &map[5]);//角色选择界面FlushBatchDraw();while (1){m3 = GetMouseMsg();if (m3.uMsg == WM_LBUTTONDOWN)//当鼠标左键按下{if (m3.x < 147 && m3.x>57 && m3.y > 210 && m3.y < 291)//1号机{minePlan.kind = 1;break;}if (m3.x < 537 && m3.x>449 && m3.y > 210 && m3.y < 291)//2号机{minePlan.kind = 2;break;}}}}if (m.x > 230 && m.x < 371 && m.y>154 && m.y < 193)//开始游戏{break;}if (m.x > 230 && m.x < 371 && m.y>270 && m.y < 306)//退出游戏{DataConserve();return 0;}if (m.x > 230 && m.x < 371 && m.y>381 && m.y < 421)//游戏记录{putimage(0, 0, &map[6]);//显示历史最高纪录putimage(0, 0, &tubiao[0], NOTSRCERASE);putimage(0, 0, &tubiao[1], SRCINVERT);int score = Datadir();//输出位置img_x = 196;img_y = 275;count = 0;//数组下标归零if (score == -1)OutScore(0);elseOutScore(score);FlushBatchDraw();while (1){m4 = GetMouseMsg();if (m4.uMsg == WM_LBUTTONDOWN)//当鼠标左键按下{if (m4.x < 50 && m4.x>0 && m4.y > 0 && m4.y < 50){break;}}}}if (m.x > 230 && m.x < 371 && m.y>484 && m.y < 3524)//游戏帮助{putimage(0, 0, &map[1]);//显示游戏操作说明putimage(0, 0, &tubiao[0], NOTSRCERASE);putimage(0, 0, &tubiao[1], SRCINVERT);FlushBatchDraw();while (1){m2 = GetMouseMsg();if (m2.uMsg == WM_LBUTTONDOWN)//当鼠标左键按下{if (m2.x < 50 && m2.x>0 && m2.y > 0 && m2.y < 50){break;}}}}}}
}
int main()
{minePlan.kind = 1;//默认为1号机D://返回主菜单t1 = t2 = t3 = t4 = t5 = t6 = t7 = t8 = GetTickCount();//获取系统开机到当前所经过的毫秒数//图形化窗口initgraph(WIDTH, HEIGHT);//地图image(&map1, &minePlan);mciSendString("open startMusic.mp3 alias start", NULL, 0, NULL);//alias 起别为 mymusic;mciSendString("play start repeat", NULL, 0, NULL);putimage(0, 0, &map[0]);FlushBatchDraw();//主菜单if (MainMenu() == 0)//在主菜单中选择退出游戏时,结束游戏return 0;R://游戏重新开始image(&map1, &minePlan);mciSendString("close start ", NULL, 0, NULL);mciSendString("close time ", NULL, 0, NULL);mciSendString("open 倒计时.wav alias time", NULL, 0, NULL);//倒计时音乐mciSendString("play time ", NULL, 0, NULL);int jishu=3;while (jishu>0)//游戏开始倒计时{putimage(0, 0, &map1);putimage(300, 350, 17, 22, &shuziyama[0], jishu * 17, 0, NOTSRCERASE);putimage(300, 350, 17, 22, &shuzi[0], jishu * 17, 0, SRCINVERT);FlushBatchDraw();Sleep(1000);jishu--;}putimage(280, 350, &tubiao[5], NOTSRCERASE);putimage(280, 350,&tubiao[4], SRCINVERT);FlushBatchDraw();Sleep(1000);mciSendString("close start ", NULL, 0, NULL);mciSendString("open ll.mp3 alias mymusic", NULL, 0, NULL);//alias 起别为 mymusic;mciSendString("play mymusic repeat", NULL, 0, NULL);while (1){BeginBatchDraw();//开启双缓冲绘图,在内存中画好,再显示出来int b = keyDown(&map1, 10);drowGame();	//更新当前的地图,飞机,子弹,重复执行子弹移动的函数,实现子弹的移动if (b == 1)//退出游戏{mciSendString("stop mymusic", NULL, 0, NULL);//关掉背景音乐PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//关掉子弹音效break;}else if (b == 2)//暂停{if (timeout() == 1)//返回1,代表返回主菜单{mciSendString("stop mymusic", NULL, 0, NULL);//关掉背景音乐goto D;}}else if (b == 3)//我方死亡,boss死亡{mciSendString("stop mymusic", NULL, 0, NULL);//关掉背景音乐PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//关掉子弹音效break;}FlushBatchDraw();Sleep(20);//延时函数}//判断游戏结束后的选择DataConserve();//每次退出游戏界面后保存数据char how;how = GameOver();//游戏结束结束界面的选择if (how == 'D')goto D;else if (how == 'R')goto R;return 0;
}

AirGame.cpp

#define _CRT_SECURE_NO_WARNINGS
#include"airHead.h"
#pragma comment(lib,"Winmm.lib")//导入Winmm.lib库,让歌曲可以播放//图片加载函数
extern int s = 0;//boss选择
extern IMAGE map1, mine[2], map[7] ,tubiao[10], shuzi[3], shuziyama[3];//声明外部变量
extern Role minePlan ;				//定义我方飞机
Ico ico[5], danger;					//danger危险图标,ico图标
Enemy enemyPlan[NUM], boss[2];		//定义敌方飞机
Bullte  bullet[N], enemyBult[N], BossBul[BOSSBUL], developBul[15], shell ;	//定义我方和地方子弹、炮弹
extern DWORD t1, t2,t3,t4, t5, t6,t7,t8;
IMAGE enemybul,blood[2],jineng[15],jinengyanma[15],img_developBul[15], boom2[2], boom2yanma[2],cue[2],bomb[2],hudun,relive, war[15], waryanma[15], enemy[10]; //relive提示复活的图片
IMAGE  boom[11], boomyanma[11], zidan, minebit[2];//爆炸、子弹、飞机掩码
extern IMAGE enemy2[5], enemy2yanma[5];//旋转的敌机
int m = 160, BloodWidth = -10, time[7] , show = 1;//dazao = 0,
int x = 0,jj=0,enemy_x=-1,enemy_y=-1,speedx=2,speedy=2;//enemy_x确定敌机爆炸的位置,speedx确定升级图标的移动速度
int score = 10;//击杀一定数量的敌机,boss出现,
extern int Num[7],count, img_x, img_y;
int fen = score / 2,num_death_enemy;
int ene_2 = 0,my_2;//my_2飞机图片选择,ene_2旋转敌机图片选择
int px[2] ,condition=0;//condition判断无敌状态,px用于地图移动
void image(IMAGE* map1, Role* minePlan)
{loadimage(&map[0], "feng.jpg", WIDTH, HEIGHT);//封面图片loadimage(&mine[0], "mp.JPG", 50, 50);//自身飞机loadimage(&minebit[0], "mpbit.jpg", 50, 50);loadimage(&minebit[1], "minePlan22.png");//二号飞机loadimage(&mine[1], "minePlan2.png");loadimage(map1, "map1.jpg", 600, 700);//地图1loadimage(&map[1], "map22.jpg", 600, 700);loadimage(&map[2], "gameEnd.jpg", 600, 700);loadimage(&map[3], "map3.jpg", 600, 1140);loadimage(&map[4], "map3.jpg", 600, 1140);loadimage(&map[5], "型号.png");loadimage(&map[6], "jilu.jpg");loadimage(&zidan, "zidan1.png",40,50);//子弹loadimage(&enemybul, "enemyBul.png", 20, 50);//敌军子弹loadimage(&enemy[0], "enemy1.jpg", 60, 60);//敌机掩码图loadimage(&enemy[1], "enemy1_1.jpg", 60, 60);loadimage(&enemy[2], "diji2.png", 70, 50);loadimage(&enemy[3], "diji22.png", 70, 50);//敌机掩码loadimage(&enemy[4], "diji1.png", 200, 150);//bossloadimage(&enemy[5], "diji11.png", 200, 150);//boss掩码loadimage(&enemy[6], "diji4.png", 60, 60);//炸弹loadimage(&bomb[0], "enemy\\paodan1.png");loadimage(&bomb[1], "enemy\\paodan11.png");loadimage(&img_developBul[0], "updata11.png", 20, 60);//升级子弹掩码loadimage(&img_developBul[1], "updata.png", 20, 60);//暂停提示图片loadimage(&cue[0], "zanting.png",600,700);//获取图标loadimage(&tubiao[0], "fanhui11.png", 50, 50);//掩码图,返回图标loadimage(&tubiao[1], "fanhui.png", 50, 50);loadimage(&tubiao[2], "12531.png", 50, 30);//掩码,升级图标loadimage(&tubiao[3], "1253.png", 50, 30);loadimage(&relive, "tishi.png");loadimage(&tubiao[6], "enemy\\weixian11.png", 50, 50);//危险图标掩码loadimage(&tubiao[7], "enemy\\weixian1.png", 50, 50);//护盾loadimage(&hudun, "didang.png", 90, 90);//技能效果for (int i = 0; i < 6; i++)//这种方式可以获取多张图片,减少代码量{char str[50] = "";sprintf_s(str, "texiao\\dian%d.jpg", i + 1);loadimage(&war[i], str, 60, 700);sprintf_s(str, "texiao\\dian1%d.jpg", i + 1);loadimage(&waryanma[i], str, 60, 700);}//敌人2loadimage(&enemy2yanma[0], "enemy\\speed_enemy11.png");loadimage(&enemy2[0], "enemy\\speed_enemy.png");loadimage(&blood[0], "blood1.png", 300, 20);//boss血量loadimage(&blood[1], "blood2.png", 300, 20);//获取数字loadimage(&shuzi[0], "shuzi.png");loadimage(&shuziyama[0], "shuzi11.png");loadimage(&tubiao[4], "kaishi.png", 70, 30);loadimage(&tubiao[5], "kaishi11.png", 70, 30);//爆炸图片for (int i = 0; i < 11; i++){char str[50] = "";sprintf_s(str, "texiao\\bbb%d.png", i + 1);loadimage(&boom[i], str, 100, 100);sprintf_s(str, "texiao\\bbby%d.png", i + 1);loadimage(&boomyanma[i], str, 100, 100);}//爆炸2loadimage(&boom2[0], "texiao\\爆炸11.png", 600, 600);//boss爆炸loadimage(&boom2yanma[0], "texiao\\爆炸111.png", 600, 600);loadimage(&boom2[1], "texiao\\爆炸11.png");//我方飞机爆炸loadimage(&boom2yanma[1], "texiao\\爆炸111.png");loadimage(&jineng[0], "jineng.png", 40, 30);//技能loadimage(&jineng[1], "hudun.png", 70, 70);BloodWidth = -10;//初始图标不存在ico[0].live = 0;//初始化自身位置minePlan->x = WIDTH/2;minePlan->y = 500;minePlan->live = 1;minePlan->type = 1;//子弹种类minePlan->score = 0;//初始化一部分数据time[0]=-1;time[1] = 0;time[2] = 0;time[3] = 0;show = 1;//初始化升级图标出现的时候num_death_enemy = 0;//击杀敌方飞机数量fen = score / 2;m = 160;//boss移动count = 0;//初始化存数字的数组下标condition = 0;//初始护盾不存在//初始化炮弹数据shell.live = 0;//初始炮弹不存在shell.shot = 0;shell.y = 0;//初始化子弹数据for (int i = 0; i < N; i++){	developBul[i].live = 0;//表示没有子弹bullet[i].live = 0;//表示没有子弹}//初始化敌军子弹for (int i = 0; i < N; i++){enemyBult[i].live = 2;//给所有子弹上塘,所有敌军共用一个子弹库enemyBult[i].y = -50;enemyBult[i].x = 0;}//多个敌军是,可以单独写个函数,传递参数i,根据概率产生敌军的种类,默认越厉害,概率越低for (int i = 0; i < NUM; i++){enemyPlan[i].live = 0;//所有不存活enemyPlan[i].HP = 1;enemyPlan[i].shot = 'N';//表示敌机未曾发射过子弹;}//初始化boss数据;boss[s].HP = 100;boss[s].type = 3;boss[s].live = 1;boss[s].x =50;boss[s].y = 0;//初始boss子弹库for (int i = 0; i < BOSSBUL; i++)BossBul[i].live = 1;//表示有子弹,2表示子弹已发射
}
//创建线程执行的代码函数       // CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BOOM, NULL, NULL, 0);//调用线程
DWORD WINAPI BOOM(LPVOID arg)//爆炸音效线程 //DWORD是无符号整,相当于C中的数据类型//一个返回DWORD 的API函数//
{mciSendString("close boom", 0, 0, 0);mciSendString("open Bomb.wav alias boom", 0, 0, 0);mciSendString("play boom", 0, 0, 0);return 0;
}
DWORD WINAPI tttt(LPVOID arg)//大招音效释放线程
{mciSendString("open dazao123.mp3 alias jineng", 0, 0, 0);mciSendString("play jineng ", 0, 0, 0);return 0;
}
//多线程爆炸动画,有闪烁的问题,暂未使用
DWORD WINAPI planBoom(LPVOID arg)//爆炸效果线程
{while (x<11){putimage(enemy_x, enemy_y, &boomyanma[x], NOTSRCERASE);putimage(enemy_x, enemy_y, &boom[x], SRCINVERT);FlushBatchDraw();Sleep(200);x++;if (x == 11){x = 7;break;}}return 0;
}
//图标升级
void up()
{ico[0].x = enemy_x;//图标的位置等于爆炸的飞机的坐标ico[0].y = enemy_y;ico[0].live = 1;
}
int  Datadir()
{FILE* fp;if ((fp = fopen("GameData\\data.text", "r")) == NULL){return -1;}char str[10];fgets(str,9, fp);//获取历史记录int num_str;num_str = atoi(str);//将字符串转为整型fclose(fp);return num_str;
}
void showEnemy2(int enemyPlan_x,int enemyPlan_y)//打印旋转敌机
{switch (ene_2){case 0:putimage(enemyPlan_x, enemyPlan_y, 47, 58, &enemy2yanma[0], 2, 0, NOTSRCERASE);putimage(enemyPlan_x, enemyPlan_y, 47, 58, &enemy2[0], 2, 0, SRCINVERT);break;case 1:putimage(enemyPlan_x, enemyPlan_y, 38, 58, &enemy2yanma[0], 49, 0, NOTSRCERASE);putimage(enemyPlan_x, enemyPlan_y, 38, 58, &enemy2[0], 49, 0, SRCINVERT);break;case 2:putimage(enemyPlan_x, enemyPlan_y, 20, 58, &enemy2yanma[0], 88, 0, NOTSRCERASE);putimage(enemyPlan_x, enemyPlan_y, 20, 58, &enemy2[0], 88, 0, SRCINVERT);break;case 3:putimage(enemyPlan_x, enemyPlan_y, 20, 58, &enemy2yanma[0], 108, 0, NOTSRCERASE);putimage(enemyPlan_x, enemyPlan_y, 20, 58, &enemy2[0], 108, 0, SRCINVERT);break;case 4:putimage(enemyPlan_x, enemyPlan_y, 40, 58, &enemy2yanma[0], 128, 0, NOTSRCERASE);putimage(enemyPlan_x, enemyPlan_y, 40, 58, &enemy2[0], 128, 0, SRCINVERT);break;}
}
void showMyPlan(int my_x, int my_y)//自身飞机二号
{switch (my_2){case 0:putimage(my_x, my_y, 53, 87, &minebit[1], 0, 0, NOTSRCERASE);putimage(my_x, my_y, 53, 87, &mine[1], 0, 0, SRCINVERT);break;case 1:putimage(my_x, my_y, 65, 87, &minebit[1], 53 ,0, NOTSRCERASE);putimage(my_x, my_y, 65, 87, &mine[1], 53, 0, SRCINVERT);break;case 2:putimage(my_x, my_y, 78, 87, &minebit[1], 118, 0, NOTSRCERASE);putimage(my_x, my_y, 78, 87, &mine[1], 118, 0, SRCINVERT);break;case 3:putimage(my_x, my_y, 67, 87, &minebit[1], 196, 0, NOTSRCERASE);putimage(my_x, my_y, 67, 87, &mine[1], 196, 0, SRCINVERT);break;case 4:putimage(my_x, my_y, 55, 87, &minebit[1], 263, 0, NOTSRCERASE);putimage(my_x, my_y, 55, 87, &mine[1], 263, 0, SRCINVERT);break;}
}
//创建子弹,给子弹补给
void createbullet()
{	//循环给子弹赋值,及充满子弹if (time[0] >= 5000 || time[0] == -1)//当技能释放完打印子弹,或者未释放技能时{for (int i = 0; i < N; i++){if (bullet[i].live == 0){bullet[i].live = 1;//表示有子弹,未发射;每调用一次只会产生一个子弹//获取当前飞机的位置,把值赋值给子弹if (minePlan.kind == 1)//飞机1bullet[i].x = minePlan.x + 6;else                    //飞机2bullet[i].x = minePlan.x + 20;bullet[i].y = minePlan.y;break;//一次只发射一颗子弹;所以break结束循环}}if (minePlan.type == 2){if (time[3] == 40){for (int i = 0; i < N; i += 2)//创建副武器子弹{if (developBul[i].live == 0 && i + 2 <= 15)//子弹不存在,{developBul[i].live = 1;developBul[i + 1].live = 1;developBul[i].x = minePlan.x - 20;developBul[i].y = minePlan.y;if (minePlan.kind == 2)developBul[i + 1].x = minePlan.x + 70;elsedevelopBul[i + 1].x = minePlan.x + 50;developBul[i + 1].y = minePlan.y;break;}}}time[3] += 20;if(time[3] > 40){time[3] = 0;}}}//实时获取存在的敌军的位置,将位置赋值给敌军子弹//先创建子弹,及敌军还未产生,所有子弹均为1;而当产生第一架敌机,所有的for (int i = 0; i < NUM; i++){if (enemyPlan[i].live == 1&&enemyPlan[i].shot=='N'){for (int j = 0; j < N; j++){if (enemyBult[j].live == 2)//若果子弹库还有子弹。给改存活的敌军发射一颗子弹,每架飞机只发射一个{enemyBult[j].x = enemyPlan[i].x + 15;enemyBult[j].y = enemyPlan[i].y + 45;enemyBult[j].live = 1;enemyPlan[i].shot = 'Y';break;}}}}//补充敌军子弹库for (int i = 0; i < N; i++){if (enemyBult[i].y > HEIGHT){enemyBult[i].live = 2;}}//产生boss子弹if (num_death_enemy>= score)//当大于100时进行子弹的填充{for (int i = 0; i < BOSSBUL; i = i + 4){if (BossBul[i].live == 1){BossBul[i].live = 2;BossBul[i + 1].live = 2;BossBul[i + 2].live = 2;BossBul[i + 3].live = 2;BossBul[i].y = boss[s].y + 100;//当前boss[s].y=50,所以加上100才是飞机的顶端BossBul[i + 1].y = boss[s].y + 100;//将最新的飞机坐标给子弹BossBul[i + 2].y = boss[s].y + 100;BossBul[i + 3].y = boss[s].y + 100;BossBul[i].x = boss[s].x+60;BossBul[i + 1].x = boss[s].x+80;BossBul[i + 2].x = boss[s].x+100;BossBul[i + 3].x = boss[s].x+120;break;}}}//创建炮弹if (rand() % 10 < 1&&shell.live==0&&num_death_enemy>=10){shell.live = 1;shell.shot = 0;shell.y = -150;//防止在出现危险警告时,导弹在屏幕上未显示,但存在,使飞机碰到死亡}
}
//产生敌机
void createEnemy()
{if (num_death_enemy >= score)//boss出现{for (int i = 0; i < NUM; i++)//将所有敌军变为0;{if (enemyPlan[i].live == 1){enemyPlan[i].live = 0;}}}else {for (int i = 0; i < NUM; i++){	//第一个敌机一定能产生出来if (enemyPlan[0].live == 0){enemyPlan[0].live = 1;//将敌机创造出来enemyPlan[0].x = rand() % (WIDTH - 70);//x位置随机在0-530、width=600enemyPlan[0].y = 0;enemyPlan[0].HP = 1;enemyPlan[0].type = 1;break;}//当第一个敌机存在时,开始判断下一个敌机												else if (enemyPlan[i + 1].live == 0 && (i + 1) < NUM && (rand() % 10 < 7))//(i+1)<NUM不让行索超过最大值,当下一个没有产生敌军时,就结束循环												{if (rand() % 10 < 4)//创造成功的概率只创建一个敌机,种类一{enemyPlan[i + 1].live = 1;//将敌机创造出来enemyPlan[i + 1].x = rand() % (WIDTH - 70);enemyPlan[i + 1].y = 0;enemyPlan[i + 1].HP = 1;enemyPlan[i + 1].type = 1;break;}else if (rand() % 10 < 2)//敌机种类二{enemyPlan[i + 1].live = 1;//将敌机创造出来enemyPlan[i + 1].x = rand() % (WIDTH - 70);//x坐标enemyPlan[i + 1].y = 0;enemyPlan[i + 1].HP = 5;enemyPlan[i + 1].type = 2;break;}else if (rand() % 10 < 5)//第三种敌机{enemyPlan[i + 1].live = 1;//将敌机创造出来enemyPlan[i + 1].x = rand() % (WIDTH - 70);//x坐标enemyPlan[i + 1].y = 0;enemyPlan[i + 1].HP = 3;enemyPlan[i + 1].type = 3;break;}break;}}}
}
void enemyMove(int speed) 
{//boss的移动if(num_death_enemy >= score){	//进行自由的左右来回移动。先想右移动一段距离,再向左移动同样的距离实现,来回移动if (boss[s].y < 50){boss[s].y += 2;}if (m>0&&m<=160)//m代表移动的次数,向左移动{boss[s].x += 2;m--;}if(m<=0)//向右移动。{boss[s].x -= 2;m--;if (m == -160)//当移动了与左移动相同的距离,再变回右移动的条件m = 160;}}else{for (int i = 0; i < NUM; i++){if (enemyPlan[i].live == 1)//遍历数组,寻找存活的敌军{if (enemyPlan[i].type == 1) //判断类型,改变不同的速度{enemyPlan[i].y += speed;	//只需要垂直移动}else if (enemyPlan[i].type == 2){enemyPlan[i].y += speed + 2;}else if (enemyPlan[i].type == 3){enemyPlan[i].y += speed + 1;}if (enemyPlan[i].y > HEIGHT)//当敌机超过地图时,将live变为0,在创造时,就可以继续使用{enemyPlan[i].live = 0;enemyPlan[i].shot = 'N';//是否发射子弹}}}}
}
//子弹发射原理,定义数组,给数组的第一个开始赋予子弹,每按一次,给一颗。通过判定数组是否有子弹进行移动,每个子弹的位置都不一样void bulletMove(int speed)//speed为子弹的移动速度  
{for (int i = 0; i < N; i++)//我方子弹移动{if (bullet[i].live == 1)//子弹存在  一次只有一个子弹有,只移动一次{bullet[i].y -= speed;//子弹坐标的移动if (bullet[i].y <= 0)//当子弹超出范围时又将其值设置为0,补充我军子弹{bullet[i].live = 0;}}if (developBul[i].live == 1)//副武器{developBul[i].y -= 8;if (developBul[i].y <= 0)//超出屏幕回收{developBul[i].live = 0;}}}if (num_death_enemy < score)//boss未出现{//敌军子弹的移动,每次移动10个像素for (int i = 0; i < N; i++){if (enemyBult[i].live == 1){enemyBult[i].y += 10;}}}//boss子弹的移动for (int i = 0; i < BOSSBUL; i++){if (BossBul[i].live == 2){BossBul[i].y += 7;}if (BossBul[i].y > HEIGHT)//超过屏幕将子弹回收{BossBul[i].live = 1;}}//当飞机吃到图标时if (ico[0].live == 1){if ((minePlan.kind == 1 && ico[0].x - minePlan.x > -20 && ico[0].x - minePlan.x < 40 && ico[0].y - minePlan.y<25 && ico[0].y - minePlan.y>-40)|| (minePlan.kind == 2 && ico[0].y > minePlan.y + 20 && ico[0].y < minePlan.y + 50 && ico[0].x<minePlan.x + 60 && ico[0].x > minePlan.x)){//当飞机1号吃到图标,图标消失,飞机子弹增加副武器ico[0].live = 0;minePlan.type = 2;}}//图标的移动if (ico[0].live == 1){ico[0].x += speedx;//移动慢一点ico[0].y += speedy;//移动慢一点if (ico[0].x <= 0 || ico[0].x >= 570)speedx = -speedx;if (ico[0].y >= 670 || ico[0].y <= 0)speedy = -speedy;}//炮弹移动if (shell.live == 1&&shell.shot==1)//存在且发射出去才移动{shell.y +=15;if (shell.y > 700){shell.live = 0;shell.shot = 0;shell.y = -150;}}
}
int minePlayDeath()
{mciSendString("pause mymusic", NULL, 0, NULL);//暂停背景音乐PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BOOM, NULL, NULL, 0);//播放爆炸mciSendString("close death ", NULL, 0, NULL);//死亡音效mciSendString("open 死亡.mp3 alias death", NULL, 0, NULL);mciSendString("play death ", NULL, 0, NULL);minePlan.live = 0;//飞机死亡for (int i = 0;i<4; i++)//通过二维数组来实现爆炸效果{for (int j = 0;j<4; j++){drowGame();putimage(minePlan.x, minePlan.y, 64, 64, &boom2yanma[1], j * 64, i * 64,NOTSRCERASE);putimage(minePlan.x, minePlan.y, 64, 64, &boom2[1], j * 64, i * 64, SRCINVERT);FlushBatchDraw();Sleep(100);}}putimage(126,312,&relive, SRCPAINT);FlushBatchDraw();system("pause");while (1)//选择死亡后是否复活{if (_getch() == 'x')//按下键复活{mciSendString("resume mymusic", NULL, 0, NULL);minePlan.x = WIDTH / 2;minePlan.y = 500;minePlan.live = 1;condition = 1;return 1;}else{minePlan.live = 0;return 0;}}//return 0;
}
int bossDeath()
{boss[s].live = 0;for (int i = 0; i < BOSSBUL; i++){BossBul[i].live = 0;}PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//关闭子弹音效CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BOOM, NULL, NULL,0);//播放爆炸mciSendString("close victory ", NULL, 0, NULL);				//胜利音效mciSendString("open 胜利.mp3 alias victory", NULL, 0, NULL);mciSendString("play victory ", NULL, 0, NULL);for (int i = 0; i < 4; i++)//通过二维数组来实现爆炸效果{for (int j = 0; j < 4; j++){drowGame();//刷新地图中的其他图片putimage(boss[s].x, boss[s].y, 150, 150, &boom2yanma[0], j * 150, i * 150, NOTSRCERASE);putimage(boss[s].x, boss[s].y, 150, 150, &boom2[0], j * 150, i * 150, SRCINVERT);FlushBatchDraw();Sleep(150);}}return 0;
}
void Score(int i)
{CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)BOOM, NULL, NULL, 0);//敌机爆炸音效线程enemy_x = enemyPlan[i].x;//记录敌机爆炸的位置,给敌机爆炸效果定位enemy_y = enemyPlan[i].y;enemyPlan[i].shot = 'N';enemyPlan[i].live = 0;//敌人死亡num_death_enemy++;//统计死亡敌机数if (enemyPlan[i].type == 1)//判断敌机类型增加分数minePlan.score += 10;else if (enemyPlan[i].type == 2)minePlan.score += 30;else if (enemyPlan[i].type == 3)minePlan.score += 20;
}
int deadth()//判断死亡
{if (num_death_enemy >= score)//boss出现{//打中boss的判断for (int i = 0; i < N; i++){if (bullet[i].live == 1)//表示已发射的子弹{if (bullet[i].x - boss[s].x > 0 && bullet[i].x - boss[s].x < 170 && bullet[i].y - boss[s].y < 130 && bullet[i].y - boss[s].y>5){bullet[i].live = 0;boss[s].HP -= 1;BloodWidth -= 3;//boss血量条图片的宽度减少if (boss[s].HP <= 0)//boss血量为小于0时{return bossDeath();}}}//副武器判断if (developBul[i].live == 1){if (developBul[i].x - boss[s].x > 50 && developBul[i].x - boss[s].x < 170 && developBul[i].y - boss[s].y < 130 && developBul[i].y - boss[s].y>5){boss[s].HP -= 2;BloodWidth -= 6;developBul[i].live = 0;if (boss[s].HP <= 0)//boss血量为0时return bossDeath();}}}//boss子弹击中我方if (condition != 1)//为1飞机处于无敌状态{for (int i = 0; i < BOSSBUL; i++){if (BossBul[i].live == 2)//已发射的子弹{if ((minePlan.kind == 1 && BossBul[i].x - minePlan.x > -5 && BossBul[i].x - minePlan.x < 45 && BossBul[i].y - minePlan.y>5 && BossBul[i].y - minePlan.y < 50)|| (minePlan.kind == 2 && BossBul[i].x - minePlan.x > -5 && BossBul[i].x - minePlan.x < 65 && BossBul[i].y - minePlan.y>15 && BossBul[i].y - minePlan.y < 70))//被boss子弹击中{return minePlayDeath();}}}}//我方与boss碰撞if ((minePlan.kind == 1 && boss[s].x < minePlan.x -20 && boss[s].x+200 > minePlan.x-50 && boss[s].y +100> minePlan.y && boss[s].y+20< minePlan.y)|| (minePlan.kind == 2 && boss[s].x < minePlan.x - 30 && boss[s].x + 200 > minePlan.x - 50 && boss[s].y + 100 > minePlan.y&& boss[s].y + 20 < minePlan.y))//被boss子弹击中){return minePlayDeath();}}else//boss未出现{for (int i = 0; i < NUM; i++){if (enemyPlan[i].live == 1)//寻找存活的敌机{for (int j = 0; j < N; j++)//遍历子弹,判断子弹是否命中该存活敌机{	//子弹击中敌机,子弹归0,PH=0敌机死亡;if (bullet[j].live == 1)//若果子弹已发射{if (bullet[j].x - enemyPlan[i].x > -15 && bullet[j].x - enemyPlan[i].x < 40 && bullet[j].y - enemyPlan[i].y < 45 && bullet[j].y - enemyPlan[i].y>5){enemyPlan[i].HP = enemyPlan[i].HP - 1;bullet[j].live = 0;if (enemyPlan[i].HP <= 0){	Score(i);//播放敌机爆炸音效并记录分数}}}}for (int j = 0; j < N; j++)//副武器打中敌机{if (developBul[j].live == 1)//已发射的子弹{if (developBul[j].x - enemyPlan[i].x > -5 && developBul[j].x - enemyPlan[i].x < 45 && developBul[j].y - enemyPlan[i].y>5 && developBul[j].y - enemyPlan[i].y < 45)//被boss子弹击中{enemyPlan[i].HP = enemyPlan[i].HP - 2;developBul[j].live = 0;if (enemyPlan[i].HP <= 0){	Score(i);}}}}if (condition != 1){		//当己方飞机碰到敌方飞机时死亡if ((minePlan.kind == 1 && abs(minePlan.x - enemyPlan[i].x) < 40 && abs(minePlan.y - enemyPlan[i].y) < 40)|| (minePlan.kind == 2 && enemyPlan[i].y > minePlan.y&& enemyPlan[i].y < minePlan.y + 60 && enemyPlan[i].x > minePlan.x - 20 && enemyPlan[i].x < minePlan.x + 65))//abs取整数绝对值{//outtextxy(minePlan.x, minePlan.y, "双击x复活,按z结束游戏")return minePlayDeath();}}}}//我方被敌方子弹击中死亡if (condition != 1){for (int i = 0; i < N; i++)//遍历敌方子弹判断是否存活{if (enemyBult[i].live == 1){if ((minePlan.kind == 1 && enemyBult[i].x - minePlan.x > 5 && enemyBult[i].x - minePlan.x < 30 && enemyBult[i].y - minePlan.y>5 && enemyBult[i].y < minePlan.y + 40)|| (minePlan.kind == 2 && enemyBult[i].x - minePlan.x > -5 && enemyBult[i].x - minePlan.x < 65 && enemyBult[i].y - minePlan.y>15 && enemyBult[i].y - minePlan.y < 70)){//子弹击中我方时//enemyBult[i].live = 0;//enemyBult[i].y = -50;return  minePlayDeath();}}}}}if (time[0] < 5000 && time[0] >= 0)//技能正在释放的时候{for (int i = 0; i < NUM; i++)//判断敌机是否有存活的{if (enemyPlan[i].live == 1){if (minePlan.x - enemyPlan[i].x < 40 && minePlan.x - enemyPlan[i].x > -50&&minePlan.y>enemyPlan[i].y )//技能击中敌机{enemyPlan[i].HP -= 3;//血量减三if (enemyPlan[i].HP <= 0){Score(i);}}}}if (num_death_enemy >= score){if (minePlan.x - boss[s].x < 175 && minePlan.x - boss[s].x > -75 && minePlan.y > boss[s].y)//技能击中敌机{boss[s].HP -= 1;BloodWidth -= 3;//boss血量条图片的宽度减少if (boss[s].HP <= 0)//boss血量为0时{return bossDeath();}}}}if (num_death_enemy == fen)//当敌机死亡数达到指定时 //调用产生图标的函数{up();fen -= 1;//若果不减,并且敌机死亡数不增加,则图标不会移动}//炮弹撞上飞机if (condition != 1){if ((minePlan.kind == 1 && shell.x > minePlan.x - 50 && shell.x<minePlan.x + 30 && shell.y>minePlan.y - 110 && shell.y < minePlan.y + 20)|| (minePlan.kind == 2 && shell.x > minePlan.x - 50 && shell.x<minePlan.x + 45 && shell.y > minePlan.y - 110 && shell.y < minePlan.y + 60)){return  minePlayDeath();}}return 1;
}
char GameOver()//游戏结束后
{PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//停止子弹音乐mciSendString("pause mymusic", NULL, 0, NULL);//停止背景音乐count = 0;//数组下标初始化为零putimage(0, 0, &map[2]);//打印图片img_x = 210;img_y = 275;OutScore(minePlan.score);//输出分数img_x = 210;img_y = 155;OutScore(num_death_enemy);//输出击杀数量FlushBatchDraw();MOUSEMSG end_mouse;while (1){end_mouse = GetMouseMsg();if (end_mouse.uMsg == WM_LBUTTONDOWN)//左键点下{if (end_mouse.x > 146 && end_mouse.x < 435 && end_mouse.y < 626 && end_mouse.y>550)//返回主菜单{return 'D';}if (end_mouse.x > 146 && end_mouse.x < 435 && end_mouse.y < 466 && end_mouse.y>390)//重新开始游戏{return 'R';}}}return 0;
}
int timeout()//暂停
{//putimage(140, 165, &cue[0]);putimage(0, 0, &cue[0]);FlushBatchDraw();mciSendString("pause mymusic", NULL, 0, NULL);//暂停背景音乐PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//暂停子弹音效MOUSEMSG n;//定义鼠标变量while (1){while (MouseHit()){n = GetMouseMsg();if (n.uMsg == WM_LBUTTONDOWN){if (n.x > 190 && n.x < 410 && n.y> 243 && n.y < 320)//点击继续{mciSendString("resume mymusic", NULL, 0, NULL);return 0;}else if (n.x > 190 && n.x < 410 && n.y> 400 && n.y < 481 )//点击退出,返回主菜单{return 1;}}}}
}
//保存游戏数据,保存数据并退出
void DataConserve()
{FILE* fp1;FILE* fp;//定义文件指针char str[10];int num_str;if ((fp1 = fopen("GameData\\data.text", "r")) == NULL);else{fgets(str, 9, fp1);//获取历史记录num_str = atoi(str);//将字符串转为整型}fclose(fp1);if ((fp = fopen("GameData\\data.text", "w+")) == NULL)//打开或创建文件失败时,fopen会返回NULL,成功则返回文件的首地址{exit(1);//退出程序}_itoa_s(minePlan.score>num_str?minePlan.score:num_str, str, 10);//后面的10是装换的进制数,不能跨平台,跨平台需使用sprintf_s();fputs(str, fp);//将数据保存fclose(fp);//关闭文件指针
}
void OutScore(int number)//在指定地方输出数字图片
{if (number / 10 != 0)//不是个位数{OutScore(number / 10);Num[count++] = number % 10;}else//是各位数,每次输出只会执行一次,开始为个位数或者分解到最后运行一次,{Num[count++] = number;}putimage(img_x, img_y, 17, 22, &shuziyama[0], Num[count-1] * 17, 0, NOTSRCERASE);putimage(img_x, img_y, 17, 22, &shuzi[0], Num[count - 1] * 17, 0, SRCINVERT);img_x += 17;//改变图片的x坐标
}
//画出游戏图片
void drowGame()
{putimage(0, 0, &map1);//打印出地图//putimage(0, 0, 600, 700, &map[3], 0, px[0]++);//动态地图//if (px[0] >= 440)// = 0;//putimage(0, 700 - (px[0] - 400), 600, 700, &map[3], 0, 0);if (minePlan.kind == 1&&minePlan.live==1)//判断飞机类型打印相应的图片{putimage(minePlan.x, minePlan.y, &minebit[0], NOTSRCERASE);putimage(minePlan.x, minePlan.y, &mine[0], SRCINVERT);}else if(minePlan.kind == 2 && minePlan.live == 1){if (GetKeyState(VK_LEFT) < 0 )//判断移动的方向打印图片my_2 = 3;else if (GetKeyState(VK_RIGHT) < 0 )my_2 = 1;elsemy_2 = 2;showMyPlan(minePlan.x, minePlan.y);//飞机2号}//打印子弹if (time[0] >= 5000 || time[0] == -1)//当技能释放完打印子弹,或者未释放技能时{if (time[1] >= 1500 || time[1] == 0)//{for (int i = 0; i < N; i++){if (bullet[i].live == 1){putimage(bullet[i].x, bullet[i].y, &zidan, SRCPAINT);}}}}//打印分数//char k[15];//_itoa_s(minePlan.score, k, 10);//将数字转为字符串//outtextxy(400, 50, k );//打印int类型有问题,打印字符串没问题count = 0;img_x = 456;img_y = 20;OutScore(minePlan.score);if (num_death_enemy >= score&&boss[s].live==1)//打印boss,和boss子弹{//BloodWidth = BloodWidth + 20;putimage(boss[s].x, boss[s].y, &enemy[5], NOTSRCERASE);putimage(boss[s].x, boss[s].y, &enemy[4], SRCINVERT);for (int i = 0; i < BOSSBUL; i++){if (BossBul[i].live == 2){putimage(BossBul[i].x , BossBul[i].y, &enemybul, SRCPAINT);putimage(BossBul[i].x , BossBul[i].y, &enemybul, SRCPAINT);putimage(BossBul[i].x , BossBul[i].y, &enemybul, SRCPAINT);putimage(BossBul[i].x , BossBul[i].y, &enemybul, SRCPAINT);}}putimage(-10, 20, &blood[0], SRCPAINT);putimage(BloodWidth, 20, &blood[1], SRCPAINT);}else{//打印敌机for (int i = 0; i < NUM; i++){//遍历敌机数组,判断哪些为存活就输出if (enemyPlan[i].live == 1){if (enemyPlan[i].type == 1){putimage(enemyPlan[i].x, enemyPlan[i].y, &enemy[0], NOTSRCERASE);//掩码图putimage(enemyPlan[i].x, enemyPlan[i].y, &enemy[1], SRCINVERT);}else if (enemyPlan[i].type == 2){putimage(enemyPlan[i].x, enemyPlan[i].y, &enemy[3], NOTSRCERASE);;//掩码图putimage(enemyPlan[i].x, enemyPlan[i].y, &enemy[2], SRCINVERT);}else if (enemyPlan[i].type == 3){showEnemy2(enemyPlan[i].x,enemyPlan[i].y);time[4] += 20;if (time[4] > 100){ene_2 += 1;time[4] = 0;}if (ene_2 >= 5)ene_2 = 0;}}}//打印敌机子弹int num = 0;for (int i = 0; i < N; i++){//子弹发射后,live值变为1;表示以发射if (enemyBult[i].live == 1){putimage(enemyBult[i].x, enemyBult[i].y, &enemybul, SRCPAINT);}}}//time[0]用于计算技能释放的时间,time[1]用于计算道具冷却的时间,show用于判断道具是否使用及显示//技能释放动画if (time[0] < 5000 && time[0] >= 0)//按下技能键,释放技能的时间5秒{if (t7 - t8 > 50)//多久切换一张图片{t8 = t7;//t7为当前最新的时间jj++;if (jj >=6)//当图片输完时,变成第一张循环绘制{jj = 0;}}t7 = GetTickCount();if (minePlan.kind == 1)//判断飞机的种类,计算技能释放的位置{putimage(minePlan.x - 7, minePlan.y - 700, &waryanma[0], NOTSRCERASE);putimage(minePlan.x - 7, minePlan.y - 700, &war[jj], SRCINVERT);}else{putimage(minePlan.x+8, minePlan.y - 700, &waryanma[0], NOTSRCERASE);putimage(minePlan.x+8, minePlan.y - 700, &war[jj], SRCINVERT);}FlushBatchDraw();time[0] += 20;//计算技能释放的时间;time[1] += 20;//计算技能能却的时间}else if (time[0] >= 5000 && time[0] < 15000)//技能冷却的时间10秒{time[1] += 20;//计算恢复的时间}if (time[1] > 15000)//技能冷却完成{time[1] = 0;time[0] = -1;show = 1;}if(show==1)//展示技能图标{putimage(10, 500, &jineng[0], SRCPAINT);}//武器升级1for (int i = 0; i < N; i++){if (developBul[i].live == 1)//子弹存在才发射{putimage(developBul[i].x, developBul[i].y, &img_developBul[0], NOTSRCERASE);//掩码putimage(developBul[i].x, developBul[i].y, &img_developBul[1], SRCINVERT);}}//敌机爆炸效果动画if (enemy_x >= 0){putimage(enemy_x, enemy_y, &boomyanma[x], NOTSRCERASE);putimage(enemy_x, enemy_y, &boom[x], SRCINVERT);}//控制图片切换的时间if (t5 - t6>50){t6 = t5;x++;if (x >= 11)//到最后一张后循环{x = 7;enemy_x = -1;//初始坐标为负值enemy_x = -1;}}t5= GetTickCount();//显示升级图标if (ico[0].live == 1){putimage(ico[0].x, ico[0].y, &tubiao[2], NOTSRCERASE);putimage(ico[0].x, ico[0].y, &tubiao[3], SRCINVERT);}//画出危险图标if (shell.live == 1&&shell.shot==0){putimage(minePlan.x, 0, &tubiao[6], NOTSRCERASE);putimage(minePlan.x, 0, &tubiao[7], SRCINVERT);time[5] += 20;if (time[5] >= 2000)//控制危险图标持续的时间{time[5] = 0;shell.shot = 1;shell.x = minePlan.x;}}//画出炸弹if (shell.shot == 1)//判断导弹是否发射{putimage(shell.x, shell.y, &bomb[1],NOTSRCERASE);putimage(shell.x, shell.y, &bomb[0], SRCINVERT);}//打印护盾if (condition == 1){if (minePlan.kind == 1)putimage(minePlan.x-20, minePlan.y-20, &hudun, SRCPAINT);else if(minePlan.kind == 2)putimage(minePlan.x-7, minePlan.y, &hudun, SRCPAINT);time[6] += 20;if (time[6] > 5000){condition = 0;time[6] = 0;}}
}
int keyDown(IMAGE* map1,int speed)//操作按键判断
{//a = GetKeyState(VK_UP);//该函数通过获取虚键来判断键盘是否按下srand(GetTickCount());//随机数种子if (GetKeyState(VK_UP)< 0&&minePlan.y>0)//minePlan.y>0,限制飞机的移动范围{minePlan.y -= speed;}else if (GetKeyState(VK_LEFT)<0&&minePlan.x>-15){minePlan.x -= speed;}else if (GetKeyState(VK_RIGHT) < 0&&minePlan.x <WIDTH-36){minePlan.x += speed;}else if (GetKeyState(VK_DOWN) < 0 && minePlan.y < HEIGHT-50){minePlan.y += speed;}else if(GetKeyState(VK_ESCAPE) < 0){return 1;}else if (GetKeyState(VK_SPACE) < 0){return 2;}else if (GetKeyState('H') < 0&& show == 1)//按下H键释放技能{show = 0;//表示技能使用了,技能图标不再显示time[0] = 0;}if ((t4 - t3) > (rand() % 500 + 800))//控制敌机产生的时间 间隔{createEnemy();t3 = t4;}t4 = GetTickCount();enemyMove(3);//敌机的产生和移动,同样每次只产生一个通过循环使用移动函数,实现移动if (t2-t1>200)//后面为判定多久时间发射一枚子弹获取当前系统的运行时间GetKeyState(VK_CONTROL) < 0{t1 = t2;   createbullet();//当按下攻击键时,给子弹填充一个,下面的bulletMove()函数才会有效果//播放子弹发射的音效,播放之后需要关掉,才能重新播放//mciSendString("close gun", 0, 0, 0);//mciSendString("open ./Beam.wav alias gun", 0, 0, 0);//mciSendString("play gun", 0, 0, 0);//time[3] += 20;if ( time[0] >= 5000 || time[0] == -1){PlaySound(TEXT("Beam.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);}else//当释放技能时不播放子弹的声音{PlaySound(NULL, NULL, SND_FILENAME | SND_ASYNC | SND_PURGE);PlaySound(TEXT("baozou.wav"), NULL, SND_FILENAME | SND_ASYNC);//PlaySound(TEXT("laser shot.mp3"), NULL, SND_FILENAME | SND_ASYNC);CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)tttt, NULL, NULL, 0);//调用线程,被其他什么东西占用了,暂停时可以播放完整的}}t2 = GetTickCount();bulletMove(10); //发射子弹 //重复执行该函数if (deadth() == 0)return 3;return 0;
}

这个小游戏代码超过1300行,分为了3个文件。其中AirGame.cpp文件中将多种功能合并在一个函数之中,读者可根据需求将各种功能分成多个函数,而不是小编这样合并在一起。代码的注释已经足够详细。读者可以借鉴一下,根据自己的思考将部分功能以自己的逻辑实现。
新手学习中…

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 文件

    文件open()mode: 可选,文件打开模式 buffering: 设置缓冲, encoding: 一般使用utf8文件读取stream.readable() 判断是否可以读取 True Falsestream.readline() 读取一行(后面加换行)stream.readlines() 读取多行,返…...

    2024/4/25 0:39:53
  2. vue中dom-diff算法

    虚拟dom的概念 可以把Virtual DOM 理解为一个简单的JS对象,并且最少包含标签名( tag)、属性(attrs)和子元素对象( children)三个属性。不同的框架对这三个属性的命名会有点差别。总而言之,虚拟dom就是用js对象来描述dom节点 单纯的使用虚拟dom并不能优化性能,因为diff算法需…...

    2024/4/28 5:35:08
  3. Java本地缓存解决方案其一(使用Google的CacheBuilder)

    Java本地缓存解决方案其一(使用Google的CacheBuilder)参考文章: (1)Java本地缓存解决方案其一(使用Google的CacheBuilder) (2)https://www.cnblogs.com/andychou/p/8342007.html 备忘一下。...

    2024/5/3 0:10:02
  4. L2-030 冰岛人 (25分)

    2018年世界杯,冰岛队因1:1平了强大的阿根廷队而一战成名。好事者发现冰岛人的名字后面似乎都有个“松”(son),于是有网友科普如下:冰岛人沿用的是维京人古老的父系姓制,孩子的姓等于父亲的名加后缀,如果是儿子就加 sson,女儿则加 sdottir。因为冰岛人口较少,为避免近亲…...

    2024/4/25 0:39:50
  5. 学习英语01——听力——剑雅12 T8S1

    #本文章仅用于记录本人学习过程,当作笔记来用,如有侵权请及时告知,谢谢! 剑雅 12 Test8 S1: 比较简单 第9句: make complete career change 职业生涯大反转第21句: a fortnight 两个星期第24句: be due to do sth 按期做某事;按理该做某事;由于...

    2024/4/25 0:39:49
  6. EVEng导入QEMU镜像

    第一大步骤: 检查并配置好虚拟机中EVEng的ftp服务,否则宿主机中的ftp软件无法连接到虚拟机中的EVEng! 1.打开VMware中的EVEng并登陆系统。2.查看ftp服务是否启用: #service vsftpd status发现没有启用ftp也没有安装ftp。 3. 安装ftp服务: #apt-get install vsftpd 4. 安装完…...

    2024/4/25 0:39:48
  7. [Python]贪心算法-Prim-和-Kruskal实现-最小生成树

    目标 在连通网的所有生成树中,找到所有边的代价和最小的生成树,简称最小生成树问题. (简要的来说,就是在AOV网中找出串联n个顶点代价总和最小的边集) 下面记录最小生成树的两种算法,Prim和Kruskal Prim算法思路从任意一个顶点开始,每次选择与当前顶点最近的一个顶点,并将…...

    2024/4/25 0:39:47
  8. os模块

    ...

    2024/4/26 3:38:17
  9. Oracle基础 - 查询

    条件表达式 通用(Oracle与MySQL通用), 推荐使用, 可重用性强 --给员工起中文名 select e.ename, case e.ename when SMITH then 史密斯 when ALLEN then 爱丽丝 when BLAKE then 布雷克 else 匿名 -- 可省略else end from emp e; --判断emp表中员工工资; >3000, 高收入; &l…...

    2024/4/26 22:38:32
  10. InnoDB 一棵 B+ 树可以存放多少行数据

    InnoDB一棵B+树可以存放多少行数据?这个问题的简单回答是:约2千万。为什么是这么多呢?因为这是可以算出来的,要搞清楚这个问题,我们先从InnoDB索引数据结构、数据组织方式说起。我们都知道计算机在存储数据的时候,有最小存储单元,这就好比我们今天进行现金的流通最小单位…...

    2024/4/15 21:59:01
  11. No bean named BookServiceImpl available

    org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘BookServiceImpl’ available org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named BookServiceImpl availableat org.springframework.beans.factory.suppor…...

    2024/5/1 20:58:02
  12. JavaSE篇学习之路:(七)【面向对象------下】

    目录第一章:final关键字第二章:抽象类和接口1.1抽象类(abstract)2.1接口(interface)能插拔的就是接口,代码演示:一个类可以实现多个接口,代码演示:总结:今天的分享就到这喽,希望对大家有帮助!!!~一起学习,快乐编程,欢迎攻城狮们多多交流!!!~ 第一章:final关…...

    2024/4/20 12:42:00
  13. RSA幂指数模运算的数学理论

    https://blog.csdn.net/chen77716/article/details/7093600...

    2024/4/28 23:37:27
  14. 关于ubuntu使用鼠标延迟问题

    目前表现的现象是usb3.0的口使用罗技无线鼠标可以,2.0的口会卡顿。电脑为联想z480,具体原因希望有人能分享...

    2024/4/27 15:32:43
  15. vue中key的作用

    key的作用 1在渲染列表的时候使用key,如果不使用的时候会进行警告。当v-for循环渲染时,不加上key的时候会默认采用原地复用原则。即,不会移动或重新渲染dom元素或者标签,而是单纯的改变数据,对数据进行更新。 典型的例子为for循环input标签,删除或者新增一个input,而其中…...

    2024/4/16 11:57:17
  16. Web编程大作业(四)高清重制+在线测验+热点广播(angular框架,websocket,树莓派)

    目录1.高清重制1. express的再理解2. angular作用域问题、自动同步问题3. 写html页面的一点方法2. 在线测验功能实现3. 热点广播网站文件夹发送树莓派安装数据库手机端测试4. 小结 1.高清重制 前几篇写的代码功能更多的是从技术层面出发,把网站需要用到的业务逻辑打通,但没有…...

    2024/5/3 7:03:10
  17. JDK中用于诊断与监控的命令行工具

    命令以及参数详解jps将打印正在运行的Java线程。输出的信息包括Java的进程ID以及主类名,我们可以通过追加参数来打印额外的信息,-l可以打印模块名以及包名,-v将打印传递给虚拟机的参数,-m将打印传递给主类的参数。 jstat允许用户查看目标Java进程的类加载,即时编译以及垃圾…...

    2024/4/25 0:39:45
  18. Win10你需要提供管理员权限才能复制到此文件

    @快速解决权限问题复制相应文件到C盘 当安装相应程序时有时需要复制很多.DLL文件到c:/windows/system32,出现相应的管理员权限问题,楼主解决办法如下: 1. 首先在电脑桌面新建一个文本文档: 输入以下内容 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT*shell un…...

    2024/4/27 0:01:26
  19. Java设计模式(十四)——————【行为型模式】设计模式之命令模式

    源码地址:【行为型模式】设计模式之命令模式 目录基本介绍基本原理应用案例1、需求2、UML类图3、代码实现Spring源码分析总结基本介绍命令模式(Command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个…...

    2024/4/25 0:39:43
  20. Kubernetes进阶 -- pod的生命周期

    pod概况 Pod 是 Kubernetes 应用程序的基本执行单元,即它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元。Pod 表示在 集群 上运行的进程。 Pod 封装了应用程序容器(或者在某些情况下封装多个容器)、存储资源、唯一网络 IP 以及控制容器应该如何运行的选项。 Kube…...

    2024/4/29 12:41:34

最新文章

  1. Rust move

    一、move有什么用 当你在闭包前加上 move 关键字时&#xff0c;闭包会强制获取其所需变量的所有权。这意味着即使在闭包外部变量的所有权被转移给闭包&#xff0c;闭包之外的代码也不能再使用这些变量 看两段代码 fn main() {let x String::from("value");let cl…...

    2024/5/3 11:21:49
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 在 Visual Studio Code (VSCode) 中隐藏以 . 开头的文件

    打开VSCode。 按下Ctrl ,快捷键打开设置。您也可以点击屏幕左下角的齿轮图标&#xff0c;然后选择“Settings”。 在设置搜索框中&#xff0c;键入files.exclude。 在找到的Files: Exclude项中&#xff0c;点击Add Pattern按钮来添加一个新的模式&#xff0c;或者直接在搜索…...

    2024/5/2 2:37:00
  4. 【Go】十六、文件操作

    文章目录 1、打开和关闭文件2、IO3、一次性读文件4、带缓冲区的读文件5、写入文件6、文件复制 1、打开和关闭文件 package main import("fmt""os" ) func main(){//打开文件&#xff1a;file,err : os.Open("d:/Test.txt");if err ! nil {//出错…...

    2024/5/1 14:17:25
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57