예제 #1
0
 public StatisticsPoint(CardUtil.EntityEnum correctEntity, Card card, Dictionary <CardUtil.EntityEnum, CardUtil.ColorEnum> entityToColor, bool useCorrectColor)
 {
     CorrectEntity   = correctEntity;
     Card            = card;
     EntityToColor   = entityToColor;
     UseCorrectColor = useCorrectColor;
     Missed          = true;
 }
예제 #2
0
 public StatisticsPoint(float timeElapsed, CardUtil.EntityEnum correctEntity, CardUtil.EntityEnum guessedEntity, Card card, Dictionary <CardUtil.EntityEnum, CardUtil.ColorEnum> entityToColor, bool useCorrectColor)
 {
     TimeElapsed     = timeElapsed;
     CorrectEntity   = correctEntity;
     GuessedEntity   = guessedEntity;
     Card            = card;
     EntityToColor   = entityToColor;
     UseCorrectColor = useCorrectColor;
     Missed          = false;
 }
예제 #3
0
    //Must be called after AddPickedCard
    public void AddMissed(CardUtil.EntityEnum correctEntity)
    {
        StatisticsList.Add(new StatisticsPoint(correctEntity, card, entityToColor, useCorrectColor));

        TotalMissed++;
        if (useCorrectColor)
        {
            TotalMissedWithCorrectlyColored++;
        }
        else
        {
            TotalMissedWithIncorrectlyColored++;
        }
    }
예제 #4
0
    IEnumerator CpuGuess(Cpu cpu)
    {
        float delayModifier = 0;

        if (cpu.delayModiferDict != null)
        {
            cpu.delayModiferDict.TryGetValue(correctEntity.Value, out delayModifier);
        }

        float delayBeforeAnswer = RandomUtil.nonUniformDistributedRandom(cpu.delayLowerRangeBeforeAnswer + delayModifier, cpu.delayUpperRangeBeforeAnswer + delayModifier, x => (float)(1f - Math.Pow(x - 1, 4)));

        yield return(new WaitForSeconds(delayBeforeAnswer));

        CardUtil.EntityEnum inCorrectEntity = correctEntity.Value == CardUtil.EntityEnum.Banana ? CardUtil.EntityEnum.Coco : CardUtil.EntityEnum.Banana;

        float chanceOfCorrectModifier = 0;

        if (cpu.chanceOfCorrectModiferDict != null)
        {
            cpu.chanceOfCorrectModiferDict.TryGetValue(correctEntity.Value, out chanceOfCorrectModifier);
        }

        float randomPercent = RandomUtil.nonUniformDistributedRandom(0, 100, x => (float)Math.Pow(x - 1, 4));

        CardUtil.EntityEnum entityToGuess;
        if (useCorrectColor)
        {
            if (cpu.chanceOfCorrectForCorrectlyColored + chanceOfCorrectModifier >= randomPercent)
            {
                entityToGuess = correctEntity.Value;
            }
            else
            {
                entityToGuess = inCorrectEntity;
            }
        }
        else
        {
            if (cpu.chanceOfCorrectForIncorrectlyColored + chanceOfCorrectModifier >= randomPercent)
            {
                entityToGuess = correctEntity.Value;
            }
            else
            {
                entityToGuess = inCorrectEntity;
            }
        }
        Guess(entityToGuess, cpu);
    }
예제 #5
0
    //Must be called after AddPickedCard
    public float AddGuess(float endTime, CardUtil.EntityEnum correctEntity, CardUtil.EntityEnum guessedEntity)
    {
        float timeElapsed = endTime - startTime;

        StatisticsList.Add(new StatisticsPoint(timeElapsed, correctEntity, guessedEntity, card, entityToColor, useCorrectColor));

        Total++;
        AverageTimeElapsed = (AverageTimeElapsed * (Total - 1) + timeElapsed) / Total;
        if (correctEntity == guessedEntity)
        {
            TotalCorrect++;
            AverageTimeElapsedForCorrectOnes = (AverageTimeElapsedForCorrectOnes * (TotalCorrect - 1) + timeElapsed) / TotalCorrect;
            if (useCorrectColor)
            {
                TotalCorrectWithCorrectlyColored++;
                AverageTimeElapsedForCorrectOnesWithCorrectlyColored = (AverageTimeElapsedForCorrectOnesWithCorrectlyColored * (TotalCorrectWithCorrectlyColored - 1) + timeElapsed) / TotalCorrectWithCorrectlyColored;
            }
            else
            {
                TotalCorrectWithIncorrectlyColored++;
                AverageTimeElapsedForCorrectOnesWithIncorrectlyColored = (AverageTimeElapsedForCorrectOnesWithIncorrectlyColored * (TotalCorrectWithIncorrectlyColored - 1) + timeElapsed) / TotalCorrectWithIncorrectlyColored;
            }
        }
        else
        {
            TotalIncorrect++;
            AverageTimeElapsedForIncorrectOnes = (AverageTimeElapsedForIncorrectOnes * (TotalIncorrect - 1) + timeElapsed) / TotalIncorrect;
            if (useCorrectColor)
            {
                TotalIncorrectWithCorrectlyColored++;
                AverageTimeElapsedForIncorrectOnesWithCorrectlyColored = (AverageTimeElapsedForIncorrectOnesWithCorrectlyColored * (TotalIncorrectWithCorrectlyColored - 1) + timeElapsed) / TotalIncorrectWithCorrectlyColored;
            }
            else
            {
                TotalIncorrectWithIncorrectlyColored++;
                AverageTimeElapsedForIncorrectOnesWithIncorrectlyColored = (AverageTimeElapsedForIncorrectOnesWithIncorrectlyColored * (TotalIncorrectWithIncorrectlyColored - 1) + timeElapsed) / TotalIncorrectWithIncorrectlyColored;
            }
        }
        return(timeElapsed);
    }
