Skip to content

Instantly share code, notes, and snippets.

@treastrain
Created July 16, 2021 20:24
Show Gist options
  • Save treastrain/8fd9b164aeb6321444918de785ede590 to your computer and use it in GitHub Desktop.
Save treastrain/8fd9b164aeb6321444918de785ede590 to your computer and use it in GitHub Desktop.
あの日本語非対応で有名な JapaneseTraditionalDiceGame を Swift で書いてみた( https://ja.wikipedia.org/wiki/NKODICE
import Foundation
struct Dice {
private let characters = ["う", "お", "こ", "ち", "ま", "ん"].sorted()
func roll() -> String? {
return Int.random(in: 0..<5) == 0 ? nil : characters.shuffled().first
}
}
enum Hand: CaseIterable {
case unchi
case unko
case manko
case omanko
case chinko
case chinchin
case ochinchin
var effect: String {
String(reflecting: self).components(separatedBy: ".").last!.uppercased()
}
var score: Int {
switch self {
case .unchi, .unko, .manko, .chinko:
return 1000
case .chinchin:
return 3000
case .omanko:
return 5000
case .ochinchin:
return 10000
}
}
private func condition(by rolls: [String]) -> Bool {
let effectHiragana = effect.applyingTransform(.latinToHiragana, reverse: false)!
switch self {
case .unchi, .unko, .manko, .omanko, .chinko:
return effectHiragana.reduce(true) { $0 && rolls.contains(String($1)) }
case .chinchin:
return Set(effectHiragana).reduce(true) { partialResult, element in
partialResult && rolls.filter { $0 == String(element) }.count == 2
}
case .ochinchin:
var effectHiragana = Set(effectHiragana)
effectHiragana.remove("お")
return rolls.contains("お") && effectHiragana.reduce(true) { partialResult, element in
partialResult && rolls.filter { $0 == String(element) }.count == 2
}
}
}
static func check(from result: [String]) -> [Self] {
return Hand.allCases.compactMap { $0.condition(by: result) ? $0 : nil }
}
}
func play() {
let dices = (0..<5).map { _ in Dice() }
let rollResults = dices.compactMap { $0.roll() }
let hands = Hand.check(from: rollResults)
let effects = hands.map { $0.effect }
let totalScore = hands.map { $0.score }.reduce(0, +)
print(rollResults)
if !effects.isEmpty {
print("🎉 ", terminator: "")
effects.forEach { print("\($0) ", terminator: "") }
print()
}
print("SCORE:", totalScore)
}
for round in 1...3 {
print("ROUND", round, "------------------------------")
play()
print()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment