From 748c2de536afc950815205032b86660c46a32ca4 Mon Sep 17 00:00:00 2001 From: Hazel Noack Date: Mon, 30 Jun 2025 12:44:06 +0200 Subject: [PATCH] implemented functionality to guess a letter --- internal/game/session.go | 57 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/internal/game/session.go b/internal/game/session.go index cf7f13e..0f9c5ba 100644 --- a/internal/game/session.go +++ b/internal/game/session.go @@ -3,6 +3,8 @@ package game import ( "crypto/ed25519" "encoding/base64" + "errors" + "strings" petname "github.com/dustinkirkland/golang-petname" ) @@ -16,17 +18,28 @@ type Session struct { Name string Users []User - Phrase []string - HiddenPhrase []string + phrase []string + AskedLetters []string + DiscoveredPhrase []string + Mistakes int + + userIndex int + CurrentUser *User } func NewSession(phrase string) Session { sessionName := petname.Generate(3, "-") s := Session{ - id: lastSessionId, - Name: sessionName, - Users: []User{}, + id: lastSessionId, + Name: sessionName, + Users: []User{}, + phrase: []string{phrase}, + AskedLetters: []string{}, + DiscoveredPhrase: make([]string, len(phrase)), + Mistakes: 0, + userIndex: 0, + CurrentUser: nil, } sessionStorage = append(sessionStorage, s) @@ -42,6 +55,10 @@ func GetSession(name string) *Session { func (s *Session) AddUser(user User) { s.Users = append(s.Users, user) + + if s.CurrentUser == nil { + s.CurrentUser = &s.Users[s.userIndex] + } } func (s Session) VerifySignature(signature string, message []byte) *User { @@ -55,3 +72,33 @@ func (s Session) VerifySignature(signature string, message []byte) *User { return nil } + +func (s *Session) GuessLetter(letter string) (*Session, error) { + letter = strings.ToLower(letter) + if len(letter) != 1 { + return s, errors.New("the letter needs to have a length of one") + } + for _, asked := range s.AskedLetters { + if letter == asked { + return s, errors.New("the letter " + letter + " was already asked") + } + } + + s.AskedLetters = append(s.AskedLetters, letter) + + found := false + for i, l := range s.phrase { + if l == letter { + found = true + s.DiscoveredPhrase[i] = s.phrase[i] + } + } + + if !found { + s.Mistakes++ + } + + s.userIndex = (s.userIndex + 1) % len(s.Users) + s.CurrentUser = &s.Users[s.userIndex] + return s, nil +}