Google恐龍遊戲的難度是無限增加還是停在某一點?
Google瀏覽器的恐龍亞軍遊戲的難度是否會達到上限?當我試圖獲得高分時(大約 2000 年左右),我注意到一路上難度緩慢但肯定地上升,不僅是恐龍的速度,還有仙人掌的分組,以及引入翼龍道路。
我想知道的是遊戲是否無限擴展?它只是迅速變得越來越快嗎?或者遊戲是否在特定的分數/距離上限制了難度?
TL;博士
似乎有一個最大速度限制,因此“限制”了難度。最大速度為 13。速度還用於確定障礙物之間的距離,因此,如果您達到最大速度,您也會達到障礙物之間距離的上限。
“Downasaur”的原始碼可以在一個名為offline.js的 Javascript 文件中找到。它可通過Chromium GitHub儲存庫公開獲得。我不能說我參與過 Chromium 項目,但我至少可以嘗試根據其結構來解釋程式碼。
文件的頂部是遊戲的配置區域。它從第 115 行開始:
/** * Default game configuration. * @enum {number} */ Runner.config = { ACCELERATION: 0.001, BG_CLOUD_SPEED: 0.2, BOTTOM_PAD: 10, // Scroll Y threshold at which the game can be activated. CANVAS_IN_VIEW_OFFSET: -10, CLEAR_TIME: 3000, CLOUD_FREQUENCY: 0.5, GAMEOVER_CLEAR_TIME: 750, GAP_COEFFICIENT: 0.6, GRAVITY: 0.6, INITIAL_JUMP_VELOCITY: 12, INVERT_FADE_DURATION: 12000, INVERT_DISTANCE: 700, MAX_BLINK_COUNT: 3, MAX_CLOUDS: 6, MAX_OBSTACLE_LENGTH: 3, MAX_OBSTACLE_DUPLICATION: 2, MAX_SPEED: 13, MIN_JUMP_HEIGHT: 35, MOBILE_SPEED_COEFFICIENT: 1.2, RESOURCE_TEMPLATE_ID: 'audio-resources', SPEED: 6, SPEED_DROP_COEFFICIENT: 3, ARCADE_MODE_INITIAL_TOP_POSITION: 35, ARCADE_MODE_TOP_POSITION_PERCENT: 0.1 };
請注意本節中的一些值,主要是:
ACCELERATION
= 0.001SPEED
= 6MAX_SPEED
= 13速度
update
在文件的第 545 行開始呼叫一個函式。從這個函式的程式碼註釋來看,這是更新遊戲幀並安排下一幀的函式。在這個函式中是從第 578 行開始的碰撞檢查:// Check for collisions. var collision = hasObstacles && checkForCollision(this.horizon.obstacles[0], this.tRex); if (!collision) { this.distanceRan += this.currentSpeed * deltaTime / this.msPerFrame; if (this.currentSpeed < this.config.MAX_SPEED) { this.currentSpeed += this.config.ACCELERATION; } } else { this.gameOver(); }
該
if
語句評估條件,這意味著在語句本身之前定義的!collision
“如果變數不為真”。如果不是,那麼我們就沒有碰撞,所以在塊內執行程式碼。我們可以在塊內進一步看到,還有另一個條件檢查目前速度是否小於設置為 13 的配置。如果目前速度(預設為文件第 44 行上的配置值)小於,我們進入程式碼塊,它採用 currentSpeed 值並將配置值 .001 添加到它。因此,每個遊戲幀都將加速 0.001 倍,最高可達 13 幀。collision``if``if``if``MAX_SPEED``SPEED``MAX_SPEED``if``ACCELERATION
障礙
據我所知,除了翼手龍障礙之外,所有障礙都遵循相同的邏輯。這個障礙物的獨特之處在於它可以隨機生成 3 個不同的 Y 座標(如果在移動設備上,則為 2 個)。障礙物類型可以在文件的第 1556 行找到。為了限制這篇文章的長度,我只包括
PTERODACTYL
範例目的:{ type: 'PTERODACTYL', width: 46, height: 40, yPos: [ 100, 75, 50 ], // Variable height. yPosMobile: [ 100, 50 ], // Variable height mobile. multipleSpeed: 999, minSpeed: 8.5, minGap: 150, collisionBoxes: [ new CollisionBox(15, 15, 16, 5), new CollisionBox(18, 21, 24, 6), new CollisionBox(2, 14, 4, 3), new CollisionBox(6, 10, 4, 7), new CollisionBox(10, 8, 6, 9) ], numFrames: 2, frameRate: 1000/6, speedOffset: .8 }
在第 2863 行有一個函式呼叫
updateObstacles
,它是通過另一個名為 的函式添加實際障礙物的地方addNewObstacle
。該addNewObstacle
函式是程式碼決定它是什麼障礙物類型(小仙人掌、大仙人掌或翼龍)的地方。創建障礙物後,將
init
呼叫第 1388 行的另一個函式。該init
函式位於第 1409 行,在這裡它通過一些條件邏輯確定用於障礙物的 Y 座標:// Check if obstacle can be positioned at various heights. if (Array.isArray(this.typeConfig.yPos)) { var yPosConfig = IS_MOBILE ? this.typeConfig.yPosMobile : this.typeConfig.yPos; this.yPos = yPosConfig[getRandomNum(0, yPosConfig.length - 1)]; } else { this.yPos = this.typeConfig.yPos; }
該
if
語句正在檢查障礙物的 (this
)yPos
屬性是否為數組。如果是,它評估三元運算符(程式碼位var yPosConfig = IS_MOBILE ? this.typeConfig.yPosMobile : this.typeConfig.yPos;
)。三元運算符的作用很像一條if
語句,可用於根據某些條件確定變數值設置為什麼。在這種情況下,如果變數IS_MOBILE
為真(在第 106 行設置),則設置yPosConfig
為this.typeConfig.yPosMobile
. 如果IS_MOBILE
為假,則設置yPosConfig
為this.typeConfig.yPos
。在這兩種情況下,yPosConfig
都設置為具有 3 個元素(不是移動設備)或 2 個(移動設備)的數組。設置後yPosConfig
,它將障礙設置為yPos
在yPosConfig
隨機排列。如果第一個if
語句確定yPos
不是一個數組,它只是將障礙設置為yPos
障礙定義中指定的值。我還發現了我認為是障礙程式碼之間的差距大小:
/** * Calculate a random gap size. * - Minimum gap gets wider as speed increses * @param {number} gapCoefficient * @param {number} speed * @return {number} The gap size. */ getGap: function(gapCoefficient, speed) { var minGap = Math.round(this.width * speed + this.typeConfig.minGap * gapCoefficient); var maxGap = Math.round(minGap * Obstacle.MAX_GAP_COEFFICIENT); return getRandomNum(minGap, maxGap); },
無需過多討論,看起來障礙之間的最小間隙大小會隨著您的進步而變化。然而,因為
MAX_SPEED
是 13,如果你達到那個速度,我相信障礙之間的差距也會縮小。間隙大小設置在函式內的第 1450 行。init