攻陷对方堡垒!
是时候拿出真正的技术了~
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <xiaohoucode.h>
using namespace std;
int main()
{
cout << "欢迎来到愤怒的皮皮!" << endl;
sleep(1);
cout << "你的目标是炸毁那些堡垒!" << endl;
sleep(1);
int n;
srand(time(0));
int sum = 0; // 总分计数器
int bg = time (0); // 记录开始时间
for (int t = 1; t <= 999; t++)
{
cout << "来!第" << t << "个堡垒!" << endl;
int score = 0; // 单次得分计数器
int dis = rand() % 8 + 3; // 到目标距离
int n = rand() % 5 + 3; // 堡垒大小
int num = rand() % 2; // 随机产生正方形或平行四边形两种堡垒:0表示正方形堡垒,1表示平行四边形堡垒
// cin >> num;
if (num == 0) // 0表示正方形堡垒
{
// 1.1 打印爆破之前的正方形堡垒图
for (int i = 1; i <= n; i++) // 总共有n行
{
for (int j = 1; j <= dis; j++) // 每行前dis列先打印空格
{
if (i == n && j == 1) // 打印前dis列的左下角的时候输出炮,其余都输出空格
{
cout << "➹";
}
else
{
cout << " ";
}
}
for (int j = 1; j <= n; j++) // 接下来的n列输出#
{
cout << "#";
}
cout << endl;
}
cout << "设置瞄准高度:" << endl;
int x, y;
cin >> x;
x = n - x + 1; // 高度和行坐标恰好相反,需要计算出来反过来的x
cout << "设置远攻距离:" << endl;
cin >> y; // 远攻距离y, 远攻距离为距左边的空格数
y = y - dis; // 由于打印图形是拼接的,实际处理爆炸范围需要减去空格数dis
// 1.2 打印爆破之后的正方形堡垒图
int lk = rand() % 3 + 1; // 设置爆炸范围,爆炸范围是1~3的随机数
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= dis; j++)
{
if (i == n && j == 1) // 打印到左下角的时候输出炮,其余都输出空格
{
cout << "➹";
}
else
{
cout << " ";
}
}
for (int j = 1; j <= n; j++) // 输出轰炸之后的图形
{
if ( abs(i - x) + abs(j - y) <= lk) // 曼哈顿距离在lk以内的输出*,表示被炸到了;否则输出#
{
cout << "*";
score++; // 记录得分
}
else
{
cout << "#"; // 未被轰炸的地方原样输出
}
}
cout << endl;
}
cout << "【本次得分" << score << "分】" << endl;
sleep(2);
clear(); // 清屏
}
else if (num == 1) // 1表示平行四边形堡垒
{
// 2.1 打印爆破之前的平行四边形堡垒图
for (int i = 1; i <= n; i++) // 总共有n行
{
for (int j = 1; j <= dis; j++) // 每行前dis列先打印空格
{
if (i == n && j == 1) // 打印前dis列的左下角的时候输出炮,其余都输出空格
{
cout << "➹";
}
else
{
cout << " ";
}
}
for (int j = 1; j <= n - i + 1; j++) // 平行四边形每行额外输出上三角形的空格
cout << " ";
for (int j = 1; j <= n; j++) // 接下来的n列输出#
cout << "#";
cout << endl;
}
cout << "设置瞄准高度:" << endl;
int x, y;
cin >> x;
x = n - x + 1; // 高度和行坐标恰好相反,需要计算出来反过来的x
cout << "设置远攻距离:" << endl;
cin >> y; // 远攻距离y, 远攻距离为距左边的空格数
y = y - dis; // 由于打印图形是拼接的,实际处理爆炸范围需要减去空格数dis
y -= n - x + 1;
// 2.2 打印爆破之后的平行四边形堡垒图
int lk = rand() % 3 + 1; // 设置爆炸范围,爆炸范围是1~3的随机数
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= dis; j++)
{
if (i == n && j == 1) // 打印到左下角的时候输出炮,其余都输出空格
{
cout << "➹";
}
else
{
cout << " ";
}
}
for (int j = 1; j <= n - i + 1; j++) // 输出此行上三角的空格个数
{
cout << " ";
}
for (int j = 1; j <= n; j++) // 输出轰炸之后的图形
{
if ( abs(i - x) + abs(j - y) <= lk) // 曼哈顿距离在lk以内的输出*,表示被炸到了;否则输出#
{
cout << "*";
score++; // 记录得分
}
else
{
cout << "#"; // 未被轰炸的地方原样输出
}
}
cout << endl;
}
cout << "【本次得分" << score << "分】" << endl;
sleep(2);
clear(); // 清屏
}
sum += score; // 累计每一轮获得的分数
int now = time(0); // 记录结束时间
if (now - bg >= 30) // 游戏时间 >= 30,游戏结束
{
t = 10000;
}
}
cout << "游戏结束,总分" << sum << "分" << endl;
return 0;
}