| 
TA的每日心情|  | 开心 2025-10-19 09:35
 | 
|---|
 签到天数: 50 天 连续签到: 1 天 [LV.5]常住居民I 
 高级会员 
 
 
	积分645 来自: 中国福建泉州
 | 
    
    
    
        
            非业余 - aardio 编程语言 - 非官方问答社区 | | 前言 
 作为一个新手,学习是很枯燥的,但带着感兴趣的项目,变写变学习将快乐百倍。项目框架 
 虽然是一个新手,但是该有的框架还是要有的。只有前期知道需要什么,才能快速的进入状态。 项目代码游戏核心贪吃蛇的运行逻辑是用户控制它超食物走去,当吃到食物时增长一节。 胜利:身体达到总高长度,没有空位生成食物。
 失败:贪吃蛇走出界面或者撞到自己。
游戏功能显示界面: 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 编程语言 - 非官方问答社区 |