代码如下:
#include
#include
#include
#include
#include
#include
#include
#pragma comment(lib,"winmm.lib")
typedef struct Node
{
int x;
int y;
struct Node *pnext;
}NODE;
#define WINDOW_WIDTH 1024
#define WINDOW_HEIGHT 680
#define WIDTH 480
//我机图片尺寸
#define pw 86
#define ph 82
//敌机图片尺寸
#define aw 70
#define ah 70
#define boss1w 192
#define boss1h 290
//敌机重出现的y坐标
#define APStart -ah-20
NODE *p_bullet = NULL;
//MyPlane
NODE *p_MP = NULL;
//AttackPlane
NODE* p_AP = NULL;
//子弹时间差
NODE* p_AP2 = NULL;
DWORD b1, b2, b3, b4, b5, b6;
IMAGE i_MP,i_MPS,i_AP,i_APS;
IMAGE i_backeve, i_backxing, i_backduicheng, i_backguan,i_backcontrol,i_backgo;
IMAGE i_boss1_1, i_boss1_1S, i_boss1_2, i_boss1_2S;
//backxing的左右移动
int left = (WINDOW_WIDTH / 2 - WIDTH / 2);
//分数
int score = 0;
//击毁敌机的数量
int kill = 0;
//boss是否出现
int boss1show = 0;
//boss1贴图开关
int boss1image = 0;
int boss1hp = 20;
int line1_x = WINDOW_WIDTH / 2 - 20;
int line1_y = boss1h;
int line2_x = WINDOW_WIDTH / 2 + 20;
int line2_y = boss1h;
//Beam只播放一次
int test = 1;
int MP_HP = 1;
void CreateList()
{
p_MP = (NODE*)malloc(sizeof(NODE));
p_MP->x = WINDOW_WIDTH / 2 - pw / 2;
p_MP->y = WINDOW_HEIGHT-100;
p_MP->pnext = NULL;
p_bullet = (NODE*)malloc(sizeof(NODE));
p_bullet->pnext = NULL;
b1 = GetTickCount();
p_AP = (NODE*)malloc(sizeof(NODE));
srand((unsigned)time(NULL));
p_AP->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);
p_AP->y = APStart;
p_AP->pnext = NULL;
b3 = GetTickCount();
p_AP2 = (NODE*)malloc(sizeof(NODE));
p_AP2->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);
p_AP2->y = -350;
p_AP2->pnext = NULL;
b5 = GetTickCount();
}
void GameBackInit()
{
loadimage(&i_MP, L"mp.jpg");
loadimage(&i_MPS, L"mpbit.jpg");
loadimage(&i_backeve, L"backeve.jpg");
loadimage(&i_backxing, L"backtaikong.jpg");
loadimage(&i_AP, L"AP.jpg", aw, ah);
loadimage(&i_APS, L"APS.jpg", aw, ah);
loadimage(&i_backduicheng, L"backduicheng.jpg");
loadimage(&i_backguan, L"backguan.jpg", WIDTH, WINDOW_HEIGHT);
loadimage(&i_backcontrol, L"backcontrol.jpg",WINDOW_WIDTH,WINDOW_HEIGHT);
loadimage(&i_boss1_1, L"boss1_1.jpg");
loadimage(&i_boss1_1S, L"boss1_1S.jpg");
loadimage(&i_boss1_2, L"boss1_2.jpg");
loadimage(&i_boss1_2S, L"boss1_1S.jpg");
loadimage(&i_backgo, L"Gameover.jpg", WINDOW_WIDTH, WINDOW_HEIGHT);
putimage(0, 30, &i_backeve);
Sleep(1000);
PlaySound(L"baozou.wav", NULL, SND_FILENAME | SND_ASYNC);
putimage(0, 0, &i_backcontrol);
outtextxy(600, 540, L"【PRESS】 按任意键进入游戏");
system("pause");
mciSendString(L"open bgmusic.mp3 alias bg", NULL, 0, NULL);
mciSendString(L"play bg repeat", NULL, 0, NULL);
putimage((WINDOW_WIDTH / 2 - WIDTH / 2), 0, WIDTH, WINDOW_HEIGHT, &i_backguan, 0, 0, SRCCOPY);
putimage(0, 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 0, 100, SRCCOPY);
putimage((WINDOW_WIDTH / 2 + WIDTH / 2), 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 1200 - (WINDOW_WIDTH / 2 - WIDTH / 2), 100, SRCCOPY);
//字体出现的高度
int text_h = WINDOW_HEIGHT/2;
Sleep(300);
BeginBatchDraw();
for (int i = 0; i < text_h; i++)
{
clearrectangle((WINDOW_WIDTH / 2 - WIDTH / 2), 0, (WINDOW_WIDTH / 2 + WIDTH / 2), WINDOW_HEIGHT);
putimage((WINDOW_WIDTH / 2 - WIDTH / 2), 0-i, WIDTH, text_h , &i_backguan, 0, 0, SRCCOPY);
putimage((WINDOW_WIDTH / 2 - WIDTH / 2), text_h + i, WIDTH, WINDOW_HEIGHT - (text_h + i), &i_backguan, 0, text_h, SRCCOPY);
putimage((WINDOW_WIDTH / 2 - WIDTH / 2), text_h - i, WIDTH, 2*i, &i_backxing, left, text_h-i, SRCCOPY);
FlushBatchDraw();
Sleep(5);
}
EndBatchDraw();
Sleep(100);
}
void Boss1show()
{
p_AP->y = WINDOW_HEIGHT + 100;
p_AP2->y = WINDOW_HEIGHT + 100;
if (boss1hp >14)
{
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1S, NOTSRCERASE);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1, SRCINVERT);
}
else if(boss1hp >= 9 && boss1hp <=14)
{
if (boss1hp % 2 == 0)
{
setlinecolor(0x996666);
setlinestyle(PS_DOT, 3);
line(line1_x, line1_y, line1_x, WINDOW_HEIGHT);
line(line2_x, line2_y, line2_x, WINDOW_HEIGHT);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2S, NOTSRCERASE);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2, SRCINVERT);
}
else
{
setlinecolor(0xCC6666);
setlinestyle(PS_DOT, 3);
line(line1_x, line1_y, line1_x, WINDOW_HEIGHT);
line(line2_x, line2_y, line2_x, WINDOW_HEIGHT);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1S, NOTSRCERASE);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_1, SRCINVERT);
}
}
else
{
if (test == 1)
{
PlaySound(L"Beam.wav", NULL, SND_FILENAME | SND_ASYNC);
test++;
}
setlinecolor(0xFF6666);
setlinestyle(PS_DASH, 5);
line(line1_x, line1_y, line1_x, WINDOW_HEIGHT);
line(line2_x, line2_y, line2_x, WINDOW_HEIGHT);
line(WINDOW_WIDTH / 2 - boss1w / 2, boss1h -90, 482, boss1h + 50);
line(WINDOW_WIDTH / 2 + boss1w / 2, boss1h - 90, 542, boss1h + 50);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2S, NOTSRCERASE);
putimage(WINDOW_WIDTH / 2 - boss1w / 2, -boss1h + boss1image, &i_boss1_2, SRCINVERT);
if ((boss1hp!=8)&&(p_MP->x - line1_x) > -pw && (p_MP->x - line2_x)<0&& (p_MP->y - line1_y)>-ph) MP_HP = 0;
}
if(boss1image<=boss1h ) boss1image+=2;
}
void AddNode(int flag)
{
//后插法,更新第二个位置
if (flag == 0)
{
NODE* p_new = (NODE*)malloc(sizeof(NODE));
p_new->x = p_MP->x + 35;
p_new->y = p_MP->y - 45;
p_new->pnext = p_bullet->pnext;
p_bullet->pnext = p_new;
}
}
int main()
{
//create a window
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
setfillcolor(0xFF9999);
GameBackInit();
char key;
CreateList();
//批量绘图
BeginBatchDraw();
while (1)
{
//清画板,要不然就成重叠的残影了
cleardevice();
putimage((WINDOW_WIDTH / 2 - WIDTH / 2), 0, WIDTH, WINDOW_HEIGHT, &i_backxing, left, 0, SRCCOPY);
putimage(0, 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 0, 100, SRCCOPY);
putimage((WINDOW_WIDTH / 2 + WIDTH / 2), 0, (WINDOW_WIDTH / 2 - WIDTH / 2), WINDOW_HEIGHT, &i_backduicheng, 1200 - (WINDOW_WIDTH / 2 - WIDTH / 2), 100, SRCCOPY);
putimage(p_MP->x, p_MP->y, &i_MPS, NOTSRCERASE);
putimage(p_MP->x, p_MP->y, &i_MP, SRCINVERT);
putimage(p_AP->x, p_AP->y, &i_APS, NOTSRCERASE);
putimage(p_AP->x, p_AP->y, &i_AP, SRCINVERT);
putimage(p_AP2->x, p_AP2->y, &i_APS, NOTSRCERASE);
putimage(p_AP2->x, p_AP2->y, &i_AP, SRCINVERT);
//MP单位时间发射子弹的数量
b2 = GetTickCount();
//不能等于,有偏差
if (b2 - b1 >= 600)
{
AddNode(0);
b1 = b2;
}
//我方战机子弹递增
NODE* P = p_bullet->pnext;
while (P != NULL)
{
if (boss1show == 0)
{
//确定敌机重生位置不是在原位置
int mid;
//10是子弹宽度,但半个子弹打中也算,要不然太难了,就右边是-3,左边是-7
if ((P->y - p_AP->y) < ah && (P->y - p_AP->y) >= 0 && (P->x - p_AP->x) < aw -3 && (P->x - p_AP->x) >= -7)
{
P->y = APStart -100;
P = P->pnext;
p_AP->y = APStart;
kill++;
PlaySound(L"Bomb.wav", NULL, SND_FILENAME | SND_ASYNC);
while (1)
{
mid = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);
if (abs(mid - p_AP->x) > aw)
{
p_AP->x = mid;
break;
}
}
}
else if((P->y - p_AP2->y) < ah && (P->y - p_AP2->y) >= 0 && (P->x - p_AP2->x) < aw - 3 && (P->x - p_AP2->x) >= -7)
{
P->y = APStart -100;
P = P->pnext;
p_AP2->y = APStart;
kill++;
while (1)
{
mid = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);
if (abs(mid - p_AP2->x) > aw)
{
p_AP2->x = mid;
break;
}
}
PlaySound(L"Bomb.wav", NULL, SND_FILENAME | SND_ASYNC);
}
else
{
fillroundrect(P->x, P->y, P->x + 10, P->y + 35, 10, 30);
P->y -= 5;
P = P->pnext;
}
}
else if (boss1show == 1)
{
if (boss1image > boss1h)
{
if ((P->y) < boss1h && (P->y) >= 0 && (P->x - (WINDOW_WIDTH / 2 - boss1w / 2)) < boss1w - 3 && (P->x - (WINDOW_WIDTH / 2 - boss1w / 2)) >= -7)
{
P->y = APStart -100;
P = P->pnext;
boss1hp--;
if (boss1hp>9||boss1hp<7) PlaySound(L"Bomb.wav", NULL, SND_FILENAME | SND_ASYNC);
}
else
{
fillroundrect(P->x, P->y, P->x + 10, P->y - 35, 10, 30);
P->y -= 10;
P = P->pnext;
}
TCHAR s_boss1hp[100];
_stprintf(s_boss1hp, _T("【Boss】HP:%d"), boss1hp);
outtextxy((WINDOW_WIDTH / 2 + WIDTH / 2) + 45, 200, s_boss1hp);
if (boss1hp <= 0)
{
boss1show = 0;
kill += 50;
}
}
else
{
fillroundrect(P->x, P->y, P->x + 10, P->y + 35, 10, 30);
P->y -= 5;
P = P->pnext;
}
}
}
//AP飞行的速度
b4 = GetTickCount();
//不能等于,有偏差
if (b4- b3 >= 50)
{
if (p_AP->y < WINDOW_HEIGHT)
{
p_AP->y += 3;
}
else
{
p_AP->y = 0;
p_AP->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);
}
b3 = b4;
}
//AP2飞行的速度
b6 = GetTickCount();
//不能等于,有偏差
if (b6 - b5 >= 50)
{
if (p_AP2->y < WINDOW_HEIGHT)
{
p_AP2->y += 3;
}
else
{
p_AP2->y = 0;
p_AP2->x = rand() % (WIDTH - aw) + (WINDOW_WIDTH / 2 - WIDTH / 2);
}
b5 = b6;
}
if (kill==10&& boss1hp > 0) boss1show = 1;
if (boss1show==1)
{
Boss1show();
}
if ((p_MP->x - p_AP->x) > -pw && (p_MP->x - p_AP->x)y - p_AP->y)>-ph && (p_MP->y - p_AP->y)x - p_AP2->x) > -pw && (p_MP->x - p_AP2->x)y - p_AP2->y)>-ph && (p_MP->y - p_AP2->y)boss1h&&(p_MP->x-(WINDOW_WIDTH / 2 - boss1w / 2)) >-pw && (p_MP->x-(WINDOW_WIDTH / 2 + boss1w / 2))yy -= 5;
break;
case 80://下
p_MP->y += 5;
break;
case 75://左
p_MP->x -= 5;
left -= 5;
break;
case 77://右
p_MP->x += 5;
left += 5;
break;
}
}
if (p_MP->x<(WINDOW_WIDTH / 2 - WIDTH / 2))
p_MP->x = (WINDOW_WIDTH / 2 - WIDTH / 2);
if (p_MP->x>(WINDOW_WIDTH / 2 + WIDTH / 2 - pw))
p_MP->x = (WINDOW_WIDTH / 2 + WIDTH / 2 - pw);
if (p_MP->y<0 )
p_MP->y = 0;
if (p_MP->y>WINDOW_HEIGHT - ph)
p_MP->y = WINDOW_HEIGHT - ph;
if (left < 0)
left = 0;
if (left>1280 - WIDTH)
left = 1280 - WIDTH;
}
EndBatchDraw();
closegraph();
return 0;
}