feat: add counting won rounds for players

This commit is contained in:
Nikita Mikhalev 2025-01-19 20:53:35 +03:00
parent 9e94572a22
commit e1b9be373d

View file

@ -57,9 +57,9 @@ type Answer struct {
type Player struct {
Wallet interop.Hash160
RoundsWon int
isReady bool
isVotedToFinish bool
// todo: Сделать реализацию подсчета выигранных раундов
}
// GLOBAL PRIVATE METHODS FOR ROOM
@ -77,6 +77,7 @@ func setRoom(ctx storage.Context, room *Room) {
// Function for get room from storage with deserialize
func getRoom(ctx storage.Context, roomId string) Room {
var roomData = storage.Get(ctx, "room:"+roomId)
if roomData == nil {
panic(fmt.Sprintf("Room with roomId=%s not found", roomId))
}
@ -128,7 +129,13 @@ func JoinRoom(roomId string) bool {
// todo: Добавить списание токенов за вход в комнату
var player = Player{Wallet: wallet}
var player = Player{
Wallet: wallet,
RoundsWon: 0,
isReady: false,
isVotedToFinish: false,
}
room.Players = append(room.Players, player)
setRoom(ctx, &room)
return true
@ -287,8 +294,8 @@ func VoteAnswer(roomId string, answerIdx int) bool {
return true
}
func chooseWinner(round Round, countWinners int) []Answer {
var winners []Answer
func chooseWonAnswers(round Round, countWinners int) []Answer {
var wonAnswers []Answer
var answers = round.answers
sort.Slice(answers, func(a, b int) bool {
return len(answers[a].votes) > len(answers[b].votes)
@ -302,21 +309,21 @@ func chooseWinner(round Round, countWinners int) []Answer {
return []Answer{answers[0]}
}
// Choose winners from sorted answers. If the current answer has the same number of votes as the previous one,
// we add it to the winners list. We increase the number of winners if there are multiple answers with the same
// Choose wonAnswers from sorted answers. If the current answer has the same number of votes as the previous one,
// we add it to the wonAnswers list. We increase the number of wonAnswers if there are multiple answers with the same
// number of votes, as in cases where there are 5 answers with equal votes and countWinners is 3, all should be included.
var lastVote = len(answers[0].votes)
winners = append(winners, answers[0])
for i := 1; i < len(answers) && len(winners) < countWinners; i++ {
wonAnswers = append(wonAnswers, answers[0])
for i := 1; i < len(answers) && len(wonAnswers) < countWinners; i++ {
var currentVote = len(answers[i].votes)
if lastVote == currentVote {
countWinners++ // todo: Могут возникнуть проблемы, надо протестировать
}
lastVote = currentVote
winners = append(winners, answers[i])
wonAnswers = append(wonAnswers, answers[i])
}
return winners
return wonAnswers
}
// GetWinner todo: Нам сказали, что ссылку на другой контракт нельзя чисто, используем nns
@ -333,10 +340,21 @@ func GetWinner(roomId string) bool {
return false // Zero winners, because no answer
}
var winners = chooseWinner(round, room.CountWinners)
var wonAnswers = chooseWonAnswers(round, room.CountWinners)
var players = room.Players
for _, answer := range wonAnswers {
for _, player := range players {
if answer.wallet.Equals(player.Wallet) {
player.RoundsWon++
break
}
}
}
room.Players = players
var result string
for i, winner := range winners {
result += fmt.Sprintf("place:%d, winner:%s, votes:%s", i, winner.wallet, winner.votes)
for i, answer := range wonAnswers {
result += fmt.Sprintf("place:%d, winner:%s, votes:%s", i, answer.wallet, answer.votes)
}
for _, player := range room.Players {