2017-02-16 71 views
1

我正在做一个学校项目,我选择了用C#做一个蛇游戏。 我几乎完成了游戏,但是我还想添加一件最后一件事,那就是当蛇碰到一个边缘时没有碰撞。因此,我不希望它在屏幕的另一端出现(因为它是在原始游戏中)。这是我的代码,当蛇碰到边缘时。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编写代码。

回答

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