我正在Angular中创建Tic Tac Toe,我想在会话中跟踪游戏中的统计数据,即在创建新的棋盘对象时不会重置的统计数据。
我有一个TicTacToeComponent
创建了一个新的棋盘,而且TicTacToeBoard
对象具有游戏的所有字段和逻辑。用户可以使用绑定到newGame()
中的TicTacToeComponent
的按钮创建新电路板,或者当您加载页面时创建新电路板。显然,跟踪板对象中的统计数据是没有意义的。我在想一个创建每个游戏的会话对象是最好的,但是我不知道如何能够将这些数据注入到TicTacToeComponent
模板中...如何跟踪整个用户的统计数据可能会创建多个游戏的会话?这是某种可观察的模式吗?我该如何实现呢?
app
|--tic-tac-toe
| |--tic-tac-toe.component.* (imports and instantiates board)
|
|--app.component.* (routes to welcome screen and t-t-t.component
|
|--tic-tac-toe-board.ts (board class, probably should be moved)
解决这个问题也可能让我即使在路由到另一个页面时也可以保持游戏。
答案 0 :(得分:1)
你可以拥有一个Private Sub CommandButton1_Click()
Dim rng As Range, r As Range, v As Variant
Dim i As Long, n As Long
Dim iRowOffset As Long, temp As Long
Dim iColOffset As Long
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Transfer")
Set rng = getRng(Me.RefEdit1.Value) ' << use helper function getRng
If Not rng Is Nothing Then
' a) count (non) contiguous areas obtained via Ctrl-key in RefEdit (e.g. "D13:D15,A1:B2")
n = rng.Areas.Count
' b) calculate necessary row/col offset to start copies at A1 in target sheet
iRowOffset = rng.Areas(1).Row - 1
iColOffset = rng.Areas(1).Column - 1
For i = 1 To n
temp = rng.Areas(i).Row - 1
If temp < iRowOffset And temp > 0 Then iRowOffset = temp
temp = rng.Areas(i).Column - 1
If temp < iColOffset And temp > 0 Then iColOffset = temp
Next i
' c) write values back
For i = 1 To n
With rng.Areas(i).Parent.Name ' sheet
v = rng.Areas(i) ' write values to variant 1-based 2-dim array
ws.Range(rng.Areas(i).Address).Offset(-iRowOffset, -iColOffset) = v
End With
Next i
Else ' after manual input of not existing ranges
RefEdit1.Value = "": Beep
RefEdit1.SetFocus
End If
End Sub
组件,每当游戏结束时,你会从Stats
发送一个包含相关信息的事件(即玩家X赢得的游戏)并将其存储在TicTacToeComponent
组件的属性。
这将允许您跟踪不同的游戏,但显然如果刷新页面,所有信息都将丢失。如果您想要更复杂的解决方案,则需要在服务器端实现它。
答案 1 :(得分:0)
由于您可能不想使用数据库,因此可以使用组件在localstorage中创建变量localStorage.setItem('gamesWon', gamesWon++);
然后,您可以在应用中的任意位置创建一个可观察的或只是一个getter来获取localStorage.getItem('gamesWon);
到目前为止,我还没有找到一种在没有某种数据库或使用本地存储的情况下在存储器中充分存储不可构造对象的好方法。按照这个帖子看看其他人是否找到了一个好的解决方案。