飞机大战的代码,玩的时候会显示以下的图片,显示缓冲区太小,这个要如何解决啊
所以,有代码吗,错误处上下文也可以啊
#include<graphics.h>
#include<Windows.h>
#include<conio.h>
#include<math.h>
#include<stdio.h>
#include<time.h>
#include<tchar.h>/*本游戏目前实现的功能为,1进入开始游戏,2退出游戏,3中途暂停,暂停后1继续或者2退出,血量100
进行记分,撞击敌机血量减少并扣分,敌机进入下方扣分,分数达到1000时胜利,血量小于1时失败,达到一定分数后,敌机加速移动,我方飞机也加速移动*/
#pragma comment(lib,"Winmm.lib")
#define High 1080 //游戏画面尺寸
#define Width 1080
#define Bullet_NUM 10//玩家子弹数量
#define ENEMY_NUM 8//敌机数量
enum My
{
BIG, SMALL, SENIOR
};//使用枚举的方法,飞机类型有三种
IMAGE img_bk;//背景图片
float position_x, position_y;//飞机的位置
float bullet_x, bullet_y;//子弹位置
float enemy_x, enemy_y;//敌机位置
IMAGE img_planeNormal1, img_planeNormal2;//正常飞机图片
IMAGE img_bullet1, img_bullet2;//子弹图片
IMAGE img_planeExplode1, img_planeExplode2;//爆炸飞机图片
IMAGE img_enemy[3][2];//敌机图片
IMAGE img_background;//开始画面背景
IMAGE img_victory; // 胜利时背景
IMAGE img_fail;//失败时背景
int isExplode = 0;//飞机是否爆炸
int score = 0, n = 50;//得分
int m = 0, isexplode = 0;
int luxuanhong = 0;//定义的一个变量
int gameStatus = 0;//游戏状态,0为初始菜单界面,1为正常游戏,2为结束游戏状态,3为游戏暂停
void startMenu();//初始菜单界面
void pauseMenu();//游戏暂停后的菜单界面,按3键后启动该界面
struct Plane//飞机结构(结构体)
{
int x;
int y;
bool live;//是否存活
int width, height;
int hp;
int Hp;
int type;//敌机的类型
}player, bull[Bullet_NUM], enemy[ENEMY_NUM];
void startMenu()//显示开始的菜单
{
putimage(0, 0, &img_background);//显示背景
setbkmode(TRANSPARENT);
//settextcolor(BLACK);
setlinecolor(WHITE);
settextstyle(50, 0, _T("黑体"));
outtextxy(500, 400, "./1进入游戏");
outtextxy(500, 500, "./2退出");
FlushBatchDraw();
Sleep(2);
if (GetAsyncKeyState('1'))
gameStatus = 1;
else if (GetAsyncKeyState('2'))
{
gameStatus = 2;
exit(0);
}
}
void pauseMenu()//显示暂停时的画面
{
putimage(0, 0, &img_background);//显示背景
setbkmode(TRANSPARENT);
settextstyle(50, 0, _T("黑体"));
outtextxy(500, 400, "./1继续游戏");
outtextxy(500, 500, "./2退出");
FlushBatchDraw();
if (GetAsyncKeyState('1'))
gameStatus = 1;
else if (GetAsyncKeyState('2'))
{
gameStatus = 2;
exit(0);//直接结束程序
void load()//加载图片的函数,loadimage后图片俩俩出现,一张原图一张掩码图
{
mciSendString("./open 1.mp3 alias p", NULL, 0, NULL);//打开背景音乐
mciSendString("./play p repeat", NULL, 0, NULL);//循环播放
//加载音乐
/*initgraph(Width, High);*/
//loadimage(&img_bk, L"picture//4.jpg");//背景图片
loadimage(&img_bk, "./images/Background2.png");
loadimage(&img_enemy[0][0], "./images//enemy3_2.png");//敌机1图片
loadimage(&img_enemy[0][1], "./images//enemy3_1.png");
loadimage(&img_background, "./images//Begin.png");//开始菜单背景
loadimage(&img_enemy[1][0], "./images//enemy2_2.png");//敌机2图片
loadimage(&img_enemy[1][1], "./images//enemy2_1.png");
loadimage(&img_enemy[2][0], "./images//enemy1_2.png");//敌机3图片
loadimage(&img_enemy[2][1], "./images//enemy1_1.png");
loadimage(&img_fail, "./images//Fail.png");//失败图片
loadimage(&img_victory, "./images//Victory.png"); // 胜利图片
loadimage(&img_planeNormal1, "./images/player_2.png");//我方飞机图片
loadimage(&img_planeNormal2, "./images/player_1.png");
loadimage(&img_bullet1, "./images//bull_2.png");//子弹图片
loadimage(&img_bullet2, "./images//bull_1.png");
loadimage(&img_planeExplode1, "./images//boom_2.png");//爆炸图片
loadimage(&img_planeExplode2, "./images//boom_1.png");
}
void enemyHp(int i)
{//敌机大小血量,宽度,高度
int flag = rand() % 15;//0-14,以下为各类型敌机的出现概率
if (flag >= 0 && flag <= 2)
{
enemy[i].type = BIG;
enemy[i].hp = 3;
enemy[i].width = 274;
enemy[i].height = 226;
}
else if (flag >= 0 && flag <= 3)
{
enemy[i].type = SENIOR;
enemy[i].hp = 2;
enemy[i].width = 120;
enemy[i].height = 99;
}
else if (flag >= 0)
{
enemy[i].type = SMALL;
enemy[i].hp = 1;
enemy[i].width = 100;
enemy[i].height = 61;
}
}
void gameInit()//初始化游戏数据
{
player.x = 540;
player.y = 900;
player.live = true;
player.Hp = 100;
for (int i = 0; i < Bullet_NUM; i++)//初始化子弹
{
bull[i].x = 0;
bull[i].y = 0;
bull[i].live = false;
}
for (int i = 0; i < ENEMY_NUM; i++)
{
enemy[i].live = false;
enemyHp(i);
}
}
void playplane()//击落飞机
{
for (int i = 0; i < ENEMY_NUM; i++)
{
if (!enemy[i].live)
{
continue;
}
for (int k = 0; k < Bullet_NUM; k++)
{
if (!bull[k].live)
{
continue;
}
if (bull[k].x > enemy[i].x - 25 && bull[k].x<enemy[i].x + enemy[i].width && bull[k].y>enemy[i].y && bull[k].y < enemy[i].y + enemy[i].height)
{
bull[k].live = false;//子弹消失
enemy[i].hp--;//血量减少,每次减少
}
}
if (enemy[i].hp <= 0)
{
enemy[i].live = false;//根据血量判断敌机生死
if (enemy[i].type == BIG)
{
score += 20;
printf("%d", score);
}
if (enemy[i].type == SENIOR)
{
score += 10; printf("%d", score);
}
if (enemy[i].type == SMALL)
{
score += 5; printf("%d", score);
}
mciSendString("./close 4", NULL, 0, NULL);//先把前面一次的音乐关闭
mciSendString("./open 1.mp3 alias 4", NULL, 0, NULL);//打开背景音乐
mciSendString("./play 4 ", NULL, 0, NULL);//循环播放
}
}
}
void show()//游戏绘制
{
load();
while (gameStatus == 3)
{
pauseMenu();
}
putimage(0, 0, &img_bk);
putimage(player.x, player.y, &img_planeNormal1, NOTSRCERASE);//显示正常飞机
putimage(player.x, player.y, &img_planeNormal2, SRCINVERT);//显示正常飞机
//putimage(enemy_x, enemy_y, &img_enemyPlane1, SRCAND);//显示敌机
//putimage(enemy_x, enemy_y, &img_enemyPlane2, SRCPAINT);
for (int i = 0; i < Bullet_NUM; i++)
{
if (bull[i].live)//绘制子弹
{
putimage(bull[i].x, bull[i].y, &img_bullet1,NOTSRCERASE);//显示子弹
putimage(bull[i].x, bull[i].y, &img_bullet2, SRCINVERT);
}
} //绘制敌机
for (int i = 0; i < ENEMY_NUM; i++)
{
if (enemy[i].live)
{
if (enemy[i].type == BIG)
{
putimage(enemy[i].x, enemy[i].y, &img_enemy[1][0], NOTSRCERASE);//显示敌机
putimage(enemy[i].x, enemy[i].y, &img_enemy[1][1], SRCINVERT);
}
if (enemy[i].type == SENIOR)
{
putimage(enemy[i].x, enemy[i].y, &img_enemy[2][0], NOTSRCERASE);//显示敌机
putimage(enemy[i].x, enemy[i].y, &img_enemy[2][1], SRCINVERT);
}
if (enemy[i].type == SMALL)
{
putimage(enemy[i].x, enemy[i].y, &img_enemy[0][0], NOTSRCERASE);//显示敌机
putimage(enemy[i].x, enemy[i].y, &img_enemy[0][1], SRCINVERT);
}
}
if (!enemy[i].live && enemy[i].hp <= 0)
{
putimage(enemy[i].x, enemy[i].y, &img_planeExplode1, NOTSRCERASE);//显示爆炸敌机
putimage(enemy[i].x, enemy[i].y, &img_planeExplode2, SRCINVERT);
}
if (abs(abs((int)player.x - (int)enemy[i].x) + abs((int)player.y - (int)enemy[i].y)) < 150 && isexplode == 0)
{
isexplode = 1;
enemy[i].live = false;
enemy[i].hp = 0;
score -= 5;
player.Hp -= 2;
putimage(enemy[i].x, enemy[i].y, &img_planeExplode1, NOTSRCERASE);//显示爆炸敌机
putimage(enemy[i].x, enemy[i].y, &img_planeExplode2, SRCINVERT);
mciSendString("./close 4", NULL, 0, NULL);//先把前面一次的音乐关闭
mciSendString("./open 1.mp3 alias 4", NULL, 0, NULL);//打开背景音乐
mciSendString("./play 4 ", NULL, 0, NULL);//循环播放
}
if (luxuanhong == 0 && enemy[i].y >= 750)//敌机跑到屏幕下方,扣分
{
luxuanhong = 1;
score -= 5;
}
}
outtextxy(0, 5, "./得分:");
TCHAR s[5];
_stprintf_s(s, "./%d", score);
outtextxy(150, 5, s);//指定出现的文字及位置
outtextxy(0, 50, "./血量:");
TCHAR Hp[50];
_stprintf_s(Hp, "./%d", player.Hp);
outtextxy(150, 50, Hp);
Sleep(2);
} //产生子弹
void creatBullet()
{
for (int i = 0; i < Bullet_NUM; i++)
{
if (!bull[i].live)
{
bull[i].x = player.x + 10;
bull[i].y = player.y - 40;
bull[i].live = true;
break;
}
}
}//产生敌机
void creatEnemy()
{
for (int i = 0; i < ENEMY_NUM; i++)
{
if (!enemy[i].live)
{
isexplode = 0;
luxuanhong = 0;
enemy[i].live = true;
enemy[i].x = rand() % (Width - 100);
enemy[i].y = 0;
enemyHp(i);//重置机型血量
break;
}
}
}//子弹移动
void BulletMove(int speed)
{
for (int i = 0; i < Bullet_NUM; i++)
{
if (bull[i].live)//假
{
bull[i].y -= speed;
if (bull[i].y < 0)
{
bull[i].live = false;//重新被找
}
}
}
}//敌机移动
void enemyMove(int speed)
{
for (int i = 0; i < ENEMY_NUM; i++)
if (enemy[i].live)
{
enemy[i].y += speed;
if (enemy[i].y > High)
{
enemy[i].live = false;
}
}
}//定时器封装,静态变量,只初始化一次,不重复初始化
bool Timer(int ms, int id)
{
static DWORD t[10];//自动初始化为0
if (clock() - t[id] > ms)
{
t[id] = clock();
return true;//保存上次数据记录
}
return false;//默认值,不是0就认为是真
}
void playerMove(int speed)//角色移动
{
if (GetAsyncKeyState('W'))
{
if (player.y > 0)//能移动
{
player.y -= speed;
}
}
if (GetAsyncKeyState('S'))
{
if (player.y < 980)
{
player.y += speed;
}
}
if (GetAsyncKeyState('A'))
{
if (player.x + 60 > 0)
{
player.x -= speed;
}
}
if (GetAsyncKeyState('D'))
{
if (player.x < 1000)
{
player.x += speed;
}
}
if (GetAsyncKeyState(' ') && Timer(300, 1))
{
creatBullet();
//创建一个子弹
mciSendString("./close 3 ", NULL, 0, NULL);
mciSendString("./open 3.mp3 alias 3", NULL, 0, NULL);//打开背景音乐
mciSendString("./play 3 ", NULL, 0, NULL);//循环播放
}
}
int main()
{
load();
initgraph(Width, High, SHOWCONSOLE);//SHOWCONSOLE显示控制台窗口
gameInit();//双缓冲绘图
BeginBatchDraw();
while (!gameStatus)
{
startMenu();
//pauseMenu();
}
while (player.Hp != 0 && score < 1000)
{
if (GetAsyncKeyState('3'))
{
while (1)
{
pauseMenu();
if (GetAsyncKeyState('1'))
break;
}
}
//system("pause");
show();
FlushBatchDraw();
if (score < 200)
playerMove(10);
if (score >= 200 && score < 500)
playerMove(15);
if (score > 500 && score < 800)
playerMove(16);
if (score > 800 && score < 1000)
playerMove(17);
BulletMove(30);
if (Timer(800, 0))
{
creatEnemy();//产生敌机
}
//时间函数,时间变化,t2变化,满足条件,定时器,控制敌机的出现,移动
if (Timer(10, 2))
{
if (score < 200)
enemyMove(2);
if (score >= 200 && score < 500)
enemyMove(3);
if (score >= 500 && score < 800)
enemyMove(4);
if (score >= 800 && score < 1000)
enemyMove(4);
}
playplane();
}
cleardevice();
if (player.Hp <= 0)
{
putimage(0, 0, &img_fail);
mciSendString("./close p", NULL, 0, NULL);
mciSendString("./close wu", NULL, 0, NULL);//先把前面一次的音乐关闭
mciSendString("./open wu.mp3 alias m", NULL, 0, NULL);//打开背景音乐
mciSendString("./play m", NULL, 0, NULL);//循环播放
}
if (score == 10000)
{
putimage(0, 0, &img_victory);
mciSendString("./close p", NULL, 0, NULL);
mciSendString("./close my", NULL, 0, NULL);//先把前面一次的音乐关闭
mciSendString("./open my.mp3 alias v", NULL, 0, NULL);//打开背景音乐
mciSendString("./play v ", NULL, 0, NULL);//循环播放
system("pause");
}
EndBatchDraw();
Sleep(1000000);
return 0;
}
静态链接的可执行文件要比动态链接的可执行文件大得多,因为它将需要用到的代码从二进制文件中拷贝了一份,而动态链接仅仅是复制了一些重定位和符号表信息。