SteinCode / BlackJack

0 stars 0 forks source link

hitCard() #1

Open Dudzius opened 1 year ago

Dudzius commented 1 year ago
public void hitCard() {
        if (deck.getDeckSize() == 0) {
            deck = new Deck();
            deck.shuffle();
        }
        hand = new Hand();
        currentCard = deck.dealCard();
        int currentCardFaceValue;
        playerHandCount++;

        ImageView playerCard = getPlayerCardImageView(playerHandCount);
        playerCard.setImage(currentCard.getImage());
        playerCard.setVisible(true);

        currentCardFaceValue = hand.extractFaceValue(currentCard.toString(), playerScore);
        playerScore = hand.calculateScore(playerScore, currentCardFaceValue);
        displayPlayerFaceValue.setText(String.valueOf(playerScore));
        cardsInDeck.setText(Integer.toString(deck.getDeckSize()));

        if (checkIfBust(playerScore) && playerHandCount > 2) {
            winsText.setVisible(true);
            winsText.setText("Dealer wins (player busted)");
            playAgainButton.setVisible(true);
            playerLostFlag = true;
            toggleButtons(false);
            if (checkIfGameOver(playerMoneyAmount)) {
                showGameOverScreen();
            }
        } else if (checkIfMaxScore(playerScore) && playerHandCount >= 2) {
            winsText.setVisible(true);
            winsText.setText("Player wins (player got 21)");
            playAgainButton.setVisible(true);
            playerMoneyAmount = playerMoneyAmount + playerBetAmount * 2;
            playerMoney.setText(Integer.toString(playerMoneyAmount));
            playerLostFlag = false;
            toggleButtons(false);
        }
        hand.setPlayerHandCardCount(playerHandCount);
        hand.setPlayerScoreCount(playerScore);
    }
SteinCode commented 1 year ago

Atlikau funkcijos statinio kodo analizę, mano atsiliepimai būtų tokie:

Ką reikėtų taisyti:

  1. Funkcija yra akivaizdžiai per didelė ir turi per daug atsakomybių, kai pagal funkcijos pavadinimą yra suprantamą, kad funkcija turi inicijuoti kortos išmetimą. Šią funkciją būtų galima išskaidyti į šias funkcijas:

    • Kaladės inicializacija, pvz. initializeDeck();
    • Kortų išdalijimas, pvz. dealPlayerCard();
    • Patikrinti, ar nėra "Bust", pvz., checkIfBust(playerScore).
    • Tikrinti maksimalų rezultatą checkIfMaxScore(playerScore);
    • Atnaujinti vartotojo sąsają, sukurkite funkciją, skirtą naudotojo sąsajos elementams atnaujinti, pavyzdžiui, žaidėjo rezultatui atnaujinti, kortų kaladėje esančių kortų skaičiui rodyti ir pranešimams ekrane rodyti.
    • Žaidimo pabaiga, pvz., endGame().
  2. Kintamųjų pavadinimai, pvz., playerLostFlag ir playerMoneyAmount, galėtų būti labiau suprantami. pvz., isPlayerLost ir playerMoney.

  3. Klaidų tvarkymas: Kodas neapdoroja klaidų. Daroma prielaida, kad kaladėje visada yra kortų ir kad žaidėjo ranka bei rezultatas gali būti atnaujinami be jokių problemų. Svarbu įtraukti klaidų tvarkymą ir patvirtinimą, kad realaus pasaulio scenarijuose gali įvykti nesklandumų. (Nėra visiškai clean code principas, tačiau svarbus aspektas)

  4. Kode yra keletas stebuklingų skaičių, pavyzdžiui, skaičius "2". Jei "2" reiškia laimėjimo sąlygai reikalingų kortų skaičių, geriau reiktų apibrėžti konstantą, pavyzdžiui, WIN_CONDITION_CARD_COUNT, turinčią prasmingą pavadinimą.

  5. winsText. ir playAgainButton kodo dublikavimas, galbūt reikėtų taip pat išskirti į atskirą funkciją.

  6. "Hardcodintos" "2" ir "21" reikšmės susijusios su žaidimo taisyklėmis. Jas reikėtų apsibrėžti kodo pradžioje, kad vėliau, esant poreikiui, jas būtų lengviau pakeisti.