游戏逻辑

已完成

在本单元中,我们将介绍四子棋游戏的工作原理以及制作游戏需要了解的 Blazor 构造。

四子棋

四子棋游戏的玩法是看你能否比对手先在纵向、横向或斜向落下相连的四个棋子。 要实现此游戏,你需要考虑如何跟踪棋子的当前状态、对手的当前状态,以及检测是否存在胜者。 在编程时,考虑游戏循环(即在宣布获胜者之前需要重复执行的一组操作)会非常有用,。 如下图所示:

  1. 从“重置”状态开始,即没有游戏棋子的空白棋盘。
  2. 用户放置游戏棋子。
  3. 对手放置一个游戏棋子。
  4. 检查是否存在胜者:
    1. 如果出现胜者,则声明获胜者并结束游戏,或重启游戏。
    2. 如果没有胜者,则重复步骤 2。

在代码中表示状态

首先,什么是状态? 游戏中的状态指的是游戏中发生的情况、你拥有的分数、你的游戏位置在哪里等。

在游戏开发中谈到状态时,一项重要的指导是将状态与 UI 分开,除了其他好处以外,这样还能让你更轻松地进行修改,且让代码更易于阅读。

在 Blazor 的上下文中,这意味着状态和围绕状态的逻辑应位于其自己的 C# 类中,如下所示:

class State
{
    Player [] players;
    int gameRoundsPlayed;
    bool gameOver;

    State()
    {
        players = new Players[]
        {
            new Player() { Name= "Player", Points = 0 },
            new Player() { Name= "Opponent", Points = 0 }
        };
        gameRoundsPlayed = 0;
        gameOver = false;
    }

    void ResetGame() 
    {
        gameOver = false;
        players[0].Points = 0;
        players[1].Points = 0;
    }

    void EndGame()
    {
        gameOver = true;
        gameRoundsPlayed++;
        // award winner..
    } 
}

State 类包含有关谁正在玩游戏、游戏已玩多少轮、游戏是否仍然处于活动状态等信息。

可以在 Blazor 组件中使用此类 State 的实例来绘制棋盘,并在游戏进行时执行其他操作。

OnInitialized 中重置游戏状态

在 Blazor 中初始化组件时会调用一项方法,然后才会执行其他操作。 此方法是适合放置代码的位置,有助于将游戏置于“重置”状态,例如创建棋盘、玩家以及根据需要重置之前游戏会话中的分数。

处理此组件初始化的方法名为 OnInitialized

处理重置游戏状态的 OnInitialized 方法可能如下所示:

void OnInitialized() 
{
    state.ResetGame();
}

具体内容由你决定,但此代码应该能对你有所启发。

使用事件处理玩家交互

当你或你的对手进行操作时,你需要捕获此交互。 将用户交互编码为游戏/应用应响应的事件。

例如,你可以通过选择一个按钮或执行拖放操作来移动棋子。

代码中的内容如下所示:

<span title="Click to play a piece" @onclick="() => PlayPiece(0)">🔽</span>

在上面的代码中,@onclick 指令属性指定了 click 事件的处理程序,即用户选择了此元素。 该事件由调用函数 PlayPiece(0) 的代码 () => PlayPiece(0) 处理。

更改状态

游戏中发生的操作会影响你的游戏状态。 在前面调用 PlayPiece() 的示例中,我们应该更改状态,以表明棋盘的这一块已被棋子占据。 也就是说在使用 State 类的示例中,我们需要想办法表示游戏棋子,如下所示:

class State 
{
    // other code omitted
    Piece [] pieces;

    State()
    {
        pieces = new Piece[25]; // 5x5 board
    }

    void PlayPiece(int position)
    {
        pieces[position] = true; // true = occupied
    }
}