新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″の文字列が得られます。こういったものを配列と言いますが、配列を使う事でプログラムがシンプルになる事が良くあります。