[原创] 也来谈谈经典游戏贪吃蛇的简易设计思路
发表于注:原创方案,如有雷同纯属巧合.
本人对图形系统并不感冒.不喜欢也不会设计图形.所以本文介绍的也只会有简单的界面.
突然有了一些灵感,所以就把它记录下来,并尝试用代码来实现它.
当然了它不是拿来玩的而是用于学习,呵呵.
程序不使用图形系统,所以界面当然是比较粗糙了(看后面的截图).
目前使用的是WIN-TC,有空再试试把它弄成GRUB4DOS的外部命令,嘻嘻,让GRUB4DOS也有游戏程序.
- 使用环形链表设计蛇的身体.
struct snakes { int pos; //节点在屏幕上的位置 struct snakes *up; //上一个节点指针.(第一个链表指向最后一个,形成循环) }; struct snakes *snake_head;//指向当前蛇头的链表.snake_head->up 就是蛇尾.
蛇的移动处理.
由于使用了环形的链表,像车轮一样走,只要把最后一个链表作为蛇头就可以了.
实际操作过程.- 首先确位移动的位置
- 在屏幕上清除当前蛇尾的显示.
- 修改蛇尾的POS为新的位置,并显示.
- 把蛇尾作为新的蛇头.snake_head = snake_head->up;
这里还有一个需要注意处理的:
根据按键处理移动时不可以反方向移动.也就是说不可以直接后退.碰壁或者蛇头碰到蛇身就算失败.
处理方法:
墙壁可以随便使用表格线划出来,蛇可移动的区域全部放空白.只要判断前面不是食物也不是空白,就算Game Over了.
部份代码:
以下是使用直接写屏的方法处理vga指向显存的指针(short类型).while(delay()) { //处理按键和移动方向的代码. if (vga[pos] == FOOD) { //如果是食物就在蛇头上添加一个节点.并继续. continue; } else if ((char)(vga[pos] & 0xff) != 0x20) {//如果该地方不是空白的就结束游戏. break; } snake_head = snake_head->up;//使当前的蛇尾作为蛇头进入下一个顺环 vga[snake_head->pos] = 0x720;//清除蛇尾的显示(显示一个黑色空格); snake_head->pos = pos;//新的屏幕位置 vga[snake_head->pos] = SNAKE;//画新的蛇头; }
食物放置,这个就没有什么可说的了,使用一个随机数放置FOOD.并且不能放在蛇的身上.
其它细节,像分数系统.都是差不多的比较简单这里就不介绍了.
新的截图:(HOH,有兴趣可以下载玩玩看,看看你能挺多久.)
WIN下可玩,用DOS效果会比较好(可以试试DOSBOX)