项目演示在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1. 项目概述

凡人修仙历练游戏是一款基于HarmonyOS平台开发的沉浸式修仙体验游戏。玩家将扮演一名初入修仙界的凡人,通过选择不同的修炼方式,体验丰富多彩的修仙人生。游戏以"选择决定命运"为核心主题,展现因果轮回、天道酬勤的传统哲学思想。

1.1 技术栈

本项目采用HarmonyOS最新的开发技术:

分类 技术 版本
开发框架 ArkUI API Level 24
编程语言 ETS (TypeScript) ES6+
构建工具 Hvigor 最新版本
UI组件 ArkUI Components API Level 24

1.2 项目结构

e:\MyApplication15\
├── AppScope/
│   └── resources/
├── entry/
│   ├── src/main/ets/
│   │   ├── entryability/
│   │   │   └── EntryAbility.ets
│   │   ├── entrybackupability/
│   │   │   └── EntryBackupAbility.ets
│   │   └── pages/
│   │       ├── Index.ets
│   │       └── AIChatService.ets
│   ├── src/main/resources/
│   ├── build-profile.json5
│   └── hvigorfile.ts
├── hvigor/
├── build-profile.json5
└── hvigorfile.ts

2. 游戏设计理念

2.1 核心主题

游戏的核心主题是"选择决定命运"。在修仙道路上,每个选择都至关重要,不同的修炼方式会带来截然不同的人生轨迹。

2.2 五种修炼方式

游戏设计了五种修炼方式,代表五种不同的人生哲学:

2.2.1 潜心打坐修炼

代表哲学:天道酬勤

选择潜心打坐修炼,如同细水长流。虽然进展缓慢,但根基稳固,每一步都扎实可靠。这种方式适合心性沉稳的修士,虽然不会有大起大落,但最终能稳步达到更高境界。

2.2.2 下山历练闯荡

代表哲学:机遇挑战

选择下山历练闯荡,机遇与风险并存。行走江湖可以遇到各种机缘巧合,获得稀世珍宝和传承功法,但也可能遇到危险。这种方式适合胆大心细、善于把握机会的修士。

2.2.3 争夺秘境宝物

代表哲学:强者生存

选择争夺秘境宝物,必然卷入宗门纷争。秘境之中藏有无数天材地宝,但也是各方势力争夺的焦点。虽然可能获得强大的宝物,但也可能成为众矢之的。

2.2.4 结交门派道友

代表哲学:合作共赢

选择结交门派道友,互帮互助共同进步。修仙之路孤独寂寞,但有同道中人互相扶持,可以事半功倍。这种方式适合注重人脉、善于合作的修士。

2.2.5 贪图捷径丹药

代表哲学:急功近利

选择贪图捷径丹药,看似快速提升,实则后患无穷。丹药虽能短期内增强修为,但会损伤根基,甚至导致走火入魔。这种方式是修仙大忌。

2.3 因果系统

游戏的因果系统是核心玩法之一,每个选择都会导致相应的结局:

修炼方式 修炼结局
潜心打坐修炼 修为稳步提升
下山历练闯荡 机缘不断突破
争夺秘境宝物 卷入宗门纷争
结交门派道友 互相借力飞升
贪图捷径丹药 走火入魔修为尽失

2.4 界面设计风格

