新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()
        }
    }
}

 次回は、今まで表にしていた他の人のカードを裏にします。

目次 解説編

コメントを残す

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

CAPTCHA