手擼俄羅斯方塊——游戲設計

手擼俄羅斯方塊——游戲設計

概述

上一章我們介紹俄羅斯方塊的基本信息,包括坐標點和方塊的基本概念,這一章節我們繼續介紹如何完成后續的游戲設計。

組成游戲的基本要素

俄羅斯方塊作為一個 2D 的平面游戲,我們可以將整個參與元素做如下抽象,如下圖:

在這里插入圖片描述

  • 游戲(Game):游戲的核心,負責控制游戲的開始、暫停、結束等。

  • 舞臺(Stage):游戲的舞臺,是一個矩形的游戲區域,方塊在舞臺中移動和旋轉。

    • 方塊(Block):游戲的基本元素,包括各種形狀的方塊,每個方塊由 4 個小方塊組成。

    • 工廠(Factory):方塊的生成器,負責生成不同形狀的方塊。

  • 控制器(Controller): 游戲控制器,用于注冊事件,如鍵盤事件、鼠標事件等;

  • 渲染(Render):游戲的渲染器,負責將游戲的狀態渲染到屏幕上。

    • 主題(Theme):游戲的主題,包括游戲的背景、方塊的顏色等。

簡單描述為:

  1. 通過工廠(Factory)產生方塊(Block)

  2. 方塊(Block)舞臺(Stage)中移動和旋轉。

  3. 控制器(Controller)監聽用戶輸入,方塊的移動和旋轉是通過游戲(Game)實例做總體控制。

  4. 游戲的狀態通過渲染(Render)渲染到屏幕上,輸出樣式由主題(Theme)進行控制。

Factory

工廠的目標是為了產生方塊,因此它只需要提供產生方塊的能力即可。可以抽象如下:

export abstract class AbstractFactory {abstract randomBlock(): Block;
}

沒錯,AbstractFactory只需要提供一個randomBlock,其隨機產生一個方塊。

Stage

Stage 作為整個游戲的舞臺,它將方塊進行組合,同時對外暴露一些能力,如:

  • tick,步進能力,包含三個操作: 生產新的方塊、方塊向下移動和方塊結算。
  • rotate,旋轉能力。
  • move,移動能力
  • reset,重置能力

除此之外,還需要提供幾個狀態的判斷能力:

  • isOver,是否結束,tick無法繼續。

為了完成上述能力,我們需要對一些信息進行存儲,也是封裝在Stage中。

  • current: Block,當前正在移動的方塊。其要么是空,要么是一個固定的方塊。
  • next: Block,下一個方塊。
  • score: number,得分。
  • points: Point[][],一個二位數組,坐標軸的填充情況。
  • dimension: Dimension,定義坐標軸的可操作區域,所有的方塊不能操作該區域。
  • factory: 方塊生成器。
type Direction = "up" | "left" | "down" | "right";
class Dimension {xSize: number; // x坐標軸的最大值ySize: number; // y坐標軸的最大值
}class Stage {current: null | Block;next: null | Block;score: number;points: Point[][];dimension: Demension;tick() {}rotate() {}move(direction: Direction) {}reset() {}
}

Game

Game 作為程序的主入口,將多個元素進行聚合,并控制游戲的開始和結束。

我們首先來分析它的屬性,它至少要包括如下屬性:

  • status,游戲的狀態,分別是 Ready、Running、Pause、Stop、Over。
  • stage,游戲的舞臺。
  • render,渲染器
  • controller,控制器

它的目標是通過定時器來控制 Stage 的步進(tick),通過 contoller 監聽用戶輸入,控制移動和旋轉。

邏輯如下:

export interface GameOptions {dimension: Dimension;canvas: AbstractCanvas;factory?: AbstractFactory;controller?: AbstractController;
}export enum GameStatus {UNREADY = 0,READY = 1,RUNNING = 2,PAUSE = 3,STOP = 4,OVER = 5
}export class Game {controller?: AbstractController;canvas: AbstractCanvas;options: GameOptions;dimension: Dimension;stage: Stage;status: GameStatus;// 開始start() {}// 暫停pause() {}// 停止stop() {}// 旋轉rotate() {}// 移動move(direction: Direction) {}toggle() {}destroy() {}
}

Render

對舞臺進行渲染。一般對于游戲渲染,主要包括兩個階段:

  • 首次渲染,渲染基本場景;
  • 更新渲染,舞臺發生變化時進行更新渲染。處于性能考量,更新時最好使用局部渲染。

定義如下:

class AbstractRender {theme: Theme;render(): void; // 首次渲染update(): void; // 更新渲染
}

Theme

為了確定游戲的背景,我們需要將游戲區域進行劃分。劃分如下圖:

在這里插入圖片描述

