#include<bits/stdc++.h>
#include<ctime>
#include<string>
#include<conio.h>
#include<windows.h>
#include<cstdio>
#include<cmath>
#include<fstream>
using namespace std;
bool fang=false,kai=false;
string oname="";
bool flag=false;
int loseplayer=0;
string have;
int lv=0;
int cnt=0;
bool lose=false;
int gid=0;
int gun=0;
string lastlose;
bool buy_it=false;
string bullet="";
string ourname[10]={"","G18","AKM","MP5","AWM","Barrett M82A1","MP7A1","HK416"};
int gun_kill[10]={0,13,28,18,75,90,20,24};
int kill[110]={};
string losename;
string my_name[5]={"","红狼","骇爪","威龙","蝶"};
int id=rand()%4;
int hp[10]={0,100,100,100,100};
string gun_name[110]={"M16","pp-19","G18","AKS74U"};
int coin=100,buy_time,bt[1010],cd_=0,buy[1010],kill_=0,player=0,game=0;
string name[5]={"花似雪","N","N"},gname,shop[10]={"止痛药(10血)","简易注射剂(20血)","强效注射剂(30血)","战地医疗箱(50血)","缩短CD 1秒","缩短CD 2秒","伤害(1血)","伤害(2血)","角色(一只姜)","角色(Macw07)"};
bool isKeyPressed(int key) {
return (GetAsyncKeyState(key)&0x8000)!=0;
}
void play_mode(){
srand(static_cast<unsigned int>(time(0)));
int n,ox=100,choice,f=0,m_kill=0,f2=0;
string g;
double p=0,p1=0,p2=0,p3=0,p4=0;
system("cls");
system("cls");
while(true){
label2:
cout<<"请选择出战角色:\n1.红狼 2.骇爪 3.威龙 4.蝶\n";
cin>>choice;
gid=choice;
if(choice==1){
if(losename=="红狼"){
cout<<"负伤状态无法选择!\n";
continue;
}else{
cout<<"角色剩余血量: "<<hp[choice]<<"\n";
cout<<"你要使用什么武器? 1.G18 2.AKM 3.MP5 4.AWM 5.Barrett M82A1 6.MP7A1 7.HK416\n";
cin>>gun;
gname="红狼";
player=0;
break;
}
}
else if(choice==2&&name[1]=="骇爪"){
if(losename=="骇爪"){
cout<<"负伤状态无法选择!\n";
continue;
}else{
cout<<"角色剩余血量: "<<hp[choice]<<"\n";
cout<<"你要使用什么武器? 1.G18 2.AKM 3.MP5 4.AWM 5.Barrett M82A1 6.MP7A1 7.HK416\n";
cin>>gun;
gname="骇爪";
player=1;
break;
}
}
else if(choice==3&&name[2]=="威龙"){
if(losename=="威龙"){
cout<<"负伤状态无法选择!\n";
continue;
}else{
cout<<"角色剩余血量: "<<hp[choice]<<"\n";
cout<<"你要使用什么武器? 1.G18 2.AKM 3.MP5 4.AWM 5.Barrett M82A1 6.MP7A1 7.HK416\n";
cin>>gun;
gname="威龙";
player=2;
break;
}
}else if(choice==4 && name[3]=="蝶"){
if(losename=="蝶"){
cout<<"负伤状态无法选择!\n";
continue;
}else{
cout<<"角色剩余血量: "<<hp[choice]<<"\n";
cout<<"你要使用什么武器? 1.G18 2.AKM 3.MP5 4.AWM 5.Barrett M82A1 6.MP7A1 7.HK416\n";
cin>>gun;
gname="蝶";
player=3;
break;
}
cout<<"你没有这个角色...\n";
}
}
cout<<"你的角色为:"<<gname<<endl;
choice=rand()%2;
cout<<"敌方的角色为:";
if(choice==0){
cout<<"阿萨拉士兵\n";
oname="阿萨拉士兵";
}
else if(choice==1){
cout<<"哈夫克士兵\n";
oname="哈夫克士兵";
}
else if(choice==2){
cout<<"阿萨拉盾兵\n";
oname="阿萨拉盾兵";
}
system("pause");
while(true){
label1:
if(hp[gid]<=10){
system("color 40");
Sleep(1000);
}
Sleep(1000);
f++;
f2++;
system("cls");
cout<<"我方血量:"<<hp[gid]<<endl;
cout<<"敌方血量:"<<ox<<endl;
cout<<"普攻CD:"<<p<<endl;
cout<<"1技能CD:"<<p1<<endl;
cout<<"2技能CD:"<<p2<<endl;
cout<<"大招CD:"<<p3<<endl;
cout<<"武器CD:"<<p4<<endl;
if (isKeyPressed('1')) {
if(p<=0){
if(flag){
cout<<"我方使用北极星,造成了敌方75点伤害"<<endl;
p=0.7;
ox-=75;
flag=false;
}else{
cout<<"我方使用北极星,造成了敌方37点伤害"<<endl;
p=0.7;
ox-=37;
}
}
}
else if (isKeyPressed('2')) {
if(p1<=0){
if(player==0){
int a=1;
int b=1;
int c=abs(rand()%1);
cout<<"我方使用一技能 三联装手炮,造成了敌方"<<25*(a+b+c)<<"点伤害"<<endl;
ox-=10*(a+b+c);
}
else if(player==1){
if(flag){
cout<<"我方使用一技能 数据飞刀,使敌方扣除50滴血"<<endl;
ox-=50;
flag=false;
}else{
cout<<"我方使用一技能 数据飞刀,使敌方扣除40滴血"<<endl;
ox-=40;
}
}
else if(player==2){
cout<<"我方使用一技能 C4炸弹,造成了敌方"<<60<<"点伤害"<<endl;
ox-=60;
}else if(player==3){
cout<<"我方使用一技能 纳米医疗粉尘为自己加"<<20<<"点血量"<<endl;
if(hp[gid]+20>100){
hp[gid]=100;
}else{
hp[gid]+=20;
}
}
p1=5-cd_;
}
}
else if (isKeyPressed('3')) {
if(p2<=0){
if(player==0){
cout<<"我方使用二技能 烟幕弹,使敌方眩晕2秒"<<endl;
f-=2;
}
else if(player==1){
cout<<"我方使用二技能 闪光巡飞器,使敌方眩晕3秒"<<endl;
f-=3;
}
else if(player==2){
cout<<"我方使用二技能 喷气,对敌方造成"<<12<<"精神伤害"<<endl;
ox-=12;
}else{
cout<<"我方使用二技能 遥控烟雾,使敌方眩晕3秒"<<endl;
f-=3;
}
p2=8-cd_;
}
}
else if (isKeyPressed('4')) {
if(p3<=0){
if(player==0){
cout<<"我方使用大招 花来+G18,造成了敌方"<<80<<"点伤害"<<endl;
ox-=80;
}
else if(player==1){
cout<<"我方使用大招 信号破译器,下一次攻击会多造成10点伤害"<<endl;
flag=true;
}
else if(player==2){
cout<<"我方使用大招 虎蹲炮,对敌方造成"<<8<<"点伤害,自己获得闪击效果(普攻可以攻击两次)"<<endl;
flag=true;
ox-=8;
}else{
cout<<"我方使用大招 蝶式救援无人机,免疫一次伤害,自己获得向死而生效果(普攻可以攻击两次)"<<endl;
flag=true;
fang=true;
kai=true;
}
p3=12-cd_;
}
}else if(isKeyPressed('5')){
int more=rand()%5;
cout<<"我方使用武器: "<<ourname[gun]<<"造成了 "<<gun_kill[gun]+more<<"点伤害\n";
ox-=gun_kill[gun]+more;
p4=10-cd_;
}
if(ox<=0){
Sleep(800);
cout<<"胜利!";
have="";
fang=false;
system("cls");
losename="";
int in=rand()%800;
if(in<150){
in+=100;
}
cout<<"\n你获得了"<<in<<"哈夫币\n";
coin+=in;
system("color 0F");
return;
}
else if(hp[gid]<=0){
cnt++;
if(cnt>=3){
return ;
}
Sleep(700);
cout<<"呃啊......\n";
Sleep(2500);
if(kai){
kai=false;
cout<<"滴滴...\n";
cout<<"正在注射血浆...\n";
Sleep(3500);
hp[gid]=10;
Sleep(500);
goto label1;
}
cout<<"撤离失败!\n";
Sleep(1000);
fang=false;
cout<<"干员名: "<<gname<<" 倒在了血泊之中...\n击败者: "<<oname<<"\n";
loseplayer=gid;
Sleep(1000);
system("pause");
losename=gname;
lastlose=gname;
system("color 0F");
have="";
int out=rand()%500;
if(out<100){
out+=100;
}
cout<<"\n你失去了"<<out<<"哈夫币\n";
coin-=out;
hp[gid]=10;
system("pause");
goto label2;
return;
}
if(f==5){
kill[1]=rand()%15+5;
kill[2]=rand()%20+5;
kill[3]=rand()%13+6;
kill[4]=rand()%25+2;
if(fang){
cout<<"成功免疫此次伤害!\n";
f=0;
}else{
cout<<"敌方使用 "<<gun_name[int(id)]<<",造成了"<<kill[int(id)]<<"点伤害\n";
hp[gid]-=kill[int(id)];
Sleep(800);
cout<<"呃...\n";
f=0;
}
}
Sleep(100);
if(p>0){
p-=0.1;
}
if(p1>0){
p1-=0.1;
}
if(p2>0){
p2-=0.1;
}
if(p3>0){
p3-=0.1;
}
if(p4>0){
p4-=0.1;
}
}
}
void shop_mode(int sign){
int choice;
system("cls");
if(sign==1){
cout<<"哈夫币不够,请重新购买\n";
}
else if(sign==2){
cout<<"输入错误,请重新输入\n";
}
else if(sign==3){
cout<<"已达到购买次数限制,请重新输入\n";
}
cout<<"你现在有"<<coin<<"哈夫币\n";
cout<<"当前角色: "<<my_name[gid]<<" "<<"剩余血量: "<<hp[gid]<<"\n";
cout<<"1.止痛药(10血) 100哈夫币\n2.简易注射剂(20血)180哈夫币\n3.强效注射剂(30血)270哈夫币\n4.战地医疗箱(50血)450哈夫币\n5.缩短CD 1秒 350哈夫币\n6.缩短CD 2秒 500哈夫币\n7.伤害(1血) 400哈夫币\n8.伤害(2血) 500哈夫币\n9.招募角色(骇爪) 600哈夫币\n10.招募角色(威龙) 1000哈夫币\n11.返回主页面\n12.招募角色(蝶) 2500哈夫币\n请问你要购买哪个?";
cin>>choice;
if((choice<=4 && hp[gid]==100)){
cout<<"你没有受伤!\n";
return ;
}
if(choice==1){
if(bt[0]>5) shop_mode(3);
else if(coin>=100){
if(hp[gid]+10>100){
hp[gid]=100;
coin-=100;
shop_mode(0);
}
coin-=100;
hp[gid]+=10;
bt[0]++;
buy[buy_time]=0;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==2){
if(hp[gid]+20>100){
hp[gid]=100;
coin-=180;
shop_mode(0);
}
if(bt[1]>2) shop_mode(3);
else if(coin>=180){
coin-=180;
hp[gid]+=20;
bt[1]++;
buy[buy_time]=1;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==3){
if(hp[gid]+30>100){
hp[gid]=100;
coin-=270;
shop_mode(0);
}
if(bt[2]>2) shop_mode(3);
else if(coin>=270){
coin-=270;
hp[gid]+=30;
bt[2]++;
buy[buy_time]=2;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==4){
if(hp[gid]+50>100){
hp[gid]=100;
coin-=450;
shop_mode(0);
}
if(bt[3]>1) shop_mode(3);
else if(coin>=450){
coin-=450;
hp[gid]+=50;
bt[3]++;
buy[buy_time]=3;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==5){
if(bt[4]>3) shop_mode(3);
else if(coin>=350){
coin-=350;
cd_+=1;
bt[4]++;
buy[buy_time]=4;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==6){
if(bt[5]>2) shop_mode(3);
else if(coin>=500){
coin-=500;
cd_+=2;
bt[5]++;
buy[buy_time]=5;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==7){
if(bt[6]>3) shop_mode(3);
if(coin>=400){
coin-=400;
kill_+=1;
bt[6]++;
buy[buy_time]=6;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==8){
if(bt[7]>2) shop_mode(3);
else if(coin>=500){
coin-=500;
kill_+=2;
bt[7]++;
buy[buy_time]=7;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==9){
if(bt[8]>1) shop_mode(3);
else if(coin>=600){
coin-=600;
name[1]="骇爪";
bt[8]++;
buy[buy_time]=8;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==10){
if(bt[9]>1) shop_mode(3);
else if(coin>=1000){
coin-=1000;
name[2]="威龙";
bt[9]++;
buy[buy_time]=9;
shop_mode(0);
}
else shop_mode(1);
}
else if(choice==11){
return;
}else if(choice==12){
if(coin>=2500){
coin-=2500;
name[3]="蝶";
shop_mode(0);
}else{
shop_mode(1);
}
}else{
shop_mode(2);
}
}
void load_mode(){
ofstream file("存档.code");
if(file.is_open()) {
file<<name[1]<<" "<<name[2]<<" "<<name[3]<<" "<<coin<<" "<<hp[gid]<<" "<<cd_<<" "<<buy_time<<" "<<kill_;
for(int i=0;i<buy_time;i++){
file<<" "<<buy[i];
}
file.close();
}
return;
}
void out_mode(){
system("cls");
cout<<"感谢游玩!";
load_mode();
exit(0);
}
void read_load_mode(){
ifstream file("存档.code");
if(file.is_open()) {
file>>name[1]>>name[2]>>name[3]>>coin>>hp[gid]>>cd_>>buy_time>>kill_;
for(int i=0;i<buy_time;i++){
file>>buy[i];
}
file.close();
}
for(int i=0;i<buy_time;i++)bt[buy[i]]++;
}
void home(){
int n;
cout<<"欢迎参加 航天之战\n1.竞技模式 2.黑市 3.退出并存档 4.读档\n请输入选择:";
cin>>n;
switch(n){
case 1:
play_mode();
break;
case 2:
shop_mode(0);
break;
case 3:
out_mode();
break;
case 4:
read_load_mode();
break;
default:
system("cls");
cout<<"请重新输入\n";
home();
}
}
int main(){
for(int i=0;i<1010;i++)bt[i]=0;
while(true){
system("cls");
home();
}
}
共 5 条回复
你/AI说的很有道理,我现在改一下
不过有点问题 1.商店扣钱Bug(致命):在 shop_mode 中,如果血量加上药品后超过100,代码执行了扣钱和递归调用 shop_mode(0),但没有 return,导致程序会继续往下执行,再次扣除一次钱,造成严重逻辑错误。
2.递归导致栈溢出:shop_mode 使用递归调用自身来刷新界面,如果玩家一直购买,会导致调用栈越来越深,最终程序崩溃。
3.输入流崩溃:当程序提示 cin >> choice 时,如果玩家不小心输入了字母,cin 会进入错误状态,导致后续所有输入失效,游戏陷入死循环。 goto 语句滥用:play_mode 中使用了 goto label1 和 goto label2,导致变量状态(如CD、buff)在复活或重开时无法正确重置。
4.敌方角色生成Bug:choice=rand()%2 只能生成 0 和 1,但后面有 choice==2 的判断,导致“阿萨拉盾兵”永远不会出现。
特别好!!!
这是一次巨大的升级
本次升级不仅添加了新元素,还增加了代码的可靠性
·新增加干员 蝶
·优化了代码
·添加巴雷特、MP7、HK416等强力武器重磅来袭!!!
更有限时特惠:付费武器限免!!!等你来玩!!!