用户名  找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
热搜: 活动 交友 discuz
查看: 23|回复: 0

【aardio】《贪吃蛇》谁能拒绝编写游戏的乐趣

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2025-3-29 10:14:40 | 显示全部楼层 |阅读模式
作为一个新手,学习是很枯燥的,但带着感兴趣的项目,变写变学习将快乐百倍。
项目框架
虽然是一个新手,但是该有的框架还是要有的。只有前期知道需要什么,才能快速的进入状态。
  • 游戏核心
    贪吃蛇的运行逻辑是用户控制它超食物走去,当吃到食物时增长一节。
    胜利:身体达到总高长度,没有空位生成食物。
    失败:贪吃蛇走出界面或者撞到自己。
  • 游戏功能
    显示界面:
    1.贪吃蛇运行界面
    2.文字显示界面
    用户控制:
    1.开始按钮:点击后进行游戏
    2.键盘输入:控制贪吃蛇运行方向
    3.暂停按键:停止游戏变化

项目代码
贪吃蛇本体功能
要想正常显示贪吃蛇的位置,需要一个坐标来记录它的位置。同理也需要坐标记录食物位置。然后需要一个生成食物的函数、一个移动变化的函数。
  1. class 贪吃蛇{

  2.     // 每次开始初始化贪吃蛇变量与坐标
  3.     ctor(){
  4.         // 初始化变量
  5.         this.身体坐标 = {};
  6.         this.食物坐标 = {};
  7.         this.方向队列 = {};
  8.         this.方向 = "";
  9.         this.分数 = 0;
  10.         this.难度 = 1;

  11.         // 每个像素点20*20大小,因此界面可以存在20*20个像素,没移动一格变化20坐标,初始坐标尽量在中间
  12.         var x = ..math.random(6, 15);   
  13.         var y = ..math.random(6, 15);
  14.         ..table.push(this.身体坐标, {x, y});
  15.     };

  16.     // 用于坐标系判断是否存在,用来排除食物不会直接出现在身体中
  17.     数组查找 = function(二维数组,数组){
  18.         var 序列化 = ..table.tostring(数组)
  19.         for(k,v in 二维数组){
  20.             if(序列化 = ..table.tostring(v)){
  21.                 return true;
  22.             };
  23.         };
  24.         return false;
  25.     };

  26.     // 生成食物
  27.     生成食物 = function() {
  28.         var 食物坐标列表 = {}
  29.         // 获取空白坐标
  30.         for(x=0;19;1){
  31.             for(y=0;19;1){
  32.                 if(!this.数组查找(this.身体坐标,{x,y})){
  33.                     ..table.push(食物坐标列表,{x,y})
  34.                 };
  35.             };
  36.         };

  37.         if(#食物坐标列表=0){
  38.             return "通关";
  39.         };
  40.         else {
  41.             var 序号 = ..math.random(1,#食物坐标列表)
  42.             this.食物坐标 = 食物坐标列表[序号]
  43.             return false;
  44.         };
  45.     };

  46.     // 移动贪吃蛇测试
  47.     移动 = function() {

  48.         var 头 = this.身体坐标[1];
  49.         var 新坐标;

  50.         // 读取方向,若没有输入新的,则按之前方向运行
  51.         if(#this.方向队列 > 0){
  52.             this.方向 = this.方向队列[1]
  53.             ..table.remove(this.方向队列,1);    //删除
  54.         };

  55.         select(this.方向) {
  56.             case "左" { 新坐标 = {头[1]-1, 头[2]}; }
  57.             case "右" { 新坐标 = {头[1]+1, 头[2]}; }
  58.             case "上" { 新坐标 = {头[1], 头[2]-1}; }
  59.             case "下" { 新坐标 = {头[1], 头[2]+1}; }
  60.             else { return false; }
  61.         };

  62.         // 撞壁检测
  63.         if (新坐标[1] < 0 or 新坐标[1] = 20 or 新坐标[2] < 0 or 新坐标[2] = 20) {
  64.             return true;
  65.         };

  66.         // 撞自己检测
  67.         for (i = 2; #this.身体坐标-1; 1) {
  68.             if (新坐标[1] == this.身体坐标[i][1] and 新坐标[2] == this.身体坐标[i][2]) {
  69.                 return true;
  70.             };
  71.         };

  72.         // 插入新头部
  73.         ..table.insert(this.身体坐标, 新坐标, 1);

  74.         // 食物检测
  75.         if(..table.tostring(新坐标) = ..table.tostring(this.食物坐标)){
  76.             this.分数 += this.难度 * 10;
  77.             return this.生成食物();
  78.         };

  79.         // 移除尾部
  80.         ..table.remove(this.身体坐标, #this.身体坐标);
  81.         return false;
  82.     };
  83. };
复制代码
在大神眼里这段代码有许多问题,但能够将自己的想法实现出来结果不完美已经不重要了。
对完整代码及编译后的游戏感兴趣的可以下载链接。
游戏界面
文件链接

https://file.uhsea.com/2503/41c0cba7e1684f70ead2037ce86ff661ZW.7z  解压密码:52pojie
游戏运行程序在dist目录下


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|一起港湾 ( 青ICP备2025004122号-1 )

GMT+8, 2025-4-12 04:50 , Processed in 0.107628 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表