找回密码
 立即注册

微信登录

只需一步,快速开始

QQ登录

只需一步,快速开始

查看: 13|回复: 0

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

[复制链接]
  • TA的每日心情
    开心
    10 小时前
  • 签到天数: 33 天

    连续签到: 1 天

    [LV.5]常住居民I

    5

    主题

    36

    回帖

    412

    积分

    中级会员

    积分
    412
    来自: 中国福建泉州
    发表于 10 小时前 | 显示全部楼层 |阅读模式 来自: 中国福建泉州
    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    前言
    作为一个新手,学习是很枯燥的,但带着感兴趣的项目,变写变学习将快乐百倍。
    项目框架
    虽然是一个新手,但是该有的框架还是要有的。只有前期知道需要什么,才能快速的进入状态。
    • 游戏核心
      贪吃蛇的运行逻辑是用户控制它超食物走去,当吃到食物时增长一节。
      胜利:身体达到总高长度,没有空位生成食物。
      失败:贪吃蛇走出界面或者撞到自己。
    • 游戏功能
      显示界面:
      1.贪吃蛇运行界面
      2.文字显示界面
      用户控制:
      1.开始按钮:点击后进行游戏
      2.键盘输入:控制贪吃蛇运行方向
      3.暂停按键:停止游戏变化
    项目代码
    贪吃蛇本体功能
    要想正常显示贪吃蛇的位置,需要一个坐标来记录它的位置。同理也需要坐标记录食物位置。然后需要一个生成食物的函数、一个移动变化的函数。
    [AAuto] 纯文本查看 复制代码
    class 贪吃蛇{
    
        // 每次开始初始化贪吃蛇变量与坐标
        ctor(){
            // 初始化变量
            this.身体坐标 = {};
            this.食物坐标 = {}; 
            this.方向队列 = {};
            this.方向 = "";
            this.分数 = 0;
            this.难度 = 1;
    
            // 每个像素点20*20大小,因此界面可以存在20*20个像素,没移动一格变化20坐标,初始坐标尽量在中间
            var x = ..math.random(6, 15);   
            var y = ..math.random(6, 15);
            ..table.push(this.身体坐标, {x, y});
        };
    
        // 用于坐标系判断是否存在,用来排除食物不会直接出现在身体中
        数组查找 = function(二维数组,数组){
            var 序列化 = ..table.tostring(数组)
            for(k,v in 二维数组){
                if(序列化 = ..table.tostring(v)){
                    return true; 
                };
            };
            return false;
        };
    
        // 生成食物
        生成食物 = function() {
            var 食物坐标列表 = {}
            // 获取空白坐标
            for(x=0;19;1){
                for(y=0;19;1){
                    if(!this.数组查找(this.身体坐标,{x,y})){
                        ..table.push(食物坐标列表,{x,y})
                    };
                };
            };
    
            if(#食物坐标列表=0){
                return "通关"; 
            };
            else {
                var 序号 = ..math.random(1,#食物坐标列表)
                this.食物坐标 = 食物坐标列表[序号]
                return false; 
            };
        };
    
        // 移动贪吃蛇测试
        移动 = function() {
    
            var 头 = this.身体坐标[1];
            var 新坐标;
    
            // 读取方向,若没有输入新的,则按之前方向运行
            if(#this.方向队列 > 0){
                this.方向 = this.方向队列[1]
                ..table.remove(this.方向队列,1);    //删除
            };
    
            select(this.方向) {
                case "左" { 新坐标 = {头[1]-1, 头[2]}; }
                case "右" { 新坐标 = {头[1]+1, 头[2]}; }
                case "上" { 新坐标 = {头[1], 头[2]-1}; }
                case "下" { 新坐标 = {头[1], 头[2]+1}; }
                else { return false; } 
            };
    
            // 撞壁检测
            if (新坐标[1] < 0 or 新坐标[1] = 20 or 新坐标[2] < 0 or 新坐标[2] = 20) {
                return true;
            };
    
            // 撞自己检测
            for (i = 2; #this.身体坐标-1; 1) {
                if (新坐标[1] == this.身体坐标[i][1] and 新坐标[2] == this.身体坐标[i][2]) {
                    return true;
                };
            };
    
            // 插入新头部
            ..table.insert(this.身体坐标, 新坐标, 1);
    
            // 食物检测
            if(..table.tostring(新坐标) = ..table.tostring(this.食物坐标)){
                this.分数 += this.难度 * 10;
                return this.生成食物();
            };
    
            // 移除尾部
            ..table.remove(this.身体坐标, #this.身体坐标);
            return false;
        };
    };

    界面显示功能
    将贪吃蛇本体及食物绘制在屏幕上
    [AAuto] 纯文本查看 复制代码
    界面显示 = function(身体坐标,食物坐标){
    
        // 清除界面数据
        for (i = 1; #当前界面; 1) { 当前界面[i].close() };
    
        var 界面资源 = {};
        for (i = 1; #身体坐标; 1) {
            var 位置 = 身体坐标[i];
            if(i = 1){
                table.push(界面资源, {cls="picturebox";left=位置[1]*20;top=位置[2]*20;right=位置[1]*20+20;bottom=位置[2]*20+20;bgcolor=0xFFFFFF});
            }
            elseif(i = #身体坐标){
                table.push(界面资源, {cls="picturebox";left=位置[1]*20+4;top=位置[2]*20+4;right=位置[1]*20+16;bottom=位置[2]*20+16;bgcolor=0xFFFFFF});
            }
            else {
                table.push(界面资源, {cls="picturebox";left=位置[1]*20+2;top=位置[2]*20+2;right=位置[1]*20+18;bottom=位置[2]*20+18;bgcolor=0xFFFFFF});
            } 
        };
    
        table.push(界面资源, {cls="picturebox";left=食物坐标[1]*20+1;top=食物坐标[2]*20+1;right=食物坐标[1]*20+19;bottom=食物坐标[2]*20+19;bgcolor=0x0000FF});
    
        当前界面 = mainForm.custom.add(界面资源);
    
        //更新面板信息
        mainForm.static4.text = #身体坐标;  //长度
        mainForm.static6.text = 游戏.分数;  //分数
    };

    用户控制功能
    获取用户输入,做出对应的改变。
    [AAuto] 纯文本查看 复制代码
    // 
    按键 = win.ui.accelerator({
        { vkey = 'W'#; oncommand = function() { if (游戏.方向 != "下") { table.push(游戏.方向队列,"上") } } },
        { vkey = 'S'#; oncommand = function() { if (游戏.方向 != "上") { table.push(游戏.方向队列,"下") } } },
        { vkey = 'A'#; oncommand = function() { if (游戏.方向 != "右") { table.push(游戏.方向队列,"左") } } },
        { vkey = 'D'#; oncommand = function() { if (游戏.方向 != "左") { table.push(游戏.方向队列,"右") } } },
    }, mainForm);
    
    // 按ESC键暂停
    mainForm.onCancel = function() {
        if(定时器!= null){
            mainForm.clearInterval(定时器);
            mainForm.msgbox("恢复游戏");
            定时器 = mainForm.setInterval( 游戏循环,游戏速度 );    
        };  
    };

    程序运行
    虽然基本功能都以实现,但要让游戏运行还需要一个定时器重复刷新来让贪吃蛇动起来
    [AAuto] 纯文本查看 复制代码
    游戏循环 = function(){
        var 结果 = 游戏.移动();
        if(结果){ /* 游戏结束 */  
            mainForm.clearInterval(定时器);    //删除定时器
            if(结果 === "通关"){
                mainForm.static7.text = "游戏通关!!!"
            }
            else {
                mainForm.static7.text = "游戏失败!!!"
            };
            mainForm.static7.show(true) //显示失败提示
            mainForm.button.disabled = false;   //取消禁止
            mainForm.combobox.disabled = false; //取消禁止
        };
        else {
            界面显示(游戏.身体坐标,游戏.食物坐标)
        };  
    };
    
    //开始键运行游戏
    mainForm.button.oncommand = function(id,event){
        mainForm.setFocus()
        mainForm.button.disabled = true;    //开始键禁止
        mainForm.combobox.disabled = true;  //速度修改禁止
    
        for (i = 1; #当前界面; 1) { 当前界面[i].close() };  //清除界面旧内容
    
        游戏 = 贪吃蛇()  //实例化
        游戏.生成食物()   //生成食物
        游戏.难度 = mainForm.combobox.selIndex //游戏难度
        key.capsLk()    //切换到大写状态,防止输入法输入
        mainForm.static7.show(false)    //隐藏失败提示
    
        // 键盘控制绑定
        if(初次运行){
            按键 = win.ui.accelerator({
                { vkey = 'W'#; oncommand = function() { if (游戏.方向 != "下") { table.push(游戏.方向队列,"上") } } },
                { vkey = 'S'#; oncommand = function() { if (游戏.方向 != "上") { table.push(游戏.方向队列,"下") } } },
                { vkey = 'A'#; oncommand = function() { if (游戏.方向 != "右") { table.push(游戏.方向队列,"左") } } },
                { vkey = 'D'#; oncommand = function() { if (游戏.方向 != "左") { table.push(游戏.方向队列,"右") } } },
            }, mainForm);
    
            初次运行 = false;   
        };
    
        //激活定时器,按照游戏速度刷新界面
        定时器 = mainForm.setInterval( 游戏循环,游戏速度 );    
    };

    结尾
    在大神眼里这段代码有许多问题,但能够将自己的想法实现出来结果不完美已经不重要了。
    对完整代码及编译后的游戏感兴趣的可以下载链接。
    游戏界面
    文件链接

    解压密码:52pojie
    游戏运行程序在dist目录下


    本帖子中包含更多资源

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

    ×
    非业余 - aardio 编程语言 - 非官方问答社区
    风行者三期培训:Aardio+Python+Flutter,1000集课程让你成为全栈开发高手!https://mp.weixin.qq.com/s/_WOoHFtITUyLk2k7BXYGkg
    Aardio培训大揭秘,轻松上手打造个人项目!https://mp.weixin.qq.com/s/cr47qhp_Cpz0p57lbbPwug
    aardio风行者第二期培训班https://mp.weixin.qq.com/s/uB6XHUDnGSk0JlWuiBE9AA
    aardio风行者第三期培训班https://mp.weixin.qq.com/s/cdZcvFiAWhlYTaSrQGCPvA
    回复

    使用道具 举报

    *滑块验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|非业余 - aardio 编程语言 - 非官方问答社区 知道创宇云防御

    GMT+8, 2025-7-12 19:38 , Processed in 0.095915 second(s), 29 queries .

    Powered by Discuz! X3.5

    © 2001-2025 Discuz! Team.

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