353スネーク

トピック:

あなたは蛇のゲームを設計し、ゲームは画面サイズ=画面の幅×高さで実行されます。あなたはこのゲームに慣れていない場合は、オンラインデモはこちらをクリックすることができます。

最初に、左上隅(0、0)の位置、ユニットの本体の長さのヘビ。

あなたは、食品の形で(行、列)の位置のシーケンスを説明します。ヘビは食べ物を食べたときに、本体部の長さを増加させる、スコアが+1であろう。

食べ物が同時に発生していない、リストの順番に一つの画面1に表示されます。だと言うが、蛇に食べられた最初の食品の後、第二食べ物が表示されるようにしましょう。

食べ物が画面に表示されたら、グリッドの占有ヘビの体に現れ保証することはできません。

各移動()操作のために、あなたは、現在のスコアまたは-1(ゲームの終了を意味し、彼の体や壁衝突、と表明ヘビ)を返すようにする必要があります。

例:

所定の幅= 3、高さ= 2、食品配列食品= [1,2]、[0,1]。

ヘビヘビ=新しいヘビ(幅、高さ、食べ物)。

最初に、(0,0)で蛇の位置と第1の食品(1)。

| S | | |
| | | F |

snake.move( "R"); - >関数が返す0

| | S | |
| | | F |

snake.move( "D"); - >関数が返す0

| | | |
| | S | F |

snake.move(「R」); - >関数が返す(第1食品は蛇に食べられ、第2食料が位置(0,1)に表示されている間)

| | F | |
| | S | S |

snake.move( "U"); - >関数リターン1

| | F | S |
| | | S |

snake.move( "L"); - > 2関数は、(第2のヘビ食べる食品)を返します

| | S | S |
| | | S |

snake.move( "U"); - >関数が返す-1(蛇境界と衝突し、ゲーム終了)

回答:

巨大な条件は、私は唾を書きたいです。あなたは、衝突前の壁ではなく、身体を打つことはできません。

それから私は、新しい座標身体の前に、二重にリンクされたリストは、体を保存するために使用されているかどうかを見つけるために使用されるマトリックスのメソッドを使用します。

1  クラスSnakeGame {
 2  公共3      INT cur_x = 0、cur_y = 0 4      ベクトル<ベクトル< int型 >> 食品。
5      ベクトル<ベクトル< BOOL >> マトリックス。
6      INT next_food = 0 、幅、高さ。
7      BOOLゲームオーバー= ;
8      リスト<ベクトル< int型 >> ボディ。
9      unordered_map < 文字列、ベクトル< INT >> MP = {{ " U"{ - 10 }}、{ " D "{ 10 }}、{ " L "{ 0、 - 1 }}、{ " R "、{ 0  1 }}};
 10      
11      SnakeGame(int型の幅、INT高さ、ベクトル<ベクトル< INT >>&食品){
 12           - >幅=幅、この - >高さ=高、この - >食品= 食品;
 13         matrix.resize(高さ、ベクトル< BOOL >(幅、))。
14          行列[ 0 ] [ 0 ] = 15          body.push_back({ 00 })。
16      }
 17      
18      INTの移動(方向){
 19          であれば(ゲームオーバー){ リターン - 1 ;}
 20          cur_x + =融点[方向] [ 0 ]、cur_y + =融点[方向] [ 1 ]。
21          であれば(next_food <food.size()及び食物[next_food] [0 ] == cur_x及び食物[next_food] [ 1 ] == cur_y){ // 吃了
22              next_food ++ 23          }
 24           { // 没吃
25              自動尾= body.front()。
26              行列[尾[ 0 ] [尾[ 1 ] = 27              body.pop_front()。
28          }
 29          であれば(cur_x < 0またはcur_x> =高さ又はcur_y < 0またはcur_y> =幅や行列[cur_x] [cur_y] == ){
 30             ゲームオーバー= ;
31              リターン - 1 32          }
 33          行列[cur_x] [cur_y] = 34          body.push_back({cur_x、cur_y})。
35          // COUT <<方向<< " "<< cur_x <<"" << cur_y << ENDL。
36          リターンnext_food。
37      }
 38 }。

 

 

私はコメント欄だけでなく、身体、前に体の位置を特定するために使用するハッシュテーブルを保存するために両端キューを見ました。このような効率は、すべての後に少し高い、行列時間がかかるの確立でなければなりません。

おすすめ

転載: www.cnblogs.com/FdWzy/p/12386769.html