예제 #6
0
    public void Guess(CardUtil.EntityEnum entity, Participant _participant = null)
    {
        if (gameOver || cardInDelay)
        {
            return;
        }

        Participant participant = _participant == null ? player1 : _participant;

        if (participant.guessed)
        {
            return;
        }

        participant.guessed = true;
        float timeToGuess = participant.Stats.AddGuess(Time.time, correctEntity.Value, entity);

        if (entity == correctEntity)
        {
            participant.points++;

            //Clear coroutine so other cpus will stop guessing
            cpuCoroutines.ForEach(co => StopCoroutine(co));
            cpuCoroutines.Clear();

            if (participant != player1 && !player1.guessed)
            {
                player1.Stats.AddMissed(correctEntity.Value);
            }
            if (GameSettingsUtil.GetGameType() == GameSettingsUtil.GameTypeEnum.Two && participant != player2 && !player2.guessed)
            {
                player2.Stats.AddMissed(correctEntity.Value);
            }
            GameUtil.cpuList.ForEach(cpu =>
            {
                if (participant != cpu && !cpu.guessed)
                {
                    cpu.Stats.AddMissed(correctEntity.Value);
                }
            });

            if (participant == player1 || (GameSettingsUtil.GetGameType() == GameSettingsUtil.GameTypeEnum.Two && participant == player2))
            {
                correctStreak++;
                if (useCorrectColor)
                {
                    GameProgressionUtil.UpdateGameProgression(rep => rep.totalCorrectCorrectlyColoredGuesses++);
                }
                else
                {
                    GameProgressionUtil.UpdateGameProgression(rep => rep.totalCorrectIncorrectlyColoredGuesses++);
                }
                if (correctEntity == CardUtil.EntityEnum.Coco)
                {
                    GameProgressionUtil.UpdateGameProgression(rep => rep.totalTimesCocoWasPicked++);
                }
                if (correctEntity == CardUtil.EntityEnum.Chomp)
                {
                    GameProgressionUtil.UpdateGameProgression(rep => rep.totalTimesChompWasPicked++);
                }
                if (timeToGuess < 1f)
                {
                    GameProgressionUtil.UpdateGameProgression(rep => rep.totalCorrectGuessesUnderOneSecond++);
                }
                if (timeToGuess < .5f)
                {
                    GameProgressionUtil.UpdateGameProgression(rep => rep.totalCorrectGuessesUnderHalfASecond++);
                }
                gameAudioManager.PlayCorrectGuess();
            }
            else
            {
                Cpu cpu = (Cpu)participant;
                gameAudioManager.PlayAVoice(cpu.voiceCorrect);
            }
        }
        else
        {
            if (SettingsUtil.IsPenaltiesAllowed())
            {
                participant.penalties++;
                if (participant.points - participant.penalties < 0 && !SettingsUtil.IsNegativeScoresAllowed())
                {
                    participant.penalties--;
                }
            }

            if (participant == player1 || (GameSettingsUtil.GetGameType() == GameSettingsUtil.GameTypeEnum.Two && participant == player2))
            {
                correctStreak = 0;
                gameAudioManager.PlayIncorrectGuess();
            }
            else
            {
                Cpu cpu = (Cpu)participant;
                gameAudioManager.PlayAVoice(cpu.voiceIncorrect);
            }
        }


        if (participant == player1)
        {
            SetButtonsEnabled(player1Buttons, entity == correctEntity);
        }
        if (participant == player2)
        {
            SetButtonsEnabled(player2Buttons, entity == correctEntity);
        }

        participant.finalScore = participant.points - participant.penalties;
        UpdateScoresAndNameText();

        CheckForGameOver();
        bool player2Guessed = GameSettingsUtil.GetGameType() == GameSettingsUtil.GameTypeEnum.Two && player2.guessed;

        if (entity == correctEntity || ((GameSettingsUtil.GetGameType() == GameSettingsUtil.GameTypeEnum.Single || player2Guessed) && player1.guessed && GameUtil.cpuList.All(cpu => cpu.guessed)))
        {
            if (cardGameObject != null)
            {
                DestroyImmediate(cardGameObject.gameObject);
                cardGameObject = null;
            }

            if (!gameOver)
            {
                StartCoroutine(NewRoundWithDelay());
            }
        }
    }
