新Swiftで行こう…第47回「ババ抜き16」 田部井保
カードが無くなって、あがった人に順位を付けて、ゲームから抜ける処理を加えます。
今回の難易度も結構高いです。中々思ったように動かないと思います。
以下ソースコードです。
//
// ViewController.swift
// baba
//
// Created by 保 Tabei on 2024/09/15.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
put53()
}
var eachCard: [[UILabel]] = [[],[],[],[]]
var eachButton: [UIButton] = []
var cardObj:Card = Card(cdCnt: Card.EnumCard.joker)
func put53() {
for i in 0 ..< 4 {
for j in 0 ..< 14 {
let lbl = UILabel(frame: CGRectMake(0, 0, 50, 21))
lbl.center = CGPointMake(50 + 40 * CGFloat(j % 7), 150 + 120 * CGFloat(i) +
50 * CGFloat(j / 7))
lbl.textAlignment = NSTextAlignment.center
if i != 0 && j == 13 {
lbl.text = " "
} else {
lbl.text = "⬛️"
}
eachCard[i] += [lbl]
self.view.addSubview(lbl)
}
let btn = UIButton(frame: CGRectMake(0, 0, 50, 21)) as UIButton
btn.center = CGPointMake(20, 150 + 120 * CGFloat(i) + 25)
btn.setTitle("⚪️", for: .normal)
btn.setTitleColor(UIColor.black, for: .normal)
btn.addTarget(self, action: #selector(btnTapped), for: .touchUpInside)
btn.tag = i
eachButton += [btn]
self.view.addSubview(btn)
}
share()
show()
}
var btnEnable = true
@objc func btnTapped(sender: UIButton) {
if btnEnable == false {
return
}
for i in 0 ..< 4 {
if eachButton[i] == sender {
if sender.currentTitle == "⚪️" {
sender.setTitle("⚫️", for: .normal)
} else {
sender.setTitle("⚪️", for: .normal)
}
} else {
eachButton[i].setTitle("⚪️", for: .normal)
}
}
}
func share() {
btnEnable = true
cardObj.reset()
for i in 0 ..< 4 {
for j in 0 ..< 14 {
if i != 0 && j == 13 {
eachCard[i][j].tag = -1
} else {
var ii: Int
ii = cardObj.put()
eachCard[i][j].text = cardObj.disp(card: ii)
eachCard[i][j].tag = ii
}
}
}
}
func show() {
for i in 0 ..< 4 {
for j in 0 ..< 14 {
if eachCard[i][j].tag >= 0 {
eachCard[i][j].text = cardObj.disp(card: eachCard[i][j].tag)
} else {
eachCard[i][j].text = " "
}
}
}
}
@IBAction func btnGoTouch(_ sender: Any) {
share()
show()
for cardBtn in eachCardButton {
cardBtn.removeFromSuperview()
}
eachCardButton.removeAll()
for changeBtn in eachChangeButton {
changeBtn.removeFromSuperview()
}
eachChangeButton.removeAll()
for i in 0 ..< 4 {
player[i] = true
eachButton[i].setTitle("⚪️", for: .normal)
}
number = 0
}
@IBAction func btnPairTouch(_ sender: Any) {
var selected = false
for i in 0 ..< 4 {
if eachButton[i].currentTitle == "⚫️" {
selected = true
mine = i
break
}
}
if !selected {
let alert = UIAlertController()
alert.title = "選択"
alert.message = "4組のうちのどれかを選択して下さい。"
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true, completion: nil)
return
}
btnEnable = false
for i in 0 ..< 4 {
for j in 0 ..< 13 {
if (eachCard[i][j].tag == 52) || (eachCard[i][j].tag == -1) {
continue
}
for k in j + 1 ..< 14 {
if (eachCard[i][k].tag == 52) || (eachCard[i][k].tag == -1) {
continue
}
if (eachCard[i][j].tag % 13) == (eachCard[i][k].tag % 13) {
eachCard[i][j].tag = -1
eachCard[i][k].tag = -1
break
}
}
}
var find = false
var k = 0
for j in 0 ..< 14 {
if eachCard[i][j].tag == -1 {
find = true
} else {
if find {
eachCard[i][k].tag = eachCard[i][j].tag
eachCard[i][j].tag = -1
}
k += 1
}
}
}
show()
step = 0
if mine == 0 {
btnChangeTouch()
} else if mine == 1 {
get()
}
}
func take(i: Int, randm: Bool) {
var kl = 0
for j in 0 ..< 14 {
if eachCard[i][j].tag == -1 {
kl = j
break
}
}
var k = 0
if randm {
k = Int.random(in: 0 ..< kl)
} else {
for j in 0 ..< kl {
if eachCardButton[j].tag == 1 {
k = j
break
}
}
}
var ii = i
repeat {
ii += 1
if ii > 3 {
ii = 0
}
} while (player[ii] == false)
var stop = false
if eachCard[i][k].tag != 52 {
for jj in 0 ..< 14 {
if stop {
eachCard[ii][jj - 1].tag = eachCard[ii][jj].tag
}
if eachCard[ii][jj].tag == -1 {
break
}
if eachCard[ii][jj].tag == 52 {
continue
}
if (eachCard[ii][jj].tag % 13) == (eachCard[i][k].tag % 13) {
stop = true
}
}
}
if stop == false {
for jj in 0 ..< 14 {
if eachCard[ii][jj].tag == -1 {
eachCard[ii][jj].tag = eachCard[i][k].tag
break
}
}
}
for j in k + 1 ..< 14 {
eachCard[i][j - 1].tag = eachCard[i][j].tag
}
eachCard[i][13].tag = -1
show()
if eachCard[i][0].tag == -1 && player[i] {
player[i] = false
number += 1
eachButton[i].setTitle(number.description, for: .normal)
}
if eachCard[ii][0].tag == -1 && player[i] {
player[ii] = false
number += 1
eachButton[ii].setTitle(number.description, for: .normal)
step += 1
if (step > 3) {
step = 0
}
}
if number > 2 {
var alert = UIAlertController()
alert.title = "終了"
alert.message = "ゲーム終了です。"
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true, completion: nil)
}
}
func hiku() {
take(i: step, randm: true)
}
var eachCardButton: [UIButton] = []
func shuffle() {
let i = step
var kl = 0
var cardList: [Int] = []
for j in 0 ..< 14 {
if eachCard[i][j].tag == -1 {
kl = j
break
}
cardList += [eachCard[i][j].tag]
}
for j in 0 ..< kl {
let jj = Int.random(in: 0 ..< kl - j)
eachCard[i][j].tag = cardList[jj]
for k in jj ..< kl - j - 1 {
cardList[k] = cardList[k + 1]
}
}
show()
}
func get() {
var i = step
var kl = 0
for j in 0 ..< 14 {
if eachCard[i][j].tag == -1 {
kl = j
break
}
}
for j in 0 ..< kl {
let btn = UIButton(frame: CGRectMake(0, 0, 50, 21))
btn.center = CGPointMake(50 + 40 * CGFloat(j % 7), 150 + 120 * CGFloat(i) + 50 * CGFloat(j / 7))
btn.setTitle("◼︎", for: .normal)
btn.setTitleColor(UIColor.blue, for: .normal)
btn.addTarget(self, action: #selector(cardBtnTapped), for: .touchUpInside)
btn.tag = 0
eachCardButton += [btn]
self.view.addSubview(btn)
}
}
@objc func cardBtnTapped(sender: UIButton) {
for cardBtn in eachCardButton {
cardBtn.setTitleColor(UIColor.blue, for: .normal)
cardBtn.tag = 0
}
sender.setTitleColor(UIColor.red, for: .normal)
sender.tag = 1
}
func btnHikuTouch() {
take(i: step, randm: false)
for cardBtn in eachCardButton {
cardBtn.removeFromSuperview()
}
eachCardButton.removeAll()
}
var eachChangeButton: [UIButton] = []
func btnChangeTouch() {
var i = mine
var kl = 0
for j in 0 ..< 14 {
if eachCard[i][j].tag == -1 {
kl = j
break
}
}
for j in 0 ..< kl {
let btn = UIButton(frame: CGRectMake(0, 0, 50, 21))
btn.center = CGPointMake(50 + 40 * CGFloat(j % 7), 150 + 120 * CGFloat(i) + 50 * CGFloat(j / 7))
btn.setTitle("◼︎", for: .normal)
btn.setTitleColor(UIColor.blue, for: .normal)
btn.addTarget(self, action: #selector(cardChangeTapped), for: .touchUpInside)
btn.tag = 0
eachChangeButton += [btn]
self.view.addSubview(btn)
}
}
@objc func cardChangeTapped(sender: UIButton) {
var i = mine
var j = 0
var k = 0
for cardBtn in eachChangeButton {
if cardBtn == sender {
break;
}
k += 1
}
var dis = false
for cardBtn in eachChangeButton {
if cardBtn.tag == 1 {
var change = eachCard[i][j].tag
eachCard[i][j].tag = eachCard[i][k].tag
eachCard[i][k].tag = change
cardBtn.setTitleColor(UIColor.blue, for: .normal)
cardBtn.tag = 0
dis = true
show()
break
}
j += 1
}
if dis == false {
sender.setTitleColor(UIColor.red, for: .normal)
sender.tag = 1
}
}
func changeFinishTouch() {
take(i: step, randm: true)
for changeBtn in eachChangeButton {
changeBtn.removeFromSuperview()
}
eachChangeButton.removeAll()
}
var step = 0
var mine = 0
var player: [Bool] = [true,true,true,true]
var number = 0
@IBAction func btnExecTouch(sender: AnyObject) {
while (player[step] == false) {
step += 1
if (step > 3) {
step = 0
}
}
var reMine = mine
repeat {
reMine -= 1
if reMine < 0 {
reMine = 3
}
} while (player[reMine] == false)
if step == reMine && player[mine] {
var i = step
var kl = 0
for j in 0 ..< 14 {
if eachCard[i][j].tag == -1 {
kl = j
break
}
}
var k = true
for j in 0 ..< kl {
if Int(eachCardButton[j].tag) == 1 {
k = false
break
}
}
if k {
var alert = UIAlertController()
alert.title = "選択"
alert.message = "引くカードを選択して下さい。"
alert.addAction(UIAlertAction(title: "OK", style: .default))
present(alert, animated: true, completion: nil)
return
}
btnHikuTouch()
step += 1
if step > 3 {
step = 0
}
btnChangeTouch()
} else if step == mine && player[mine] {
changeFinishTouch()
step += 1
if step > 3 {
step = 0
}
shuffle()
} else {
hiku()
step += 1
if step > 3 {
step = 0
}
shuffle()
}
if step == reMine && player[mine] {
get()
}
}
}
次回は、今まで表にしていた他の人のカードを裏にします。