经典游戏 ---- 贪吃蛇。游戏的实现很简单,只要理清需要用什么数据结构表示蛇以及更新逻辑就好。这里使用 SFML 实现。
一、蛇的表示
我们可以将蛇身体每一部分存储起来,这里只需要储存每一部分的坐标值。如下
1 2 3 4 5 6 7 8 9
| struct SnakeSegment { int x, y;
SnakeSegment(int xx, int yy): x(xx), y(yy) {}
bool operator == (const SnakeSegment& other) { return this->x == other.x && this->y == other.y; } };
|
二、更新逻辑
这里的话,我们需要考虑的逻辑有:
- 在每一步的更新中,蛇的每一部分的坐标都在变化
- 如果撞到自身,那么游戏重新开始
- 判断是否吃到了食物
- 边界处理
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| void update() { int n = snake.size();
for (int i = 0; i < n-1; i++) snake[i] = snake[i+1];
if (dir == 0) snake[n-1].x--; if (dir == 1) snake[n-1].y++; if (dir == 2) snake[n-1].x++; if (dir == 3) snake[n-1].y--;
if (std::find(snake.begin(), snake.end()-1, snake[n-1]) != snake.end()-1) init();
if (snake[n-1].x == fruit.x && snake[n-1].y == fruit.y) { fruit.x = rand() % (windowWidth-2)+1; fruit.y = rand() % (windowHeight-2)+1; snake.push_back(snake[n-1]); }
if (snake[n-1].x >= windowWidth-1) snake[n-1].x = 1; if (snake[n-1].x < 1) snake[n-1].x = windowWidth-2;
if (snake[n-1].y >= windowHeight-1) snake[n-1].y = 1; if (snake[n-1].y < 1) snake[n-1].y = windowHeight-2; }
|
三、其他东西
剩下的就是世界的绘制和键盘事件的处理,这两部分实现比较简单,这里就不贴代码了。完整代码可以参见这里
游戏展示:
四、后续
作为展示,贪吃蛇游戏的代码实现过程较为简单,很多小细节没有去处理。例如,吃到食物之后蛇的身体没有立马更新、食物的随机生成没有考虑与蛇冲突、没有分数的展示等等,感兴趣的小伙伴可以动手去实现自己的贪吃蛇小游戏。😃