2017-02-16 2 views
1

Я делаю школьный проект, и я решил сделать змеиную игру на C#. Я почти закончил игру, но есть одна последняя вещь, которую я хотел бы добавить, и это не имеет никакого столкновения, когда змея ударяет по одному и тому же краям. Поэтому вместо того, чтобы умирать змей, я хочу, чтобы он вышел на другом конце экрана (как это было в оригинальной игре). Вот мой код, когда змея попадает в край.C# Snake игра без столкновений

//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.

ответ

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; 

В else -statements вместо простого if избегать, что вы делаете ненужные сравнения когда уже был какой-то удар по любому из предыдущих условий.

+0

Спасибо, это действительно помогло мне. :) – Chris

+0

Это * может * дать ложные позиции, если ваша 'Snake' может двигаться быстрее, чем 1 элемент за ход. Пока скорость не меняется, она должна работать нормально. – DIF

+0

@ DIF Я никогда не видел змеиную игру. Однако частота кадров может увеличиться, делая время на один шаг меньше. Но я не вижу причин, чтобы змея «прыгала» несколькими шагами. – HimBromBeere

0

Я предполагаю, что у вас также есть минимальные позиции, хранящиеся где-нибудь?

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; } 
1

Я считаю, что это должно быть использовано, как вы всегда будете иметь дело только с одним столкновением:

//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

То, что я имел в виду, заключается в том, что в одной позиции обновление змеи будет идти только в одном направлении, что означает, что он сможет одновременно сталкиваться с одним краем экрана за раз. Вот почему, если вместо этого следует использовать. –

3

Вы можете использовать модуль % оператор для этого:

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

сказать пример maxXPos == 10, когда X будет -2, это сделает его 8.

И когда X будет 11, это сделает его 1.

+0

Почему '(Snake [i] .X + maxXPos)% maxXPos;', а не только 'Snake [i] .X% maxXPos;'? – wkl

+0

, чтобы избежать получения отрицательного результата –

+0

Не возвратил бы это значение, если текущая позиция равна нулю для X или Y? Например. X = 0 -> (X + 10)% 10 = 0 – HimBromBeere

Смежные вопросы