Переработанная игра в блэкджек

Я пытаюсь создать игру в блэкджек, в которой игрок начинает с 2 карт, а затем спрашивает, хочет ли он/она иметь еще одну карту (ввод пользователя: да или нет), если да, добавляется еще одна карта. общий. если нет, игра просто завершается.

Вот пример вывода, который я пытаюсь получить:

И это то, что у меня есть до сих пор (это, вероятно, неправильно с точки зрения размещения):

import java.util.Scanner;

public class BlackJackGame {
    public static void main(String[] args) {

        int randomnum1 = (int) (1 + Math.random() * 10);
        int randomnum2 = (int) (1 + Math.random() * 10);
        int randomnum3 = (int) (1 + Math.random() * 10);
        int total;
        char anotherCard = 'y';

        Scanner input = new Scanner(System.in);

        System.out.println("First cards: " + randomnum1 + ", " + randomnum2);

        total = randomnum1 + randomnum2;

        System.out.println("Total: " + total);

        while (anotherCard != 'n')
        {   
            System.out.print("Card: " + randomnum3);

            System.out.print("Do you want another card? (y/n): ");
            anotherCard = input.next().charAt(0);           
        }   
    }
}

Советы и переработка исходного кода будут высоко оценены.


person user3385997    schedule 28.08.2014    source источник
comment
Кроме того, мне трудно создать аккумулятор для карт. Например, скажем, мои первые 2 карты — это 2 и 9. Затем он спрашивает меня, хочу ли я еще одну карту, я говорю «да». тогда следующая карта будет 2. Таким образом, моя сумма будет 13. Как вы сохраняете такой промежуточный итог? Цель состоит в том, чтобы не превысить 21. Может ли в этом участвовать оператор if-else?   -  person user3385997    schedule 28.08.2014
comment
Привет и добро пожаловать в stackoverflow! Чтобы быть эффективным на этом сайте, мы просим вас задавать конкретные вопросы и предоставлять информацию о том, что вы уже пробовали. Если вы сделаете это, мы будем рады вам помочь   -  person ControlAltDel    schedule 28.08.2014
comment
Приятно (и редко) видеть вопрос нового пользователя с реальными усилиями. Хорошая работа!   -  person Mad Physicist    schedule 28.08.2014


Ответы (3)


Что касается карточных игр, то в колоде 52 карты, и я предполагаю, что колода одна.

Если вы хотите, чтобы это была честная игра, вы должны помнить об этом.

Но если вы просто хотите, чтобы результаты выглядели правильно, вам просто нужно избегать получения более 4 тузов, 2, 3 и 4.

Одним из способов добиться этого было бы создание массива int размером 52 с 4 картами каждой карты. Я полагаю, что туз будет 1, а 10, J, Q, K будут 10, так что будет 16 десяток.

Получите случайное число от 0 до 51, чтобы получить индекс массива, который вы хотите использовать. Как только вы используете этот индекс, установите значение этого массива = -1 и всегда проверяйте -1 перед использованием этого индекса, и если он равен -1, получите другое случайное значение.

int [] deck = size 52 array with 4 of each card.
int random = get random number between 0 and 51.

while(deck[random] == -1){
   random = get random number between 0 and 51.
}
int card1 = deck[random]
deck[random] = -1;

что-то вроде этого .. Я просто сделал это быстро, надеюсь, вы поняли идею.

person Justin    schedule 28.08.2014
comment
На самом деле в казино игры в блэкджек состоят из 6 тщательно перетасованных колод в колоде. На самом деле во всех 6 колодах и 4 мастях по 24 каждого числа. - person RevanProdigalKnight; 28.08.2014
comment
@RevanProdigalKnight Я предпочитаю играть в блэкджек с одной колодой в казино. Они до сих пор есть во всех казино. - person Justin; 28.08.2014

