Подскажите как лучше реализовать.
Нужно написать игру- 21 очко на с++ в консоли. Для игры между двумя людьми.
36 карт, туз -11 очков, валет 2, дама 3, король 4. Цифровые соответственно по номиналу 6-10.
каждый поочередно достает по карте, либо добавляет еще либо вскрывается, либо у него 21. Выигрывает тот у которого либо больше,либо 21, либо меньший перебор.
Я только начал изучать программирование, и не знаю куда копать.
Я так понимаю мне необходим массив на 36 карт, и в нем устроивать рандомную выборку и функцию которая будет эту выборку исполнять. Функцию нужно вызывать в цикле пока у одного игрока либо будет перебор, либо он вскрывает карты, либо у двоих перебор. каша в голове. помогите с алгоритмом , и с тем как именно реализовать программу.
Если карты достаются не по очереди, а как в блекджеке. то могу предложить следующий вариант написания. Если не так, то думаю ты поправишь сам.
Игрок №1 набирает карты. Делаем бесконечный цикл. В нем спрашиваем что игрок хочет сейчас - остановиться или брать. Если брать, то вызываем некоторую функцию getNewCard(), которую я опишу ниже. Она вернет очки за карту. Если перебор или игрок сказал остановиться, то выходим из цикла. Кстати при переборе количество очков можно приравнять к -1, так будет проще.
Аналогично для игрока №2. Потом сравниваем итог.
Теперь о функции getNewCard(). Ей нужно знать какие карты уже были выложены. Поэтому можно хранить хотя бы массив из 36 значений карт( для первого раза сойдет и так вариант, его легче понять) и еще один массив в котором храним, выдана ли это карта. Еще храним сколько карт осталось. Когда вызывается функция, то генерируем случайное число от 0 до количества оставшихся карт. Затем отсчитываем в массиве такую по счету неиспользованную карту. Помечаем ее использованной, возвращаем ее количество очков.
Рофал Лафор: В C/C++ есть тип bool. Делаешь массив bool used[36], в котором помечаешь, использована ли карта. Затем бежишь
generatedNumber = rand() % cardsLeft + 1; // какая по счету карта будет выдана
resultCard = -1;
while (generatedNumber) {
resultCard++;
if (!used[resultCard]) {
generatedNumber--;
}
}
resultCard - номер выданной карты. Ее помечаешь занятой used[resultCard] = true и отдаешь количество очков, которое узнаем из другого массива.
Антон Хурс: Можно долго спорить, должно ли это быть характеристикой самой карты. Но здесь уж точно проще завести новый массив, чем объяснять классы новичку.