#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
// 清屏函数,根据不同操作系统自动适配
#ifdef _WIN32
#define CLEAR_SCREEN "cls"
#else
#define CLEAR_SCREEN "clear"
#endif
// 函数声明
void draw_card(int* kill, int* thunder, int* fire, int* shan, int* tao,
int* duel, int* steal, int* nullify, int* execute,
int* raze, int* south, int* arrow, int* peach_garden,
int* weapon, int* armor, int is_player);
int get_valid_input(int min, int max);
int main()
{
// 游戏状态变量
int player_hp = 3; // 玩家血量
int computer_hp = 3; // 电脑血量
int round = 1; // 回合数
// 基本牌
int player_kill = 1; // 普通杀数量
int player_thunder = 1; // 雷杀数量
int player_fire = 1; // 火杀数量
int player_shan = 2; // 闪的数量
int player_tao = 1; // 桃的数量
// 锦囊牌 - 新增了万箭齐发和桃园结义
int player_duel = 1; // 决斗
int player_steal = 1; // 顺手牵羊
int player_nullify = 1; // 无中生有
int player_execute = 1; // 过河拆桥
int player_raze = 1; // 釜底抽薪
int player_south = 1; // 南蛮入侵
int player_arrow = 1; // 新增:万箭齐发
int player_peach_garden = 1; // 新增:桃园结义
// 装备牌状态 (0-无装备,1-有装备)
int player_weapon = 0; // 0-无,1-诸葛连弩(可出多张杀)
int player_armor = 0; // 0-无,1-八卦阵(50%自动闪避)
// 电脑牌
int computer_kill = 1;
int computer_thunder = 1;
int computer_fire = 1;
int computer_shan = 2;
int computer_tao = 1;
int computer_duel = 1;
int computer_south = 1;
int computer_arrow = 1; // 新增
int computer_peach_garden = 1; // 新增
// 武将选择 (新增诸葛亮、吕布、孙权)
int player_hero, computer_hero;
char* hero_names[9] = {"", "关羽", "周瑜", "曹操", "赵云", "华佗", "诸葛亮", "吕布", "孙权"};
char* hero_skills[9] = {
"",
"红杀不可闪避",
"每回合多摸一张牌",
"受到伤害后可获得对方一张牌",
"可将闪当杀使用,杀当闪使用",
"使用桃时可额外恢复1点体力",
"观星(回合开始可多摸2张牌并选择保留),空城(无手牌时不可被攻击)", // 新增
"无双(出杀时对方需出2张闪才能闪避),马术(攻击范围+1)", // 新增
"制衡(可弃1张牌换2张新牌),救援(濒死时额外恢复1点血)" // 新增
};
// 初始化随机数
srand(time(0));
// 游戏欢迎界面
system(CLEAR_SCREEN);
printf("=\n");
printf(" 三国杀2.0版 \n");
printf("=\n");
printf("请选择武将:\n");
for (int i = 1; i <= 8; i++) {
printf("%d. %s: %s\n", i, hero_names[i], hero_skills[i]);
}
printf("选择(1-8): ");
player_hero = get_valid_input(1, 8);
// 电脑随机选择武将
computer_hero = rand() % 8 + 1;
printf("电脑选择了: %s (%s)\n", hero_names[computer_hero], hero_skills[computer_hero]);
printf("\n游戏规则:\n");
printf("1. 基础牌: 杀、雷杀、火杀、闪、桃\n");
printf("2. 锦囊牌: 决斗、顺手牵羊、无中生有、过河拆桥、釜底抽薪、南蛮入侵、万箭齐发、桃园结义\n");
printf("3. 装备牌: 诸葛连弩、八卦阵\n");
printf("4. 血量为0时失败\n");
printf("按回车键开始游戏...\n");
getchar();
getchar(); // 等待用户按回车
// 游戏主循环
while (player_hp > 0 && computer_hp > 0) {
// 清屏并显示回合信息
system(CLEAR_SCREEN);
printf("=\n");
printf(" 你: %s | 电脑: %s \n",
hero_names[player_hero], hero_names[computer_hero]);
printf("=\n");
printf("================ 第 %d 回合 ================\n", round);
printf("当前状态: 你 %d血 (杀:%d 雷杀:%d 火杀:%d 闪:%d 桃:%d)\n",
player_hp, player_kill, player_thunder, player_fire,
player_shan, player_tao);
printf("锦囊牌: 决斗:%d 顺手:%d 无中:%d 拆桥:%d 抽薪:%d 南蛮:%d 万箭:%d 桃园:%d\n",
player_duel, player_steal, player_nullify,
player_execute, player_raze, player_south, player_arrow, player_peach_garden);
printf("装备: %s | %s\n",
(player_weapon ? "诸葛连弩" : "无武器"),
(player_armor ? "八卦阵" : "无防具"));
printf("-------------------------------------\n");
printf("电脑 %d血\n", computer_hp);
}
// 清屏并显示游戏结果
system(CLEAR_SCREEN);
printf("=\n");
printf(" 游戏结束 \n");
printf("=\n");
printf("共进行了 %d 回合\n", round - 1);
if (player_hp > 0 && computer_hp <= 0) {
printf("恭喜你获胜了!\n");
} else if (player_hp <= 0 && computer_hp > 0) {
printf("很遗憾,电脑获胜了!\n");
} else {
printf("游戏结束\n");
}
printf("=====================================\n");
return 0;
}
// 摸牌函数 - 扩展以支持新牌
void draw_card(int* kill, int* thunder, int* fire, int* shan, int* tao,
int* duel, int* steal, int* nullify, int* execute,
int* raze, int* south, int* arrow, int* peach_garden,
int* weapon, int* armor, int is_player) {
int card_type = rand() % 12; // 增加范围以包含新牌
switch(card_type) {
case 0: *kill += 1; printf("获得【杀】!\n"); break;
case 1: *thunder += 1; printf("获得【雷杀】!\n"); break;
case 2: *fire += 1; printf("获得【火杀】!\n"); break;
case 3: *shan += 1; printf("获得【闪】!\n"); break;
case 4: *tao += 1; printf("获得【桃】!\n"); break;
case 5: *duel += 1; printf("获得【决斗】!\n"); break;
case 6: *steal += 1; printf("获得【顺手牵羊】!\n"); break;
case 7: *nullify += 1; printf("获得【无中生有】!\n"); break;
case 8: *execute += 1; printf("获得【过河拆桥】!\n"); break;
case 9: *raze += 1; printf("获得【釜底抽薪】!\n"); break;
case 10: *south += 1; printf("获得【南蛮入侵】!\n"); break;
case 11: *arrow += 1; printf("获得【万箭齐发】!\n"); break; // 新增
case 12: *peach_garden += 1; printf("获得【桃园结义】!\n"); break; // 新增
default:
// 装备牌逻辑
if (*weapon == 0 && *armor == 0) {
if (rand() % 2 == 0) {
*weapon = 1;
printf("获得装备【诸葛连弩】!\n");
} else {
*armor = 1;
printf("获得装备【八卦阵】!\n");
}
}
break;
}
}
// 获取有效输入的函数
int get_valid_input(int min, int max) {
int input;
char buffer[100];
while (1) {
if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
if (sscanf(buffer, "%d", &input) == 1) {
if (input >= min && input <= max) {
return input;
}
}
}
printf("输入无效,请输入%d到%d之间的数字: ", min, max);
}
}