2017-02-16 9 views
1

私は学校のプロジェクトを行っています。私はC#でスネークゲームを作ることにしました。 私はゲームでほとんど終わっていますが、追加したい最後のものがあります。それは、スネークが1つのエッジに当たったときに衝突しないことです。だから、蛇が死ぬのではなく、元のゲームのように画面の反対側に出てくるようにしたい。スネークがエッジに当たったときのコードは次のとおりです。C#コリジョンエッジのないスネークゲーム

//Get maximum X and Y Pos 
int maxXPos = pbCanvas.Size.Width/Settings.Width; 
int maxYPos = pbCanvas.Size.Height/Settings.Height; 

//Detect collission with game borders. 
if (Snake[i].X < 0 || Snake[i].Y < 0 
        || Snake[i].X >= maxXPos || Snake[i].Y >= maxYPos) 
{ 
    Die(); 
} 

私はDie();がそこにあることを想定されていないことを知っているが、私は私が代わりにそこに書くべきかを把握することはできません。私はVisual Studio 2010で執筆しています。

私はあなたが4例、それぞれに対応し、「反対」の場所にヘビの座標を設定しているとし

答えて

1

if(Snake[i].X < 0) Snake[i].X = maxXPos; 
else if(Snake[i].X >= maxXPos) Snake[i].X = 0; 
else if(Snake[i].Y < 0) Snake[i].Y = maxYPos; 
else if(Snake[i].Y >= maxYPos) Snake[i].Y = 0; 

あなたが不要な比較を行う代わりに、単純なif回避のelse -statements前の条件のどれかにすでにヒットしたとき。

+0

ありがとう、これは本当に私を助けました。 :) – Chris

+0

これは、あなたの 'Snake 'が1ターンに1要素より速く進むことができるならば、偽のポジションを与えるかもしれません。速度が変わらない限り、うまくいくはずです。 – DIF

+0

@DIF私はこれをやっているヘビゲームを見たことがありません。しかし、フレームレートが増加し、1つのステップの時間が短くなります。しかし、私はヘビをいくつかの段階で「飛び越える」ようにする理由は見当たらない。 – HimBromBeere

0

私はあなたもどこかにミニのポジションを保存していると思いますか?

//Get maximum X and Y Pos 
int maxXPos = pbCanvas.Size.Width/Settings.Width; 
int maxYPos = pbCanvas.Size.Height/Settings.Height; 

//Detect collission with game borders. 
if (Snake[i].X < 0){ 
    Snake[i].X = maxXPos; 
} 
else if(Snake[i].Y < 0){ 
    Snake[i].Y = maxYPos; 
} 
else if(Snake[i].X >= maxXPos){ 
    Snake[i].X = 0; 
} 
else if(Snake[i].Y >= maxYPos){ 
    Snake[i].Y = 0; 
} 
1

私はあなたが常に一つだけの衝突に対処しますと、これは使用すべきであると信じています例maxXPos == 10の場合、X-2になると、8になります。

X11になると、1になります。

+1

私はそれが意味することは、単一の位置更新のヘビは、一度に画面の1つの端だけに衝突することができることを意味する一方向にしか進まないという事実である。これが理由で、ifを代わりに使用する必要があります。 –

3

あなたはこのためにモジュラス%演算子を使用することができます:

Snake[i].X = (Snake[i].X + maxXPos) % maxXPos; 
Snake[i].Y = (Snake[i].Y + maxYPos) % maxYPos; 

セイをするために

int maxXPos = pbCanvas.Size.Width/Settings.Width; 
int maxYPos = pbCanvas.Size.Height/Settings.Height; 

// Detect collission with game borders. 
if (Snake[i].X < 0) { Snake[i].X = maxXPos; } 
if (Snake[i].X > maxXPos 0) { Snake[i].X = 0; } 
if (Snake[i].Y < 0) { Snake[i].Y = maxXPos; } 
if (Snake[i].Y > maxYPos 0) { Snake[i].Y = 0; } 
+0

'Snake [i] .X%maxXPos;だけでなく、(Snake [i] .X + maxXPos)%maxXPos; – wkl

+0

負の値を取得しないようにする –

+0

現在の位置がXまたはYのいずれかでゼロの場合、ゼロを返しませんか?例えば。 X = 0 - >(X + 10)%10 = 0 – HimBromBeere

関連する問題