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

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

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

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

Swift

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

Q&A

解決済

1回答

1299閲覧

[swift] まるばつゲームを4*4にしたい。

isekiryu

総合スコア15

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/10/18 11:04

前提・実現したいこと

海外のYouTuberの動画を参考にして、33のまるばつゲームを模写しました。その際に、44を作成したら、面白いのではないかと思い、挑戦しました。

○と✖️を交互に押すことや一度押したものは、押せないようなものは実装できました。
今のコードだと、3つ揃えると勝ちになっています。これを、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 @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 && gameState[combination[0]] == gameState[combination[1]] && gameState[combination[1]] == gameState[combination[2]] { gameIsActive = false if gameState[combination[0]] == 1 { print("CROSS") } else { print("NOUGHT") } } } } override func viewDidLoad() { super.viewDidLoad() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

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

このような感じでシンプルなものになっています。

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

Swift

1if gameState[combination[0]] != 0 && gameState[combination[0]] == 2 gameState[combination[1]] && gameState[combination[1]] == 3 gameState[combination[2]]

勝敗判定は

  1. 既にコマが置かれている
  2. 一列全てのコマが同じコマである

というアルゴリズムになっていますので、これを 4 * 4 に対応するようにすれば良いだけかと思います。

一列全て同じコマとのは

Swift

1gameState[combination[n]] == gameState[combination[n + 1]]

という具合に、一つ前のマスと次のマスの状態が同じか否かで判断しています。
今見ている範囲は 0 から 2 までと3つ分だけですので、これを4つ分にすればいいかと思います。

Swift

1// 先頭のマスに何か置かれている 2if gameState[combination[0]] != 0 && 3 // 0番目と1番目が同じコマか判断 4 gameState[combination[0]] == gameState[combination[1]] && 5 // 1番目と2番目が同じコマか判断 6 gameState[combination[1]] == gameState[combination[2]] && 7 // 2番目と3番目が同じコマか判断 8 gameState[combination[2]] == gameState[combination[3]] {

ちなみに、現在のwinningCombinationsは斜めの条件が入っていないため、斜めに4つ並んでも勝者判定が行われないようです(それが仕様であれば別に構いませんが)。

また、 4 * 4 程度であればこれでも良いのですが、マス目が増えると大変になってくるので、オセロの勝者判定のアルゴリズムなどを参考にするのも良いかもしれません。

投稿2020/10/18 23:31

TsukubaDepot

総合スコア5086

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

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

isekiryu

2020/10/19 02:15

回答していただきありがとうございます。4つ揃えると勝ちになれるようなものを作れました。斜めに関してですが、4つの斜めが2通りあると思います。斜めに関しては、もう少し考えてから実装してみます。助かりました。
TsukubaDepot

2020/10/19 02:51

難しく考える必要はないとおもいます。 winningCombinationsに勝ちパターンを列挙していますから、そこに斜めのパターンを追加すれば良いだけだと思います。 [0,1,2,3] であれば、0, 1, 2, 3 番目のマスをチェックするという意味ですから(ちなみに、セルの番号は tag - 1 になっているようです)、斜めも同じように入れれば良いだけだと思います。左上からと右下からは同じ配列なので、実際に追加するのは、左上から右下と、右上から左下の2パターンだけだと思います。
isekiryu

2020/10/19 03:20

わざわざありがとうございます。斜めに関しては、ゲーム性を複雑にするために、斜めのみ3つにしてみようなどを考えています。 このコードを参考にした後に、もう一回やり直すなどのものを実装してほぼ完成した後に試してみたところ、 ・❌が勝っても、ボタンが押せて最後まで押すと、引き分けになってしまう。 ・○が勝っても、テキストが表示されない。 といった不具合がありました。どのように対応したらいいか教えていただけると嬉しいです。 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() } } もし、わかりにくかったら、新しい質問として出します。
TsukubaDepot

2020/10/19 03:28

新しい質問にしていただいた方がいいですね。
isekiryu

2020/10/19 05:25

お願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問