新Swiftで行こう…第54回「ハイアンドローゲーム3解説」 田部井保

目次 通常版

 ハイアンドローゲーム3の解説です。

 まず前半部分、重複部分の関数化です。

//
//  ViewController.swift
//  Hi and Lo
//
//  Created by 保 Tabei on 2024/09/22.
//

import UIKit

class ViewController: UIViewController {

    ///ガイドラベル
    @IBOutlet weak var Guide: UILabel!
    ///入力フィールド(0〜9を入れる)
    @IBOutlet weak var Input: UITextField!
    ///回数表示ラベル
    @IBOutlet weak var Count: UILabel!
    
    ///乱数保持変数
    var randInt = 0
    ///回数保持、最初は0
    var cnt = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //回数表示0回目
        Count.text = "0回目"
        //初期設定処理
        reset()
    }

    ///初期設定処理、ゲーム開始状態にする
    func reset()
    {
        //乱数発生
        randInt = Int.random(in: 0 ..< 10)
        //回数初期化0に
        cnt = 0
        //ガイドラベル初期化
        Guide.text = "0~9の数字を入れてボタンを押して下さい"
    }

    ///ボタン押下時処理
    @IBAction func TouchBtnGo(_ sender: Any) {
        //回数加算
        cnt = cnt + 1
        //回数表示
        Count.text = cnt.description + "回目"
        //入力フィールドに入れた値を数値としてval変数に入れる
        let val = Int(Input.text!)!
        //入力値と乱数を比べて入力値が大きい場合
        if val > randInt {
            Guide.text = "もっと小さいです"
        }
        //入力値と乱数を比べて入力値が小さい場合
        else if val < randInt {
            Guide.text = "もっと大きいです"
        }
        //上記以外、等しい時
        else {
            //アラートを出す為のコントローラー設定
            let alert = UIAlertController()
            //アラートタイトル
            alert.title = "当たり"
            //アラートメッセージ
            alert.message = "当たりです"
            //アラートアクション
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            //アラートを出す
            present(alert, animated: true, completion: nil)
            //初期設定処理
            reset()
        }
    }
    
}

 まず20行目は、初期設定の中で乱数を発生させる様にしたので、ここでは、単に0を入れています。

 30行目、ここでは以前、ガイドラベルの初期化だけを行なっていたのですが、その部分でreset関数を呼ぶようにしました。

 34行目から42行目までが、reset関数です。この様に関数として定義し、色々な場所から呼ばれる様に出来ます。まとめておくと変更が1箇所になるので良い事が多いです。ここでは、乱数発生、回数を0に、ガイドラベル初期化をやっています。これを一番最初と、1ゲームが終わった後に呼んでいます。

 73行目付近にあった処理をreset関数内に移動し、ここではreset関数を呼び出すだけにしています。

 続いて、セグメンテッドコントロールを入れて、初級と中級を選択できるようにしたものです。

//
//  ViewController.swift
//  Hi and Lo
//
//  Created by 保 Tabei on 2024/09/22.
//

import UIKit

class ViewController: UIViewController {

    ///ガイドラベル
    @IBOutlet weak var Guide: UILabel!
    ///入力フィールド(0〜9を入れる)
    @IBOutlet weak var Input: UITextField!
    ///回数表示ラベル
    @IBOutlet weak var Count: UILabel!
    ///レベル指定セグメンテッドコントロール
    @IBOutlet weak var Level: UISegmentedControl!
    
    ///乱数保持変数
    var randInt = 0
    ///回数保持、最初は0
    var cnt = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //回数表示0回目
        Count.text = "0回目"
        //初期設定処理
        reset()
    }

    ///初期設定処理、ゲーム開始状態にする
    func reset()
    {
        //初級の場合
        if Level.selectedSegmentIndex == 0 {
            //乱数発生 0〜9
            randInt = Int.random(in: 0 ..< 10)
            //ガイドラベル初期化 0〜9
            Guide.text = "0~9の数字を入れてボタンを押して下さい"
        //中級の場合
        } else {
            //乱数発生 0〜19
            randInt = Int.random(in: 0 ..< 20)
            //ガイドラベル初期化 0〜19
            Guide.text = "0~19の数字を入れてボタンを押して下さい"
        }
        //回数初期化0に
        cnt = 0
    }

    ///レベル変更時処理
    @IBAction func LevelChange(_ sender: Any) {
        //初期設定処理
        reset()
    }
    
    ///ボタン押下時処理
    @IBAction func TouchBtnGo(_ sender: Any) {
        //回数加算
        cnt = cnt + 1
        //回数表示
        Count.text = cnt.description + "回目"
        //入力フィールドに入れた値を数値としてval変数に入れる
        let val = Int(Input.text!)!
        //入力値と乱数を比べて入力値が大きい場合
        if val > randInt {
            Guide.text = "もっと小さいです"
        }
        //入力値と乱数を比べて入力値が小さい場合
        else if val < randInt {
            Guide.text = "もっと大きいです"
        }
        //上記以外、等しい時
        else {
            //アラートを出す為のコントローラー設定
            let alert = UIAlertController()
            //アラートタイトル
            alert.title = "当たり"
            //アラートメッセージ
            alert.message = "当たりです"
            //アラートアクション
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            //アラートを出す
            present(alert, animated: true, completion: nil)
            //初期設定処理
            reset()
        }
    }
    
}

 19行目が、セグメンテッドコントロールを扱えるようにする為に名前を付けた部分です。

 36行目から53行目のreset関数が変更になっています。初級と中級で乱数の発生範囲、表示を変更しています。

 39行目は、セグメンテッドコントロールのインデックスが1(初級)の場合にという条件で、40行目〜43行目で初級での初期化をしています。

 45行目は、39行目以外という事で、中級の場合となっており、46行目〜49行目で中級での初期化をしています。

 56行目〜59行目は、セグメンテッドコントロールの値が変わった時(初級から中級、中級から初級)に動作する関数で、reset関数を呼ぶ様にしています。ここで呼ぶことで、セグメンテッドコントロールの変更がすぐに反映される様になります。この処理を加えないと、初級、中級の変更は、1ゲームが終わった時に変更されるという動作になり、表示との乖離が出来て分かりにくくなると思います。

目次 通常版

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA