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

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

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

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1939閲覧

Swiftバグ?ミス?

souroppy

総合スコア44

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

Xcode

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

Swift

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

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/06/09 12:42

編集2016/06/10 11:46

Swiftで、〜〜をいったら負けゲームのようなものを作ってみたのですが予期せぬ動きがまれに起こります。
まず全文がこんな感じなんですが、たまに、1、23、ボタンを押したときにゼロに戻ってしまったり、すでにtetoがXを超えているのに、ゲームが続けられたりしてしまいます。理由が自分ではわからないのでお教えください。

Swift

1import UIKit 2import SpriteKit 3 4class ViewController: UIViewController { 5 6 7 @IBOutlet weak var start: UIButton! 8 @IBOutlet weak var one: UIButton! 9 @IBOutlet weak var two: UIButton! 10 @IBOutlet weak var three: UIButton! 11 @IBOutlet weak var kekka: UILabel! 12 @IBOutlet weak var agote: UILabel! 13 @IBOutlet weak var konkai: UILabel! 14 @IBOutlet weak var serifu: UILabel! 15 @IBOutlet weak var make: UILabel! 16 17 var teto = 0 18 var X = 0 19 20 21 22 23 override func viewDidLoad() { 24 super.viewDidLoad() 25 // Do any additional setup after loading the view, typically from a nib. 26 } 27 28 override func didReceiveMemoryWarning() { 29 super.didReceiveMemoryWarning() 30 // Dispose of any resources that can be recreated. 31 } 32 33 34 //開始ボタン 35 @IBAction func starta(sender: AnyObject) { 36 teto = 0 37 self.make.hidden = true 38 self.one.hidden = false 39 self.two.hidden = false 40 self.three.hidden = false 41 self.agote.hidden = false 42 self.kekka.hidden = false 43 self.serifu.hidden = false 44 self.konkai.hidden = false 45 X = Int(arc4random_uniform(20))+10 46 if X % 4 == 1{ 47 return 48 } 49 self.start.hidden = true 50 konkai.text = String(X) 51 if X % 4 == 0 { 52 teto = 3 53 } else { 54 teto = (X-4)%4-1 55 } 56 agote.text = String(teto) 57 kekka.text = String(teto) 58 } 59 60 //1ボタン 61 @IBAction func onea(sender: AnyObject) { 62 teto = teto + 1 63 kekka.text = String(teto) 64 serifu.text = "考え中" 65 self.one.hidden = true 66 self.two.hidden = true 67 self.three.hidden = true 68 if X <= teto { 69 make.text = "You have lose" 70 self.make.hidden = false 71 self.start.hidden = false 72 self.one.hidden = true 73 self.two.hidden = true 74 self.three.hidden = true 75 self.agote.hidden = true 76 self.kekka.hidden = true 77 self.serifu.hidden = true 78 self.konkai.hidden = true 79 } else { 80 let delay = 3 * Double(NSEC_PER_SEC) 81 let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 82 dispatch_after(time, dispatch_get_main_queue(), { 83 self.teto = self.teto + 3 84 self.kekka.text = String(self.teto) 85 self.agote.text = String(3) 86 self.serifu.text = "君の番だよ" 87 self.one.hidden = false 88 self.two.hidden = false 89 self.three.hidden = false 90 if self.teto > self.X - 1{ 91 self.two.hidden = true 92 self.three.hidden = true 93 } 94 if self.teto > self.X - 2{ 95 self.three.hidden = true 96 } 97 self.teto = 0 98 }) 99 } 100 101} 102 //2ボタン 103 @IBAction func twoa(sender: AnyObject) { 104 teto = teto + 2 105 kekka.text = String(teto) 106 serifu.text = "考え中" 107 self.one.hidden = true 108 self.two.hidden = true 109 self.three.hidden = true 110 if X <= teto { 111 make.text = "You have lose" 112 self.make.hidden = false 113 self.start.hidden = false 114 self.one.hidden = true 115 self.two.hidden = true 116 self.three.hidden = true 117 self.agote.hidden = true 118 self.kekka.hidden = true 119 self.serifu.hidden = true 120 self.konkai.hidden = true 121 } else { 122 let delay = 3 * Double(NSEC_PER_SEC) 123 let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 124 dispatch_after(time, dispatch_get_main_queue(), { 125 self.teto = self.teto + 2 126 self.kekka.text = String(self.teto) 127 self.agote.text = String(2) 128 self.serifu.text = "君の番だよ" 129 self.one.hidden = false 130 self.two.hidden = false 131 self.three.hidden = false 132 if self.teto >= self.X - 1{ 133 self.two.hidden = true 134 self.three.hidden = true 135 } 136 if self.teto >= self.X - 2{ 137 self.three.hidden = true 138 } 139 }) 140 } 141 } 142 //3ボタン 143 @IBAction func threea(sender: AnyObject) { 144 teto = teto + 3 145 kekka.text = String(teto) 146 serifu.text = "考え中" 147 self.one.hidden = true 148 self.two.hidden = true 149 self.three.hidden = true 150 if X <= teto { 151 make.text = "You have lose" 152 self.make.hidden = false 153 self.start.hidden = false 154 self.one.hidden = true 155 self.two.hidden = true 156 self.three.hidden = true 157 self.agote.hidden = true 158 self.kekka.hidden = true 159 self.serifu.hidden = true 160 self.konkai.hidden = true 161 } else { 162 let delay = 3 * Double(NSEC_PER_SEC) 163 let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) 164 dispatch_after(time, dispatch_get_main_queue(), { 165 self.teto = self.teto + 1 166 self.kekka.text = String(self.teto) 167 self.agote.text = String(1) 168 self.serifu.text = "君の番だよ" 169 self.one.hidden = false 170 self.two.hidden = false 171 self.three.hidden = false 172 if self.teto > self.X - 1{ 173 self.two.hidden = true 174 self.three.hidden = true 175 } 176 if self.teto > self.X - 2{ 177 self.three.hidden = true 178 } 179 }) 180 } 181 } 182 183}

・追記
このゲームは二人(自分とコンピューター)で1〜3(任意)ずつ言っていき、Xの数字を言った人が負けです。今のところ設定は必ずコンピューターが勝つようにしているつもりです。今回の誤作動?は、例えば今の数字が4で次に人が3を押すと7になるはずなのに3(押した数)に戻ってしまいます。

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

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

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

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

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

_Kentarou

2016/06/10 11:23

このゲームのルールがそもそも分からないので、バグなのか仕様なのかがハッキリしません。このボタンを押すとこう動くのが正解、こうするとゲームオーバーでこう動く等、細かい仕様を記述してください。
souroppy

2016/06/10 11:47

すみません。説明不足でした・・・。
guest

回答1

0

ベストアンサー

1、23、ボタンを押したときにゼロに戻ってしまったり

こちらの件は1ボタンの相手のターンの最後にself.teto = 0と書いてあるのでカウントがリセットされています。

すでにtetoがXを超えているのに、ゲームが続けられたり

上記のコードを削除して、数回試したところ数がオーバーしてもゲームが続けられるという事はありませんでした。
確認してみてください。


コードの中に同じ様な記述が複数あったのでまとめてみました、参考にしてみてください。

swift

1import UIKit 2import SpriteKit 3 4class ViewController: UIViewController { 5 6 @IBOutlet weak var start: UIButton! 7 @IBOutlet weak var one : UIButton! 8 @IBOutlet weak var two : UIButton! 9 @IBOutlet weak var three: UIButton! 10 11 @IBOutlet weak var kekka : UILabel! 12 @IBOutlet weak var agote : UILabel! 13 @IBOutlet weak var konkai: UILabel! 14 @IBOutlet weak var serifu: UILabel! 15 @IBOutlet weak var make : UILabel! 16 17 var teto = 0 18 var X = 0 19 20 //開始ボタン 21 @IBAction func starta(sender: AnyObject) { 22 teto = 0 23 [make].forEach { $0.hidden = true } 24 [one, two, three, agote, kekka, serifu, konkai].forEach { $0.hidden = false } 25 26 X = Int(arc4random_uniform(20))+10 27 if X % 4 == 1{ 28 return 29 } 30 31 self.start.hidden = true 32 konkai.text = String(X) 33 if X % 4 == 0 { 34 teto = 3 35 } else { 36 teto = (X-4)%4-1 37 } 38 agote.text = String(teto) 39 kekka.text = String(teto) 40 } 41 42 // 1ボタン 43 @IBAction func onea(sender: AnyObject) { 44 setTeto(player1Teto: 1, player2Teto: 3) 45 } 46 47 // 2ボタン 48 @IBAction func twoa(sender: AnyObject) { 49 setTeto(player1Teto: 2, player2Teto: 2) 50 } 51 52 // 3ボタン 53 @IBAction func threea(sender: AnyObject) { 54 setTeto(player1Teto: 3, player2Teto: 1) 55 } 56 57 func setTeto(player1Teto teto1: Int, player2Teto teto2: Int) { 58 setPlayer1(teto1) 59 if X <= teto { 60 gemeOver() 61 } else { 62 setPlayer2(teto2) 63 } 64 } 65 66 func setPlayer1(player1Teto: Int) { 67 teto += player1Teto 68 kekka.text = String(teto) 69 serifu.text = "考え中" 70 [one, two, three].forEach { $0.hidden = true } 71 } 72 73 func setPlayer2(player2Teto: Int) { 74 75 // 3秒後にメインスレッドで実行 76 dispatch_async_main_after(3) { 77 self.teto += player2Teto 78 self.kekka.text = String(self.teto) 79 self.agote.text = String(player2Teto) 80 self.serifu.text = "君の番だよ" 81 [self.one, self.two, self.three].forEach { $0.hidden = false } 82 if self.teto > self.X - 1 { 83 [self.two, self.three].forEach { $0.hidden = true } 84 } 85 if self.teto > self.X - 2 { 86 self.three.hidden = true 87 } 88 } 89 } 90 91 func gemeOver() { 92 make.text = "You have lose" 93 [make, start].forEach { $0.hidden = false } 94 [one, two, three, agote, kekka, serifu, konkai].forEach { $0.hidden = true } 95 } 96} 97 98// メインスレッドで遅延実行 99func dispatch_async_main_after(minute: Double, block: () -> ()) { 100 let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(minute * Double(NSEC_PER_SEC))) 101 dispatch_after(delayTime, dispatch_get_main_queue(), block) 102}

投稿2016/06/10 16:31

編集2016/06/10 17:37
_Kentarou

総合スコア8490

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

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

souroppy

2016/06/11 23:12

解決しました!ありがとうございます! 次はランダムで数字が出てくるものをつくろうとおもいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問