從上到下,我們可以將整個操作界面分為如下區域:

  • 外框區域: 包括外框的顏色和整體的背景,以及外框的樣式;

  • 分數區域: 用于顯示分數;

  • 當前圖形: 顯示當前正在移動的方塊;

  • 下一圖形: 顯示接下來要出現的方塊;

  • 游戲狀態: 顯示當前游戲的狀態,如: 游戲暫停;

  • 已填充圖形: 顯示已填充的圖形;

按照上述劃分,我們可以將theme抽象為如下:

abstract class AbstractTheme {/*** 設置外框的樣式,如外框的顏色、整體的背景等。* @param outer 指代外框對象的元素,通過修改其內容改變顯示樣式。*/abstract outStyle(outer: any): void;/*** 設置內框的樣式,如內框的顏色、整體的背景等。* @param inner 指代內框對象的元素,通過修改其內容改變顯示樣式。*/abstract innerStyle(inner: any): void;/*** 設置分數的樣式。* @param score 指代分數對象的元素,通過修改其內容改變顯示樣式。*/abstract scoreStyle(score: any): void;/*** 設置狀態欄的樣式* @param status 指代狀態對象的元素。*/abstract statusStyle(status: any): void;/*** 分數的格式化字符串,輸入一個分數的數字,將其轉換為目標的樣式;* @param score {number} 當前游戲的分數*/abstract scoreTemplate(score: number): string;abstract nextStyle(blocks: any): void;abstract currentStyle(current: any): void;/*** 設置方塊區域的樣式* @param block 指代當前方塊區域*/abstract blockStyle(block: any): void;/*** 設置current區域和已填充區域的小方塊的樣式* @param blockItem 當前小方塊,如一個IBlock會拆分成4各BlockItem。* @param point 當前小方塊的位置信息,包括`x`軸和`y`軸的坐標等信息*/abstract blockPointStyle(blockItem: any, point: Point): void;/*** 設置next區域的小方塊的樣式* @param blockItem* @param point*/abstract nextPointStyle(blockItem: any, point: Point): void;
}

小結

本章主要描述了俄羅斯方塊的幾個控制元素,也僅僅是幾個相關的骨架。后續章節將進一步介紹方塊的設計。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43069.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43069.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43069.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡過網:工程專業最吃香的6個證書,你考了幾個了?

工程專業最吃香的6個證書,你考了幾個了?我們一起來看看吧! 1、二級建造師 報考條件:工程類大專及以上學歷/從事相關職業 考試時間:3月報名、6月考試 就業前景:建筑設計院、房產開發公司、施工單位 2、一…

如何管理一百個ai專家智能體——ai調度系統設計

前言 如果你用過openai的chatgpt服務,你肯定知道一個叫做GPTs的智能體商店,里面提供了大量的來自官方和個人制作的專門針對某個領域的gpt助手。比如,你想讓gpt幫忙寫文章,并且要能夠寫得好,你就可以在商店中搜索相關的…

【C語言】符號優先級詳解

C語言符號優先級詳細解析 在C語言中,不同的運算符具有不同的優先級和結合性,這決定了在表達式中運算符的計算順序。理解這些優先級和結合性是正確編寫和理解C語言程序的基礎。本文將詳細解析C語言中的符號優先級,包括各類運算符的優先級、結…

Smail語句如何使用判斷語句跳過驗證卡密界面?談談思路

🏆本文收錄于《CSDN問答解惑》專欄,主要記錄項目實戰過程中的Bug之前因后果及提供真實有效的解決方案,希望能夠助你一臂之力,幫你早日登頂實現財富自由🚀;同時,歡迎大家關注&&收藏&…

數據融合工具(5)面中心線提取

這是一個重磅工具,建議先看視頻。 提取中心線 一、需求背景 說真的,當小編第一次使用ArcGIS中的Polygon To Centerline工具提取面要素中心線時,激動得無以言表,畢竟,以前要提取面中心線,是一件非常麻煩的事…

uniapp圖片壓縮之后在上傳

