这是我大二下学期借着课设的机会,花了一个月的时间用c++做的模仿星露谷的游戏。
已实现钓鱼,挖矿,打怪,玩家,背包,npc,时间,存档读档这八大系统,基本实现了游戏的底层逻辑。
全程个人开发,ai辅助,总之还是相当有成就感的!
一、 题目要求
这是以星露谷物语这一游戏为方向开发的游戏,此为一个像素风的RGB游戏,现已实现钓鱼,挖矿,打怪,玩家,背包,npc,时间,存档读档这八大系统。
1. 背包系统
a) 背包内的道具类型主要分为三大类:消耗品,装备,材料
b) 消耗/获取道具,道具可自动堆叠
c) 绘制背包页面,在左上角显示背包界面,显示各个已有道具图片和数量
d) 鼠标点击背包中的道具会显示高亮,表示现在持有
2. 钓鱼系统:
a) 拿着钓鱼竿道具左键则会进入钓鱼小游戏界面。
b) 通过玩家快速点击或长按实现“钓鱼条”的垂直移动
c) 鱼的行为AI:鱼会根据预设曲线垂直移动,鱼的速度与玩家钓鱼等级有关
d) 实时检测钓鱼条与鱼图标的碰撞(矩形或圆形碰撞检测),成功则填充捕获进度条。捕获进度条则钓鱼成功,在十种鱼里面随机选取一种进入背包。
3. 挖矿系统
a) 现在设置了四层矿洞,每次进入矿洞,矿石的种类和位置都会根据当前层数随机生成
b) 持有稿子道具靠近并点击对应矿石进行挖矿,此动作消耗矿石耐度条,矿石耐度条清零时,矿石消失,玩家根据玩家挖矿等级和矿石种类概率获得矿物
c) 挖矿动作消耗玩家耐力条,玩家耐力条清零时挖不了矿
4. 打怪系统
a) 在每层矿洞中都会出现怪物,每次进入矿洞时自动随机生成。每层的怪物机制和类型也不同,有些可以无视地形,有些可以发射光弹
b) 每层怪物的血量和攻击造成的伤害也不相同,怪物攻击玩家,玩家会扣除相应血量,玩家血量清零时,显示死亡界面,传送回家,并且能量条减半
c) 玩家拿着剑道具靠近怪物点击怪物,则会对怪物造成伤害,伤害量与玩家打怪等级有关
5. 玩家
a) 玩家UI包括血量和能量会以进度条的形式显示在屏幕右下角
b) 按下q键显示人物面板,包括人物打怪,钓鱼,挖矿技能的等级及经验条,它们颜色不同
c) 玩家在屏幕中随着地图移动会尽量显示在视觉中心
6. Npc系统
a) 游戏中加载了12个npc,可以给npc对话和送礼,左键对话右键送礼,当然送礼时需保证手中有物品
b) 对话和送礼时都会显示人物对话框和头像框
c) 人物好感界面,按g显示,左键翻面,人物好感不同,显示的颜色不同。对话和送礼都会加好感,送的礼物不同加的好感不同,讨厌的礼物会减好感。
7. 时间系统
a) 时间UI包括当前游戏中时间和季节图片会显示在屏幕右上角,不同季节显示的图片不同
b) 根据时间调整游戏内亮度
c) 凌晨两点必须睡觉,如果这个时间还在野外,会自动晕倒并掉落一定道具
d) 在自己加靠近床,按z键就能睡觉,睡觉则在当前挡位自动存档
8. 存档读档系统
a) 在首页可以选择创建存档或者读档,读取玩家,背包,npc,时间等一系列信息
b) 睡觉时自动在当前档位存档
二、程序的设计
总体设计结构

1. 背包系统
结构体
struct Item {
int id; // 道具唯一标识
HBITMAP icon; // 图标位图(正常尺寸)
HBITMAP icon1; // 备用图标(可能用于不同状态)
std::wstring name; // 道具名称(宽字符支持多语言)
int count; // 堆叠数量
int type; // 道具类型(ItemType枚举)
std::string resourcePath; // 资源文件路径(用于动态加载)
};
类图:

2. npc系统
结构体
class NPC {
string name; // NPC名称
int x, y; // 世界坐标位置
int friendship; // 好感度(0-100)
map<int, int> giftPreferences; // 礼物偏好表(物品ID->好感度增减值)
HBITMAP icon, icon2; // 行走图(不同状态)
HBITMAP portrait; // 对话头像
Direction dirnow; // 当前移动方向
int timel, time; // 移动计时器
AppState npcstate; // 所属游戏区域
int clos; // 行走图帧控制
};
类图:
NPC 核心类
plaintext
+---------------------+
| NPC |
+---------------------+
| - name: string |
| - friendship: int |
| - giftPreferences |
| - position(x,y) |
| - bitmap资源... |
+---------------------+
| + initnpc() |
| + moveRandomlyk() |
| + talk() |
| + giveGift() |
| + Save()/Load() |
+---------------------+
全局管理
plaintext
+---------------------+
| npcs全局 |
+---------------------+
| - vector<NPC> npcs |
| - initnpcs() |
| - npcsRender() |
| - HandleRightClick()|
+---------------------+