游戏采用深色修仙风格主题:

  • 深邃的紫色背景(#1a1a2e),营造神秘的修仙氛围
  • 金色文字点缀(#ffd700),彰显修仙的尊贵感
  • 蓝色按钮和边框(#4a90d9),突出交互元素
  • 简洁的卡片式布局,信息层次分明

3. 技术架构

3.1 分层架构

本项目采用分层架构设计:

┌─────────────────────────────────────┐
│          表现层 (UI Layer)          │
│         Index.ets (游戏页面)         │
├─────────────────────────────────────┤
│          业务层 (Service Layer)     │
│    AIChatService.ets (游戏逻辑)      │
├─────────────────────────────────────┤
│          数据层 (Data Layer)        │
│     GameResponse (数据接口)         │
├─────────────────────────────────────┤
│        基础设施层 (Infrastructure)   │
│     HarmonyOS ArkUI Framework       │
└─────────────────────────────────────┘

3.2 核心模块

模块 职责 文件位置
Index.ets 游戏界面展示、用户交互 entry/src/main/ets/pages/Index.ets
AIChatService.ets 游戏逻辑处理 entry/src/main/ets/pages/AIChatService.ets

4. API Level 24 适配

4.1 API Level 24 特性

HarmonyOS API Level 24是HarmonyOS 4.0版本的API级别,包含了许多新特性:

  1. 新UI组件:RichText、Web等
  2. 增强动画能力:支持更复杂的动画效果
  3. 改进状态管理:更灵活的状态管理方式
  4. 增强权限管理:更精细的权限控制

4.2 关键API使用

4.2.1 组件装饰器
@Entry           // 页面入口
@Component       // 组件声明
@State           // 状态管理
@Builder         // 构建函数
4.2.2 布局组件
Column()         // 垂直布局
Flex()           // 弹性布局
4.2.3 布局属性
FlexWrap.Wrap           // 换行布局
FlexAlign.Center        // 居中对齐
HorizontalAlign.Center  // 水平居中
4.2.4 文本属性
FontWeight.Bold         // 粗体
FontWeight.Medium       // 中等粗细
TextAlign.Center        // 文本居中
4.2.5 样式属性
.width('100%')          // 宽度
.height('100%')         // 高度
.backgroundColor()      // 背景颜色
.fontColor()            // 文字颜色
.fontSize()             // 字体大小
.margin()               // 外边距
.padding()              // 内边距
.borderRadius()         // 圆角
.onClick()              // 点击事件

5. 核心代码详解

5.1 Index.ets 主页面

5.1.1 状态定义
@State gameStarted: boolean = false
@State showResult: boolean = false
@State userChoice: string = ''
@State guidance: string = ''
@State analysis: string = ''
@State summary: string = ''
@State outcome: string = ''
@State isLoading: boolean = false
5.1.2 界面切换逻辑
build() {
    Column() {
        if (!this.gameStarted) {
            this.startScreen()
        } else if (!this.showResult) {
            this.choiceScreen()
        } else {
            this.resultScreen()
        }
    }
    .width('100%')
    .height('100%')
    .backgroundColor('#1a1a2e')
    .padding(20)
}
5.1.3 开始界面
@Builder
startScreen() {
    Column() {
        Text('凡人修仙')
            .fontSize(48)
            .fontWeight(FontWeight.Bold)
            .fontColor('#ffd700')
            .margin({ bottom: 20 })

        Text('历练之路')
            .fontSize(32)
            .fontWeight(FontWeight.Medium)
            .fontColor('#ffffff')
            .margin({ bottom: 40 })

        Text('你本是一介凡人,偶然踏入修仙之路。\n前方迷雾重重,选择在你手中...')
            .fontSize(18)
            .fontColor('#aaaaaa')
            .textAlign(TextAlign.Center)
            .margin({ bottom: 60 })

        Button('开始修仙')
            .width(200)
            .height(60)
            .fontSize(24)
            .fontWeight(FontWeight.Bold)
            .backgroundColor('#4a90d9')
            .borderRadius(30)
            .onClick(() => {
                this.gameStarted = true
            })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
}
5.1.4 选择界面
@Builder
choiceScreen() {
    Column() {
        Text('选择修炼方式')
            .fontSize(32)
            .fontWeight(FontWeight.Bold)
            .fontColor('#ffd700')
            .margin({ bottom: 10 })

        Text('修行路上如何选择修炼方式得道成仙?\n请根据你的道心做出选择')
            .fontSize(16)
            .fontColor('#aaaaaa')
            .textAlign(TextAlign.Center)
            .margin({ bottom: 30 })

        Flex({ wrap: FlexWrap.Wrap, justifyContent: FlexAlign.Center }) {
            ForEach(this.choices, (choice: string) => {
                Button(choice)
                    .width(150)
                    .height(80)
                    .fontSize(16)
                    .backgroundColor('#2d3436')
                    .borderColor('#4a90d9')
                    .borderWidth(2)
                    .borderRadius(10)
                    .margin(10)
                    .onClick(() => {
                        this.handleChoice(choice)
                    })
            })
        }
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
}
5.1.5 结果界面
@Builder
resultScreen() {
    Column() {
        if (this.isLoading) {
            Column() {
                Text('正在推演因果...')
                    .fontSize(20)
                    .fontColor('#ffd700')
            }
            .width('100%')
            .height('100%')
            .justifyContent(FlexAlign.Center)
            .alignItems(HorizontalAlign.Center)
        } else {
            Column() {
                Text('修炼结局')
                    .fontSize(32)
                    .fontWeight(FontWeight.Bold)
                    .fontColor('#ffd700')
                    .margin({ bottom: 10 })

                Text(this.outcome)
                    .fontSize(24)
                    .fontWeight(FontWeight.Medium)
                    .fontColor('#ffffff')
                    .margin({ bottom: 30 })

                Column() {
                    Text('因果分析')
                        .fontSize(20)
                        .fontWeight(FontWeight.Bold)
                        .fontColor('#4a90d9')
                        .margin({ bottom: 10 })

                    Text(this.analysis)
                        .fontSize(16)
                        .fontColor('#aaaaaa')
                        .textAlign(TextAlign.Center)
                }
                .width('100%')
                .backgroundColor('#2d3436')
                .padding(20)
                .borderRadius(10)
                .margin({ bottom: 20 })

                Column() {
                    Text('修仙历程')
                        .fontSize(20)
                        .fontWeight(FontWeight.Bold)
                        .fontColor('#4a90d9')
                        .margin({ bottom: 10 })

                    Text(this.summary)
                        .fontSize(16)
                        .fontColor('#ffffff')
                        .textAlign(TextAlign.Center)
                }
                .width('100%')
                .backgroundColor('#2d3436')
                .padding(20)
                .borderRadius(10)
                .margin({ bottom: 30 })

                Button('重新开始')
                    .width(150)
                    .height(50)
                    .fontSize(20)
                    .fontWeight(FontWeight.Bold)
                    .backgroundColor('#4a90d9')
                    .borderRadius(25)
                    .onClick(() => {
                        this.resetGame()
                    })
            }
            .width('100%')
            .height('100%')
            .justifyContent(FlexAlign.Center)
            .alignItems(HorizontalAlign.Center)
        }
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
    .alignItems(HorizontalAlign.Center)
}
5.1.6 选择处理方法
async handleChoice(choice: string) {
    this.userChoice = choice
    this.showResult = true
    this.isLoading = true

    await new Promise<void>((resolve: () => void) => {
        setTimeout(resolve, 1500)
    })

    const response = await this.chatService.getGameResponse(choice)
    this.guidance = response.guidance
    this.analysis = response.analysis
    this.summary = response.summary

    const outcomeIndex = response.choices.indexOf(choice)
    if (outcomeIndex >= 0) {
        this.outcome = response.outcomes[outcomeIndex]
    } else {
        this.outcome = response.outcomes[0]
    }

    this.isLoading = false
}

5.2 AIChatService.ets 服务类

5.2.1 数据接口
export interface GameResponse {
    guidance: string
    choices: string[]
    outcomes: string[]
    analysis: string
    summary: string
}
5.2.2 服务类实现
export class AIChatService {
    private systemPrompt: string = `你是一个凡人修仙历练游戏的AI助手...`
    
    private choices: string[] = ['潜心打坐修炼', '下山历练闯荡', '争夺秘境宝物', '结交门派道友', '贪图捷径丹药']
    private outcomes: string[] = ['修为稳步提升', '机缘不断突破', '卷入宗门纷争', '互相借力飞升', '走火入魔修为尽失']

    async getGameResponse(userChoice: string): Promise<GameResponse> {
        let analysis: string = ''
        let summary: string = ''

        const choiceIndex: number = this.choices.indexOf(userChoice)
        
        switch (choiceIndex) {
            case 0:
                analysis = '选择潜心打坐修炼,如同细水长流...'
                summary = '你选择了潜心打坐修炼,日复一日...'
                break
            case 1:
                analysis = '选择下山历练闯荡,机遇与风险并存...'
                summary = '你选择了下山历练闯荡,一路斩妖除魔...'
                break
            case 2:
                analysis = '选择争夺秘境宝物,必然卷入宗门纷争...'
                summary = '你选择了争夺秘境宝物,卷入了各大宗门的纷争之中...'
                break
            case 3:
                analysis = '选择结交门派道友,互帮互助共同进步...'
                summary = '你选择了结交门派道友,广结善缘...'
                break
            case 4:
                analysis = '选择贪图捷径丹药,看似快速提升,实则后患无穷...'
                summary = '你选择了贪图捷径丹药,初期修为暴涨...'
                break
            default:
                analysis = '修仙之路,选择至关重要...'
                summary = '修仙之路漫漫,需历经重重考验...'
        }

        return {
            guidance: '修行路上,选择修炼方式至关重要...',
            choices: this.choices,
            outcomes: this.outcomes,
            analysis: analysis,
            summary: summary
        }
    }
}

6. 游戏玩法详解

6.1 游戏流程

  1. 进入游戏:打开应用,看到开始界面
  2. 开始游戏:点击"开始修仙"按钮
  3. 选择修炼方式:从五种修炼方式中选择一种
  4. 查看结果:系统推演因果,显示修炼结局
  5. 重新开始:点击"重新开始"按钮

6.2 各修炼方式详细说明

6.2.1 潜心打坐修炼

修炼特点

  • 如同细水长流,进展缓慢但根基稳固
  • 适合心性沉稳的修士
  • 没有大起大落,稳步提升

修炼结局:修为稳步提升

因果分析
选择潜心打坐修炼,如同细水长流。虽然进展缓慢,但根基稳固,每一步都扎实可靠。这种方式适合心性沉稳的修士,虽然不会有大起大落,但最终能稳步达到更高境界。

修仙历程
你选择了潜心打坐修炼,日复一日,年复一年。虽然没有惊天动地的奇遇,但你的修为如同涓涓细流汇聚成江海。历经千年苦修,终于功德圆满,渡劫飞升成仙!

6.2.2 下山历练闯荡

修炼特点

  • 机遇与风险并存
  • 可以遇到各种机缘巧合
  • 获得稀世珍宝和传承功法

修炼结局:机缘不断突破

因果分析
选择下山历练闯荡,机遇与风险并存。行走江湖可以遇到各种机缘巧合,获得稀世珍宝和传承功法,但也可能遇到危险。这种方式适合胆大心细、善于把握机会的修士。

修仙历程
你选择了下山历练闯荡,一路斩妖除魔,奇遇不断。在一次次生死考验中,你的修为突飞猛进。最终在秘境中获得上古传承,一举突破瓶颈,渡劫飞升成仙!

6.2.3 争夺秘境宝物

修炼特点

  • 必然卷入宗门纷争
  • 秘境之中藏有无数天材地宝
  • 各方势力争夺的焦点

修炼结局:卷入宗门纷争

因果分析
选择争夺秘境宝物,必然卷入宗门纷争。秘境之中藏有无数天材地宝,但也是各方势力争夺的焦点。虽然可能获得强大的宝物,但也可能成为众矢之的。

修仙历程
你选择了争夺秘境宝物,卷入了各大宗门的纷争之中。在血雨腥风中,你凭借实力和智慧脱颖而出,成为一代枭雄。最终超脱凡尘,渡劫飞升成仙!

6.2.4 结交门派道友

修炼特点

  • 互帮互助共同进步
  • 修仙之路不再孤独
  • 可以事半功倍

修炼结局:互相借力飞升

因果分析
选择结交门派道友,互帮互助共同进步。修仙之路孤独寂寞,但有同道中人互相扶持,可以事半功倍。这种方式适合注重人脉、善于合作的修士。

修仙历程
你选择了结交门派道友,广结善缘,与志同道合的伙伴一起修行。在众人的帮助下,你度过了一个又一个难关。最终与道友们一同渡劫,携手飞升成仙!

6.2.5 贪图捷径丹药

修炼特点

  • 短期内快速提升修为
  • 损伤根基
  • 可能导致走火入魔

修炼结局:走火入魔修为尽失

因果分析
选择贪图捷径丹药,看似快速提升,实则后患无穷。丹药虽能短期内增强修为,但会损伤根基,甚至导致走火入魔。这种方式是修仙大忌。

修仙历程
你选择了贪图捷径丹药,初期修为暴涨,风光无限。但好景不长,丹药的副作用逐渐显现,最终走火入魔,修为尽失。切记修仙无捷径,唯有脚踏实地才能成就大道!

7. 构建与运行

7.1 环境要求

  • DevEco Studio:4.0及以上版本
  • HarmonyOS SDK:API Level 24及以上
  • Node.js:18.0及以上版本
  • JDK:11.0及以上版本

7.2 构建步骤

  1. 打开DevEco Studio,配置SDK路径
  2. 同步项目(Sync Project with Gradle Files)
  3. 构建项目(Build > Build HAP(s))

7.3 运行项目

  1. 创建或选择模拟器(API Level 24及以上)
  2. 点击Run按钮或使用快捷键Shift+F10
  3. 等待应用安装并启动

8. 未来扩展方向

8.1 功能扩展

  • 修炼等级系统:凡人→炼气→筑基→金丹→元婴→化神→渡劫→飞升
  • 资源系统:灵石、丹药、功法、法宝
  • 战斗系统:与妖兽战斗、与其他修士切磋
  • 社交系统:门派系统、好友系统、交易系统

8.2 技术扩展

  • 数据持久化:使用Preferences或数据库保存进度
  • 网络功能:排行榜、在线对战、云存档
  • 动画效果:修炼动画、战斗动画、等级提升动画

8.3 内容扩展

  • 更多修炼方式:炼丹、炼器、阵法、符篆
  • 更多结局:成为散仙、堕入魔道、转世重修
  • 剧情故事:主线剧情、支线任务、NPC互动

9. 附录

9.1 资源文件

颜色资源(color.json):

{
    "color": [
        {
            "name": "start_window_background",
            "value": "#ffffff"
        }
    ]
}

字符串资源(string.json):

{
    "string": [
        {
            "name": "module_desc",
            "value": "entry module description"
        },
        {
            "name": "EntryAbility_label",
            "value": "凡人修仙"
        }
    ]
}

9.2 配置文件

module.json5:定义应用基本配置,包括模块名称、设备类型、页面路由等。

build-profile.json5:定义构建配置,包括API类型、资源选项、构建选项集等。

9.3 API Level 24 新增特性

  1. 新UI组件:RichText、Web等
  2. 增强动画能力:支持更复杂的动画效果
  3. 改进状态管理:更灵活的状态管理方式
  4. 增强权限管理:更精细的权限控制

结语

凡人修仙历练游戏通过简洁的界面和丰富的内容,为玩家提供了一个沉浸式的修仙体验。游戏的核心玩法是通过选择不同的修炼方式,体验不同的修仙人生,领悟因果轮回的道理。

本项目采用了现代化的ArkUI框架和ETS语言,充分利用了HarmonyOS API Level 24的新特性,为用户打造了一个视觉效果出色、交互流畅的游戏界面。

希望玩家能够在游戏中找到属于自己的修仙之路,体验修仙的乐趣和人生的道理!


Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