Вот советы, которые вы просили:

  • Вам нужно ввести переменную, чтобы отслеживать вашу сумму. Например, вы можете инициализировать его с помощью: int sum = randomnum1 + randomnum2; и продолжать добавлять к нему следующую карту внутри цикла: sum += randomnum3;
  • Вам нужно сгенерировать randomnum3 внутри цикла while. Таким образом, вы будете каждый раз получать новую карту. По сути, вам нужно вызывать функцию random каждый раз, когда вы создаете карту, а не только один раз. В противном случае значение randomnum3 не изменится, и вы будете получать одну и ту же карту снова и снова.
  • Чтобы выйти, когда вы дойдете до 21, вам нужно будет использовать if и, возможно, break в цикле, как только вы добавите текущую карту к сумме: if(sum > 21) { break; }
  • Кроме того, вы можете установить значение anotherCard на 'n' вместо использования break.
  • Вы должны отслеживать, какие карты уже получил пользователь, если хотите имитировать настоящую колоду. Это не является технически необходимым для программы, которую вы пишете.
person Mad Physicist    schedule 28.08.2014
comment
Как создать новую карту для randomnum3? Я знаю, как добавить к нарастающей сумме (total += randomnum3;), но каждый раз, когда я хочу получить новую карту, она дает мне один и тот же номер карты... Если вы можете мне помочь, я думаю, что смогу чтобы завершить программу. - person user3385997; 28.08.2014
comment
Пункт 2 списка решает эту проблему. Вам нужно поместить int randomnum3 = (int) (1 + Math.random() * 10); в цикл while. - person Mad Physicist; 28.08.2014
comment
Я немного отредактировал ответ. Надеюсь, станет немного понятнее. - person Mad Physicist; 28.08.2014
comment
ААА, ДУХ! Почему я пропустил это? СПАСИБО! - person user3385997; 28.08.2014
comment
Без проблем. Мы все здесь, чтобы учиться. Не стесняйтесь принять мой ответ, если он вам нравится :) - person Mad Physicist; 28.08.2014
comment
Обязательно будет! Что касается общего количества › 21: Будет ли это цикл Do-While? - person user3385997; 28.08.2014
comment
Да. Вы хотите сделать эту проверку для каждой новой карты. Кроме того, у вас есть обычный цикл while, а не do-while. Ваша логика будет работать так же хорошо с do-while, если вы захотите переключиться на нее. - person Mad Physicist; 28.08.2014
comment
Хорошо, я поработаю над этим и дам вам знать, что мне удалось получить. Спасибо еще раз! - person user3385997; 28.08.2014
comment
Привет, Безумный Физик, могу я связаться с вами по электронной почте? Я немного подправил свой код, но проблемы, которые у меня возникли: 1) Когда он спрашивает меня, хочу ли я снова играть? и я отвечаю нет, он все равно дает мне 2 карты и общее количество. 2) Тот же вопрос выше, но ответ "да" Он начинается с вопроса "Хотите еще одну карту?" - person user3385997; 29.08.2014
comment
Было бы проще, если бы вы задали другой вопрос с обновленным кодом. Похоже, вы вкладываете в это много труда, поэтому я не думаю, что у вас возникнут проблемы с получением хорошего ответа. Всегда лучше получить более одного мнения, независимо от того, насколько вы готовы доверять этому мнению. Я хотел бы увидеть, как вы решаете, начинать ли новую игру, чтобы найти проблему (похоже, что обе проблемы являются проявлением одной и той же логики). - person Mad Physicist; 29.08.2014

Вот несколько простых улучшений, на которые стоит обратить внимание. Я оставлю это так, поскольку часть радости обучения программированию заключается в открытии. В качестве следующего шага я бы предложил создать руку дилера, а затем посмотреть, сможет ли игрок ее побить. Удачи!

public static void main(String[] args) {
    int card1 = (int) (1 + Math.random() * 10);
    int card2 = (int) (1 + Math.random() * 10);
    int total = card1 + card2;

    System.out.println(String.format("First cards: %d & %d.  Total %d", card1, card2, total));
    System.out.println();

    Scanner input = new Scanner(System.in);

    System.out.print("Do you want another card? (y/n): ");
    char anotherCard = input.next().charAt(0);
    while (anotherCard != 'n' && total < 21) {
        int nextcard = (int) (1 + Math.random() * 10);
        total += nextcard;
        System.out.println(String.format("You drew a %d.  Your total is now %d", nextcard, total));

        if (total > 21) {
            System.out.println("You busted!");
        } else {
            System.out.print("Do you want another card? (y/n): ");
            anotherCard = input.next().charAt(0);
        }
    }
}
person Bryan Moore    schedule 28.08.2014