🚀

Swift勉強奮闘記#2:ジャンケンゲーム作ってみた編

2022/05/24に公開約5,200字

はじめに

みなさんこんにちは普通のニートです。
今回はジャンケンゲームを作ってみました。目的は画面遷移を使うことです。今回はモーダル遷移というのを使って作ってみました。結構コードがごちゃごちゃしたのでそこは反省点ですね。ぐちゃぐちゃなコードを直すのって難しいですよね。

全体のコード

ViewController.swift
import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myJankenImg: UIImageView!
    @IBOutlet weak var yourJankenImg: UIImageView!
    @IBOutlet weak var jankenLabel: UILabel!
    @IBOutlet weak var jankenGuBtn: UIButton!
    @IBOutlet weak var jankenPaBtn: UIButton!
    @IBOutlet weak var jankenChokiBtn: UIButton!
    
    var aikoFlag = false
    
    let jankenImgDictionary = [
        "グー": "janken_gu.png",
        "チョキ": "janken_choki.png",
        "パー": "janken_pa.png"
    ]

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        jankenLabel.isHidden = true
        setMyJankenImg(jankenHand: "グー")
        setYourJankenImg(jankenHand: "グー")
    }
    
    @IBAction func tapJankenBtn(_ sender: UIButton) {
        switch sender.titleLabel?.text {
        case "グー":
            jajanken(jankenHand: "グー")
        case "チョキ":
            jajanken(jankenHand: "チョキ")
        case "パー":
            jajanken(jankenHand: "パー")
        default:
            print("ありえないです〜")
        }
    }
    
    func jajanken(jankenHand: String) {
        jankenLabel.isHidden = false
        
        if aikoFlag {
            jankenLabel.text = "あいこで"
        } else {
            jankenLabel.text = "ジャンケン"
        }
        
        let jankenList = ["グー", "チョキ", "パー"]
        let randomInt = Int.random(in: 0..<3)
        let JankenHand2 = jankenList[randomInt]
        
        //一秒待って
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { [self] in
            if aikoFlag {
                jankenLabel.text = "しょ!"
            } else {
                jankenLabel.text = "ポン!"
            }
            setMyJankenImg(jankenHand: jankenHand)
            setYourJankenImg(jankenHand: JankenHand2)
            jankenJadge(my: jankenHand, your: JankenHand2)
        }
        
    }
    
    func setMyJankenImg(jankenHand: String) {
        let sampleImage = UIImage(named: jankenImgDictionary[jankenHand]!)
        myJankenImg.image = sampleImage
    }
    
    func setYourJankenImg(jankenHand: String) {
        let yourjanken = UIImage(named: jankenImgDictionary[jankenHand]!)
        yourJankenImg.image = yourjanken
        
        var transRotate = CGAffineTransform()
        let angle = CGFloat.pi
        transRotate = CGAffineTransform(rotationAngle: CGFloat(angle));
        yourJankenImg.transform = transRotate
    }


    func jankenJadge(my: String, your: String) {
        if my == "グー" {
            if your == "グー" {
                aikoFlag = true
            }
            if your == "パー" {
                self.performSegue(withIdentifier: "toLoseResult", sender: nil)
                aikoFlag = false
            }
            if your == "チョキ" {
                self.performSegue(withIdentifier: "toWinResult", sender: nil)
                aikoFlag = false
            }
        }
        if my == "チョキ" {
            if your == "グー" {
                self.performSegue(withIdentifier: "toLoseResult", sender: nil)
                aikoFlag = false
            }
            if your == "パー" {
                self.performSegue(withIdentifier: "toWinResult", sender: nil)
                aikoFlag = false
            }
            if your == "チョキ" {
                aikoFlag = true
            }
        }
        if my == "パー" {
            if your == "グー" {
                self.performSegue(withIdentifier: "toWinResult", sender: nil)
                aikoFlag = false
            }
            if your == "パー" {
                aikoFlag = true
            }
            if your == "チョキ" {
                self.performSegue(withIdentifier: "toLoseResult", sender: nil)
                aikoFlag = false
            }
        }
    }
}

画面遷移先はボタンをタップした時に戻る処理をしただけです。

WinViewController, LoseViewController
@IBAction func back(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }

動画

image

詳しく見る

変数たち

aikoFlag変数はジャンケンであいこになっときに使うやつですね。jankenImgDictionary変数はジャンケンの画像をセットするときに使う変数でこれがあるおかげでコードを効率良くコード書くことができた。普通のニートでもやればできるのだ。

func tapJankenBtn()

これはボタンをタップした時の処理だ。もう言うまでもない。

func jajanken()

ジャジャンケン関数これはまず名前がいいですね。普通のニートはネーミングセンスがいいようだ。とう言うのはどうでもよくて、これはメインの関数でここで相手の出す手とセリフを決めている。相手の出す手はリストのインデックス番号をランダムメソッドを使って取っている。今調べたらrandomElement()を使ったらリストからランダムで値を取る関数があったので次からはこれを使おうかな。

func setMyJankenImg()

これは自分側のUIImageViewに画像をセットする関数です。UIImage()のnamedのところでjankenImgDictionary変数を使ってます。ここでニート初心者はifを使って3パターンの条件分岐を書いてしまうがベテランニートは条件分岐も書かない。

func setYourJankenImg()

これは相手側のUIImageViewに画像をセットする関数です。さっきの関数に画像を180度回転させただけです。

func jankenJadge()

これは自分がジャンケンで勝ったかどうかを判定する関数です。もうちょっと効率良くコードを書けたんじゃないかと思っている。普通のニートは敗北した。

学んだこと

まずUIImageViewの使い方を知りセットで画像の回転のさせかたが分かったかな。次に画面遷移のやり方が分かった。今回はモーダル遷移だけ使いましたがプッシュ通知も同じようなことをするだけです。これができれば結構作れるものの幅が広がるような気がする。まぁあとは辞書の使い方ぐらいかな。
今回は結構収穫がありました。普通のニート感激!

最後に

最後まで見てくれてありがとう。普通のニートは感謝している。
余談なんですけどコードを一気に見せるじゃなくて作り方の手順も載せたほうがいいのかな?迷いどころです。次はAPIとか使ってみたいな。

Discussion

ログインするとコメントできます