質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

863閲覧

swiftを用いた対人用オセロアプリ

f_r

総合スコア4

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/08/11 03:59

編集2019/08/14 07:08

前提・実現したいこと

初心者です。
対人用オセロゲームを作成しています。
コンパイルは通りますが、白のターンの際リバースしない。また、次に白が置けるところを表示しないという現象が起こっています。
どのように改善すればよろしいでしょうか。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

文字数制限で載せれなかった部分があるので、こちらに追加で載せておきました。

swift

1コード 2// Board.swift 3// オセロ 対戦ゲームimport Foundation 4class Board{ 5 6 var SIZE: Int = 0 7 let DIRECTIONS_XY = [[-1, -1], [+0, -1], [+1, -1], 8 [-1, +0], [+1, +0], 9 [-1, +1], [+0, +1], [+1, +1]] 10 let BLACK = -1 11 let WHITE = +1 12 let BLANK = +0 13 var square:[[Int]] = [] 14 15 // オセロを開始する際に呼ばれ、オセロ盤を初期化する 16 func start(size: Int){ 17 self.SIZE = size 18 let center = size / 2 19 for _ in 0..<self.SIZE{ 20 var array:[Int] = [] 21 for _ in 0..<self.SIZE{ 22 array += [BLANK] 23 } 24 square += [array] 25 } 26 square[center-1][center-1] = self.WHITE 27 square[center-1][center] = self.BLACK 28 square[center][center-1] = self.BLACK 29 square[center][center] = self.WHITE 30 } 31 32 // 盤上にある石の個数を返す 33 func returnStone() -> (Int,Int) { 34 var black = 0 35 var white = 0 36 var blank = 0 37 for y in 0..<SIZE{ 38 for x in 0..<SIZE{ 39 switch square[y][x]{ 40 case BLACK: 41 black += 1 42 case WHITE: 43 white += 1 44 default: 45 blank += 1 46 } 47 } 48 } 49 return (black,white) 50 } 51 52 // 対戦終了時もう一度対戦する際にボード板をリセットする 53 func reset(){ 54 var _square:[[Int]] = [] 55 let size = SIZE 56 let center = size / 2 57 for _ in 0..<SIZE{ 58 var array:[Int] = [] 59 for _ in 0..<SIZE{ 60 array += [BLANK] 61 } 62 _square += [array] 63 } 64 _square[center-1][center-1] = self.WHITE 65 _square[center-1][center] = self.BLACK 66 _square[center][center-1] = self.BLACK 67 _square[center][center] = self.WHITE 68 square = _square 69 } 70 71 // ボード盤を返す 72 func return_board() -> [[Int]]{ 73 return square 74 } 75 76 // 呼ばれた段階で Game Over であるかどうかを判定する 77 func gameOver() -> Bool { 78 var black = 0 79 var white = 0 80 var blank = 0 81 for y in 0..<SIZE{ 82 for x in 0..<SIZE{ 83 switch square[y][x]{ 84 case BLACK: 85 black += 1 86 case WHITE: 87 white += 1 88 default: 89 blank += 1 90 } 91 } 92 } 93 if( blank == 0 || black == 0 || white == 0 ){ 94 return true 95 } 96 if( self.available(stone: BLACK).count == 0 && self.available(stone: WHITE).count == 0){ 97 return true 98 } 99 return false 100 } 101 102 func is_available( x: Int, y:Int, stone: Int) -> Bool { 103 if ( square[x][y] != BLANK ){ 104 return false 105 } 106 for i in 0..<8 { 107 let dx = DIRECTIONS_XY[i][0] 108 let dy = DIRECTIONS_XY[i][1] 109 110 if( self.count_reversible(x: x, y: y, dx: dx, dy: dy, stone: stone) > 0 ){ 111 return true 112 } 113 } 114 return false 115 } 116 117 // 引数で与えられた石の次に打てる場所を返す 118 func available(stone: Int) -> [[Int]]{ 119 var return_array:[[Int]] = [] 120 for x in 0..<SIZE{ 121 for y in 0..<SIZE{ 122 if( self.is_available( x: x, y: y, stone: stone) ){ 123 return_array += [[x,y]] 124 } 125 } 126 } 127 return return_array 128 } 129// ボードに石を置く 130 func count_reversible( x: Int, y: Int, dx: Int, dy: Int, stone: Int) -> Int { 131 var _x = x 132 var _y = y 133 for i in 0..<SIZE{ 134 _x = _x + dx 135 _y = _y + dy 136 // 0 <= x < 4 : can't write <- Annoying!!!! 137 if !( 0 <= _x && _x < SIZE && 0 <= _y && _y < SIZE ){ 138 return 0 139 } 140 if (square[_x][_y] == BLANK){ 141 return 0 142 } 143 if (square[_x][_y] == stone){ 144 return i 145 } 146 } 147 return 0 148 } 149}

投稿2019/08/14 07:09

f_r

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問