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() } }
关键细节说明
- 随机化处理:
originalFonts.shuffled()会返回原数组的随机打乱版本,确保三个按钮的字体不重复且全部使用 - 匹配逻辑:按钮点击时直接对比
fontName和randomFont,逻辑简单清晰,不容易出错 - 代码复用:把字体转换逻辑抽成
getTargetFont()方法,后续新增字体只需要修改originalFonts数组即可,维护成本低 - 游戏体验:每次点击按钮后自动刷新题目,不用手动触发,游戏流畅性更好
内容的提问来源于stack exchange,提问作者devnull
相关产品推荐
相关产品推荐

