Раздача карт в покере в Java
Данная статья написана командой Vertex Academy. Это одна из статей из нашего "Самоучителя по Java."
Условие задачи:
Напишите программу Deal.java, которая должна имитировать раздачу карт для игры в покер. Программа получает число n, задаваемое с консоли пользователем, и раздает карты на n игроков (по 5 карт каждому) из рассортированной колоды. Разделяйте пять карт, выданных каждому игроку, пустой строкой.
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
import java.util.Scanner; public class Deal { public static void main(String[] args) { // часть 1 - инициализация переменных int cardsPerPlayer = 5; int players =0 ; String[] suits = { "Пик", "Бубен", "Черв", "Треф" }; String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Валет", "Королева", "Король", "Туз" }; int n = suits.length * rank.length; // количество карт // часть 2 - ввод с консоли for(;;){ Scanner sc = new Scanner(System.in); System.out.println("Введите количество игроков: "); if(sc.hasNextInt()){ players = sc.nextInt(); if(cardsPerPlayer * players <= n){ break; } else { if (players ==0){ System.out.println("Игра прекращена."); break; } else if (players<0){ System.out.println("Число игроков не может быть меньше 0"); } else{ System.out.println("Слишком много игроков!"); } } } else{ System.out.println("Вы ввели не число, или Ваше число слишком большое!"); } } // часть 3 - инициализация колоды String[] deck = new String[n]; for (int i = 0; i < rank.length; i++) { for (int j = 0; j < suits.length; j++) { deck[suits.length*i + j] = rank[i] + " " + suits[j]; } } // часть 4 - перетасовка колоды for (int i = 0; i < n; i++) { int r = i + (int) (Math.random() * (n-i)); // случайная карта в колоде String temp = deck[r]; deck[r] = deck[i]; deck[i] = temp; } // часть 5 - перетасованная колода выводится на экран for (int i = 0; i < players * cardsPerPlayer; i++) { System.out.println(deck[i]); if (i % cardsPerPlayer == cardsPerPlayer - 1) System.out.println(); } } } |
Комментарии к задаче:
В двух словах, этот код принимает количество игроков, проверяет не является ли оно слишком большим ( а то карт не хватит), тасует карты и выводит на экран по пять карт (столько раз, сколько будет игроков).
Что самое сложное? Тасовка карт. Но оно в целом основывается на задаче смене местами элементов массива. Но в прошлой задачи мы "переворачивали", а в этой меняться местами должны случайные карты. Случайные карты - значит будем использовать (псевдо)случайные числа.
Еще сложным может показаться процес верификации (то есть определение, большое число или нет, и число ли это вообще) числа с консоли - часть 2.
Итак, разберем все части по порядку:
Часть 1 - инициализация переменных. Мы создаем переменные:
cardsPerPlayer - хранит количество карт на одноо игрока (5), заданное в условии. Эта переменная имеет тип int, а не, например, byte, потому что в процессе приведения типов в выражениях она все равно будет приводится в типу int - так что другой тип не будет оптимизировать эту программу.
players - объявляем переменную и временно задаем ей значение 0. Если этого не сделать, часть, в которой работаем с консолью (часть 2) будет работать неисправно.
Массив suits - хранит масти карт.
Массив rank - хранит ранги карт. Обратите внимание: это массив строк String, и элементы "2", "3", "4" и другие - тоже строки, к ним нельзя обращаться как к числовым значениям.
n - хранит общее количество карт в колоде. Для того, чтобы посчитать, сколько в колоде карт, умножаем количество мастей на количество рангов ( длину массива suits на длину массива rank).
Часть 2 - верификация введенной переменной. Эта часть в целом должна быть Вам знакома из решения других задач. Ее общий смысл - попросить ввести параметр заново, если он неправильно задан с консоли. Например, наш параметр - количество людей. Он не может быль меньше нуля. Он не может быть равным строке, и мы должны убедиться, что карт в колоде хватит на всех игроков. Для этого использованы условия if.
Часть 3 - инициализация колоды. Создается новый массив deck, который хранит полные названия карт "Дама Треф", "Король Пик" и т.д. Названия создаются с помощью конкатенации названий рангов и названий мастей.
Часть 4 - перетасовываем колоду. Как уже говорилось, принцип очень похож на предыдущую задачу. В этом блоке создается цикл, в котором каждая карта в колоде по очереди меняется местами с другой картой, которая определяется случайно с помощью Math.random().
Часть 5 - раздаем карты. Как в покере карты просто раздаются сверху перетасованной колоды, так и в программе - берется подряд по пять карт для каждого игрока. Цикл выполняется 5*количество_игроков раз, и через каждые 5 карт ставит пустую строку:
1 2 3 |
if (i % carsPerPlayer == cardsPerPlayer - 1) { System.out.println(); } |
Тут нет простого и понятного " if ( i%5 == 0 ) ", потому что i начинается с 0. Если так написать, первому игроку досталось бы 6 карт. Постоянный остаток от деления тут равен не 0, а 4 (т.е. cardsPerPlayer - 1).
Надеемся - наша статья была Вам полезна. Есть возможность записаться на наши курсы по Java. Детальную информацию смотрите у нас на сайте.