Push and Clear

林秉軒、王勻

遊戲邏輯

顯示

判斷

輸入

更新

輸入

function int readOperation() {
    var int ch;
    let ch = Keyboard.readChar();
    do Output.backSpace();
    if ((ch = 130)) { return 0; }
    if ((ch = 131)) { return 1; }
    if ((ch = 132)) { return 2; }
    if ((ch = 133)) { return 3; }
    return -1;
}
// 130 = left
// 131 = up
// 132 = right
// 133 = down

判斷

  • 是否緊鄰牆壁、固定方塊
  • 若四方位皆不可動,則遊戲結束

更新

  • 重新排列玩家至障礙物之間的箱子
  • 統計蒐集的點數
  • 消除完整的行列

顯示

根據盤面狀態繪圖

function void drawCell(int type, int x, int y, int size) {
    var int r, w;
    let r = size / 2;
    let w = 2;
    do Screen.setColor(false);
    do Screen.drawRectangle(x, y, x + size, y + size);
    if (type = PLAYER) {
        do Screen.setColor(true);
        do Screen.drawCircle(x + r, y + r, r);
    }
    if (type = POINT) {
        do Screen.setColor(true);
        do Screen.drawCircle(x + r, y + r, w);
    }
    if (type = NORMAL_BLOCK) {
        do Screen.setColor(true);
        do Screen.drawRectangle(x, y, x + size, y + size);
    }
    if (type = STABLE_BLOCK) {
        do Screen.setColor(true);
        do Screen.drawRectangle(x, y, x + size, y + size);
        do Screen.setColor(false);
        do Screen.drawRectangle(x + w, y + w, x + size - w, y + size - w);
        do Screen.setColor(true);
        do Screen.drawLine(x, y, x + size, y + size);
        do Screen.drawLine(x + size, y, x, y + size);
    }
    return;
}

瓶頸 & solutions

畫面閃爍

  • 每次重新渲染畫面造成頻繁閃爍

\(\Rightarrow\)只針對更新的區域重新渲染

Instant elimination

  • 生成的箱子可能立即造成消行,使遊戲不易結束

\(\Rightarrow\)若造成消行則重新隨機一個位置,至多重新三次

Instant death

  • 生成的固定箱子可能立刻卡住玩家,造成遊戲莫名其妙的結束

\(\Rightarrow\)若放置的固定箱子造成遊戲結束,則改為放置一般箱子,增加玩家的操作空間

謝謝大家

push and clear

By thomaswang2003

push and clear

  • 369