猫史档案馆


不同编程的存档方式

用户:翎with珝翎with珝查看:0 回复:3 评论:0 创建时间:2022-06-03T10:41:21


众所都知,每个编程,都有不同的存档方法。废话不多说,展开你的眼界。

编程猫的云存档

center_image

非常简短,我们在看看SCRATCH

center_image

相对而言,编程猫的代码比scratch少一些

我们在来看看喵的存档

center_image

也非常的少,所以说,按照代码的多少排序(从大到小)就是:scratch>喵>编程猫

插个题外话,我们再看看神奇代码岛的存档(SQL)

let leader;  // 当前排行榜的领跑

// 创建排行榜表
async function createTables () {
    // 创建表
    await db.sql`CREATE TABLE IF NOT EXISTS leaderboard (
        name VARCHAR(50) NOT NULL,
        record REAL NOT NULL
    )`
}

// 向排行榜添加数据
async function insertLeaderboard(name, time) {
    try {
        await db.sql`INSERT INTO leaderboard VALUES (${name}, ${time})`;
    } catch (e) {
        console.log(`insert sql error: ${e}`) ;
    }
}

// 清空所有数据
async function removeAll() {
    await db.sql`DELETE FROM leaderboard`
    world.say(`leaderboard 排行榜数据已被清空!`);
}

// 获取排行榜第一名
async function getBestTime() {
    const rows =  await db.sql`SELECT * FROM leaderboard ORDER BY record ASC LIMIT 1`;

    if (rows && !rows.length) {
        console.log('no record');
        return {name:'吉吉喵', record: '30.0'};
    }

    world.say(rows[0].name + ' / ' + rows[0].record);
    return rows[0];
}

// 获取排行榜Top10
async function getTop10() {
    const rows = await db.sql`SELECT * FROM leaderboard ORDER BY record ASC LIMIT 10`;

    // 在控制台打印数据
    console.log(`result = ${JSON.stringify(rows)}`);

    // 将搜索的结果在聊天中显示
    for await (const row of rows) {
        world.say(row.name + ' | ' + row.record)
    }
}

// 获取玩家最高分数
async function getMyBestTime(player) {

    const rows =  await db.sql`SELECT * FROM leaderboard WHERE name=${player} ORDER BY record ASC LIMIT 1`;

    if (row && !row.length) {
        console.log('no record');
        return null;
    }

    world.say(rows[0].name + '  / ' + rows[0].record);
    return rows[0];
}

//-----------------------------------------------------------------

// 在游戏开始之前,创建数据库
(async function() {
    console.clear();
    await createTables();

    // 向排行榜添加临时测试的数据
    await insertLeaderboard('吉吉喵', '22.8');
    await insertLeaderboard('吉吉喵的小伙伴', '23.4');
    await insertLeaderboard('吉吉喵的好朋友', '23.6');
    await insertLeaderboard('吉吉喵的邻居小红', '24');
    await insertLeaderboard('吉吉喵的邻居小绿', '25');
    await insertLeaderboard('吉吉喵的邻居小蓝', '28');

    // 更新最佳成绩
    leader = await getBestTime();

    // 如果没有排行榜数据,最高纪录保持者为吉吉喵。
    world.say(`[最高纪录保持者] ${leader.name?leader.name:'吉吉喵'} : ${leader.record}s`)
}());


// 通过聊天命令来获取最高纪录
world.onChat(async ({entity:user,message})=>{
    if(message==='top1'){
        const personalBest = await getMyBestTime(user.player.name); // 个人最佳成绩
        const str = personalBest ? `你目前最佳成绩是:${personalBest.record}s` : `你还没有挑战记录。`
        await user.player.dialog({
            type: Box3DialogType.TEXT,
            content: `${leader.name?leader.name:'吉吉喵'}目前以${leader.record?leader.record:'30.0'}s的成绩排名第一!\n 
            ${str}`,
        })
    }else if(message==='top10') {
        await getTop10();
    }else if(message==='清空排行榜') {
        await removeAll();
    }
});

看起来蛮多的,实际上还有

console.clear()

/// 创建表
async function createTable() {
    await db.sql`CREATE TABLE IF NOT EXISTS playerlogin (
        name VARCHAR(50) NOT NULL,
        jointime REAL NOT NULL,
        leavetime REAL
    )`
}

// 第一次进入游戏时,新建玩家数据
async function insertPlayer(name, join, leave = 0) {
    try {
        await db.sql`INSERT INTO playerlogin VALUES (${name}, ${join}, ${leave})`;
    } catch (e) {
        console.log(`insert sql error: ${e}`) ;
    }
}

// 更新玩家进入游戏时间
async function updatePlayerJoin(name, value) {
    try {
        await db.sql`UPDATE playerlogin SET jointime = ${value} WHERE name = ${name}`; 
    } catch (e) {
        console.log(`[jointime] update sql error: ${e}`) ;
    }
}

// 更新玩家离开游戏时间
async function updatePlayerLeave(name, value) {
    try {
        await db.sql`UPDATE playerlogin SET leavetime = ${value} WHERE name = ${name}`; 
    } catch (e) {
        console.log(`[leavetime] update sql error: ${e}`) ;
    }
}

// 查询数据。如果数据不存在,返回空。
async function getPlayerData(name) {
    const rows =  await db.sql`SELECT * FROM playerlogin WHERE name=${name}`;

    if (rows && !rows.length) {
        return null;
    }

    return rows[0];
}

// 清空所有数据
async function clearLoginRecord () {
    await db.sql`DELETE FROM playerlogin`
    world.say(`清空所有登陆数据!`);
}

//-------------------------------------------------------
// 玩家进入游戏

world.onPlayerJoin( async ({entity}) => {

    const now = new Date().valueOf();    // 获取真实世界的时间戳 timestamp
    const playerData = await getPlayerData(entity.player.name);    // 获取上次登录记录

    // 如果数据不存在,说明时第一次进入游戏
    if (playerData === null) {
        insertPlayer(entity.player.name, now); // 插入玩家数据
        world.say(`${entity.player.name} 第一次进入游戏。`);
    } else {
        updatePlayerJoin(entity.player.name, now); // 更新玩家进入游戏时间
        const leaveTime = (now - playerData.leavetime) / 1000;
        entity.player.directMessage(`${entity.player.name} 距离上次登录经过了 ${leaveTime.toFixed(2)} 秒`);
    }

});

// 玩家离开游戏
world.onPlayerLeave( async ({entity}) => {
    const now = new Date().valueOf();
    updatePlayerLeave(entity.player.name, now)
});

这才是神奇代码岛的代码

那么代码次序又要改了:神奇代码岛(SQL)>scratch>喵>编程猫

由此我们发现,无论用哪一种方法制作存档,都是要使用代码的。

好了,本次分享结束。

 

 

自动保存:你喵

 

 

emotion_编程猫_点赞


回复

上一页1 页 / 共 1下一页
CenCen

ddddd

点赞0


评论


翎with珝翎with珝

喵是:共/创/世/界

点赞0


评论


Ezra__Ezra__

SC的存档其实很简单,心跳码就行了()

点赞0


评论