Logika hry
V této lekci probereme koncepty, jako je způsob fungování hry "Connect Four" a jaké konstrukce Blazoru potřebujete vědět o vytvoření hry.
Připojit čtyři
Myšlenkou hry "Connect Four" je rozložit čtyři figury ať už vodorovně, svisle nebo diagonálně dříve, než to udělá váš soupeř. Věci, které je třeba vzít v úvahu při implementaci této hry, je sledovat aktuální stav herních částí, soupeřů a kontrolovat vítěze. Je užitečné při programování přemýšlet o herní smyčce, sadu akcí, které je třeba opakovat, dokud nebudete moci deklarovat vítěze. Něco takového:
- Začněte se stavem resetování, tj. čistou deskou bez herních částí.
- Uživatel umístí herní figurku.
- Soupeř položí herní figurku.
- Kontrola výherce:
- Pokud je vítěz, vyhlaste vítěze a ukončete hru, nebo restartujte hru.
- Pokud žádný vítěz není, opakujte krok 2.
Reprezentace stavu v kódu
Nejprve, co je stát? Stav ve hrách je to, co se děje ve hře, kolik bodů máte, kde se nachází vaše herní místa atd.
Důležitou radou u vývoje her je držet stav oddělený od uživatelského rozhraní, protože tím usnadňujete úpravy a váš kód je čitelnější, což přináší i další výhody.
V kontextu Blazoru by to znamená, že stav a logika kolem stavu by měly být ve své vlastní třídě C#, například takto:
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..
}
}
Třída State
obsahuje informace o tom, kdo hru hraje, kolik herních kol se hrálo, pokud je hra stále aktivní atd.
Pomocí instance této třídy State
v komponentách Blazor můžete nakreslit desku a provádět další akce v průběhu hry.
Resetování stavu hry v OnInitialized
V Blazoru existuje metoda, která se volá, když se komponenta inicializuje, než se stane cokoli jiného. Tato metoda je dobrým místem pro umístění kódu, který pomáhá uvést vaši hru do stavu "resetování," jako je vytvoření hrací plochy, hráčů a resetování skóre, pokud je to potřeba, z předchozích her.
Metoda, která zpracovává tuto inicializaci komponenty, se nazývá OnInitialized
.
Metoda OnInitialized
, která zpracovává resetování stavu hry, může vypadat přibližně takto:
void OnInitialized()
{
state.ResetGame();
}
Přesně to, co se tady děje, je na vás, ale tento kód by vám měl dát nápad.
Zpracování interakcí hráčů pomocí událostí
Když se vy nebo vaši soupeři posunete, budete muset zachytit tuto interakci. Interakce uživatelů zakódujete jako události, na které má vaše hra nebo aplikace reagovat.
Například můžete vybrat tlačítko nebo přetáhnout a přesunout herní figurku.
Takto to může vypadat v kódu:
<span title="Click to play a piece" @onclick="() => PlayPiece(0)">🔽</span>
Ve výše uvedeném kódu atribut direktivy @onclick
určuje obslužnou rutinu události click
, tj. uživatel vybral tento prvek. Událost je zpracována kódem () => PlayPiece(0)
, který vyvolá funkci PlayPiece(0)
.
Změna stavu
Akce, která se stane ve hře, by měla mít vliv na váš stav hry. V předchozím příkladu, kde vyvoláme PlayPiece()
, bychom měli změnit stav, abychom řekli, že tato část desky je nyní obsazena kusem. To znamená, že vzhledem k naší příkladové třídě State
potřebujeme způsob, jak reprezentovat herní figurky, například:
class State
{
// other code omitted
Piece [] pieces;
State()
{
pieces = new Piece[25]; // 5x5 board
}
void PlayPiece(int position)
{
pieces[position] = true; // true = occupied
}
}