Skip to content

Instantly share code, notes, and snippets.

@nmbr73
Created September 17, 2022 23:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nmbr73/66985bbbb07bb7c43fdcc582aff1f736 to your computer and use it in GitHub Desktop.
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.
//
// 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