新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ゲームが終わった時に変更されるという動作になり、表示との乖離が出来て分かりにくくなると思います。