前提・実現したいこと
初心者です。
対人用オセロゲームを作成しています。
コンパイルは通りますが、白のターンの際リバースしない。また、次に白が置けるところを表示しないという現象が起こっています。
どのように改善すればよろしいでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
swift
1// GameViewController.swift 2// オセロ 対戦ゲーム 3import UIKit 4class GameViewController: UIViewController { 5 6 // BOARDSIZE で ボードのサイズを変更できます。 7 let BOARDSIZE = 8 8 var board = Board() 9 var Stone_count = 0 10 11 // -1: 黒 12 // 1: 白 13 let User1_color = -1 14 let User2_color = 1 15 16 // ボードはボタンを行列配置して表現される 17 var buttonArray: [UIButton] = [] 18 19 // board.png, white.png, black.png 20 let baseBoard = UIImage(named: "board") 21 let white = UIImage(named: "white") 22 let black = UIImage(named: "black") 23 24 var resetButton = UIButton() 25 var passButton = UIButton() 26 var viewStoneCount = UILabel() 27 28 // オセロ盤を表現するボタン 29 class buttonClass: UIButton{ 30 let x: Int 31 let y: Int 32 init( x:Int, y:Int, frame: CGRect ) { 33 self.x = x 34 self.y = y 35 super.init(frame:frame) 36 } 37 required init?(coder aDecoder: NSCoder) { 38 fatalError("error") 39 } 40 } 41 42 // ボタンなどを生成 43 func createUI(){ 44 board.start(size: BOARDSIZE) 45 var y = 83 46 let boxSize = 84 / (BOARDSIZE/4) 47 48 49 viewStoneCount.frame = CGRect(x: 18, y: 430, width: 330, height: 60) 50 viewStoneCount.textAlignment = NSTextAlignment.center 51 viewStoneCount.font = UIFont.systemFont(ofSize: 25) 52 self.view.addSubview(viewStoneCount) 53 for i in 0..<BOARDSIZE{ 54 var x = 19 55 for j in 0..<BOARDSIZE{ 56 let button: UIButton = buttonClass( 57 x: i, 58 y: j, 59 frame:CGRect(x: x,y: y, width: boxSize,height: boxSize)) 60 button.addTarget(self, action: #selector(GameViewController.pushed), for: .touchUpInside) 61 self.view.addSubview(button) 62 button.isEnabled = false 63 buttonArray.append(button) 64 x = x + boxSize + 1 65 } 66 y = y + boxSize + 1 67 } 68 resetButton.frame = CGRect(x: 125, y: 575, width: 125, height: 45) 69 resetButton.addTarget(self, action: #selector(GameViewController.pushResetButton), for: .touchUpInside) 70 resetButton.isEnabled = false 71 resetButton.isHidden = true 72 resetButton.setTitle("RESET", for: .normal) 73 resetButton.titleLabel?.font = UIFont.systemFont(ofSize: 25) 74 resetButton.setTitleColor(.white, for: .normal) 75 resetButton.backgroundColor = UIColor(red: 0.3, green: 0.7, blue: 0.6, alpha: 1) 76 resetButton.layer.cornerRadius = 25 77 resetButton.layer.shadowOpacity = 0.5 78 resetButton.layer.shadowOffset = CGSize(width: 2, height: 2) 79 self.view.addSubview(resetButton) 80 81 passButton.frame = CGRect(x: 150, y: 500, width: 80, height: 30) 82 passButton.addTarget(self, action: #selector(GameViewController.pushPassButton), for: .touchUpInside) 83 passButton.isEnabled = false 84 passButton.isHidden = true 85 passButton.setTitle("Pass", for: .normal) 86 passButton.titleLabel?.font = UIFont.systemFont(ofSize: 25) 87 passButton.setTitleColor(.white, for: .normal) 88 passButton.backgroundColor = UIColor(red: 0.3, green: 0.7, blue: 0.6, alpha: 1) 89 passButton.layer.cornerRadius = 25 90 passButton.layer.shadowOpacity = 0.5 91 passButton.layer.shadowOffset = CGSize(width: 2, height: 2) 92 self.view.addSubview(passButton) 93 drawBoard() 94 } 95 96 // passButton を押された時の処理 97 @objc func pushPassButton() { 98 passButton.isEnabled = false 99 passButton.isHidden = true 100 } 101 102 // resetButton を押された時の処理 103 @objc func pushResetButton() { 104 board.reset() 105 drawBoard() 106 turn = 0 107 resetButton.isEnabled = false 108 resetButton.isHidden = true 109 passButton.isEnabled = false 110 passButton.isHidden = true 111 } 112 113 var turn = 0 114 // ボード盤をタッチされた時の処理 115 @objc func pushed(mybtn: buttonClass){ 116 let player = 2 117 switch turn % player { 118 case 0: 119 mybtn.isEnabled = false 120 board.put(x: mybtn.x, y: mybtn.y, stone: User1_color ) 121 drawBoard() 122 self.turn = turn + 1 123 if( board.gameOver() == true ){ 124 resetButton.isEnabled = true 125 resetButton.isHidden = false 126 } 127 if( board.available(stone: User1_color).count == 0){ 128 passButton.isHidden = false 129 passButton.isEnabled = true 130 } 131 case 1: 132 mybtn.isEnabled = false 133 board.put(x: mybtn.x, y: mybtn.y, stone: User2_color ) 134 drawBoard() 135 self.turn = turn + 1 136 if( board.gameOver() == true ){ 137 resetButton.isHidden = false 138 resetButton.isEnabled = true 139 } 140 141 if( board.available(stone: User2_color).count == 0){ 142 passButton.isHidden = false 143 passButton.isEnabled = true 144 } 145 default: break 146 } 147 } 148 149 // 画面にオセロ盤を表示させる 150 func drawBoard(){ 151 let stonecount = board.returnStone() 152 viewStoneCount.text = "● User1: " + String(stonecount.0) + " ○ User2: " + String(stonecount.1) 153 var count = 0 154 var _board = board.return_board() 155 for y in 0..<BOARDSIZE{ 156 for x in 0..<BOARDSIZE{ 157 if( _board[y][x] == User1_color ){ 158 buttonArray[count].setImage(black, for: .normal) 159 } else if( _board[y][x] == User2_color ){ 160 buttonArray[count].setImage(white, for: .normal) 161 } else { 162 buttonArray[count].setImage(baseBoard, for: .normal) 163 } 164 buttonArray[count].isEnabled = false 165 count += 1 166 } 167 } 168 let availableList = board.available(stone: User1_color) 169 170 for i in 0..<(availableList.count){ 171 let x = availableList[i][0] 172 let y = availableList[i][1] 173 buttonArray[x*BOARDSIZE+y].isEnabled = true 174 } 175 } 176 177 override func viewDidLoad() { 178 super.viewDidLoad() 179 // Do any additional setup after loading the view, typically from a nib. 180 self.createUI() 181 } 182}
試したこと
補足情報(FW/ツールのバージョンなど)
swift
x code 10.3
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。