Swift で iOS向けの チェスのようなゲームを作っているなかでできないことがあったので質問させてください。
プレイヤーとCP(コンピュータ)の間の対戦に関しての質問です。
- プレイヤーが画面をタップしてコマを動かして、コマを動かした後を描画。
- そのあとにCPが次に打つところを決めてそれを描画。
という実装をしているのですが、プレイヤーが打った後にCPが打つまでの待ち時間がないのでプレイヤーが打った瞬間にCPが打ち返してきます。そこをなんとかしてプレイヤーとCPの打つときに間が欲しいです(CPが考えているように見せたい)。
つまり上記の1.と2.の間に待ち時間が欲しいです。
単純にsleep関数などで処理を止めるとプレイヤーの動かしたコマの描画が行われず、プレイヤーが動かしてCPが動かした後が描画されます。
現状は
- プレイヤーが駒を動かす
- すかさずCPが駒を動かす
- プレイヤーとCPの両方が打ち終わった盤面を描画
理想は
- プレイヤーがコマを動かす
- プレイヤーが打った盤面を描画
- CPのターンになるが2秒ほど待つ
- CPがコマを動かす
- CPが打った盤面を描画
- プレイヤーのターン
という流れです。
現在
盤面を描画するクラス(盤面に基づいた描画) StoneView(UIView)
と
view と GameStatusの間に入るクラス (タップされた位置の受け渡しなど) ViewController
と
ゲームを管理するクラス(ゲームのターン,盤面の変化,勝敗など) GameStatus
があります。
下のstoneTouchedはViewControllerに記述されているメソッドで、
stoneviewクラスで駒にタップされるとdelegateでViewControllerに実装されているstoneTouchedが呼ばれます。
引数のstoneは盤面のどの位置がタップされたかという座標(座標ですが1次元)です。
Swift
1//盤面がタップされたら呼ばれる 2func stoneTouched(stone: Int) { 3 // self.gameStatus : ViewControllerのインスタンス変数(GameStatusクラス) 4 // self.stoneView : ViewControllerのインスタンス変数(StoneViewクラス) 5 6 //gameStatusのchangestatesは どこがタップされた位置を引数に 7 //タップされたことによる(変化した盤面,ターンが変わったか?)をタプルで返します。 8 let states_turn = self.gameStatus.changestates(pos: stone) 9 10 //stoneViewの盤面に変更された盤面を代入します 11 self.stoneView.stonestates = states_turn.0 12 13 //タップによりターンが変わっていれば(states_turn.1 == true)CPのターンを始めます 14 if states_turn.1{ 15 //cpmoveにはcpが(動かす駒,どこに動かすか)がタプルで入っています. 16 let cpmove = self.gameStatus.cpnext() 17 //動かす駒をタップした時と同様の動作をさせる 18 var cp = self.gameStatus.changestates(stone: cpmove.0) 19 //次に動かす場所をタップしたときと同様の動作をさせる 20 cp = self.gameStatus.changestates(stone: cpmove.1) 21 22 //stoneViewの盤面にcpにより変更された盤面を代入します 23 self.stoneView.stonestates = cp.0 24 } 25 self.stoneView.setNeedsDisplay() 26 27 }
setNeedsDisplayをプレイヤーが打ったあとに挟んでもあくまでこのメソッドは再描画するフラグを立てるだけで、再描画はしてくれません。
現状を理想の流れにするにはどうしたらよいでしょうか。
そもそもゲームを進めるロジックの組み方に問題があるのでしょうか。
説明不足があるところもあるかとは思いますがご教授お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。