效果展示
效果演示
源码展示
#include<stdio.h> #include <graphics.h> #include <assert.h> #include <stdlib.h> #include<conio.h>//_getch(); #include <time.h> #include <math.h> #include<mmsystem.h>//包含多媒体设备接口头文件 #pragma comment(lib,"winmm.lib")//加载静态库 #define PI 3.1415926 #define HEIGHT 503 #define WIDTH 700 int score = 0; static int enemy = 0; static int mode = 0; IMAGE img_bk, img_plane, img_a, img_b, img_c, img_abullet, img_bbullet, img_cbullet, img_planebullet, img_tmp, img_start, img_sta, img_fail, img_history,img_hp,img_nam,img_score,img_select; typedef struct bullet { float x, y; float vx, vy; int isexist; struct bullet* next; }list; list* planebullet = NULL; list* abullet = NULL; list* bbullet = NULL; void pushback2(list** pphead, float vx, float vy); void pushback3(list** pphead, float vx, float vy); void pushback1(list** pphead, list* newnode);//尾插; struct aircraft { int x, y; int width; int height; int speed; int bornflag; int hp; }; aircraft plane, a, b, c; static int dir1 = 1; bool Timer(int ms, int id) { static DWORD t[10]; if (clock() - t[id] > ms) { t[id] = clock(); return true; } return false; } void bgm() { //打开音乐 mciSendString("open ./bgm.MP3", 0, 0, 0);//后面参数不用管 //播放音乐 mciSendString("play ./bgm.MP3", 0, 0, 0);//后面参数不用管 } void bgm1() { mciSendString("close ./shoot.MP3", 0, 0, 0);//后面参数不用管 //打开音乐 mciSendString("open ./shoot.MP3", 0, 0, 0);//后面参数不用管 //播放音乐 mciSendString("play ./shoot.MP3", 0, 0, 0);//后面参数不用管 } void bgm2() { //打开音乐 mciSendString("open ./boom.MP3", 0, 0, 0);//后面参数不用管 //播放音乐 mciSendString("play ./boom.MP3", 0, 0, 0);//后面参数不用管 } void bgm3() { mciSendString("close ./change.MP3", 0, 0, 0);//后面参数不用管 //打开音乐 mciSendString("open ./change.MP3", 0, 0, 0);//后面参数不用管 //播放音乐 mciSendString("play ./change.MP3", 0, 0, 0);//后面参数不用管 } void bgm4() { mciSendString("open ./win.MP3", 0, 0, 0);//后面参数不用管 //播放音乐 mciSendString("play ./win.MP3", 0, 0, 0);//后面参数不用管 } void datainit() { plane.x = 150; plane.y = 150; //a = { 0,0 }; /*b = { 300,0 };*/ /*c = { 450,0 };*/ a.speed = 1; a.bornflag = 1; b.bornflag = 1; c.bornflag = 1; a.width = 100; a.height = 100; b.speed = 1; b.width = 80; b.height = 100; c.height = 70; c.width = 70; c.speed = 3; plane.hp = 500; a.hp = 500; b.hp = 500; c.hp = 500; } list* BuyabulletNode(float vx, float vy) { list* newnode = (list*)malloc(sizeof(list));//空间申请 assert(newnode);//断言,新结点是否申请到了 newnode->vx = vx;//数据赋值 newnode->vy = vy;//数据赋值 newnode->x = a.x + a.width / 2-10; newnode->y = a.y+80; newnode->isexist = 1; newnode->next = NULL;//指向的地址赋值 return newnode;//将申请好的空间首地址返回回去 } list* BuybbulletNode(float vx, float vy) { list* newnode = (list*)malloc(sizeof(list));//空间申请 assert(newnode);//断言,新结点是否申请到了 newnode->vx = vx;//数据赋值 newnode->vy = vy;//数据赋值 newnode->x = b.x + b.width / 2 - 10; newnode->y = b.y + 80; newnode->isexist = 1; newnode->next = NULL;//指向的地址赋值 return newnode;//将申请好的空间首地址返回回去 } list* BuyplanebulletNode(float vx, float vy) { list* newnode = (list*)malloc(sizeof(list));//空间申请 assert(newnode);//断言,新结点是否申请到了 newnode->vx = vx;//数据赋值 newnode->vy = vy;//数据赋值 newnode->x = plane.x + plane.width / 2+17; newnode->y = plane.y; newnode->isexist = 1; newnode->next = NULL;//指向的地址赋值 return newnode;//将申请好的空间首地址返回回去 } void drawAlpha(IMAGE* picture, int picture_x, int picture_y) //x为载入图片的X坐标,y为Y坐标 { // 变量初始化 DWORD* dst = GetImageBuffer(); // GetImageBuffer()函数,用于获取绘图设备的显存指针,EASYX自带 DWORD* draw = GetImageBuffer(); DWORD* src = GetImageBuffer(picture); //获取picture的显存指针 int picture_width = picture->getwidth(); //获取picture的宽度,EASYX自带 int picture_height = picture->getheight(); //获取picture的高度,EASYX自带 int graphWidth = getwidth(); //获取绘图区的宽度,EASYX自带 int graphHeight = getheight(); //获取绘图区的高度,EASYX自带 int dstX = 0; //在显存里像素的角标 // 实现透明贴图 公式: Cp=αp*FP+(1-αp)*BP , 贝叶斯定理来进行点颜色的概率计算 for (int iy = 0; iy < picture_height; iy++) { for (int ix = 0; ix < picture_width; ix++) { int srcX = ix + iy * picture_width; //在显存里像素的角标 int sa = ((src[srcX] & 0xff000000) >> 24); //0xAArrggbb;AA是透明度 int sr = ((src[srcX] & 0xff0000) >> 16); //获取RGB里的R int sg = ((src[srcX] & 0xff00) >> 8); //G int sb = src[srcX] & 0xff; //B if (ix >= 0 && ix <= graphWidth && iy >= 0 && iy <= graphHeight && dstX <= graphWidth * graphHeight) { if ((ix + picture_x) >= 0 && (ix + picture_x) <= graphWidth) //防止出边界后循环显示 { dstX = (ix + picture_x) + (iy + picture_y) * graphWidth; //在显存里像素的角标 int dr = ((dst[dstX] & 0xff0000) >> 16); int dg = ((dst[dstX] & 0xff00) >> 8); int db = dst[dstX] & 0xff; draw[dstX] = ((sr * sa / 255 + dr * (255 - sa) / 255) << 16) //公式: Cp=αp*FP+(1-αp)*BP ; αp=sa/255 , FP=sr , BP=dr | ((sg * sa / 255 + dg * (255 - sa) / 255) << 8) //αp=sa/255 , FP=sg , BP=dg | (sb * sa / 255 + db * (255 - sa) / 255); //αp=sa/255 , FP=sb , BP=db } } } } } void selectplane() { while (1) { BeginBatchDraw(); loadimage(&img_select, "./22.png"); drawAlpha(&img_select, 0, 0); loadimage(&img_select, "./23.png"); drawAlpha(&img_select, 0, 0); loadimage(&img_select, "./24.png"); drawAlpha(&img_select, 0, 400); if (mode == 0) { loadimage(&img_plane, "./1.png"); drawAlpha(&img_plane, 300, 200); } if (mode == 1) { loadimage(&img_plane, "./10.png"); drawAlpha(&img_plane, 300, 200); } else if (mode == 2) { loadimage(&img_plane, "./11.png"); drawAlpha(&img_plane, 300, 200); } else if (mode == 3) { loadimage(&img_plane, "./12.png"); drawAlpha(&img_plane, 300, 200); } else if (mode == 4) { loadimage(&img_plane, "./13.png"); drawAlpha(&img_plane, 300, 200); } else if (mode == 5) { loadimage(&img_plane, "./25.png"); drawAlpha(&img_plane, 300, 200); } if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A') && Timer(300, 1)) { bgm3(); if (mode == 0) { mode = 0; } else { mode--; } } if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D') && Timer(300, 1)) { bgm3(); if (mode == 5) { mode = 5; } else { mode++; } } if ((GetAsyncKeyState(VK_SPACE)) && Timer(300, 1)) { break; } EndBatchDraw(); } } void load() { loadimage(&img_bk, "./back.png"); if (mode == 0) { loadimage(&img_plane, "./1.png"); } loadimage(&img_a, "./2.png"); loadimage(&img_b, "./3.png"); loadimage(&img_c, "./4.png"); loadimage(&img_abullet, "./5.png"); loadimage(&img_bbullet, "./6.png"); loadimage(&img_cbullet, "./7.png"); if (mode == 0) { loadimage(&img_planebullet, "./8.png"); } if (mode == 1) { loadimage(&img_planebullet, "./8.png"); } if (mode == 2) { loadimage(&img_planebullet, "./5.png"); } if (mode == 3) { loadimage(&img_planebullet, "./16.png"); } if (mode == 4) { loadimage(&img_planebullet, "./7.png"); } if (mode == 5) { loadimage(&img_planebullet, "./19.png"); } } void draw() { putimage(0, 0,&img_bk); loadimage(&img_nam, "./20.png"); drawAlpha(&img_nam, 500, 0); if (plane.hp == 500) { //img_hp loadimage(&img_hp, "./19.png"); drawAlpha(&img_hp, 628, 0); } if (plane.hp == 1000) { //img_hp loadimage(&img_hp, "./19.png"); loadimage(&img_hp, "./19.png"); drawAlpha(&img_hp, 628, 0); drawAlpha(&img_hp, 652, 0); } if (plane.hp == 1500) { //img_hp loadimage(&img_hp, "./19.png"); loadimage(&img_hp, "./19.png"); loadimage(&img_hp, "./19.png"); drawAlpha(&img_hp, 628, 0); drawAlpha(&img_hp, 652, 0); drawAlpha(&img_hp, 676, 0); } if (plane.x > -1 && plane.x < WIDTH && plane.y>-1 && plane.y + 48< HEIGHT) { drawAlpha(&img_plane, plane.x, plane.y); } else { putimage(plane.x, plane.y, &img_plane); } if (a.x > -1 && a.x < WIDTH && a.y>0&& a.y + 98 < HEIGHT) { drawAlpha(&img_a, a.x, a.y); } else { putimage(a.x, a.y, &img_a); } if (b.x > -1 && b.x < WIDTH && b.y>-1 && b.y +120 < HEIGHT) { drawAlpha(&img_b, b.x, b.y); } else { putimage(b.x, b.y, &img_b); } if (c.x > -1 && c.x < WIDTH && c.y>-1 && c.y + 120 < HEIGHT) { drawAlpha(&img_c, c.x, c.y); } else { putimage(c.x, c.y, &img_c); } } void ufoamove() { static int cnt = 0; if (a.bornflag == 1) { a.bornflag = 0; a.x = rand() % (WIDTH - a.width); a.y = -50; } if (a.y > 200) { dir1 = 0; } else if (a.y < -150) { dir1 = 1; a.bornflag = 1; } if (1 == dir1) { a.y += a.speed; } else { a.y -= a.speed; } if (++cnt % 50 == 0) { pushback2(&abullet, 0, 10); } if (cnt > 99999) { cnt = 0; } } void ufobmove() { static int num = 0; static int step = b.speed; if (b.bornflag == 1) { b.bornflag = 0; b.x = rand() % (WIDTH - b.width); b.y = -b.height; } if (b.x <= 0 || b.x + b.width >= WIDTH) { step = -step; } b.x += step; b.y++; if (b.y >= HEIGHT) { b.bornflag = 1; } if (++num % 100 == 0) { pushback3(&bbullet, 0, 10); /*for (int i = 0; i < 10; i++) { float angle = i * 2 * PI / 10; float vx = 1* sin(angle); float vy = 1 * cos(angle); pushback3(&bbullet, vx, vy); }*/ } if (num > 99999) { num = 0; } } void pushback1(list** pphead,float vx,float vy)//尾插 { list* newnode = BuyplanebulletNode(vx, vy); if (*pphead == NULL)//链表无结点 { *pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址 } else { list* tail = *pphead;//定义一个指针,先指向头结点的地址 while (tail->next != NULL)//循环遍历找尾结点 { tail = tail->next;//指针指向下一个结点 } tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址 } } void pushback2(list** pphead, float vx, float vy)//尾插 { list* newnode = BuyabulletNode(vx, vy); if (*pphead == NULL)//链表无结点 { *pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址 } else { list* tail = *pphead;//定义一个指针,先指向头结点的地址 while (tail->next != NULL)//循环遍历找尾结点 { tail = tail->next;//指针指向下一个结点 } tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址 } } void pushback3(list** pphead, float vx, float vy)//尾插 { list* newnode = BuybbulletNode(vx, vy); if (*pphead == NULL)//链表无结点 { *pphead = newnode;// 将创建好的头节点的地址给给*pphead,作为新头节点的地址 } else { list* tail = *pphead;//定义一个指针,先指向头结点的地址 while (tail->next != NULL)//循环遍历找尾结点 { tail = tail->next;//指针指向下一个结点 } tail->next = newnode;//找到尾结点,将尾结点的next存放新接结点的地址 } } void removebullet(list** pplist) { if (*pplist == NULL) return; list* cur = *pplist; list* prev = NULL; while (cur != NULL) { if (cur->isexist == 0) { if (*pplist == cur) { *pplist = cur->next; free(cur); cur = *pplist; } else { prev->next = cur->next; free(cur); cur = prev; } } else { prev = cur; cur = cur->next; } } } void listchangexy(list** pplist) { if (*pplist == NULL) return; list* cur = *pplist; while (cur != NULL) { cur->x += cur->vx; cur->y += cur->vy; if ((cur->y<0 )|| (cur->y>HEIGHT) || (cur->x >0) || (cur->x <WIDTH)) cur->isexist = 0; cur = cur->next; } } void showbullet() { static int count1 = 0; listchangexy(&planebullet); if (++count1 == 20) { removebullet(&planebullet); removebullet(&abullet); removebullet(&bbullet); } ///} if (count1 > 99999) { count1 = 0; } for (list* cur = planebullet; cur!= NULL; cur = cur ->next) { if (mode == 0) { if (cur->x > 5 && cur->x + 15 < WIDTH && cur->y > 5 && cur->y + 15 < HEIGHT) { drawAlpha(&img_planebullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_planebullet); } } if (mode == 1) { if (cur->x > 5 && cur->x + 15 < WIDTH && cur->y > 5 && cur->y + 15 < HEIGHT) { drawAlpha(&img_planebullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_planebullet); } } if (mode == 2) { if (cur->x > 5 && cur->x + 25 < WIDTH && cur->y > 5 && cur->y + 35 < HEIGHT) { drawAlpha(&img_planebullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_planebullet); } } if (mode == 3) { if (cur->x > 5 && cur->x + 15 < WIDTH && cur->y > 5 && cur->y + 40 < HEIGHT) { drawAlpha(&img_planebullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_planebullet); } } if (mode == 4) { if (cur->x > 5 && cur->x + 25< WIDTH && cur->y > 5 && cur->y + 43 < HEIGHT) { drawAlpha(&img_planebullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_planebullet); } } if (mode == 5) { if (cur->x > 5 && cur->x + 25< WIDTH && cur->y > 5 && cur->y + 43 < HEIGHT) { drawAlpha(&img_planebullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_planebullet); } } if (cur->x + 10 < a.x || cur->x > a.x + a.width || cur->y + 10 > a.y || cur->y > a.y + a.height) { } else { cur->isexist = 0; score += 600; a.hp -= 500; } if (cur->x + 10 < b.x || cur->x > b.x + b.width || cur->y + 10 > b.y || cur->y > b.y + b.height) { } else { cur->isexist = 0; score += 400; b.hp -= 500; } if (cur->x + 10 < c.x || cur->x > c.x + c.width || cur->y + 10 > c.y || cur->y > c.y + c.height) { } else { cur->isexist = 0; score += 200; c.hp -= 500; } } listchangexy(&abullet); for (list* cur = abullet; cur != NULL; cur = cur->next) { if (cur->x > 5 && cur->x + 25 < WIDTH && cur->y > 5 && cur->y + 30 < HEIGHT) { drawAlpha(&img_abullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_abullet); } if (cur->x + 20 < plane.x || cur->x > plane.x + plane.width || cur->y + 30 > plane.y || cur->y > plane.y + plane.height) { } else { cur->isexist = 0; plane.hp -= 1000; } } listchangexy(&bbullet); for (list* cur = bbullet; cur != NULL; cur = cur->next) { if (cur->x > 5 && cur->x + 15 < WIDTH && cur->y > 5 && cur->y + 20 < HEIGHT) { drawAlpha(&img_bbullet, cur->x, cur->y); } else { putimage(cur->x, cur->y, &img_bbullet); } if (cur->x + 10< plane.x || cur->x > plane.x + plane.width || cur->y + 15 > plane.y || cur->y > plane.y + plane.height) { } else { cur->isexist = 0; plane.hp -= 1000; } } } void ufocmove() { static float disx = 0, disy = 0; static float tmpx = 0, tmpy = 0; static float vx = 0, vy = 0; float step = 1000 / c.speed; if (1 == c.bornflag) { c.bornflag = 0; tmpx = rand() % (WIDTH - c.width); tmpy = -c.height; disx = plane.x - tmpx; disy = plane.y - tmpy; vx = disx / step; vy = disy / step; } tmpx += vx; tmpy += vy; c.x = (int)(tmpx + 0.5); c.y = (int)(tmpy + 0.5); if (c.x < -c.width) { c.bornflag = 1; } if (c.x > WIDTH) { c.bornflag = 1; } if (c.y > HEIGHT) { c.bornflag = 1; } if (c.hp <= 0) { c.bornflag = 1; c.hp = 500; } } void player_move(int speed) //处理飞机移动 { int reload_time = 100; static int fire_start = 0; int tmp = clock(); if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')) { if (plane.y > 0) plane.y -= speed; } if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')) { if (plane.y + 51 < HEIGHT) plane.y += speed; } if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')) { if (plane.x > 0) plane.x -= speed; } if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')) { if (plane.x + 51 < WIDTH) plane.x += speed; } if ((GetAsyncKeyState(VK_SPACE))&& Timer(300, 1)) { if (mode == 0) { //bgm1(); pushback1(&planebullet, 0, -20); } if (mode == 1) { //bgm1(); pushback1(&planebullet, 0, -20); } if (mode == 2) { //bgm1(); pushback1(&planebullet, 0, -10); } if (mode == 3) { //bgm1(); pushback1(&planebullet, 0, -10); } if (mode == 4) { //bgm1(); pushback1(&planebullet, 0, -10); } if (mode == 5) { pushback1(&planebullet, 0, -10); } } if (GetAsyncKeyState(VK_SPACE)) { bgm1(); } } void begin() { char beginstring[] = "开始游戏"; char closestring[] = "退出游戏"; char tipstring[] = "游戏说明: 空格:发射子弹"; setfillcolor(LIGHTBLUE); solidrectangle(240, 300, 380, 350);//画矩形 solidrectangle(240, 360, 380,410);//左上坐标,右下坐标 loadimage(&img_start,"./start.jpg"); loadimage(&img_sta, "./sta.png"); //putimage(0, 0, &img_start); drawAlpha(&img_start,0,0); drawAlpha(&img_sta, 0, 0); settextcolor(RED); setbkmode(TRANSPARENT); settextstyle(30, 0, "楷体"); outtextxy(240 + 10, 300 + 10, beginstring); outtextxy(240 + 10, 360 + 10, closestring); outtextxy(130, 250, tipstring); while (1) { MOUSEMSG m = GetMouseMsg();//鼠标在矩形显示外框 if (m.x >= 240 && m.x <= 380 && m.y >= 300 && m.y <= 350) { setlinecolor(RED); rectangle(240 - 5, 300 - 5, 380 + 5, 350 + 5); if (m.uMsg == WM_LBUTTONDOWN) { break; } } else if (m.x >= 240 && m.x <= 380 && m.y >= 360 && m.y <= 410) { setlinecolor(RED); rectangle(240 - 5, 360 - 5, 380 + 5, 410 + 5); //退出游戏 if (m.uMsg == WM_LBUTTONDOWN) { exit(0); } } else//没在擦除 { setlinecolor(WHITE); rectangle(240 - 5, 300 - 5, 380 + 5, 350 + 5); rectangle(240 - 5, 360 - 5, 380 + 5, 410 + 5); } } } void crash2() { if (b.x + b.width<plane.x || b.x>plane.x + plane.width || b.y + b.height<plane.y || b.y>plane.y + plane.height) { } else { plane.hp=0; bgm2(); Timer(4000, 1); if (plane.hp == 0) { loadimage(&img_fail, "./18.png"); drawAlpha(&img_fail, 120, 0); loadimage(&img_plane, "./boom5.png"); drawAlpha(&img_plane, plane.x, plane.y); if (Timer(3000, 1)) exit(0); } } } void crash1() { if (a.x + a.width<plane.x || a.x>plane.x + plane.width || a.y + a.height<plane.y || a.y>plane.y + plane.height) { } else { plane.hp -= 500; bgm2(); Timer(4000, 1); if (plane.hp == 0) { loadimage(&img_fail, "./18.png"); drawAlpha(&img_fail, 120, 0); loadimage(&img_plane, "./boom5.png"); drawAlpha(&img_plane, plane.x, plane.y); if (Timer(3000, 1)) exit(0); } } } void crash3() { if (c.x + c.width<plane.x || c.x>plane.x + plane.width || c.y + c.height<plane.y || c.y>plane.y + plane.height) { } else { plane.hp = 0; bgm2(); Timer(4000, 1); if (plane.hp == 0) { loadimage(&img_fail, "./18.png"); drawAlpha(&img_fail, 120, 0); loadimage(&img_plane, "./boom5.png"); drawAlpha(&img_plane, plane.x, plane.y); if (Timer(4000, 1)) exit(0); } } } void showScore(int x, int y, int score) { TCHAR time_text[50]; _stprintf_s(time_text, _T("Score:%d"), score); outtextxy(x, y, time_text); } int main() { initgraph(WIDTH, HEIGHT,CONSOLE_FULLSCREEN); datainit(); begin(); selectplane(); BeginBatchDraw(); bgm(); while (1) { load(); draw(); ufoamove(); ufobmove(); ufocmove(); player_move(5); crash1(); crash2(); crash3(); showScore(520, 50, score); printf("hp:%d\n", c.hp); if (plane.hp<=0) { loadimage(&img_fail, "./18.png"); drawAlpha(&img_fail, 120, 0); loadimage(&img_plane, "./boom5.png"); drawAlpha(&img_plane, plane.x, plane.y); if (Timer(3000, 1)) exit(0); } if (a.hp <= 0) { a.bornflag = 1; a.hp = 500; } if (b.hp <= 0) { b.bornflag =1; b.hp = 500; } if (score > 10000) { bgm4(); loadimage(&img_fail, "./26.png"); drawAlpha(&img_fail, 100, 0); if (Timer(2000, 1)) exit(0); } showbullet(); FlushBatchDraw(); } EndBatchDraw(); getchar(); }