新三国杀
2025-08-02 15:56:47
发布于:浙江
一款DEVc++三国杀游戏(目前1.0版)希望大家提出建议
代码如下:(加了注释,方便提建议)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
// 清屏函数,根据不同操作系统自动适配
#ifdef _WIN32
#define CLEAR_SCREEN "cls"
#else
#define CLEAR_SCREEN "clear"
#endif
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; // 新增:南蛮入侵
// 装备牌状态 (0-无装备,1-有装备)
int player_weapon = 0; // 0-无,1-诸葛连弩(可出多张杀)
int player_armor = 0; // 0-无,1-八卦阵(50%自动闪避)
// 电脑牌
int computer_kill = 1;
int computer_shan = 2;
int computer_tao = 1;
// 武将选择 (1-关羽, 2-诸葛亮, 3-曹操, 4-赵云, 5-华佗)
int player_hero, computer_hero;
char* hero_names[6] = {"", "关羽", "诸葛亮", "曹操", "赵云", "华佗"};
// 初始化随机数
srand(time(0));
// 游戏欢迎界面
system(CLEAR_SCREEN);
printf("=====================================\n");
printf(" 三国杀1.0版 \n");
printf("=====================================\n");
printf("请选择武将:\n");
printf("1. 关羽: 红杀不可闪避\n");
printf("2. 诸葛亮: 每回合多摸一张牌\n");
printf("3. 曹操: 受到伤害后可获得对方一张牌\n");
printf("4. 赵云: 可将闪当杀使用,杀当闪使用\n"); // 新增武将
printf("5. 华佗: 使用桃时可额外恢复1点体力\n"); // 新增武将
printf("选择(1-5): ");
scanf("%d", &player_hero);
if (player_hero < 1 || player_hero > 5) player_hero = 1;
// 电脑随机选择武将
computer_hero = rand() % 5 + 1;
printf("电脑选择了: %s\n", hero_names[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\n",
player_duel, player_steal, player_nullify,
player_execute, player_raze, player_south);
printf("装备: %s | %s\n",
(player_weapon ? "诸葛连弩" : "无武器"),
(player_armor ? "八卦阵" : "无防具"));
printf("-------------------------------------\n");
printf("电脑 %d血\n", computer_hp);
// 玩家回合 - 武将特性
if (player_hero == 2) { // 诸葛亮
printf("\n诸葛亮特性: 多摸一张牌!\n");
int extra_card = rand() % 6;
if (extra_card == 0) player_kill++;
else if (extra_card == 1) player_thunder++;
else if (extra_card == 2) player_fire++;
else if (extra_card == 3) player_shan++;
else if (extra_card == 4) player_tao++;
else player_duel++;
}
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. 结束回合\n");
printf("选择(1-11): ");
scanf("%d", &action);
// 处理玩家行动
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 computer_dodge = (can_dodge && rand() % 2 && computer_shan > 0) ? 1 : 0;
if (computer_dodge) {
computer_shan--;
printf("电脑使用了【闪】,抵消了你的杀!\n");
} else {
computer_hp--;
printf("电脑没有出闪!电脑损失1点体力!\n");
}
// 诸葛连弩特性: 可继续出杀
if (player_weapon) {
if (player_hero == 4 && player_kill == 0) {
player_shan++; // 赵云用闪当杀时补充
} else {
player_kill++; // 补回杀
}
}
}
else if (action == 2 && player_thunder > 0) {
player_thunder--;
printf("你使用了【雷杀】!\n");
// 电脑很难闪避雷杀 (25%概率)
int computer_dodge = (rand() % 4 == 1 && computer_shan > 0) ? 1 : 0;
if (computer_dodge) {
computer_shan--;
printf("电脑侥幸使用了【闪】,抵消了你的雷杀!\n");
} else {
computer_hp--;
printf("电脑没能闪避!电脑损失1点体力!\n");
}
}
else if (action == 3 && player_fire > 0) {
player_fire--;
printf("你使用了【火杀】!\n");
// 火杀至少造成1点伤害
int damage = 1 + (rand() % 2);
computer_hp -= damage;
if (damage == 1) {
printf("电脑勉强防御了一部分伤害,损失1点体力!\n");
} else {
printf("电脑被火杀重创,损失2点体力!\n");
}
}
else if (action == 4 && player_tao > 0 && player_hp < 3) {
player_tao--;
// 华佗特性:使用桃额外恢复1点体力
int heal = (player_hero == 5) ? 2 : 1;
player_hp += heal;
if (player_hp > 3) player_hp = 3; // 血量上限3
printf("你使用了【桃】,%s恢复%d点体力!现在有%d血\n",
(player_hero == 5) ? "额外" : "", heal, player_hp);
}
else if (action == 5 && player_duel > 0) {
player_duel--;
printf("你使用了【决斗】!\n");
printf("你和电脑轮流出杀,不出杀者掉血!\n");
int duel_continue = 1;
int turn = 0; // 0-电脑回合,1-玩家回合
while (duel_continue) {
if (turn == 0) { // 电脑回合
if (rand() % 3 == 1 && computer_kill > 0) { // 电脑33%概率出杀
computer_kill--;
printf("电脑出杀应对决斗!\n");
turn = 1;
} else {
printf("电脑无法出杀!\n");
computer_hp--;
duel_continue = 0;
}
} else { // 玩家回合
int use_kill;
printf("是否出杀应对?(1-是,0-否,当前有%d个杀): ", player_kill);
scanf("%d", &use_kill);
if (use_kill == 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");
turn = 0;
} else {
printf("你无法出杀!\n");
player_hp--;
duel_continue = 0;
}
}
}
}
else if (action == 6 && player_steal > 0) {
player_steal--;
printf("你使用了【顺手牵羊】!获得电脑一张牌!\n");
// 随机获得电脑一种牌
int card_type = rand() % 3;
if (card_type == 0 && computer_shan > 0) {
computer_shan--;
player_shan++;
printf("你获得了一张【闪】!\n");
} else if (card_type == 1 && computer_tao > 0) {
computer_tao--;
player_tao++;
printf("你获得了一张【桃】!\n");
} else if (card_type == 2 && computer_kill > 0) {
computer_kill--;
player_kill++;
printf("你获得了一张【杀】!\n");
} else {
printf("电脑没有可偷的牌!\n");
}
}
else if (action == 7 && player_nullify > 0) {
player_nullify--;
printf("你使用了【无中生有】!摸两张牌!\n");
// 获得两张随机牌
for (int i = 0; i < 2; i++) {
int new_card = rand() % 7;
if (new_card == 0) { player_kill++; printf("获得【杀】!\n"); }
else if (new_card == 1) { player_thunder++; printf("获得【雷杀】!\n"); }
else if (new_card == 2) { player_fire++; printf("获得【火杀】!\n"); }
else if (new_card == 3) { player_shan++; printf("获得【闪】!\n"); }
else if (new_card == 4) { player_tao++; printf("获得【桃】!\n"); }
else if (new_card == 5) { player_duel++; printf("获得【决斗】!\n"); }
else if (new_card == 6) {
// 随机获得装备
if (player_weapon == 0 && player_armor == 0) {
if (rand() % 2 == 0) {
player_weapon = 1;
printf("获得装备【诸葛连弩】!\n");
} else {
player_armor = 1;
printf("获得装备【八卦阵】!\n");
}
}
}
}
}
// 新增锦囊:过河拆桥
else if (action == 8 && player_execute > 0) {
player_execute--;
printf("你使用了【过河拆桥】!拆掉电脑一张牌!\n");
int card_type = rand() % 3;
if (card_type == 0 && computer_shan > 0) {
computer_shan--;
printf("拆掉了电脑一张【闪】!\n");
} else if (card_type == 1 && computer_tao > 0) {
computer_tao--;
printf("拆掉了电脑一张【桃】!\n");
} else if (card_type == 2 && computer_kill > 0) {
computer_kill--;
printf("拆掉了电脑一张【杀】!\n");
} else {
printf("电脑没有可拆的牌!\n");
}
}
// 新增锦囊:釜底抽薪
else if (action == 9 && player_raze > 0) {
player_raze--;
printf("你使用了【釜底抽薪】!弃掉电脑一张手牌并造成1点伤害!\n");
int card_type = rand() % 3;
if (card_type == 0 && computer_shan > 0) {
computer_shan--;
printf("弃掉电脑一张【闪】!\n");
} else if (card_type == 1 && computer_tao > 0) {
computer_tao--;
printf("弃掉电脑一张【桃】!\n");
} else if (card_type == 2 && computer_kill > 0) {
computer_kill--;
printf("弃掉电脑一张【杀】!\n");
} else {
printf("电脑没有手牌可弃!\n");
}
computer_hp--;
printf("电脑受到1点伤害!\n");
}
// 新增锦囊:南蛮入侵
else if (action == 10 && player_south > 0) {
player_south--;
printf("你使用了【南蛮入侵】!所有角色必须出杀,否则掉血!\n");
// 电脑需要出杀
if (rand() % 3 == 1 && computer_kill > 0) {
computer_kill--;
printf("电脑出杀抵御南蛮入侵!\n");
} else {
computer_hp--;
printf("电脑无法出杀,损失1点体力!\n");
}
// 玩家也需要出杀
int use_kill;
printf("你是否出杀抵御?(1-是,0-否,当前有%d个杀): ", player_kill);
scanf("%d", &use_kill);
if (use_kill == 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");
} else {
player_hp--;
printf("你无法出杀,损失1点体力!\n");
}
}
else if (action == 11) {
printf("你结束了回合\n");
}
else {
printf("无效操作,结束回合\n");
action_success = 0;
}
// 检查电脑是否已失败
if (computer_hp <= 0) {
break;
}
// 补充手牌 (如果行动有效)
if (action_success) {
player_kill += rand() % 2; // 50%概率获得1张普通杀
if (rand() % 3 == 1) player_thunder += 1; // 33%概率获得1张雷杀
if (rand() % 4 == 1) player_fire += 1; // 25%概率获得1张火杀
if (player_shan < 3) player_shan += rand() % 2; // 最多3张闪
if (rand() % 5 == 1) player_tao += 1; // 20%概率获得1张桃
if (rand() % 8 == 1) player_duel += 1; // 低概率获得锦囊
if (rand() % 9 == 1) player_steal += 1;
if (rand() % 10 == 1) player_execute += 1;
}
// 等待用户确认后进入电脑回合
printf("\n按回车键进入电脑回合...");
getchar();
getchar(); // 处理输入缓冲区
// 电脑回合
system(CLEAR_SCREEN);
printf("----- 电脑回合 -----\n");
// 电脑行动逻辑
int computer_action = rand() % 7 + 1; // 1-7随机行动
// 电脑使用桃回血
if (computer_hp < 2 && computer_tao > 0 && rand() % 3 == 1) {
computer_tao--;
// 华佗特性
int heal = (computer_hero == 5) ? 2 : 1;
computer_hp += heal;
if (computer_hp > 3) computer_hp = 3;
printf("电脑使用了【桃】,%s恢复%d点体力!现在有%d血\n",
(computer_hero == 5) ? "额外" : "", heal, computer_hp);
}
else {
// 电脑可能使用锦囊
if (computer_hero == 2 && rand() % 5 == 1 && computer_hp < 3) {
// 诸葛亮可能使用无中生有
printf("电脑使用了【无中生有】!\n");
computer_kill += rand() % 2;
computer_shan += rand() % 2;
printf("电脑获得了一些牌!\n");
}
// 电脑攻击
else {
int attack_type = rand() % 3 + 1;
if (attack_type == 1) {
printf("电脑向你使用了【杀】!\n");
} else if (attack_type == 2) {
printf("电脑向你使用了【雷杀】!\n");
} else {
printf("电脑向你使用了【火杀】!\n");
}
// 玩家选择是否防御,八卦阵特性: 50%自动闪避
int player_dodge = 0;
if (player_armor && rand() % 2 == 1) {
printf("八卦阵发动!自动闪避成功!\n");
player_dodge = 1;
} else {
int player_action;
// 赵云可以用杀当闪
if (player_hero == 4) {
printf("是否使用【闪】或【杀】防御?(1-是,0-否,闪:%d 杀:%d): ",
player_shan, player_kill);
} else {
printf("是否使用【闪】防御?(1-是,0-否,当前有%d个): ", player_shan);
}
scanf("%d", &player_action);
if (player_action == 1) {
// 赵云特性:杀可以当闪
if (player_hero == 4 && player_shan == 0 && player_kill > 0) {
player_kill--;
printf("赵云特性: 用杀当闪使用!\n");
player_dodge = 1;
} else if (player_shan > 0) {
player_shan--;
player_dodge = 1;
printf("你使用了【闪】,抵消了电脑的攻击!\n");
}
}
}
// 处理不同攻击的防御结果
int damage = 0;
if (!player_dodge) {
if (attack_type == 3) { // 火杀
damage = 1 + (rand() % 2);
printf("你被火杀击中,损失%d点体力!\n", damage);
} else { // 普通杀或雷杀
damage = 1;
printf("你没有出闪!损失1点体力!\n");
}
player_hp -= damage;
// 曹操特性: 受到伤害后获得对方一张牌
if (player_hero == 3 && damage > 0) {
printf("曹操特性: 获得对方一张牌!\n");
player_kill++;
}
}
// 确保血量不会低于0
if (player_hp < 0) player_hp = 0;
printf("你现在有%d血\n", player_hp);
// 如果血量为0,询问是否用桃
if (player_hp == 0 && player_tao > 0) {
printf("是否使用【桃】回血?(1-是,0-否): ");
int use_tao;
scanf("%d", &use_tao);
if (use_tao == 1) {
player_tao--;
// 华佗特性
int heal = (player_hero == 5) ? 2 : 1;
player_hp += heal;
printf("你使用了【桃】,恢复%d点体力!\n", heal);
}
}
}
}
// 电脑补充手牌
computer_kill += rand() % 2;
computer_shan += rand() % 2;
if (computer_shan > 3) computer_shan = 3;
if (rand() % 5 == 1) computer_tao++;
// 回合结束,准备进入下一轮
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;
}
全部评论 1
上面那堆也算,不要忘了
4小时前 来自 浙江
0
有帮助,赞一个