#C语言实现小游戏 您所在的位置:网站首页 c语言迷宫程序代码大全 #C语言实现小游戏

#C语言实现小游戏

2024-07-08 00:55| 来源: 网络整理| 查看: 265

如果这篇文章对你有所帮助的话,麻烦点个赞叭(◍•͈⌔•͈◍) 

目录

一、问题描述

二、系统设计

2.1、功能模块设计

1、最基础变量声明

2、有关飞机的结构体变量定义

3、初始化敌机信息

4、初始化玩家飞机信息

5、加载图片资源

6、游戏画面加载

7、计时器编写

8、子弹创建模块

9、敌机创建模块

10、子弹移动模块

11、敌机移动模块

12、玩家移动模块

13、撞击模块(与子弹或玩家)

14、主程序

2.2模块流程图

三、程序源代码

一、问题描述

        为了实现飞机和敌机出现在设置的范围内,并且飞机能够发射子弹攻打敌机,敌机的出现位置不确定,玩家自己需要控制飞机来发射子弹攻打敌机。当敌机与飞机碰撞时,游戏结束,程序自动退出。

二、系统设计 2.1、功能模块设计 1、最基础变量声明 enum wh //enum枚举类型,程序简洁,方便后续对数据进行修改 { bgwidth = 480, bgheight = 700, bullet_num = 15, enemy_num = 10, BIG, SMALL };

        enum枚举类型,程序简洁,方便后续对数据进行修改

