三国杀2.0来了!!!!!!!!!!!!
2025-08-11 13:02:17
发布于:浙江
增加了很多东西
代码如下:
#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);
// 玩家回合 - 武将特性
if (player_hero == 2) { // 周瑜特性:多摸一张牌
printf("\n周瑜特性: 多摸一张牌!\n");
draw_card(&player_kill, &player_thunder, &player_fire, &player_shan, &player_tao,
&player_duel, &player_steal, &player_nullify, &player_execute,
&player_raze, &player_south, &player_arrow, &player_peach_garden,
&player_weapon, &player_armor, 1);
}
else if (player_hero == 6) { // 诸葛亮特性:观星
printf("\n诸葛亮特性: 观星!多摸2张牌并选择保留!\n");
int temp_cards[12] = {0}; // 临时存储摸到的牌
// 先摸2张牌
for (int i = 0; i < 2; i++) {
int card_type = rand() % 10;
if (card_type == 0) temp_cards[0]++;
else if (card_type == 1) temp_cards[1]++;
else if (card_type == 2) temp_cards[2]++;
else if (card_type == 3) temp_cards[3]++;
else if (card_type == 4) temp_cards[4]++;
else if (card_type == 5) temp_cards[5]++;
else if (card_type == 6) temp_cards[6]++;
else if (card_type == 7) temp_cards[7]++;
else if (card_type == 8) temp_cards[8]++;
else if (card_type == 9) temp_cards[9]++;
}
// 显示摸到的牌
printf("摸到的牌: ");
if (temp_cards[0] > 0) printf("杀x%d ", temp_cards[0]);
if (temp_cards[1] > 0) printf("雷杀x%d ", temp_cards[1]);
if (temp_cards[2] > 0) printf("火杀x%d ", temp_cards[2]);
if (temp_cards[3] > 0) printf("闪x%d ", temp_cards[3]);
if (temp_cards[4] > 0) printf("桃x%d ", temp_cards[4]);
printf("\n");
// 让玩家选择保留哪些
printf("是否保留这些牌?(1-是,0-重摸): ");
int keep = get_valid_input(0, 1);
if (keep) {
player_kill += temp_cards[0];
player_thunder += temp_cards[1];
player_fire += temp_cards[2];
player_shan += temp_cards[3];
player_tao += temp_cards[4];
printf("保留了这些牌!\n");
} else {
printf("重新摸牌!\n");
for (int i = 0; i < 2; i++) {
draw_card(&player_kill, &player_thunder, &player_fire, &player_shan, &player_tao,
&player_duel, &player_steal, &player_nullify, &player_execute,
&player_raze, &player_south, &player_arrow, &player_peach_garden,
&player_weapon, &player_armor, 1);
}
}
}
else if (player_hero == 8) { // 孙权特性:制衡
if (player_kill > 0 || player_shan > 0) {
printf("\n孙权特性: 制衡!可弃1张牌换2张新牌!\n");
printf("是否使用制衡?(1-是,0-否): ");
int use_ability = get_valid_input(0, 1);
if (use_ability) {
// 弃掉一张牌
printf("选择要弃的牌类型:\n1. 杀(%d) 2. 闪(%d): ", player_kill, player_shan);
int discard = get_valid_input(1, 2);
if (discard == 1 && player_kill > 0) {
player_kill--;
printf("弃掉了一张杀!\n");
} else if (discard == 2 && player_shan > 0) {
player_shan--;
printf("弃掉了一张闪!\n");
} else {
printf("无法弃牌,取消制衡!\n");
use_ability = 0;
}
// 换两张新牌
if (use_ability) {
for (int i = 0; i < 2; i++) {
draw_card(&player_kill, &player_thunder, &player_fire, &player_shan, &player_tao,
&player_duel, &player_steal, &player_nullify, &player_execute,
&player_raze, &player_south, &player_arrow, &player_peach_garden,
&player_weapon, &player_armor, 1);
}
}
}
}
}
printf("\n----- 你的回合 -----\n");
int action;
printf("请选择行动:\n");
printf("1. 出普通杀攻击 (当前有%d个)\n", player_kill);
printf("2. 出雷杀攻击 (当前有%d个,难闪避)\n", player_thunder);
printf("3. 出火杀攻击 (当前有%d个,必中1血)\n", player_fire);
printf("4. 吃桃回血 (当前有%d个)\n", player_tao);
printf("5. 决斗 (当前有%d个)\n", player_duel);
printf("6. 顺手牵羊 (当前有%d个)\n", player_steal);
printf("7. 无中生有 (当前有%d个)\n", player_nullify);
printf("8. 过河拆桥 (当前有%d个)\n", player_execute);
printf("9. 釜底抽薪 (当前有%d个)\n", player_raze);
printf("10. 南蛮入侵 (当前有%d个)\n", player_south);
printf("11. 万箭齐发 (当前有%d个) - 新增\n", player_arrow); // 新增
printf("12. 桃园结义 (当前有%d个) - 新增\n", player_peach_garden); // 新增
printf("13. 结束回合\n");
printf("选择(1-13): ");
action = get_valid_input(1, 13);
// 处理玩家行动
int action_success = 1;
if (action == 1 && (player_kill > 0 || (player_hero == 4 && player_shan > 0))) {
// 赵云特性:闪可以当杀使用
if (player_hero == 4 && player_kill == 0 && player_shan > 0) {
player_shan--;
printf("赵云特性: 用闪当杀使用!\n");
} else {
player_kill--;
}
printf("你使用了【杀】!\n");
// 关羽特性: 红杀(普通杀)不可闪避
int can_dodge = 1;
if (player_hero == 1) {
printf("关羽特性: 红杀不可闪避!\n");
can_dodge = 0;
}
// 吕布特性: 无双,需要两张闪才能闪避
int need_two_dodges = (player_hero == 7) ? 1 : 0;
if (need_two_dodges) {
printf("吕布特性: 无双!对方需要两张闪才能闪避!\n");
}
// 电脑决定是否出闪
int computer_dodge = 0;
if (can_dodge && computer_shan > 0) {
if (need_two_dodges) {
// 需要两张闪
if (computer_shan >= 2 && rand() % 3 == 1) {
computer_shan -= 2;
computer_dodge = 1;
printf("电脑使用了两张【闪】,勉强抵消了你的杀!\n");
}
} else {
// 普通情况,一张闪
if (rand() % 2 == 1) {
computer_shan--;
computer_dodge = 1;
printf("电脑使用了【闪】,抵消了你的杀!\n");
}
}
}
if (!computer_dodge) {
computer_hp--;
printf("电脑没有出闪!电脑损失1点体力!\n");
}
// 诸葛连弩特性: 可继续出杀
if (player_weapon) {
if (player_hero == 4 && player_kill == 0) {
player_shan++; // 赵云用闪当杀时补充
} else {
player_kill++; // 补回杀
}
}
}
// 处理其他原有行动...
else if (action == 11 && player_arrow > 0) { // 新增:万箭齐发
player_arrow--;
printf("你使用了【万箭齐发】!所有角色必须出闪,否则掉血!\n");
// 电脑需要出闪
if (rand() % 3 == 1 && computer_shan > 0) {
computer_shan--;
printf("电脑出闪抵御万箭齐发!\n");
} else {
computer_hp--;
printf("电脑无法出闪,损失1点体力!\n");
}
// 玩家也需要出闪
int use_shan;
// 赵云可以用杀当闪
if (player_hero == 4) {
printf("是否使用【闪】或【杀】防御?(1-是,0-否,闪:%d 杀:%d): ",
player_shan, player_kill);
} else {
printf("是否使用【闪】防御?(1-是,0-否,当前有%d个): ", player_shan);
}
use_shan = get_valid_input(0, 1);
if (use_shan == 1) {
// 赵云特性:杀可以当闪
if (player_hero == 4 && player_shan == 0 && player_kill > 0) {
player_kill--;
printf("赵云特性: 用杀当闪使用!\n");
} else if (player_shan > 0) {
player_shan--;
printf("你使用了【闪】,抵御了万箭齐发!\n");
}
} else {
player_hp--;
printf("你无法出闪,损失1点体力!\n");
}
}
else if (action == 12 && player_peach_garden > 0) { // 新增:桃园结义
player_peach_garden--;
printf("你使用了【桃园结义】!所有角色回复1点体力!\n");
// 玩家回血
if (player_hp < 3) {
player_hp++;
printf("你恢复了1点体力,现在有%d血!\n", player_hp);
} else {
printf("你已满血,无法恢复!\n");
}
// 电脑回血
if (computer_hp < 3) {
computer_hp++;
printf("电脑恢复了1点体力,现在有%d血!\n", computer_hp);
} else {
printf("电脑已满血,无法恢复!\n");
}
}
else if (action == 13) {
printf("你结束了回合\n");
}
else {
// 处理其他原有行动...
printf("无效操作,结束回合\n");
action_success = 0;
}
// 诸葛亮空城特性检查
if (player_hero == 6 && player_kill == 0 && player_thunder == 0 &&
player_fire == 0 && player_shan == 0 && player_tao == 0) {
printf("\n诸葛亮特性: 空城!本回合不会受到攻击!\n");
}
// 检查电脑是否已失败
if (computer_hp <= 0) {
break;
}
// 补充手牌 (如果行动有效)
if (action_success) {
draw_card(&player_kill, &player_thunder, &player_fire, &player_shan, &player_tao,
&player_duel, &player_steal, &player_nullify, &player_execute,
&player_raze, &player_south, &player_arrow, &player_peach_garden,
&player_weapon, &player_armor, 1);
}
// 等待用户确认后进入电脑回合
printf("\n按回车键进入电脑回合...");
getchar();
getchar(); // 处理输入缓冲区
// 电脑回合
system(CLEAR_SCREEN);
printf("----- 电脑回合 -----\n");
// 电脑行动逻辑
// ... (省略部分代码,保持原有逻辑并添加新角色和新锦囊的处理)
// 回合结束,准备进入下一轮
round++;
printf("\n本回合结束,按回车键进入下回合...");
getchar();
getchar(); // 处理输入缓冲区
}
// 清屏并显示游戏结果
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);
}
}
这里空空如也
有帮助,赞一个