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

目次 解説編

 さて今度は

        Count.text = "0回目"

この部分が、最初に一回呼ばれるだけである点を変更します。なぜ、これがresetに入っていないか疑問に思われたのではないでしょうか?

 当たった時に、最後にresetを呼んでいますが、当たりましたのダイアログが出た時に、reset関数も動作してしまって、「大きいです」「小さいです」の表示が「0~9の数字を入れてボタンを押して下さい」に変わってしまっているのに気付かれた方もいると思います。ダイアログが出ても待っていてくれないのです。

 この点の修正をします。

        else {
            let alert = UIAlertController()
            alert.title = "当たり"
            alert.message = "当たりです"
            alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
            present(alert, animated: true, completion: nil)
            reset()
        }

を以下のように修正します。

        else {
            Guide.text = "当たりです"
            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)
        }

 以下全体ソースです。

//
//  ViewController.swift
//  Hi and Lo
//
//  Created by 保 Tabei on 2024/08/30.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var Guide: UILabel!
    @IBOutlet weak var Input: UITextField!
    @IBOutlet weak var Count: UILabel!
    @IBOutlet weak var Level: UISegmentedControl!
    
    var randInt:Int = 0
    var cnt:Int = 0
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        //Count.text = "0回目"
        reset()
    }
    
    func reset()
    {
        if Level.selectedSegmentIndex == 0 {
            randInt = Int.random(in: 0 ..< 10)
            Guide.text = "0~9の数字を入れてボタンを押して下さい"
        } else {
            randInt = Int.random(in: 0 ..< 20)
            Guide.text = "0~19の数字を入れてボタンを押して下さい"
        }
        cnt = 0
        Count.text = "0回目"
    }

    @IBAction func LevelChange(_ sender: Any)
    {
        reset()
    }
    

    @IBAction func TouchBtnGo(_ sender: Any) {
        cnt = cnt + 1
        Count.text = cnt.description + "回目"
        let val = Int(Input.text!)!
        if val > randInt {
            Guide.text = "もっと小さいです"
        } 
        else if val < randInt {
            Guide.text = "もっと大きいです"
        } 
        else {
            Guide.text = "当たりです"
            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)
        }
    }
    
}

 23行目は、削除したのが分かる様にコメントにしました。ここは削除してしまってもよいです。「//」を頭に付けるとコメントになります。

 さて問題です。

    @IBAction func LevelChange(_ sender: Any)
    {
        reset()
    }

この関数を入れたのはなぜでしょうか? また、reset関数の中身をもう少しシンプルに出来ないでしょうか? また、今度は更に上級(0~29)を加えるとしたらどうすれば良いでしょうか?

 3番目の問題のヒントです。セグメンテッドコントロールを選んで、右上、左から5番目のアイコンを選んで、Segmentsの部分を2から3に変 更すると、2つ区切りだったものが3つ区切りになります。

目次 解説編

コメントを残す

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

CAPTCHA