C#创建一个简单的蛇游戏


12

我当时正在考虑使用C#创建蛇游戏,所以我脑子里有了想法,但出现了一些问题。

我该如何跟踪并输出在蛇头后面运行的块的正确位置?

如果蛇是由五个块组成,并且用户开始绕圈走,我如何在正确的位置打印蛇的身体?

另外,无论用户做什么,我如何创建一个在后台运行的动作,它将使蛇向前移动?

我的代码应具有什么结构?(代码设计结构)

这应该是一个控制台应用程序,因为它是我所熟悉的唯一框架。

我不是要查找完成的代码,因为我想真正了解它应该如何工作。

Answers:


23

代表蛇

创建一个Snake游戏非常简单。您需要做的第一件事是代表蛇的身体的方法。如果您认为蛇是由块或砖块组成的,则您的身体可以简单地列为这些块坐标的列表。

在您的情况下,如果您打算做一个控制台应用程序,那么每个应用程序都将是控制台上的一个字符,并且位置将对应于控制台输出的一行或一行。因此,您从以下开始:

// List of 2D coordinates that make up the body of the snake
List<Point>() body = new List<Point>();

此时,您的清单为空,因此您的蛇没有身体。假设您想要一条长度为5的蛇,其头部应从位置(5,2)开始并向底部生长。只需在游戏开始时将这些位置添加到列表中,例如:

// Initialize the snake with 5 blocks starting downwards from (5,2)
for(int i=0; i<5; ++i)
{
    body.Add(new Point(5, 2 + i));
}

渲染蛇

为了渲染,只需在正文列表的每个位置绘制一个字符。例如,上面的示例可以绘制为:

...................
...................
.....O............. -- y = 2
.....#.............
.....#.............
.....#.............
.....V.............
...................
     |
     x = 5

通过为字符的头(列表中的第一个元素)和尾部(列表中的最后一个元素)选择不同的字符,甚至根据相邻块的位置来定位它们,您会变得更加复杂。但是对于初学者来说,只需将所有内容渲染为a #或诸如此类。

例如,您可以从包含背景的2D char数组开始,如下所示:

// Array with map characters
char[,] render = new char[width, height];

// Fill with background
for(x=0; x<width; ++x)
    for(y=0; y<height; ++y)
        render[x,y] = '.';

然后遍历蛇的身体,将其绘制到数组上:

// Render snake
foreach(Point point in body)
    render[point.X, point.Y] = '#';

最后,再次遍历数组,并将每个字符写入控制台,每行末尾都有一个换行符。

// Render to console
for(y=0; y<height; ++y)
{
    for(x=0; x<width; ++x)
    {
        Console.Write(render[x,y]);
    }
    Console.WriteLine();
}

移动蛇

最后,运动。您需要做的第一件事就是跟踪Direction蛇在移动。这可以是一个简单的枚举:

// Enum to store the direction the snake is moving
enum Direction { Left, Right, Up, Down }

只需从列表中删除最后一个块并将其按正确的方向添加到前面,即可完成移动蛇的动作。换句话说:

// Remove tail from body
body.RemoveAt(body.Count - 1);

// Get head position
Point next = body[0];

// Calculate where the head should be next based on the snake's direction
if(direction == Direction.Left) 
    next = new Point(next.X-1, next.Y);
if(direction == Direction.Right) 
    next = new Point(next.X+1, next.Y);
if(direction == Direction.Up) 
    next = new Point(next.X, next.Y-1);
if(direction == Direction.Down) 
    next = new Point(next.X, next.Y+1);

// Insert new head into the snake's body
body.Insert(0, next);

5
将最后一块移动到前面进行移动时,请致电!
SpartanDonut 2012年

好答案。我爱你如何移动蛇-它非常优雅。
Cypher 2012年

-3
  1. 每次计时器打勾时,您都会更新蛇的位置并在新位置绘制形状

  2. 使用System.Windows.Forms.Timer进行后台操作,以触发游戏移动蛇。

  3. 对结构使用类和继承


这是一个非常模糊的答案。第三步尤其如此。
MichaelHouse
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.