游戏案例:GemDrops(9)

 

8.2.5  重置游戏

我们已经定义好了宝石对象,接下来就向游戏中添加一些进一步的功能来使用它。

该游戏基本上是基于宝石网格的,所以我们应该能够在游戏中对该网格进行存储。可以使用不同的结构来实现网格,但最简单的办法就是声明一个数组。数组中的每个元素都包含了一个CObjGem实例,表示在游戏区域中该位置上的宝石。如果该位置上没有宝石,就为null。

为了指定数组的大小,我们还声明了两个常量,用于指定整个游戏区域横向和纵向上能够包含多少个宝石。如果以后想对游戏区域使用一个不同的尺寸,那么可以直接修改这些常量,其他所有内容都会自动调整。

程序清单8-8  声明游戏区域数组

// The dimensions of the game board (gems across and gems down)

public const int BOARD_GEMS_ACROSS = 7;

public const int BOARD_GEMS_DOWN = 15;

// Create an array to hold the game board -- all our dropped gems will appear 

// here

private CObjGem[,] _gameBoard = new CObjGem[BOARD_GEMS_ACROSS, BOARD_GEMS_DOWN];

我们还为其他有用的信息添加了属性,这些信息都是游戏所需的。同时还提供了用于记录游戏是否暂停或结束的标志。添加的其他变量分别用于记录玩家的得分、跟踪玩家在游戏中堆放好了多少组宝石。

 

// Track whether the game has finished

private bool _gameOver;

// Track whether the game is paused

private bool _paused;

// The player's current score

private int _playerScore;

// The number of pieces that have dropped into the game.

// We'll use this to gradually increase the game difficulty

private int _piecesDropped;

实现Reset功能所需要的所有东西现在都已经到位。我们将通过Reset函数将游戏恢复到初始状态,使玩家可以重新开始游戏。

我们首先将所有简单的游戏属性恢复为其初始值。将_gameOver设置为false,将_playerScore变量及_piecesDropped变量设置为0。与上一个示例中所进行的操作相似,然后清除所有游戏对象,从而使游戏引擎重置为一个空状态。

接下来,对游戏区域进行初始化。如果在前一次游戏已经结束后我们才进行重置,那么游戏区域中会包含前面遗留下来的信息。因此,我们可以调用ClearBoard函数(稍后就会看到该函数)将已经显示在游戏区域中的宝石清空。这样就使游戏恢复为空白,从而可以重玩。Reset函数目前的代码如程序清单。

 

/// <summary>

/// Reset the game to its detault state

/// </summary>

public override void Reset()

{

base.Reset();

// Reset game variables

_gameOver = false;

_playerScore = 0;

_piecesDropped = 0;

// Clear any existing game objects

GameObjects.Clear();

// Clear the game board

ClearBoard();

// Ensure the information displayed on the game form is up to date

UpdateForm();

}

这里调用的ClearBoard函数只是简单地对_gameBoard数组中的元素进行遍历,检测每个元素中是否包含了宝石。如果是,就将宝石对象终止,并从游戏区域中将该宝石对象清除。遍历完成后,游戏区域就被完全清空。

读书导航