You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SwiftUI实现随机不重复字体猜谜功能求助

SwiftUI 字体猜题游戏实现方案

刚好做过类似的小互动组件,给你整理了完整的实现思路和代码,完美匹配你的需求:

核心思路拆解

  • 用shuffled()方法对字体数组进行随机打乱,保证三个按钮的字体无重复且全覆盖
  • 点击按钮时直接对比按钮使用的字体与题目中的randomFont,匹配则加分
  • 每次操作后自动刷新题目,让游戏可以持续进行

完整代码实现

import SwiftUI

struct FontGuessGameView: View {
    // 原始字体列表
    private let originalFonts = ["Arial", "System", "Helvetica"]
    // 状态变量:当前题目字体、分数、按钮的随机字体序列
    @State private var randomFont = ""
    @State private var score = 0
    @State private var shuffledButtonFonts: [String] = []
    
    var body: some View {
        VStack(spacing: 30) {
            // 分数展示区
            Text("Score: \(score)")
                .font(.title)
                .bold()
            
            // 题目文本区
            Text("Which font is \(randomFont)?")
                .font(getTargetFont(for: randomFont, size: 24))
                .padding()
            
            // 动态生成三个字体按钮
            ForEach(shuffledButtonFonts, id: \.self) { fontName in
                Button(action: {
                    // 判断是否答对,答对则加分
                    if fontName == randomFont {
                        score += 1
                    }
                    // 刷新游戏,生成新的随机组合
                    refreshGame()
                }) {
                    Text(randomFont)
                        .font(getTargetFont(for: fontName, size: 40))
                        .padding()
                        .border(.gray, width: 2)
                        .cornerRadius(8)
                }
            }
        }
        .onAppear {
            // 初始化游戏状态
            refreshGame()
        }
    }
    
    // 辅助方法:根据字体名称返回对应的Font实例
    private func getTargetFont(for fontName: String, size: CGFloat) -> Font {
        if fontName == "System" {
            return .system(size: size)
        } else {
            return .custom(fontName, size: size)
        }
    }
    
    // 辅助方法:刷新游戏,生成新的随机题目和按钮排列
    private func refreshGame() {
        // 随机挑选题目字体
        randomFont = originalFonts.randomElement()!
        // 打乱字体数组生成按钮的随机顺序
        shuffledButtonFonts = originalFonts.shuffled()
    }
}

struct FontGuessGameView_Previews: PreviewProvider {
    static var previews: some View {
        FontGuessGameView()
    }
}

关键细节说明

  1. 随机化处理:originalFonts.shuffled()会返回原数组的随机打乱版本,确保三个按钮的字体不重复且全部使用
  2. 匹配逻辑:按钮点击时直接对比fontName和randomFont,逻辑简单清晰,不容易出错
  3. 代码复用:把字体转换逻辑抽成getTargetFont()方法,后续新增字体只需要修改originalFonts数组即可,维护成本低
  4. 游戏体验:每次点击按钮后自动刷新题目,不用手动触发,游戏流畅性更好

内容的提问来源于stack exchange,提问作者devnull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:02:44