新Swiftで行こう…第59回「トランプ1解説」 田部井保

目次 通常版

 トランプ1の解説です。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/25.
//

import UIKit

class ViewController: UIViewController {
    ///マーク表示用ラベル
    @IBOutlet weak var lblMark: UILabel!
    ///ナンバー表示用ラベル
    @IBOutlet weak var lblNumber: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    ///ボタン押下時処理
    @IBAction func btnGoTouch(_ sender: Any) {
        //マーク乱数発生(0〜3)
        let mark = Int.random(in: 0 ..< 4)
        //ナンバー乱数発生(0〜12)
        let number = Int.random(in: 0 ..< 13)
        //マークにより振り分け
        switch mark {
        case 0:
            lblMark.text = "♣️"
        case 1:
            lblMark.text = "♦️"
        case 2:
            lblMark.text = "♥️"
        case 3:
            lblMark.text = "♠️"
        default:
            lblMark.text = ""
        }
        //ナンバーにより振り分け
        switch number {
        case 0:
            lblNumber.text = "A"
        case 1:
            lblNumber.text = "2"
        case 2:
            lblNumber.text = "3"
        case 3:
            lblNumber.text = "4"
        case 4:
            lblNumber.text = "5"
        case 5:
            lblNumber.text = "6"
        case 6:
            lblNumber.text = "7"
        case 7:
            lblNumber.text = "8"
        case 8:
            lblNumber.text = "9"
        case 9:
            lblNumber.text = "T"
        case 10:
            lblNumber.text = "J"
        case 11:
            lblNumber.text = "Q"
        case 12:
            lblNumber.text = "K"
        default:
            lblNumber.text = ""
        }
    }
    
}

 24行目でマークの乱数発生をしています。ここで1〜4ではなくて、0〜3としている所が不思議かも知れません。これは、この回の後で説明します。

 26行目でナンバーの乱数を発生しています。ここも1〜13ではなくて、0〜12としています。

 あとは、マークとナンバーによって表示するものを変えています。

 バリエーション2です。ラベルを一つにしました。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/25.
//

import UIKit

class ViewController: UIViewController {
    ///カード表示用ラベル
    @IBOutlet weak var lblCard: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    ///ボタン押下時処理
    @IBAction func btnGoTouch(_ sender: Any) {
        //マーク乱数発生(0〜3)
        let mark = Int.random(in: 0 ..< 4)
        //ナンバー乱数発生(0〜12)
        let number = Int.random(in: 0 ..< 13)
        
        //マーク保持変数
        var strMark:String
        //ナンバー保持変数
        var strNumber:String
        
        //マークにより振り分け
        switch mark {
        case 0:
            strMark = "♣️"
        case 1:
            strMark = "♦️"
        case 2:
            strMark = "♥️"
        case 3:
            strMark = "♠️"
        default:
            strMark = ""
        }
        
        //ナンバーにより振り分け
        switch number {
        case 0:
            strNumber = "A"
        case 1:
            strNumber = "2"
        case 2:
            strNumber = "3"
        case 3:
            strNumber = "4"
        case 4:
            strNumber = "5"
        case 5:
            strNumber = "6"
        case 6:
            strNumber = "7"
        case 7:
            strNumber = "8"
        case 8:
            strNumber = "9"
        case 9:
            strNumber = "T"
        case 10:
            strNumber = "J"
        case 11:
            strNumber = "Q"
        case 12:
            strNumber = "K"
        default:
            strNumber = ""
        }
        //カード表示用ラベルにマークとナンバーを表示
        lblCard.text = strMark + strNumber
    }
    
}

 バリエーション3です。ランダムに出す数をマークとナンバーで分けなくしました。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/25.
//

import UIKit

class ViewController: UIViewController {
    ///カード表示用ラベル
    @IBOutlet weak var lblCard: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    ///ボタン押下時処理
    @IBAction func btnGoTouch(_ sender: Any) {
        //カード乱数発生(0〜51)
        let card = Int.random(in: 0 ..< 52)
        
        //マーク保持変数
        var strMark:String
        //ナンバー保持変数
        var strNumber:String
        
        //マークにより振り分け
        switch card / 13 {
        case 0:
            strMark = "♣️"
        case 1:
            strMark = "♦️"
        case 2:
            strMark = "♥️"
        case 3:
            strMark = "♠️"
        default:
            strMark = ""
        }
        
        //ナンバーにより振り分け
        switch card % 13 {
        case 0:
            strNumber = "A"
        case 1:
            strNumber = "2"
        case 2:
            strNumber = "3"
        case 3:
            strNumber = "4"
        case 4:
            strNumber = "5"
        case 5:
            strNumber = "6"
        case 6:
            strNumber = "7"
        case 7:
            strNumber = "8"
        case 8:
            strNumber = "9"
        case 9:
            strNumber = "T"
        case 10:
            strNumber = "J"
        case 11:
            strNumber = "Q"
        case 12:
            strNumber = "K"
        default:
            strNumber = ""
        }
        //カード表示用ラベルにマークとナンバーを表示
        lblCard.text = strMark + strNumber
    }
    
}

 再掲になりますが、トランプの場合、一度配られたカードは捨てられたカードを復活させた場合以外はもう出て来ません。そこでマークとナンバーを分けていると、例えばハート❤️はもう出尽くしたのにマークのハート❤️が出てしまうという事が考えられます。ランダムに出す数は一つの方が良いと思われます。特にジョーカーの事を考えると一つの方が良いと思われます。

 一つにして、52枚で、0〜12が♣️、13〜25が♦️、26〜38が♥️、39〜51が♠️となると良いです。これは card に0〜51の乱数を発生させて、card / 13 と商を計算すると、0になるのが♣️、1になるのが♦️、2になるのが♥️、3になるのが♠️となります。

 そして card % 13 と剰余を計算すると、0から12が得られます。0から順にA、2、3…K に割り当てられます。この様に、1〜4、1〜13としないで、0〜3、0〜12としておくと、シンプルになります。コンピュータでは、1始まりより、0始まりとした方が良い場面が結構あります。

 バリエーション4です。配列という仕組みを使ってみました。シンプルになりました。

//
//  ViewController.swift
//  Card
//
//  Created by 保 Tabei on 2024/09/25.
//

import UIKit

class ViewController: UIViewController {
    ///カード表示用ラベル
    @IBOutlet weak var lblCard: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    ///マーク保持配列
    let mark: [String] = ["♣️","♦️","❤️","♠️"]
    ///ナンバー保持配列
    let number: [String] = ["A","2","3","4","5","6","7","8","9","T","J","Q","K"]

    ///ボタン押下時処理
    @IBAction func btnGoTouch(_ sender: Any) {
        //カード乱数発生(0〜51)
        let card = Int.random(in: 0 ..< 52)
        //カード表示用ラベルにマークとナンバーを表示
        lblCard.text = mark[card / 13] + number[card % 13]
    }
    
}

 20行目でマークの絵柄を保持する配列を定義しています。こうすると、mark[0] とすると”♣️”の文字列が、mark[1] とすると”♦️”の文字列が得られます。同様に22行目でナンバーの文字列を保持する配列を定義しています。こうすると、number[0] とすると”A”の文字列が、number[1] とすると”2″の文字列が、number[2] とすると”3″の文字列が得られます。こういったものを配列と言いますが、配列を使う事でプログラムがシンプルになる事が良くあります。

目次 通常版

コメントを残す

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

CAPTCHA