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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

1160閲覧

[swift] 4*4のまるばつゲームの不具合について

isekiryu

総合スコア15

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/10/19 04:13

前提・実現したいこと

4つ揃えると勝ちになるゲームを作成中です。

今、生じている不具合の内容です。

・まるを4つ揃えても、勝ちにならない。
・ばつを4つ揃えた後に引き続きプレイできる。

これを
・まるorばつを4つ揃えた時点でボタンを押せないようにしたい。

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

エラーメッセージ

該当のソースコード

import UIKit class ViewController: UIViewController { var activePlayer = 1 //cross var gameState = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] let winningCombinations = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15],[0,4,8,12],[1,5,9,12],[2,6,10,14],[3,7,11,15]] var gameIsActive = true @IBOutlet weak var label: UILabel! @IBAction func action(_ sender: AnyObject) { if (gameState[sender.tag-1] == 0 && gameIsActive == true) { gameState[sender.tag-1] = activePlayer if (activePlayer == 1) { sender.setImage(UIImage(named: "Cross.png"),for: UIControl.State()) activePlayer = 2 } else { sender.setImage(UIImage(named: "Nought.png"),for: UIControl.State()) activePlayer = 1 } } for combination in winningCombinations { if gameState[combination[0]] != 0 && // 0番目と1番目が同じコマか判断 gameState[combination[0]] == gameState[combination[1]] && // 1番目と2番目が同じコマか判断 gameState[combination[1]] == gameState[combination[2]] && // 2番目と3番目が同じコマか判断 gameState[combination[2]] == gameState[combination[3]] { gameIsActive = false if gameState[combination[0]] == 1 { label.text = "✖️の勝ち!" } else { label.text = "○の勝ち!" } playAgainButton.isHidden = false label.isHidden = false } } gameIsActive = false for i in gameState { if i == 0 { gameIsActive = true break } } if gameIsActive == false { label.text = "引き分け!" label.isHidden = false playAgainButton.isHidden = false } } @IBOutlet weak var playAgainButton: UIButton! @IBAction func playAgain(_ sender: AnyObject) { gameState = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] gameIsActive = true activePlayer = 1 playAgainButton.isHidden = true label.isHidden = true for i in 1...16 { let button = view.viewWithTag(i) as! UIButton button.setImage(nil, for: UIControl.State()) } } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

補足情報(FW/ツールのバージョンなど)

イメージ説明

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1 for combination in winningCombinations { 2 if gameState[combination[0]] != 0 && gameState[combination[0]] == 3 gameState[combination[1]] && gameState[combination[1]] == 4 gameState[combination[2]] && gameState[combination[2]] == 5 gameState[combination[3]] { 6 gameIsActive = false 7 8 if gameState[combination[0]] == 1 { 9 label.text = "✖️の勝ち!" 10 } else { 11 label.text = "○の勝ち!" 12 } 13 14 playAgainButton.isHidden = false 15 label.isHidden = false 16 17 // この時点で勝負が決まっているので、return などで終了させる 18 } 19 } 20 21 gameIsActive = false 22 23 for i in gameState { 24 if i == 0 { 25 gameIsActive = true 26 break 27 } 28 } 29

上記のロジックだと、勝負がついた結果 gameIsActivefalse になったにもかかわらず、次の for-in 文で gameIsActivetrue になってしまう可能性があります。

コード中のコメント通り、勝負が決まった時点で関数から抜けるなどすれば、期待通りの動きになるはずです。

Swift

1 let winningCombinations = [[0,1,2,3],[4,5,6,7],[8,9,10,11],[12,13,14,15],[0,4,8,12],[1,5,9,12],[2,6,10,14],[3,7,11,15]]

上記の表ですが、一部間違いがあるようです。

[1,5,9,12] ではなく、[1,5,9,13]ではないでしょうか。

投稿2020/10/19 05:26

TsukubaDepot

総合スコア5086

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

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

isekiryu

2020/10/19 06:57

// この時点で勝負が決まっているので、return などで終了させる return gameIsActive = false と入れてみた結果、うまく行きました。2つ目の記事ありがとうございます。
TsukubaDepot

2020/10/19 06:58

コンパイルは通っているかもしれませんが、文法的に間違っています。 @IBAction func action(_ sender: AnyObject) と、action という関数は戻り値なしで宣言されていますので return だけで成立します。
isekiryu

2020/10/19 07:23

そうなんですね。変更します。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問