新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つ区切りになります。