壓縮圖片js方法,新建imgPress.js /** * H5壓縮 二分查找算法來找到一個合適的圖像質量系數,使得壓縮后的圖片文件大小接近于目標大小* param {Object} imgSrc 圖片url * param {Object} callback 回調設置返回值 * */ export function compressH5(fileI…

nginx熱更新詳解及實戰操作

Nginx熱更新,也被稱為平滑升級或熱部署,是指在不中斷Nginx服務的情況下,對Nginx進行升級或更新其配置,以實現業務的無損和用戶無感知的升級過程。以下是關于Nginx熱更新的詳細解釋: 一、Nginx熱更新的原理 Nginx熱更…

Kubernetes APIServer 幾種基本認證方式

"認證",形象地理解就是"你是誰"。在上文中,用戶A在發起API請求時,管理員如何道該請求是用戶A發起的呢?所以,客戶端在發起API請求時,必須要攜帶一個身份信息來表明"我是誰"&a…

泰勒公式中拉格朗日余項和佩亞諾余項的區別及具體的應用場景案例

泰勒公式是微積分中的一個重要工具,用于將一個函數在某一點附近展開成多項式形式,以便于近似計算和分析。泰勒公式的一般形式為: f ( x ) f ( a ) f ′ ( a ) ( x ? a ) f ′ ′ ( a ) 2 ! ( x ? a ) 2 ? f ( n ) ( a ) n ! ( x ? a…

[CTF]-PWN:House of Cat堆題型綜合解析

原理: 調用順序: exit->_IO_wfile_jumps->_IO_wfile_seekoff->_IO_switch_to_wget_mode _IO_wfile_seekoff源碼: off64_t _IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode) {off64_t result;off64_t delta, new…

AI繪畫小白必備!Stable Diffusion常用插件合集,好用推薦!(附插件下載)

前言 寶子們,早上好啊~Stable Diffusion 常用插件,月月已經給大家整理好了,自取就好。 擁有這些SD常用插件,讓您的圖像生成和編輯過程更加強大、直觀、多樣化。以下插件集成了一系列增強功能,覆蓋從自動補全提示詞到…

開源項目:驅動創新與協作的時代引擎

《開源項目:驅動創新與協作的時代引擎》 在當今全球經濟與科技環境瞬息萬變的背景下,開源軟件項目如同一顆璀璨的新星,在開發者社區的天空中熠熠生輝。其蓬勃發展的態勢不僅成為了熱門話題,更是引領著技術領域的變革潮流。 開源…

無法訪問。你可能沒有權限使用網絡資源。請與這臺服務器的管理員聯系以查明你是否有訪問權限。【解決辦法】

問題描述 新建好一臺windows虛擬機,兩臺設備網絡是互通的,但是物理機在訪問虛擬機的網絡共享文件資源時,出現圖下所示的報錯:XXX無法訪問。你可能沒有權限使用網絡資源。請與這臺服務器的管理員聯系以查明你是否有訪問權限。用戶…

echarts無法加載Map地圖的問題

項目場景: echarts無法加載Map地圖的問題 詳情 查閱相關資料講,echarts4.9以上版本已經移除了map,那么我們就得重新打包echarts文件了。打包echarts.min.js的鏈接:https://echarts.apache.org/zh/builder.html 在這個鏈接頁面可…

考完軟考之后,如何評職稱?是否有有效期?

一、軟考和職稱之間的關系 軟考和職稱之間的關系可以這樣理解:拿到軟考證書并不意味著就能獲得職稱。軟考證書是技術等級證書,而職稱則是一種資格。如果單位聘用你做工程師,那么你的軟考證書就可以發揮作用,相當于獲得了職稱證。…

單商戶和多商戶的區別

單商戶商城通常由單個企業或品牌運營,專注于銷售自家產品,而多商戶商城則類似于一個平臺,允許多個商家入駐并銷售各自的商品。它們在經營模式、商家入駐和運營投入等方面有所不同。具體分析如下: 經營模式 單商戶商城&#xff1…

MES:連接計劃與執行的橋梁

想象一下,你的企業擁有一份完美的生產計劃,但如何將這份計劃準確無誤地轉化為實際生產中的每一步操作?這就是MES大展身手的地方。MES作為ERP(企業資源計劃)與車間自動化控制之間的橋梁,確保生產計劃能夠順暢…

hf-mirror (huggingface 的國內鏡像)

官網: https://hf-mirror.com/ 網站域名 hf-mirror.com,用于鏡像 huggingface.co 域名。作為一個公益項目,致力于幫助國內AI開發者快速、穩定的下載模型、數據集。 如何使用HF-Mirror 方法一:網頁下載 在https://hf-mirror.com/…

邊框插畫:成都亞恒豐創教育科技有限公司

邊框插畫:藝術與生活的精致邊界 在視覺藝術的廣闊天地里,邊框插畫以其獨特的魅力和細膩的表達方式,成為連接藝術與生活的一道精致邊界。成都亞恒豐創教育科技有限公司它不僅僅是圖像的外框裝飾,更是情感、故事與創意的延伸&#…

看到指針就頭疼?這篇文章讓你對指針有更全面的了解!

文章目錄 1.什么是指針2.指針和指針類型2.1 指針-整數2.2 指針的解引用 3.野指針3.1為什么會有野指針3.2 如何規避野指針 4.指針運算4.1 指針-整數4.2 指針減指針4.3 指針的關系運算 5.指針與數組6.二級指針7.指針數組 1.什么是指針 指針的兩個要點 1.指針是內存中的一個最小單…