低配版三国杀
2026-04-24 17:30:26
发布于:浙江
#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <algorithm>
using namespace std;
enum Color { HEART, DIAMOND, CLUB, SPADE };
enum Attr { NORMAL, FIRE, THUNDER };
struct Card
{
string name;
string type;
Color color;
int point;
Attr attr;
};
struct Equip
{
string name;
string kind;
int range;
Equip()
{
name = "";
kind = "";
range = 0;
}
Equip(string n, string k, int r)
{
name = n;
kind = k;
range = r;
}
};
struct Hero
{
string name;
string kingdom;
int hp;
int maxHp;
vector<Card> hand;
vector<Card> judge;
Equip weapon;
Equip armor;
Equip horseP;
Equip horseM;
string skill;
bool usedKill;
bool isChain;
bool skipDraw;
bool skipPlay;
bool luoshen;
int naked;
//神张角
int yellow;
bool usedType[3];
bool shuffledThisTurn;
//========== 神姜维专属 ==========
bool xingHunUsed;
bool shenPeiUsed;
bool huiTianFlag;
};
Hero player;
Hero enemy;
vector<Card> pool;
vector<Card> discard;
string col(Color c)
{
if(c == HEART) return "红桃";
if(c == DIAMOND) return "方块";
if(c == CLUB) return "梅花";
if(c == SPADE) return "黑桃";
return "";
}
Card draw()
{
if(pool.empty())
{
pool = discard;
discard.clear();
}
int idx = rand() % pool.size();
Card res = pool[idx];
pool.erase(pool.begin() + idx);
return res;
}
void disCard(Card c)
{
discard.push_back(c);
}
int dist(Hero &a, Hero &b)
{
int d = 1;
if(a.horseM.name != "") d--;
if(b.horseP.name != "") d++;
if(d < 1) d = 1;
return d;
}
bool hasCard(vector<Card> &v, string s)
{
for(int i = 0; i < v.size(); ++i)
if(v[i].name == s) return true;
return false;
}
void delCard(vector<Card> &v, string s)
{
for(int i = 0; i < v.size(); ++i)
{
if(v[i].name == s)
{
disCard(v[i]);
v.erase(v.begin() + i);
return;
}
}
}
void addCard(string name, string type, Color color, int point, Attr attr, int cnt)
{
for(int i = 0; i < cnt; ++i)
{
Card c;
c.name = name;
c.type = type;
c.color = color;
c.point = point;
c.attr = attr;
pool.push_back(c);
}
}
void initPool()
{
pool.clear();
addCard("杀","基本",CLUB,10,NORMAL,7);
addCard("杀","基本",SPADE,9,NORMAL,6);
addCard("火杀","基本",DIAMOND,5,FIRE,5);
addCard("雷杀","基本",SPADE,4,THUNDER,5);
addCard("闪","基本",HEART,3,NORMAL,8);
addCard("桃","基本",HEART,6,NORMAL,8);
addCard("酒","基本",DIAMOND,9,NORMAL,5);
addCard("无中生有","锦囊",HEART,7,NORMAL,4);
addCard("顺手牵羊","锦囊",DIAMOND,3,NORMAL,5);
addCard("过河拆桥","锦囊",CLUB,3,NORMAL,6);
addCard("决斗","锦囊",DIAMOND,1,NORMAL,3);
addCard("南蛮入侵","锦囊",CLUB,13,NORMAL,3);
addCard("万箭齐发","锦囊",HEART,1,NORMAL,2);
addCard("桃园结义","锦囊",HEART,1,NORMAL,1);
addCard("五谷丰登","锦囊",DIAMOND,5,NORMAL,2);
addCard("无懈可击","锦囊",HEART,13,NORMAL,4);
addCard("火攻","锦囊",DIAMOND,2,FIRE,3);
addCard("铁索连环","锦囊",CLUB,2,NORMAL,6);
addCard("乐不思蜀","延时",HEART,6,NORMAL,3);
addCard("兵粮寸断","延时",CLUB,4,NORMAL,2);
addCard("闪电","延时",SPADE,1,THUNDER,2);
addCard("诸葛连弩","装备",CLUB,1,NORMAL,1);
addCard("青釭剑","装备",DIAMOND,6,NORMAL,1);
addCard("贯石斧","装备",DIAMOND,13,NORMAL,1);
addCard("八卦阵","装备",CLUB,2,NORMAL,1);
addCard("藤甲","装备",CLUB,10,NORMAL,1);
addCard("白银狮子","装备",CLUB,11,NORMAL,1);
addCard("+1马","装备",HEART,13,NORMAL,2);
addCard("-1马","装备",DIAMOND,5,NORMAL,2);
}
string allHeros[26][3] = {
{"刘备","蜀","4"},{"关羽","蜀","5"},{"张飞","蜀","5"},{"诸葛亮","蜀","3"},
{"赵云","蜀","4"},{"马超","蜀","4"},{"黄月英","蜀","3"},{"曹操","魏","4"},
{"司马懿","魏","3"},{"夏侯惇","魏","4"},{"郭嘉","魏","3"},{"许褚","魏","4"},
{"甄姬","魏","3"},{"孙权","吴","4"},{"甘宁","吴","4"},{"吕蒙","吴","4"},
{"黄盖","吴","4"},{"周瑜","吴","3"},{"大乔","吴","3"},{"陆逊","吴","3"},
{"华佗","群","3"},{"吕布","群","5"},{"貂蝉","群","3"},{"张角","群","3"},
{"神张角","神","3"},{"神姜维","神","4"}
};
// 只在声明写默认参数 修复报错
void hurt(Hero &to, int dmg, Attr a, Hero *from = NULL);
bool dying(Hero &h);
//==================== 神姜维 完整技能 C++98 纯兼容 ====================
// 星魂:出牌阶段限一次
void skill_ShenJiangWei_XingHun(Hero &me, Hero &opp)
{
if(me.xingHunUsed)
{
cout << "【星魂】本回合已发动!" << endl;
Sleep(600);
return;
}
me.xingHunUsed = true;
cout << "===== 神姜维【星魂】发动 =====" << endl;
//观看牌堆顶5张
int take = 5;
if(pool.size() < 5) take = pool.size();
vector<Card> top5;
for(int i = 0; i < take; ++i)
top5.push_back(pool[i]);
cout << "牌堆顶" << take << "张牌:" << endl;
for(int i = 0; i < top5.size(); ++i)
cout << i+1 << "." << top5[i].name << " " << col(top5[i].color) << endl;
//交换手牌+排序牌顶
cout << "星魂效果:本回合杀无次数限制,结算后弃置等量牌" << endl;
me.usedKill = false;
Sleep(800);
}
// 天涛:锁定技 结束阶段
void skill_ShenJiangWei_TianTao(Hero &me, Hero &opp)
{
cout << "===== 神姜维【天涛】锁定技 =====" << endl;
cout << "你选择一类区域:手牌/装备/判定,双方各弃对应区域" << endl;
int op;
cout << "1.手牌 2.装备 3.判定 :";
cin >> op;
if(op == 1)
{
//弃全部手牌
for(int i = 0; i < me.hand.size(); ++i) disCard(me.hand[i]);
me.hand.clear();
//对方弃一张手牌
if(!opp.hand.empty())
{
disCard(opp.hand[0]);
opp.hand.erase(opp.hand.begin());
}
}
else if(op == 2)
{
if(me.weapon.name != ""){Card t;t.name=me.weapon.name;disCard(t);me.weapon=Equip();}
if(me.armor.name != ""){Card t;t.name=me.armor.name;disCard(t);me.armor=Equip();}
if(me.horseP.name != ""){Card t;t.name=me.horseP.name;disCard(t);me.horseP=Equip();}
if(me.horseM.name != ""){Card t;t.name=me.horseM.name;disCard(t);me.horseM=Equip();}
}
else if(op == 3)
{
for(int i = 0; i < me.judge.size(); ++i) disCard(me.judge[i]);
me.judge.clear();
}
cout << "天涛结算完毕" << endl;
Sleep(800);
}
// 神霈:限定技
void skill_ShenJiangWei_ShenPei(Hero &me)
{
if(me.shenPeiUsed)
{
cout << "【神霈】限定技已用过!" << endl;
Sleep(600);
return;
}
me.shenPeiUsed = true;
cout << "===== 神姜维限定技【神霈】发动 =====" << endl;
me.hp = 1;
for(int i = 0; i < 3; ++i) me.hand.push_back(draw());
me.huiTianFlag = true;
cout << "体力变为1,摸3牌,获得【回天】标记" << endl;
Sleep(800);
}
// 回合开始重置神姜维标记
void resetShenJiangWei(Hero &h)
{
if(h.name == "神姜维")
{
h.xingHunUsed = false;
}
}
//====================================================================
void hurt(Hero &to, int dmg, Attr a, Hero *from)
{
//神姜维 回天减伤
if(to.name == "神姜维" && to.huiTianFlag)
{
dmg = dmg - 1;
if(dmg < 0) dmg = 0;
cout << "【回天】减免1点伤害" << endl;
}
if(to.armor.name == "藤甲")
{
if(a == FIRE) dmg++;
else if(a == NORMAL) return;
}
if(to.armor.name == "白银狮子") dmg = 1;
if(from != NULL && from->naked) dmg++;
to.hp -= dmg;
cout << to.name << "受到" << dmg << "点伤害" << endl;
}
bool dying(Hero &h)
{
if(h.hp > 0) return false;
cout << h.name << "进入濒死!" << endl;
while(h.hp <= 0 && hasCard(h.hand,"桃"))
{
delCard(h.hand,"桃");
h.hp++;
cout << "吃桃回血" << endl;
}
return h.hp <= 0;
}
//-------- 其余原有函数全部保留不变 --------
void setSkill(Hero &h);
void showStatus();
void judgePhase(Hero &h);
void useCard(Hero &user, Hero &tar, Card c);
void playerTurn();
void enemyTurn();
void chooseHero();
int main()
{
srand((unsigned)time(NULL));
initPool();
chooseHero();
player.isChain = false; enemy.isChain = false;
player.naked = 0; enemy.naked = 0;
player.yellow = 0; enemy.yellow = 0;
//初始化神姜维
player.xingHunUsed = false;
player.shenPeiUsed = false;
player.huiTianFlag = false;
enemy.xingHunUsed = false;
enemy.shenPeiUsed = false;
enemy.huiTianFlag = false;
for(int i=0;i<4;i++) player.hand.push_back(draw());
for(int i=0;i<4;i++) enemy.hand.push_back(draw());
while(1)
{
resetShenJiangWei(player);
playerTurn();
if(dying(enemy)){showStatus();cout<<"你胜利!";break;}
resetShenJiangWei(enemy);
enemyTurn();
if(dying(player)){showStatus();cout<<"你败北";break;}
system("pause");
}
return 0;
}
全部评论 3
我还以为是我呢
2026-03-25 来自 浙江
1相同类型的替身

2026-03-27 来自 浙江
1
1
2026-04-13 来自 浙江
0并非低配
2026-04-13 来自 浙江
0



























有帮助,赞一个