2、有关飞机的结构体变量定义 struct plane { int x; //玩家飞机的横坐标 int y; //玩家飞机的纵坐标 int width; //飞机的宽度 int height; //飞机的高度 int hp; //敌机血量 int type; //敌机类型 bool live; //布尔类型变量非0即1,用于判断飞机是否仍然存活 }player, bullet[bullet_num], enemy[enemy_num]; //每个子弹都有自己的状态,所以这里要以数组的形式定义

        这里定义一个结构体,用于存储游戏中的飞机、子弹、敌机等元素的属性信息。其中结构体包括了位置(横、纵坐标)、大小(宽度、高度)、血量、类型、是否存活等。

3、初始化敌机信息 void enemyHP(int i) { int flag = rand() % 10; if (flag >= 0 && flag ms) { t[id] = clock(); //#include return true; } return false; } //计时器

        timer函数用于控制游戏的帧率和动画效果。该函数接受两个参数,分别为计时器时间间隔和计时器 ID。

        计时器使用了数组 t 来存储每个计时器的最近触发时间,其中数组下标为计时器 ID。在函数中,先计算当前时间与上次触发时间的时间差,如果大于指定的时间间隔,则将该计时器的最近触发时间更新为当前时间,并返回 true;否则返回 false。

8、子弹创建模块 void bullet_creat() //子弹创建模块 { for (int i = 0; i < bullet_num; i++) { if (bullet[i].live == false) { bullet[i].x = player.x + 50; bullet[i].y = player.y; bullet[i].live = true; break; } } }

        bullet_creat函数主要用于在游戏中创建新的子弹。该函数使用了一个循环遍历子弹数组中的所有元素,检查是否存在空闲的子弹。如果存在,将新的子弹对象的位置设置为玩家角色的位置加上50,子弹对象的状态设置为“存活”,并退出循环。

9、敌机创建模块 void enemy_creat() { for (int i = 0; i < enemy_num; i++) { if (!enemy[i].live) { enemy[i].live = true; enemy[i].x = rand() % (bgwidth - 60); enemy[i].y = -600; enemyHP(i); break; } } }

        enemy_creat函数主要用于在游戏中创建敌人,前面和子弹创建函数一样都是用循环遍历数组中的每个元素,检查是否存在没有生成的敌机。如果存在,则将新的敌机对象的位置设置为随机生成的水平位置和初始纵向位置,敌机对象的状态设置为“true”,并调用 enemyHP函数来初始化敌机对象的生命值。最后输出敌机对象的位置信息和状态信息,并退出循环。

10、子弹移动模块 void move_b(int speed) { if (GetAsyncKeyState(VK_SPACE) && timer(300, 1)) { bullet_creat(); } for (int i = 0; i < bullet_num; i++) { if (bullet[i].live) { bullet[i].y -= speed; if (bullet[i].y < 0) { bullet[i].live = false; } } } }

        move_b函数主要作用是子弹的移动。在函数中,首先检查玩家是否按下了空格键,并判断距离上一次发射子弹的时间是否超过 300 毫秒,如果满足条件,则调用 bullet_creat 函数创建新的子弹对象,使用一个循环遍历子弹数组中的所有存活子弹对象。对于每个存活的子弹对象,将其纵向坐标向上移动一定的距离并检查其是否超出了屏幕顶部。如果超出,则将其状态设置为“死亡”。

11、敌机移动模块 void move_e(int speed) { for (int i = 0; i < enemy_num; i++) { if (enemy[i].live) { enemy[i].y += speed; if (enemy[i].y > bgheight) { enemy[i].live = false; } } } }

        move_e函数的作用是敌机移动,与子弹移动基本函数基本一致,没有子弹移动函数中的空格键和时间检查,而且是超出屏幕底部敌机设置。

12、玩家移动模块 void move_p(int speed) /* 控制玩家移动——ps:speed为控制移动速度的变量 */ { /* _kbhit()函数的作用作用是判断是否有敲击键盘按键的行为 若有此行为则返回值“真” 若无此行为则返回值“假” */ #if 0 if(_kbhit()) { char key = _getch(); switch (key) { case 'w': case 'W': player.y -= speed; break; case 's': case 'S': player.y += speed; break; case 'a': case 'A': player.x -= speed; break; case 'd': case 'D': player.x += speed; break; } } #elif 1 if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')) { if (player.y > 0) player.y -= speed; } if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')) { if (player.y < bgheight - 100) player.y += speed; } if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')) { if (player.x > -50) player.x -= speed; } if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')) { if (player.x < bgwidth - 50) player.x += speed; } #endif }

        前半部分和后半部分都是运动函数,但是后半部分的移动效果更佳丝滑,所以我们注释掉了前半部分,只保留了第二版的移动函数,同时只对第二版的函数进行讲解:

        使用 GetAsyncKeyState函数来检测特定的键盘按键,包括上下左右箭头和 W/A/S/D 键,并执行相应的移动操作。该部分代码使用了条件语句和逻辑运算符来限制玩家在屏幕边缘或其他限制区域内移动,防止玩家角色越过游戏界面的范围。

13、撞击模块(与子弹或玩家) void hit() { for (int i = 0; i < enemy_num; i++) { if (!enemy[i].live) continue; for (int j = 0; j < bullet_num; j++) { if (!bullet[j].live) continue; if (bullet[j].x > enemy[i].x && bullet[j].x < enemy[i].x + enemy[i].width && bullet[j].y > enemy[i].y && bullet[j].y < enemy[i].y + enemy[i].height) { bullet[j].live = false; enemy[i].hp--; } } if (enemy[i].hp = enemy[i].x && player.x = 0 && flag ms) { t[id] = clock(); //#include return true; } return false; } //计时器 void bullet_creat() //子弹创建模块 { for (int i = 0; i < bullet_num; i++) { if (bullet[i].live == false) { bullet[i].x = player.x + 50; bullet[i].y = player.y; bullet[i].live = true; break; } } } void enemy_creat() { for (int i = 0; i < enemy_num; i++) { if (!enemy[i].live) { enemy[i].live = true; enemy[i].x = rand() % (bgwidth - 60); enemy[i].y = -600; enemyHP(i); break; } } } void move_b(int speed) { if (GetAsyncKeyState(VK_SPACE) && timer(300, 1)) { bullet_creat(); } for (int i = 0; i < bullet_num; i++) { if (bullet[i].live) { bullet[i].y -= speed; if (bullet[i].y < 0) { bullet[i].live = false; } } } } void move_e(int speed) { for (int i = 0; i < enemy_num; i++) { if (enemy[i].live) { enemy[i].y += speed; if (enemy[i].y > bgheight) { enemy[i].live = false; } } } } void move_p(int speed) /* 控制玩家移动——ps:speed为控制移动速度的变量 */ { /* _kbhit()函数的作用作用是判断是否有敲击键盘按键的行为 若有此行为则返回值“真” 若无此行为则返回值“假” */ #if 0 if(_kbhit()) { char key = _getch(); switch (key) { case 'w': case 'W': player.y -= speed; break; case 's': case 'S': player.y += speed; break; case 'a': case 'A': player.x -= speed; break; case 'd': case 'D': player.x += speed; break; } } #elif 1 if (GetAsyncKeyState(VK_UP) || GetAsyncKeyState('W')) { if (player.y > 0) player.y -= speed; } if (GetAsyncKeyState(VK_DOWN) || GetAsyncKeyState('S')) { if (player.y < bgheight - 100) player.y += speed; } if (GetAsyncKeyState(VK_LEFT) || GetAsyncKeyState('A')) { if (player.x > -50) player.x -= speed; } if (GetAsyncKeyState(VK_RIGHT) || GetAsyncKeyState('D')) { if (player.x < bgwidth - 50) player.x += speed; } #endif } void hit() { for (int i = 0; i < enemy_num; i++) { if (!enemy[i].live) continue; for (int j = 0; j < bullet_num; j++) { if (!bullet[j].live) continue; if (bullet[j].x > enemy[i].x && bullet[j].x < enemy[i].x + enemy[i].width && bullet[j].y > enemy[i].y && bullet[j].y < enemy[i].y + enemy[i].height) { bullet[j].live = false; enemy[i].hp--; } } if (enemy[i].hp = enemy[i].x && player.x


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有