3. 挖矿系统
class MiningSystem {
public:
int mineLevel;//当前深度
int energyCost = 5;//挖掘能量消耗
std::vector<OreNode> oreNodes; // 存储当前地图的矿石节点}

4. 打怪系统



5. 钓鱼系统


6. 玩家系统


7. 存档读档系统



存档系统

存档选择页面:

8. 时间系统


类图

三、程序的实现过程
1. 挖矿系统
· 矿石生成流程
GenerateOres → 根据矿层深度计算矿石数量和稀有概率 → 生成 OreNode 并存储到 oreNodes。
· 挖掘流程
TryMine → 检测玩家坐标与 OreNode 的碰撞 → 扣除耐久度 → 耐久度为 0 时生成对应 OreType → 调用 AddOreToInventory 存入背包。
· 渲染流程
RenderOres → 遍历 oreNodes → 根据 OreSType 选择对应的纹理 → 世界坐标转屏幕坐标后绘制到窗口。
· 层级提升流程
DescendToNextLevel → 调用 IncreaseLevel 提升矿层 → 重新调用 GenerateOres 生成新层矿石。
2. 打怪系统
· 怪物生成流程
GenerateMonster → 根据等级计算怪物数量 → 随机生成坐标并校验有效性 → 设置怪物属性(类型、生命值、掉落物等)→ 加入 monsters 列表。
· 怪物移动流程
MoveMonster → 遍历 monsters → 根据类型调用 UpdateMonsterPosition(受地形阻挡)或 UpdateMonsterPositionignore(无视地形)→ 更新坐标和朝向 → 渲染动画。
· 攻击流程
· 怪物攻击:UpdateAttrack 生成攻击光球并移动 → MonsterAttact 检测光球或怪物是否与玩家碰撞 → 返回伤害值。
· 玩家攻击:AttackMonster 检测玩家攻击范围是否命中怪物 → 扣除生命值 → 生命值为 0 时掉落物品并添加到背包(Inventory 类)。
· 等级提升流程
IncreaseLevel → 提升 monsterLevel → 重新生成更高等级的怪物(需手动调用,如玩家进入新关卡)。
3. 钓鱼系统
· 玩家操作:
· 按住空格键:控制条上移(速度 10 像素 / 帧)
· 松开空格键:控制条下移(速度 20 像素 / 帧)
· 成功判定:
· 控制条覆盖鱼的位置时,successCount增加
· 否则减少
· 当successCount达到 50 时,游戏成功,随机生成一种鱼并添加到背包
· 当successCount低于 - 30 时,游戏失败
与其他系统的关联
·与Inventory的交互:
inventory.AddItem(fishs);
钓鱼成功后,创建一个Item对象并添加到玩家背包。
·与游戏状态的交互:
游戏结束后,重置游戏状态为NOTALL。
4. 玩家系统

与其他系统的交互
1. 与 MiningSystem 的关联:
player.UseTool(x, y, miningSystem, inventory);
·
调用挖矿系统的 TryMine 方法进行矿石挖掘。
· 与 CombatSystem 的关联:
player.TakeDamage(x, y); // 调用战斗系统的 MonsterAttact
player.UseTool(x, y, ...); // 调用战斗系统的 AttackMonster
·
处理玩家受到的伤害和对怪物的攻击。
· 与 Inventory 的关联:
player.AddToInventory(item);
·
将物品添加到背包系统。
· 与 Fishing.h 的关联:
通过 fishingLevel 和 fishingEXP 影响钓鱼小游戏的难度和奖励。
5. 存档读档系统

6. 时间系统

7. 背包系统


8. Npc系统
Npc移动逻辑

· 对话系统:
随机显示预设的对话内容,增加 1 点好感度。
· 送礼系统:
根据物品喜好度调整好感度(-5 到 5),最大好感度为 100。
好感度系统

四、程序的运行结果
主页:

创建页面:

读档页面

地图:
家:

农场:

车站:

小镇

森林:

海边:

矿场:

小路:

矿洞:

矿层1:

矿层2:

矿层3:

矿层4:

时间系统
睡觉:


半夜不睡觉,在野外会随机掉落物品

打怪系统:
死亡界面

Npc系统:
交互界面


Npc好感界面:

钓鱼系统:

玩家系统:
