不好玩(AI楚新钓)
2026-07-19 19:17:34
发布于:广东
/*
- 楚新钓鱼 - 98版C++兼容版本
- 编译环境: VC++ 6.0 / Turbo C++ 3.0 / Borland C++ 5.5
- 编译命令: cl chuxin_fishing.cpp 或 tcc chuxin_fishing.cpp
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
/* ========== 常量定义 ========== */
#define MAX_LEVEL 10000
#define MAX_MAPS 4
#define MAX_RODS 4
#define MAX_TECHNIQUES 4
#define MAX_FISH_TYPES 12
#define MAX_QUESTS 5
#define NAME_LEN 32
/* ========== 数据结构 ========== */
/* 鱼种定义 /
typedef struct {
char name[NAME_LEN];
int min_level; / 角色最低等级可钓 /
int base_value; / 基础价值(金币) /
int difficulty; / 难度系数 1-100 /
int map_id; / 所属地图ID */
} Fish;
/* 地图定义 /
typedef struct {
char name[NAME_LEN];
int unlock_level; / 解锁所需角色等级 /
int fish_count; / 该地图鱼种数量 /
int fish_indices[MAX_FISH_TYPES]; / 鱼种索引 */
} Map;
/* 鱼竿定义 /
typedef struct {
char name[NAME_LEN];
int price; / 购买价格 /
int power_bonus; / 钓力加成 /
int luck_bonus; / 幸运加成 */
} Rod;
/* 钓法定义 /
typedef struct {
char name[NAME_LEN];
int level; / 当前等级 /
int success_bonus; / 成功率加成% /
int value_bonus; / 鱼获价值加成% */
} Technique;
/* 任务定义 /
typedef struct {
char desc[64];
int target_fish_id; / 目标鱼种索引,-1表示任意 /
int target_count; / 目标数量 /
int current_count; / 当前进度 /
int reward_gold; / 金币奖励 /
int reward_exp; / 经验奖励 /
int completed; / 是否已完成 */
} Quest;
/* 玩家数据 /
typedef struct {
char name[NAME_LEN];
int level;
long exp;
long gold;
int current_rod; / 当前装备鱼竿索引 /
int current_technique; / 当前使用钓法索引 /
int current_map; / 当前所在地图 /
int rods_owned[MAX_RODS]; / 已拥有鱼竿标记 */
int total_fish_caught;
int fish_caught_by_type[MAX_FISH_TYPES];
} Player;
/* ========== 全局数据 ========== */
Fish g_fishes[MAX_FISH_TYPES] = {
{"小鲫鱼", 1, 10, 20, 0},
{"草鱼", 1, 25, 35, 0},
{"鲤鱼", 5, 50, 45, 0},
{"青鱼", 10, 80, 55, 1},
{"鲢鱼", 15, 120, 60, 1},
{"黑鱼", 20, 200, 70, 1},
{"鲈鱼", 30, 350, 75, 2},
{"鳜鱼", 40, 500, 80, 2},
{"黄颡鱼", 50, 800, 85, 2},
{"中华鲟", 100, 2000, 90, 3},
{"金鲤鱼", 200, 5000, 95, 3},
{"楚新神鱼", 500, 20000,99, 3}
};
Map g_maps[MAX_MAPS] = {
{"新手池塘", 1, 3, {0, 1, 2}},
{"青溪河", 5, 3, {3, 4, 5}},
{"洞庭湖", 30, 3, {6, 7, 8}},
{"楚新秘境", 100, 3, {9, 10, 11}}
};
Rod g_rods[MAX_RODS] = {
{"竹制鱼竿", 0, 0, 0},
{"碳素鱼竿", 500, 10, 5},
{"钛合金鱼竿", 3000, 25, 15},
{"楚新神竿", 20000, 50, 30}
};
Technique g_techniques[MAX_TECHNIQUES] = {
{"基础抛竿", 1, 0, 0},
{"沉底钓法", 1, 5, 10},
{"浮钓技法", 1, 10, 20},
{"楚新秘钓", 1, 20, 50}
};
Quest g_quests[MAX_QUESTS];
Player g_player;
/* ========== 函数声明 ========== */
void init_game(void);
void init_quests(void);
void show_main_menu(void);
void show_status(void);
void go_fishing(void);
void upgrade_character(void);
void upgrade_technique(void);
void buy_rod(void);
void switch_map(void);
void switch_rod(void);
void switch_technique(void);
void show_quests(void);
void do_lottery(void);
void show_help(void);
int calc_exp_needed(int level);
int roll_fish(int map_id, int rod_idx, int tech_idx);
void complete_quest_check(void);
/* ========== 主函数 ========== */
int main(void) {
srand((unsigned)time(NULL));
init_game();
while (1) {
show_main_menu();
}
return 0;
}
/* ========== 核心逻辑 ========== */
void init_game(void) {
strcpy(g_player.name, "楚新钓手");
g_player.level = 1;
g_player.exp = 0;
g_player.gold = 100;
g_player.current_rod = 0;
g_player.current_technique = 0;
g_player.current_map = 0;
g_player.total_fish_caught = 0;
memset(g_player.rods_owned, 0, sizeof(g_player.rods_owned));
g_player.rods_owned[0] = 1; /* 初始拥有竹制鱼竿 */
memset(g_player.fish_caught_by_type, 0, sizeof(g_player.fish_caught_by_type));
init_quests();
printf("\n========================================\n");
printf(" 欢迎进入《楚新钓鱼》世界!\n");
printf("========================================\n");
printf("提示: 输入对应数字选择功能, 0退出游戏\n\n");
}
void init_quests(void) {
/* 初始化5个循环任务 */
strcpy(g_quests[0].desc, "钓5条小鲫鱼");
g_quests[0].target_fish_id = 0;
g_quests[0].target_count = 5;
g_quests[0].current_count = 0;
g_quests[0].reward_gold = 50;
g_quests[0].reward_exp = 30;
g_quests[0].completed = 0;
strcpy(g_quests[1].desc, "钓3条草鱼");
g_quests[1].target_fish_id = 1;
g_quests[1].target_count = 3;
g_quests[1].current_count = 0;
g_quests[1].reward_gold = 80;
g_quests[1].reward_exp = 50;
g_quests[1].completed = 0;
strcpy(g_quests[2].desc, "累计钓10条鱼");
g_quests[2].target_fish_id = -1;
g_quests[2].target_count = 10;
g_quests[2].current_count = 0;
g_quests[2].reward_gold = 100;
g_quests[2].reward_exp = 80;
g_quests[2].completed = 0;
strcpy(g_quests[3].desc, "钓2条鲤鱼");
g_quests[3].target_fish_id = 2;
g_quests[3].target_count = 2;
g_quests[3].current_count = 0;
g_quests[3].reward_gold = 150;
g_quests[3].reward_exp = 100;
g_quests[3].completed = 0;
strcpy(g_quests[4].desc, "钓1条青鱼");
g_quests[4].target_fish_id = 3;
g_quests[4].target_count = 1;
g_quests[4].current_count = 0;
g_quests[4].reward_gold = 200;
g_quests[4].reward_exp = 150;
g_quests[4].completed = 0;
}
int calc_exp_needed(int level) {
/* 升级所需经验: 等级*100, 满级后返回极大值 */
if (level >= MAX_LEVEL) return 999999999;
return level * 100;
}
void show_status(void) {
printf("\n--- 角色状态 ---\n");
printf("姓名: %s 等级: %d/%d\n", g_player.name, g_player.level, MAX_LEVEL);
printf("经验: %ld/%d 金币: %ld\n", g_player.exp, calc_exp_needed(g_player.level), g_player.gold);
printf("地图: %s 鱼竿: %s 钓法: %s(Lv.%d)\n",
g_maps[g_player.current_map].name,
g_rods[g_player.current_rod].name,
g_techniques[g_player.current_technique].name,
g_techniques[g_player.current_technique].level);
printf("总渔获: %d 条\n", g_player.total_fish_caught);
printf("----------------\n");
}
void show_main_menu(void) {
show_status();
printf("\n=== 主菜单 ===\n");
printf("1. 开始钓鱼\n");
printf("2. 升级角色 (金币)\n");
printf("3. 升级钓法 (金币)\n");
printf("4. 购买/切换鱼竿\n");
printf("5. 切换地图\n");
printf("6. 切换钓法\n");
printf("7. 查看任务\n");
printf("8. 幸运抽奖\n");
printf("9. 帮助说明\n");
printf("0. 退出游戏\n");
printf("请选择: ");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1: go_fishing(); break;
case 2: upgrade_character(); break;
case 3: upgrade_technique(); break;
case 4: buy_rod(); break;
case 5: switch_map(); break;
case 6: switch_technique(); break;
case 7: show_quests(); break;
case 8: do_lottery(); break;
case 9: show_help(); break;
case 0:
printf("感谢游玩《楚新钓鱼》, 再见!\n");
exit(0);
default:
printf("无效选择, 请重新输入!\n");
break;
}
}
/* 钓鱼核心逻辑 */
void go_fishing(void) {
Map *cur_map = &g_maps[g_player.current_map];
Rod *cur_rod = &g_rods[g_player.current_rod];
Technique *cur_tech = &g_techniques[g_player.current_technique];
/* 检查地图解锁 */
if (g_player.level < cur_map->unlock_level) {
printf("等级不足! 需要等级%d才能进入%s\n", cur_map->unlock_level, cur_map->name);
return;
}
printf("\n在%s使用%s和%s钓鱼...\n", cur_map->name, cur_rod->name, cur_tech->name);
printf("抛竿... 等待咬钩... ");
/* 随机决定钓到的鱼 */
int fish_idx = roll_fish(g_player.current_map, g_player.current_rod, g_player.current_technique);
if (fish_idx < 0) {
printf("脱钩了! 再试一次吧.\n");
return;
}
Fish *fish = &g_fishes[fish_idx];
/* 计算实际价值和经验 */
int value = fish->base_value;
value = value * (100 + cur_tech->value_bonus) / 100;
value = value * (100 + cur_rod->luck_bonus) / 100;
int exp_gain = value / 5;
if (exp_gain < 1) exp_gain = 1;
/* 更新玩家数据 */
g_player.gold += value;
g_player.exp += exp_gain;
g_player.total_fish_caught++;
g_player.fish_caught_by_type[fish_idx]++;
printf("钓到了 [%s]! 价值:%d金币 经验:+%d\n", fish->name, value, exp_gain);
/* 升级检查 */
while (g_player.exp >= calc_exp_needed(g_player.level) && g_player.level < MAX_LEVEL) {
g_player.exp -= calc_exp_needed(g_player.level);
g_player.level++;
printf(">>> 恭喜升级! 当前等级: %d <<<\n", g_player.level);
}
if (g_player.level >= MAX_LEVEL) {
printf(">>> 已达满级 %d! <<<\n", MAX_LEVEL);
}
/* 任务进度检查 */
complete_quest_check();
}
int roll_fish(int map_id, int rod_idx, int tech_idx) {
Map *map = &g_maps[map_id];
Rod *rod = &g_rods[rod_idx];
Technique *tech = &g_techniques[tech_idx];
/* 基础成功率 */
int base_success = 60 + tech->success_bonus + rod->power_bonus / 2;
if (base_success > 95) base_success = 95;
int roll = rand() % 100;
if (roll >= base_success) {
return -1; /* 脱钩 */
}
/* 从当前地图鱼种中随机选择 */
int fish_count = map->fish_count;
int selected = rand() % fish_count;
int fish_idx = map->fish_indices[selected];
/* 等级检查: 如果等级不够钓这条鱼, 降级为同地图最低等级鱼 */
if (g_player.level < g_fishes[fish_idx].min_level) {
fish_idx = map->fish_indices[0];
}
return fish_idx;
}
void complete_quest_check(void) {
int i;
for (i = 0; i < MAX_QUESTS; i++) {
if (g_quests[i].completed) continue;
int done = 0;
if (g_quests[i].target_fish_id == -1) {
/* 任意鱼 */
if (g_player.total_fish_caught >= g_quests[i].target_count) {
g_quests[i].current_count = g_player.total_fish_caught;
done = 1;
}
} else {
/* 指定鱼种 */
int caught = g_player.fish_caught_by_type[g_quests[i].target_fish_id];
if (caught >= g_quests[i].target_count) {
g_quests[i].current_count = caught;
done = 1;
}
}
if (done) {
g_quests[i].completed = 1;
g_player.gold += g_quests[i].reward_gold;
g_player.exp += g_quests[i].reward_exp;
printf(">>> 任务完成: %s! 奖励:%d金币 +%d经验 <<<\n",
g_quests[i].desc, g_quests[i].reward_gold, g_quests[i].reward_exp);
/* 检查升级 */
while (g_player.exp >= calc_exp_needed(g_player.level) && g_player.level < MAX_LEVEL) {
g_player.exp -= calc_exp_needed(g_player.level);
g_player.level++;
printf(">>> 恭喜升级! 当前等级: %d <<<\n", g_player.level);
}
}
}
}
/* 升级角色 */
void upgrade_character(void) {
if (g_player.level >= MAX_LEVEL) {
printf("已达满级 %d, 无法继续升级!\n", MAX_LEVEL);
return;
}
int cost = g_player.level * 50;
printf("升级角色需金币: %d (当前: %ld)\n", cost, g_player.gold);
printf("确认升级? (1=是, 0=否): ");
int confirm;
scanf("%d", &confirm);
if (confirm != 1) return;
if (g_player.gold < cost) {
printf("金币不足!\n");
return;
}
g_player.gold -= cost;
g_player.exp += calc_exp_needed(g_player.level); /* 直接给够升级经验 */
while (g_player.exp >= calc_exp_needed(g_player.level) && g_player.level < MAX_LEVEL) {
g_player.exp -= calc_exp_needed(g_player.level);
g_player.level++;
printf(">>> 升级成功! 当前等级: %d <<<\n", g_player.level);
}
}
/* 升级钓法 */
void upgrade_technique(void) {
printf("\n--- 钓法列表 ---\n");
int i;
for (i = 0; i < MAX_TECHNIQUES; i++) {
printf("%d. %s (Lv.%d/%d) 成功率+%d%% 价值+%d%%\n",
i + 1,
g_techniques[i].name,
g_techniques[i].level,
MAX_LEVEL,
g_techniques[i].success_bonus,
g_techniques[i].value_bonus);
}
printf("0. 返回\n");
printf("选择要升级的钓法: ");
int choice;
scanf("%d", &choice);
if (choice < 1 || choice > MAX_TECHNIQUES) return;
int idx = choice - 1;
if (g_techniques[idx].level >= MAX_LEVEL) {
printf("该钓法已达满级!\n");
return;
}
int cost = g_techniques[idx].level * 100;
printf("升级%s需金币: %d (当前: %ld)\n", g_techniques[idx].name, cost, g_player.gold);
printf("确认升级? (1=是, 0=否): ");
int confirm;
scanf("%d", &confirm);
if (confirm != 1) return;
if (g_player.gold < cost) {
printf("金币不足!\n");
return;
}
g_player.gold -= cost;
g_techniques[idx].level++;
g_techniques[idx].success_bonus = g_techniques[idx].level / 5;
g_techniques[idx].value_bonus = g_techniques[idx].level / 2;
printf("%s 升级至 Lv.%d! 成功率+%d%% 价值+%d%%\n",
g_techniques[idx].name,
g_techniques[idx].level,
g_techniques[idx].success_bonus,
g_techniques[idx].value_bonus);
}
/* 购买/切换鱼竿 */
void buy_rod(void) {
printf("\n--- 鱼竿列表 ---\n");
int i;
for (i = 0; i < MAX_RODS; i++) {
printf("%d. %s (价格:%d金币) 钓力+%d 幸运+%d [%s]\n",
i + 1,
g_rods[i].name,
g_rods[i].price,
g_rods[i].power_bonus,
g_rods[i].luck_bonus,
g_player.rods_owned[i] ? "已拥有" : "未购买");
}
printf("0. 返回\n");
printf("请选择 (购买或切换): ");
int choice;
scanf("%d", &choice);
if (choice < 1 || choice > MAX_RODS) return;
int idx = choice - 1;
/* 如果已拥有,直接切换 */
if (g_player.rods_owned[idx]) {
g_player.current_rod = idx;
printf("已切换为: %s\n", g_rods[idx].name);
return;
}
/* 未拥有,尝试购买 */
if (g_player.gold < g_rods[idx].price) {
printf("金币不足! 需要 %d 金币\n", g_rods[idx].price);
return;
}
g_player.gold -= g_rods[idx].price;
g_player.rods_owned[idx] = 1;
g_player.current_rod = idx;
printf("购买成功! 已装备: %s\n", g_rods[idx].name);
}
/* 切换地图 */
void switch_map(void) {
printf("\n--- 地图列表 ---\n");
int i;
for (i = 0; i < MAX_MAPS; i++) {
printf("%d. %s (解锁等级:%d) [%s]\n",
i + 1,
g_maps[i].name,
g_maps[i].unlock_level,
g_player.level >= g_maps[i].unlock_level ? "可进入" : "未解锁");
}
printf("0. 返回\n");
printf("请选择: ");
int choice;
scanf("%d", &choice);
if (choice < 1 || choice > MAX_MAPS) return;
int idx = choice - 1;
if (g_player.level < g_maps[idx].unlock_level) {
printf("等级不足! 需要等级 %d 才能进入 %s\n", g_maps[idx].unlock_level, g_maps[idx].name);
return;
}
g_player.current_map = idx;
printf("已前往: %s\n", g_maps[idx].name);
}
/* 切换钓法 */
void switch_technique(void) {
printf("\n--- 钓法列表 ---\n");
int i;
for (i = 0; i < MAX_TECHNIQUES; i++) {
printf("%d. %s (Lv.%d) 成功率+%d%% 价值+%d%%\n",
i + 1,
g_techniques[i].name,
g_techniques[i].level,
g_techniques[i].success_bonus,
g_techniques[i].value_bonus);
}
printf("0. 返回\n");
printf("请选择: ");
int choice;
scanf("%d", &choice);
if (choice < 1 || choice > MAX_TECHNIQUES) return;
int idx = choice - 1;
g_player.current_technique = idx;
printf("已切换为: %s\n", g_techniques[idx].name);
}
/* 查看任务 */
void show_quests(void) {
printf("\n--- 任务列表 ---\n");
int i;
for (i = 0; i < MAX_QUESTS; i++) {
printf("%d. %s\n", i + 1, g_quests[i].desc);
if (g_quests[i].completed) {
printf(" [已完成]\n");
} else {
printf(" 进度: %d/%d | 奖励: %d金币 +%d经验\n",
g_quests[i].current_count,
g_quests[i].target_count,
g_quests[i].reward_gold,
g_quests[i].reward_exp);
}
}
printf("0. 返回\n");
printf("请选择: ");
int choice;
scanf("%d", &choice);
}
/* 幸运抽奖 */
void do_lottery(void) {
int cost = 100;
printf("\n=== 幸运抽奖 ===\n");
printf("抽奖消耗: %d金币\n", cost);
printf("当前金币: %ld\n", g_player.gold);
printf("1. 抽奖一次\n");
printf("0. 返回\n");
printf("请选择: ");
int choice;
scanf("%d", &choice);
if (choice != 1) return;
if (g_player.gold < cost) {
printf("金币不足!\n");
return;
}
g_player.gold -= cost;
int roll = rand() % 100;
int reward_gold = 0;
int reward_exp = 0;
char result[64];
if (roll < 5) { /* 5% 大奖 */
reward_gold = 1000;
reward_exp = 500;
strcpy(result, "【特等奖】运气爆棚!");
} else if (roll < 15) { /* 10% 一等奖 */
reward_gold = 500;
reward_exp = 200;
strcpy(result, "【一等奖】恭喜发财!");
} else if (roll < 35) { /* 20% 二等奖 */
reward_gold = 200;
reward_exp = 100;
strcpy(result, "【二等奖】小赚一笔!");
} else if (roll < 60) { /* 25% 三等奖 */
reward_gold = 50;
reward_exp = 50;
strcpy(result, "【三等奖】安慰奖~");
} else { /* 40% 未中奖 */
strcpy(result, "【未中奖】再接再厉!");
}
g_player.gold += reward_gold;
g_player.exp += reward_exp;
printf("抽奖结果: %s 获得金币:%d 经验:%d\n", result, reward_gold, reward_exp);
/* 检查升级 */
while (g_player.exp >= calc_exp_needed(g_player.level) && g_player.level < MAX_LEVEL) {
g_player.exp -= calc_exp_needed(g_player.level);
g_player.level++;
printf(">>> 恭喜升级! 当前等级: %d <<<\n", g_player.level);
}
}
/* 帮助说明 */
void show_help(void) {
printf("\n=== 游戏帮助 =\n");
printf("1. 钓鱼: 消耗时间获取金币和经验\n");
printf("2. 升级角色: 消耗金币直接提升等级\n");
printf("3. 升级钓法: 消耗金币提升钓法等级,增加成功率和鱼获价值\n");
printf("4. 鱼竿: 购买更好的鱼竿增加钓力和幸运值\n");
printf("5. 地图: 高等级解锁新地图,钓更珍贵的鱼\n");
printf("6. 任务: 完成指定钓鱼目标获取额外奖励\n");
printf("7. 抽奖: 消耗100金币随机获取金币和经验\n");
printf("8. 满级: 角色和钓法满级均为 %d 级\n", MAX_LEVEL);
printf("==============\n");
printf("按回车键返回...");
getchar(); getchar();
}
这里空空如也


















有帮助,赞一个