Created
July 16, 2021 20:24
-
-
Save treastrain/8fd9b164aeb6321444918de785ede590 to your computer and use it in GitHub Desktop.
あの日本語非対応で有名な JapaneseTraditionalDiceGame を Swift で書いてみた( https://ja.wikipedia.org/wiki/NKODICE )
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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