예제 #7
0
 public void GuessForPlayer2(CardUtil.EntityEnum entity)
 {
     Guess(entity, player2);
 }
예제 #8
0
    private void NewRound()
    {
        Card card = generateCard();

        CardUtil.EntityEnum[] allEntities = new CardUtil.EntityEnum[CardUtil.Entities_2Card.Count];
        CardUtil.Entities_2Card.CopyTo(allEntities);

        CardUtil.EntityEnum[] currentEntities = card.cardEntities.Select(e => e.entity).ToArray();
        CardUtil.EntityEnum[] otherEntities   = allEntities.Where(e => !currentEntities.Contains(e)).ToArray();


        useCorrectColor = false;
        HashSet <CardUtil.ColorEnum> colorsUsed = new HashSet <CardUtil.ColorEnum>();
        Dictionary <CardUtil.EntityEnum, CardUtil.ColorEnum> entityToColor = new Dictionary <CardUtil.EntityEnum, CardUtil.ColorEnum>();

        Array.ForEach(card.cardEntities, cardEntity =>
        {
            int index = useCorrectColor ? UnityEngine.Random.Range(0, otherEntities.Length) : UnityEngine.Random.Range(0, otherEntities.Length + 1);
            index--;
            CardUtil.ColorEnum color;
            do
            {
                if (index < otherEntities.Length)
                {
                    index++;
                }
                else
                {
                    index = 0;
                }

                if (index >= otherEntities.Length)
                {
                    useCorrectColor = true;
                }

                color = CardUtil.EntityColorMap[index >= otherEntities.Length ? cardEntity.entity : otherEntities[index]];
            } while (colorsUsed.Contains(color));
            colorsUsed.Add(color);
            entityToColor[cardEntity.entity] = color;
            Debug.Log(cardEntity.entity + ": " + color);

            cardEntity.image.color = CardUtil.ColorColorMap[color];
        });

        if (currentEntities.Contains(CardUtil.EntityEnum.Banana) && entityToColor[CardUtil.EntityEnum.Banana] == CardUtil.ColorEnum.Yellow)
        {
            GameProgressionUtil.UpdateGameProgression(rep => rep.totalTimesYellowBananaWasSeen++);
        }

        correctEntity = null;

        List <CardUtil.EntityEnum> incorrectEntities = new List <CardUtil.EntityEnum>();

        foreach (KeyValuePair <CardUtil.EntityEnum, CardUtil.ColorEnum> entry in entityToColor)
        {
            CardUtil.EntityEnum entity      = entry.Key;
            CardUtil.ColorEnum  color       = entry.Value;
            CardUtil.EntityEnum otherEntity = CardUtil.ColorEntityMap[color];

            if (entity == otherEntity)
            {
                correctEntity = entity;
                break;
            }

            incorrectEntities.Add(entity);
            incorrectEntities.Add(otherEntity);
        }

        if (correctEntity == null)
        {
            correctEntity = allEntities.Except(incorrectEntities).First();
        }

        cardGameObject = Instantiate(card, cardContainer.transform);

        //Enable all buttons

        SetButtonsEnabled(player1Buttons, true);
        SetButtonsEnabled(player2Buttons, true);


        //Set up stats

        float time = Time.time;

        player1.Stats.AddPickedCard(time, card, entityToColor, useCorrectColor);
        player1.guessed = false;
        if (GameSettingsUtil.GetGameType() == GameSettingsUtil.GameTypeEnum.Two)
        {
            player2.Stats.AddPickedCard(time, card, entityToColor, useCorrectColor);
            player2.guessed = false;
        }

        GameUtil.cpuList.ForEach(cpu =>
        {
            cpu.Stats.AddPickedCard(time, card, entityToColor, useCorrectColor);
        });
        GameUtil.cpuList.ForEach(cpu =>
        {
            cpu.guessed = false;
        });

        //Cpu starts guessing
        GameUtil.cpuList.ForEach(cpu =>
        {
            cpuCoroutines.Add(StartCoroutine(CpuGuess(cpu)));
        });
    }