Дополнительное задание #2. Доска Боггл
На этой неделе вам предстоит разработать класс для хранения конфигурации на доске Боггл. Стандартная доска для игры в Боггл имеет размер 4 на 4 клетки. Каждая клетка содержит одну букву, если это не "Q". В последнем случае клетка должна содержать строку "Qu". Ваш класс должен быть более универсальным; добавьте возможность работать с досками размером NxN а не только 4x4. (Тогда вы сможете делать доски Супер Боггл размером 5x5 с помощью того же кода. Или собственные доски "Ультра-Мега-Гипер-Боггл" размером 20x20, если конечно вас увлечет эта идея ...)
Создайте класс "Доска Боггл" (можете назвать его BoggleBoard, например) который представляет доску разбитую на клетки размером NxN. Каждая клетка должна быть объектом типа String. Возможно вы захотите хранить их в двумерном массиве строк.
Вот дополнительная спецификация на класс:
Создайте конструктор с одним аргументом size - размер доски, и создайте в нем доску Боггл размером size × size.
В конструкторе надо проинициализировать Боггл случайным набором букв. Каждая ячейка после инициализации содержит или одну заглавную букву (от "A" до "Z", минус буква "Q"), или строку "Qu". Для генерации случайных чисел необходимых для управления всем процессом игры можно использовать класс java.util.Random.
(Предложение: Возможно лучше всего было бы поместить операцию "генерации доски" в отдельный метод который вызывается из конструктора. В целом, каждый метод должен решать только одну задачу. Просто вызовите метод "генерации доски" из конструктора, после выделения памяти под двумерное поле.)
TestNG Framework
На этой неделе вы начнете создавать настоящий пакет формального модульного тестирования программы. Для создания тестов мы воспользуемся TestNG Framework.
В целом, следование некоторым "стандартам" назначения имен для тестовых классов это хорошая идея. Например, если у вас есть класс с именем Foo, класс для тестирования Foo должен называться TestFoo. Следуйте этому правилу создавая тестовые классы в этом проекте.
Создайте тестовый класс для проверки вашего класса "список слов". Попытайтесь спроектировать ваши тесты так, чтобы проверить все возможные пути исполнения кода в вашем "списке слов", и выполнить все предполагаемые сценарии использования класса. Вот несколько тестов, чтобы вы могли начать с них обдумывание:
И так далее. Ваши тесты также должны выполнять методы "добавить список слов" и "вычесть список слов". Если ваш тестовый пакет не достаточно полон нужно его усовершенствовать. Однако, каждый тест должен проверять только какой нибудь один "вид" функционала; у вас в каждом методе может быть несколько утверждений, не нужно пытаться проверить все в одном тексте!
Вставьте тэг TestNG @Test для отметки своих тестовых классов. Ваши тесты можно разделить на группы содержащие "базовые" тесты и "файловые" тесты (т.е. тесты которые проверяют функционал загрузки из файлов TestNG). Можно также использовать параметр expectedException тега @Test для проверки работы списка слов при при попытке загрузки из не существующего файла.
Создайте другой тестовый класс для проверки класса доски Боггл. Тестовый класс для доски Боггл должен быть значительно проще, так как этот класс имеет более простой функционал. Ваш тест должен проверить только несколько вещей:
Все клетки должны быть проинициализированы допустимыми значениями. Значение клетки Боггл считается допустимым если оно не равно null, и является одной заглавной буквой в диапазоне "A".."Z", кроме буквы "Q", вместо которой должно стоять значение "Qu" (заглавная Q, строчная u).
(Подсказка: Если вы сделаете эту "проверку значений" в отдельном вспомогательном методе его можно легко вызвать для проверки 2 или 3 различных вариантов конфигурации доски Боггл.)
Компиляция и запуск тестов
Для компиляции модульных тестов, нужно сделать ссылку на JAR файл TestNG framework. TestNG установлена в кластере в следующем каталоге:
/cs/courses/cs11/software/testng-6.3.1
Следует использовать JAR-файл testng-6.3.1.jar. Можно указывать ссылку на JAR файл при вызове javac и java. Или, облегчите себе жизнь просто скопировав JAR-файл TestNG в свой локальный каталог lab2!
Если вы скопировали файл .jar в свой локальный каталог, команда компиляции в Linux будет такая:
javac -cp .:testng-6.3.1.jar *.java
Можно также установить переменную среды окружения CLASSPATH так чтобы она содержала ссылку на этот файл. В кластере CS это делается так:
export CLASSPATH=$CLASSPATH:/cs/courses/cs11/software/testng-6.3.1/testng-6.3.1.jar
javac *.java
(В кластере CS, вы можете отредактировать свой файл ~/.bashrc включив в него строчку export CLASSPATH=....) Следующий раз после входа в систему или запуска терминала, загрузится измененный файл .bashrc. Или можно, просто ввести команду source ~/.bashrc для перезагрузки файла в открытом терминале.)
В Windows надо сделать так:
set CLASSPATH=%CLASSPATH%;c:\path\to\testng\dir\testng-6.3.1\testng-6.3.1.jar
javac *.java
После компиляции тестов, вы можете запустить их используя инструмент командной строки TestNG. Снова нужно дать ссылку на JAR-файл TestNG одним из двух приведенных выше способов.
java org.testng.TestNG -testclass TestWordList TestBoggleBoard
Готово?
Это все что требуется в этом задании. Когда закончите, отправьте ваши файлы исходного кода (не нужно отправлять файлы .class, файлы javadocs, или списки слов) на проверку.
У нашей доски Боггл есть один неприятный недостаток: все буквы выбираются с одинаковой вероятностью. Это сильно усложняет игру, потому что гораздо проще закончить ее на доске с несколькими буквами "X" или "Z". Если вы хотите упростить вашу игру Боггл (и сделать ее более забавной!), можете использовать другой вид распределения букв. Вот распределение букв , использующееся в Клоне Боггл, который называется Логгл:
| A: 8 | H: 3 | O: 6 | V: 2 |
| B: 3 | I: 7 | P: 3 | W: 2 |
| C: 3 | J: 1 | Qu: 1 | X: 1 |
| D: 4 | K: 2 | R: 4 | Y: 3 |
| E: 10 | L: 5 | S: 5 | Z: 1 |
| F: 2 | M: 3 | T: 5 | |
| G: 3 | N: 5 | U: 4 |
Можете использовать это распределение букв, или использовать свое собственное распределение.
Есть несколько различных способов генерации случайных чисел имеющих неравномерное распределение вероятностей; возможно для реализации процедуры выбора буквы вам понадобятся коллекции.
Если вы добавите это свойство в класс доски Боггл, включите объяснение используемой технологии в документацию Javadoc вашего класса.
Copyright (C) 2015, California Institute of Technology. All rights reserved.