填补射击(C++)

编程入门 行业动态 更新时间:2024-10-09 11:19:23

填补射击(C++)

填补射击(C++)

目录

1. 游戏机制

2. 游戏代码

3. 游戏截图


1. 游戏机制

        玩家通过小键盘上的"←"、"→"键来控制角色的移动,玩家需要按"z"键进行射击,使得发射的方块子弹填满某一行墙体,从而消除该行墙体,若子弹撞到墙体或边界,则子弹变为墙体。游戏难度不会逐渐增加,当墙体"挤压"到玩家时游戏结束。

2. 游戏代码

#include "../Engine/BrickEngine.h"const int BW(15), BH(20); // BW表示场景的宽度, BH表示场景的高度
int PlayerX;              // PlayerX表示玩家的横坐标
// Wall表示该处是否有墙, Bullet表示该处是否有子弹
bool Wall[15 * 20], Bullet[15 * 20];void Run();
// 显示角色
void ShowRole()
{FillStr(PlayerX, BH - 2, "■");FillStr(PlayerX - 1, BH - 1, "■■■");
}
// 玩家死亡
void PlayerDead()
{int n = BW * (BH - 3) + BW - 1; // 倒数第3行最后一个坐标for (int idx = n - BW + 1; idx < n; ++idx)if (Wall[idx]) // 如果倒数第3行存在墙体, 则玩家死亡{// 先在中间留一块空白区域, 然后居中显示Game Over!FillRec(BW - 6 >> 1, (BH >> 1) - 2, 7, 3, "  ");FillStr(BW - 5 >> 1, (BH >> 1) - 1, "Game Over!");// 改变玩家显示样式FillStr(PlayerX, BH - 2, "×");FillStr(PlayerX - 1, BH - 1, "×××");Pause();Run();}
}
// 显示墙体
void ShowWall()
{for (int idx = 0; idx < BW * BH; ++idx)if (Wall[idx])FillStr(idx % BW, idx / BW, "■");
}
// 添加墙体
void AddWall()
{// 先判断玩家是否死亡PlayerDead();// 下移所有墙体for (int idx = BW * (BH - 1) - 1; idx >= 0; --idx)if (Wall[idx]){Wall[idx] = false;FillStr(idx % BW, idx / BW, "  ");Wall[idx + BW] = true;}// 所有墙体向下移动一行, 此时最上方那行空出来了, 为空出来的那行添加墙体for (int x = 1; x < BW - 1; ++x)if (rand() & 1) // 有一半的概率生成墙体Wall[x] = true;// 显示移动后的墙体ShowWall();
}
// 显示子弹
void ShowBullet()
{for (int idx = 0; idx < BW * BH; ++idx)if (Bullet[idx])FillStr(idx % BW, idx / BW, "■");
}
// 移动子弹
void MoveBullet()
{for (int idx = 0; idx < BW * BH; ++idx)if (Bullet[idx]){Bullet[idx] = false;if (idx > BW) // 子弹未抵达边界{if (Wall[idx - BW]) // 子弹下一位置是墙, 子弹变成墙Wall[idx] = true;else // 子弹下一位置为空, 子弹移动{Bullet[idx - BW] = true;FillStr(idx % BW, idx / BW, "  ");}}else // 子弹抵达边界, 子弹变成墙Wall[idx] = true;}// 显示移动后的子弹ShowBullet();
}
// 整行消除
void LineClear()
{int count = 0; // 记录该行的墙的数量for (int idx = 0; idx < BW * BH; ++idx){if (Wall[idx])++count;if (!((idx + 1) % BW)) // 扫描到该行结尾{if (count == BW - 2) // 该行已满, 消除整行{for (int i = idx - BW; i < BW * BH; ++i)if (Wall[i]){Wall[i] = false;FillStr(i % BW, i / BW, "  ");if (i > idx)Wall[i - BW] = true;}ShowWall();idx -= BW; // 回退坐标, 重新扫描这一行}count = 0;}}
}
// 运行游戏
void Run()
{// 初始化游戏system("cls");for (bool &w : Wall)w = false;for (bool &b : Bullet)b = false;PlayerX = (BW - 1 >> 1);ShowRole();AddWall();int t = 0;while (true){Sleep(1);++t &= 255; // t的取值范围0~255, 当t等于255时, t加1值变为0if (kbhit()){int ch = getch();if (ch == 224) // 玩家移动{// 清除角色FillStr(PlayerX, BH - 2, "  ");FillRec(PlayerX - 1, BH - 1, 3, 1, "  ");switch (getch()){case 75: // 左移PlayerX -= PlayerX != 1;break;case 77: // 右移PlayerX += PlayerX != BW - 2;break;}ShowRole();}else if (ch == 122) // 玩家射击{Bullet[BW * (BH - 3) + PlayerX] = true;ShowBullet();}else if (ch == 32) // 暂停游戏Pause();}if (!(t & 1)) // 2的倍数{MoveBullet();LineClear();}if (!(t & 255)) // 255的倍数AddWall();}
}int main()
{SetConsole("填补射击", 30, 20, "80");srand((int)time(0));Run();
}

3. 游戏截图

 

更多推荐

填补射击(C++)

本文发布于:2024-02-07 10:42:10,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1756337.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!