Created
September 17, 2022 23:52
-
-
Save nmbr73/66985bbbb07bb7c43fdcc582aff1f736 to your computer and use it in GitHub Desktop.
This code is a total disaster ... preserved here as a cautionary example - hope to be able to create a way better solution soon.
This file contains 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
// | |
// ContentView.swift | |
// RockPaperScissors | |
// | |
// Created by nmbr73 on 17.09.22. | |
// | |
import SwiftUI | |
struct Game { | |
static let kindergarden = "Kindergarden" | |
static let sheldon = "Go full Sheldon" | |
static let rock = 0 | |
static let paper = 1 | |
static let scissors = 2 | |
static let lizard = 3 | |
static let spock = 4 | |
static let modes = [kindergarden, sheldon] | |
static func random(mode: String) -> Int { | |
Int.random(in: rock...(mode == kindergarden ? scissors : spock)) | |
} | |
struct Element { | |
let emoji: String | |
let name: String | |
let isSuperiorTo: [(String,Int)] | |
let isDefeatedBy: [(Int,String)] | |
} | |
static var elements = [ | |
Element(emoji: "👊👊🏻👊🏼👊🏽👊🏾👊🏿🪨", name: "Rock", isSuperiorTo: [("blunts",scissors),("crushes",lizard)], isDefeatedBy: [(paper,"wraps"),(spock,"vaporizes")] ), | |
Element(emoji: "✋✋🏻✋🏼✋🏽✋🏾✋🏿🧻", name: "Paper", isSuperiorTo: [("wraps",rock),("disproves",spock)], isDefeatedBy: [(scissors,"cuts"),(lizard,"eats")] ), | |
Element(emoji: "✌️✌🏻✌🏼✌🏽✌🏾✌🏿✂️", name: "Scissors", isSuperiorTo: [("cuts",paper),("decapitates",lizard)], isDefeatedBy: [(rock,"blunts"),(spock,"smashes")] ), | |
Element(emoji: "🤏🤏🏻🤏🏼🤏🏽🤏🏾🤏🏿🦎", name: "Lizard", isSuperiorTo: [("eats", paper),("poisons", spock)], isDefeatedBy: [(rock,"crushes"),(scissors,"decapitates")] ), | |
Element(emoji: "🖖🖖🏻🖖🏼🖖🏽🖖🏾🖖🏿🧝", name: "Spock", isSuperiorTo: [("smashes", scissors),("vaporizes", rock)], isDefeatedBy: [(paper,"disproves"),(lizard,"poisons")] ), | |
] | |
static func emojiSet(_ element: Int) -> String { | |
return elements[element].emoji | |
} | |
} | |
// https://www.hackingwithswift.com/example-code/strings/how-to-read-a-single-character-from-a-string | |
extension String { | |
subscript(i: Int) -> String { | |
return String(self[index(startIndex, offsetBy: i)]) | |
} | |
} | |
struct Emoji: View { | |
private let rainbow: Int | |
private let asterisk: Int | |
private let emojiSet: String | |
private let theme: String | |
static func randomRainbow() -> Int { | |
Int.random(in:0...5) | |
} | |
static func randomAsterisk() -> Int { | |
Int.random(in:0...6) | |
} | |
static let themes = ["👶","👶🏻","👶🏼","👶🏽","👶🏾","👶🏿","🌈","🧸","✳️"] | |
func string() -> String { | |
let charPos: Int | |
switch theme { | |
case "👶": charPos = 0 | |
case "👶🏻": charPos = 1 | |
case "👶🏼": charPos = 2 | |
case "👶🏽": charPos = 3 | |
case "👶🏾": charPos = 4 | |
case "👶🏿": charPos = 5 | |
case "🌈": charPos = rainbow | |
case "🧸": charPos = 6 | |
case "✳️": charPos = asterisk | |
default: charPos = asterisk | |
} | |
return emojiSet[charPos] | |
} | |
init(for element: Int, theme: String, rainbow: Int, asterisk: Int) { | |
//self.element=element | |
emojiSet = Game.emojiSet(element) | |
self.theme = theme | |
self.rainbow = rainbow | |
self.asterisk = asterisk | |
} | |
var body: some View { | |
Text(string()) | |
} | |
} | |
let initialEmojiTheme = "✳️" | |
let initialGameMode = Game.sheldon | |
struct ContentView: View { | |
// ----- Emoji Theme | |
@State private var emojiTheme = initialEmojiTheme | |
var emojiThemePicker: some View { | |
Picker("Emoji Theme", selection: $emojiTheme) { | |
ForEach(Emoji.themes, id: \.self) { | |
Text($0) | |
} | |
} | |
.pickerStyle(.segmented) | |
} | |
// ----- Game Mode | |
@State private var gameMode = initialGameMode | |
var gameModePicker: some View { | |
Picker("Game Mode", selection: $gameMode) { | |
ForEach(Game.modes, id: \.self) { | |
Text($0) | |
} | |
} | |
.pickerStyle(.segmented) | |
} | |
@State private var computersChoice = Game.random(mode: initialGameMode) | |
@State private var computersChoiceRainbow = Emoji.randomRainbow() | |
@State private var computersChoiceAsterisk = Emoji.randomAsterisk() | |
@State private var humandWins2ndOption = Int.random(in: 0...1) | |
@State private var humanWinsRainbow = Game.random(mode: initialGameMode) | |
@State private var humanWinsAsterisk = Emoji.randomAsterisk() | |
@State private var humandLooses2ndOption = Int.random(in: 0...1) | |
@State private var humanLoosesRainbow = Game.random(mode: initialGameMode) | |
@State private var humanLoosesAsterisk = Emoji.randomAsterisk() | |
@State private var computerShouldWin = Bool.random() | |
@State private var humanWinsOnLeft = Bool.random() | |
@State private var score = 0 | |
var humanShouldWin: Bool { !computerShouldWin } | |
var humanShouldLoose: Bool { computerShouldWin } | |
@State private var lastAnswerReason = "" | |
@State private var lastAnswerCorrect = false | |
@State private var endGame = false | |
let rounds = 5 | |
@State private var round = 1 | |
func shuffle() { | |
computersChoice = Game.random(mode: gameMode) | |
computersChoiceRainbow = Emoji.randomRainbow() | |
computersChoiceAsterisk = Emoji.randomAsterisk() | |
humandWins2ndOption = Int.random(in: 0...1) | |
humanWinsRainbow = Emoji.randomRainbow() | |
humanWinsAsterisk = Emoji.randomAsterisk() | |
humandLooses2ndOption = Int.random(in: 0...1) | |
humanLoosesRainbow = Emoji.randomRainbow() | |
humanLoosesAsterisk = Emoji.randomAsterisk() | |
computerShouldWin.toggle() | |
humanWinsOnLeft = Bool.random() | |
if round == rounds { | |
endGame = true | |
} | |
round += 1 | |
} | |
func restart() { | |
lastAnswerReason = "" | |
score = 0 | |
round = 0 | |
shuffle() | |
} | |
var body: some View { | |
VStack { | |
Spacer() | |
Text("My choice:") | |
Emoji(for: computersChoice, theme: emojiTheme, rainbow: computersChoiceRainbow, asterisk: computersChoiceAsterisk) | |
.font(.system(size:120)) | |
Text("Choose wisely to \( computerShouldWin ? "let me win" : "make me loose" ):") | |
HStack { | |
let humanWins = Game.elements[computersChoice].isDefeatedBy[ gameMode == Game.kindergarden ? 0 : humandLooses2ndOption ].0 | |
let humanWinsButton = Button { | |
lastAnswerReason = Game.elements[humanWins].name + " " + Game.elements[computersChoice].isDefeatedBy[ gameMode == Game.kindergarden ? 0 : humandLooses2ndOption ].1 + " " + Game.elements[computersChoice].name | |
lastAnswerCorrect = false | |
if humanShouldWin { | |
score += 1 | |
lastAnswerCorrect = true | |
} | |
shuffle() | |
} label: { | |
Emoji(for: humanWins, theme: emojiTheme, rainbow: humanWinsRainbow, asterisk: humanWinsAsterisk) | |
.font(.system(size:120)) | |
} | |
let humanLooses = Game.elements[computersChoice].isSuperiorTo[ gameMode == Game.kindergarden ? 0 : humandLooses2ndOption ].1 | |
let humanLoosesButton = Button { | |
lastAnswerReason = Game.elements[computersChoice].name + " " + Game.elements[computersChoice].isSuperiorTo[ gameMode == Game.kindergarden ? 0 : humandLooses2ndOption ].0 + " " + Game.elements[humanLooses].name | |
lastAnswerCorrect = false | |
if humanShouldLoose { | |
score += 1 | |
lastAnswerCorrect = true | |
} | |
shuffle() | |
} label: { | |
Emoji(for: humanLooses, theme: emojiTheme, rainbow: humanLoosesRainbow, asterisk: humanLoosesAsterisk) | |
.font(.system(size:120)) | |
} | |
if humanWinsOnLeft { | |
humanWinsButton | |
humanLoosesButton | |
} else { | |
humanLoosesButton | |
humanWinsButton | |
} | |
} | |
Spacer() | |
Text(lastAnswerReason) | |
.foregroundColor(lastAnswerCorrect ? .green : .red ) | |
Text("Your Score: \(score)" + (round <= rounds ? " (round \(round) / \(rounds))" : "")) | |
emojiThemePicker | |
gameModePicker | |
} // VStack | |
.alert("That's it", isPresented: $endGame) { | |
Button("OK") { | |
restart() | |
} | |
} message: { | |
Text("You scored \(score) out of \(rounds)") | |
} | |
} // body | |
} | |
struct ContentView_Previews: PreviewProvider { | |
static var previews: some View { | |
ContentView() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment