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

目次 通常版

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

 2番目の問題です。

//
//  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.
        //初期設定処理
        reset()
    }

    ///初期設定処理、ゲーム開始状態にする
    func reset()
    {
        //レベル変数
        var lv = 0
        //初級の場合
        if Level.selectedSegmentIndex == 0 {
            lv = 10
        //中級の場合
        } else {
            lv = 20
        }
        //乱数発生 0〜lv-1
        randInt = Int.random(in: 0 ..< lv)
        //ガイドラベル初期化 0〜lv-1
        Guide.text = "0~" + (lv - 1).description + "の数字を入れてボタンを押して下さい"
        //回数初期化0に
        cnt = 0
        //回数表示0回目
        Count.text = "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 {
            Guide.text = "当たりです"
            //OKボタンの表示と押下時処理記述
            //押下時reset関数を呼ぶ
            let okAction = UIAlertAction(title: "OK", style: .default)
            { (action) in
                self.reset()
            }
            //アラートコントローラー定義
            //タイトル、メッセージをまとめた
            //スタイルはアラート
            let alert = UIAlertController(title: "当たり", message: "当たりです", preferredStyle: .alert)
            //アラートアクション
            alert.addAction(okAction)
            //アラートを出す
            present(alert, animated: true, completion: nil)
        }
    }
    
}

 37行目の様にlv変数を導入しました。これを初級は10、中級は20とする事で、乱数の発生は 0 ..< lv として、0〜9、0〜19を実現しています。表示も0〜 (lv – 1).description として、0〜9、0〜19を実現しています。

 3番目の問題です。reset関数のみです。

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

 10行目、今までelseだけだったものに if Level.selectedSegmentIndex == 1 を加えました。LevelセグメンテッドコントロールのselectedSegmentIndexが1(中級)なら以下のlvに20を入れる処理となります。selectedSegmentIndex 0が初級、1が中級、2が上級となります。この値は、セグメンテッドコントロールのプロパティの設定時に Segment 0 – 初級 等と出たので分かるのではないかと思います。パソコンの世界では、1から始めるより0から始めた方が都合が良い事が多いので、0から始める場合が結構あります。今回13行目から15行目が新しく追加された部分で、初級でも中級でもない上級の設定となります。ここでlvに30を入れています。

 別の書き方です。

    ///初期設定処理、ゲーム開始状態にする
    func reset()
    {
        //レベル変数
        var lv = 0
        //セグメンテッドコントロールのセグメントのタイトル
        switch Level.titleForSegment(at:Level.selectedSegmentIndex) {
        //初級の場合
        case "初級":
            lv = 10
        //中級の場合
        case "中級":
            lv = 20
        //上級の場合
        default:
            lv = 30
        }
        //乱数発生 0〜lv-1
        randInt = Int.random(in: 0 ..< lv)
        //ガイドラベル初期化 0〜lv-1
        Guide.text = "0~" + (lv - 1).description + "の数字を入れてボタンを押して下さい"
        //回数初期化0に
        cnt = 0
        //回数表示0回目
        Count.text = "0回目"
    }

 一つ上の例では、

if … { }
else if … { }
else { } という様にもし〜ならば〜それ以外でもし〜ならば〜それ以外ならば〜という様な構文でしたが、

今回のものは、
switch …
case …:
 〜
case …:
 〜
default:
 〜
という構文になっています。

それから、Level.selectedSegmentIndex を直接使うのではなく、Level.titleForSegment(at:Level.selectedSegmentIndex)という様にそのセグメントインデックスのタイトルを指定しています。ここは

        //セグメンテッドコントロールのセグメントのタイトル
        switch Level.selectedSegmentIndex {
        //初級の場合
        case 0:
            lv = 10
        //中級の場合
        case 1:
            lv = 20
        //上級の場合
        default:
            lv = 30
        }

としても良いです。

目次 通常版

コメントを残す

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

CAPTCHA