Содержание
Вступление 2
Раздел I Методы решения поставленной задачи 3
1.1 Описание игры 3
1.2 Описание алгоритма 4
Раздел II Реализация программного продукта 10
2.1 Выбор способа реализации алгоритма решения задачи «Балда» 10
2.2 Выбор среды программирования 14
2.3 Инструкция по использованию программы 15
2.3.1 Сетевая игра 18
Выводы 20
Список использованной литературы 22
Дополнение 23

Работа № 4018. Это ОЗНАКОМИТЕЛЬНАЯ ВЕРСИЯ работы, цена оригинала 1000 рублей. Оформлен в программе Microsoft Word.

Оплата. Контакты

Вступление
Курсовая работа заключается в разработке логической игры «Балда».
Актуальность выбранной темы очевидна: в работе, в обучении, во всякой творческой деятельности человеку нужны сообразительность, изобретательность, догадка, умение размышлять — одним словом, сообразительность. Сообразительность можно воспитать и развить систематическими упражнениями и решением головоломок, которые и предусмотрено разработанным программным продуктом, который включает набор интересных игр для человека любого возраста.
Главным назначением этой работы есть способность совершать положительное действие на умственные способности человека в разных направлениях, а именно, развивая логическое мышление и пополняя его словарный запас, а также возможность использования программы для людей разного возраста и с разным уровнем интеллектуальных способностей.
Как говорил Лейбниц: «Человеческая изобретательность ни в чем не проявляется так, как в играх».
Нужно сказать, что хотя логические игры никогда не занимают верхних строк в любых таблицах популярности компьютерных игр, но, однако, имеют стойкий спрос и способны приносить своим творцам немалый доход.
В игре предусмотренные разные уровни сложности. Начинающий игрок может выбрать такой вариант игры, в котором компьютер будет слабым соперником. Развивая свои интеллектуальные способности, игрок постепенно одолевает текущий уровень сложности и переходит на новый.
Раздел I Методы решения поставленной задачи
1.1 Описание игры
В работе представлена распространенная среди детей и взрослых игра «Балда».
Правила игры «Балда»[5]:
В игре принимают участие по меньшей мере два игрока. Один из них — пользователь компьютера (игрок), другой — компьютер (соперник) или еще один пользователь. Игровое поле — таблица, которая составляется с 25 клеток (5х5, 7×7, 9×9). В начале игры в третью строку таблицы вводится слово (существительное) из пяти букв. После этого игроки поочередно придумывают слова. Чтобы сделать ход, необходимо в какую-нибудь свободную клетку записать одну букву, потом указать слово, которое можно составить из имеющихся в таблице букв, которые стоят возле друг с другом (но не по диагонали). В новом слове должна быть использована вставленная буква. За каждое придуманное слово игроку насчитываются очки. Количество очков пропорционально количеству букв в придуманном слове. Побеждает игрок, который набрал большее количество очков.
В начале игры игроку предлагается выбрать уровень сложности, который учитывается таким образом: чем выше уровень, тем длиннее слово может «придумать» компьютер из комбинации букв в таблице.
Выигрывает тот, кто набрал большее количество очков.
1.2 Описание алгоритма
Компьютер «придумывает» слово так: «выбирает» все слова из словаря, которые можно составить на текущем ходу. Потом из полученного множества слов «выбирает» такое слово, длина которого отвечает выбранному уровню сложности игры.
Игрок, придумав слово, указывает клетку, в которую он хочет поместить новую букву. Потом нажимает на клетки с буквами в такой последовательности, в которой они следуют в придуманном им слове. После этого компьютер проверяет наличие слова игрока среди слов, уже использованных в игре. Если это слово уже использовалось, то компьютер сообщает об этом игрока, и игрок делает ход заново. Потом компьютер «ищет» слово игрока в словаре. Если это слово не найдено, то компьютер сообщает об этом игрока и предлагает один из вариантов :
1) сохранить новое слово в словаре;
2) не сохранять это слово в словаре (при этом игрок делает ход заново);
3) в случае сетевой игры право сохранения решает сервер.
После этого компьютер вычисляет количество очков, которые добавляются на счет игрока.
Выигрывает тот, кто набрал большее количество очков.
Для наглядности предоставим диаграммы потоков данных.[6]
рис. 1.1 Начальная контекстная диаграмма
рис. 1.2 Диаграмма потоков данных нулевого уровня
рис. 1.3 Диаграмма потоков данных первого уровня для процесса 2
рис. 1.4 Диаграмма потоков данных второго уровня для процесса 2.1
рис 1.5 Диаграмма потоков данных второго уровня для процесса 2.2
Раздел II Реализация программного продукта
2.1 Выбор способа реализации алгоритма решения задачи «Балда»
Основным этапом при разработке алгоритма игры «Балда» является имитация хода компьютера. Он заключается в «придумывании» слова и вывода его на экран, причём длина придуманного слова должна зависеть от выбранного уровня сложности игры. Чтобы осуществить ход, компьютеру необходим словарь, содержащий множество слов, удовлетворяющих правилам игры, а именно: слово должно быть именем существительным в единственном числе, но не нарицательным.
Опишем процесс «придумывания» слова компьютером:
1. Выбор из словаря всех слов, которые можно составить на текущем ходе.
Этот этап использует разработанную рекурсивную процедуру, проверяющую возможность «придумывания» слова при данной расстановке букв в таблице. Эти слова помещаются в массив «придуманных» слов.
Рассмотрим более детально:
private void rec(int i, int j, int k, int matrhodrec[][], boolean qb)
{
if (qsatisfy) {
return;
}
if (k>=snewwordfind.length()){
if ((qb) && (!Checkalreadyusedword(snewwordfind))){//проверка на использование составленного в текущей игре.
Countwordallpc++;//количество всех возможных слов составленных компьютером
mascurfieldwordallpc[Countwordallpc-1]=snewwordfind;
newletterfix=newletter;//новая добавленная буква на игровое поле
inewfix=inew;//позиция новой буквы
jnewfix=jnew;
//Перечень условий, если избранная буква на поле отвечает букве в выдуманном слове
if (j<sizewidthfield-1) {if ((matrhodrec[i][j+1]==0) && (matralph[i][j+1].equals(snewwordfind.substring(k,k+1)))) {//проверка: дело находится k+1 буква текущего підбираємого слова
matrhodrec[i][j+1] = k+1;//если так, отметим в матрице номер буквы
rec(i,j+1,k+1,matrhodrec,qb);//вызов рекурсии для поиска возможностью установления новой буквы или совпадения буквы на поле с буквой в текущем слове
if (qsatisfy) {return;}//если слово составлено выходим из рекурсии
matrhodrec[i][j+1] = 0;//удаляем индекс-отметку о расположении новой буквы или пути создания слова
}}
if (i<sizeheightfield-1) {if ((matrhodrec[i+1][j]==0) && (matralph[i+1][j].equals(snewwordfind.substring(k,k+1)))) {// та же самая проверка вверх
matrhodrec[i+1][j] = k+1;
rec(i+1,j,k+1,matrhodrec,qb);
if (qsatisfy) {return;}
matrhodrec[i+1][j] = 0;
}}
if (j>0) {if ((matrhodrec[i][j-1]==0) && (matralph[i][j-1].equals(snewwordfind.substring(k,k+1)))) {
matrhodrec[i][j-1] = k+1; // та же самая проверка налево
rec(i,j-1,k+1,matrhodrec,qb);
if (qsatisfy) {return;}
matrhodrec[i][j-1] = 0;
}}
if (i>0) { if ((matrhodrec[i-1][j]==0) && (matralph[i-1][j].equals(snewwordfind.substring(k,k+1)))) {
matrhodrec[i-1][j] = k+1; // та же самая проверка вниз
rec(i-1,j,k+1,matrhodrec,qb);
if (qsatisfy) {return;}
matrhodrec[i-1][j] = 0;
}}
//Перечень условий, если клеточка на поле свободная. Вставка в эту позицию соответствующей буквы нового слова.
if (j<sizewidthfield-1) {if((matrhodrec[i][j+1]==0) && (matralph[i][j+1].equals(«»)) && (!qb)) {
newletter = snewwordfind.substring(k,k+1);//запоминаем новую букву
inew = i;
jnew = j+1;
matrhodrec[i][j+1] = k+1;
rec(i,j+1,k+1,matrhodrec,true);
if (qsatisfy) {return;}
matrhodrec[i][j+1] = 0;
}}
if (i<sizeheightfield-1) {if((matrhodrec[i+1][j]==0) && (matralph[i+1][j].equals(«»)) && (!qb)) {
newletter = snewwordfind.substring(k,k+1);
inew = i+1;
jnew = j;
matrhodrec[i+1][j] = k+1;
rec(i+1,j,k+1,matrhodrec,true);
if (qsatisfy) {return;}
matrhodrec[i+1][j] = 0;
}}
if (j>0) {if((matrhodrec[i][j-1]==0) && (matralph[i][j-1].equals(«»)) && (!qb)) {
newletter = snewwordfind.substring(k,k+1);
inew = i;
jnew = j-1;
matrhodrec[i][j-1] = k+1;
rec(i,j-1,k+1,matrhodrec,true);
if (qsatisfy) {return;}
matrhodrec[i][j-1] = 0;
}}
if (i>0) {if((matrhodrec[i-1][j]==0) && (matralph[i-1][j].equals(«»)) && (!qb)) {
newletter = snewwordfind.substring(k,k+1);
inew = i-1;
jnew = j;
matrhodrec[i-1][j] = k+1;
rec(i-1,j,k+1,matrhodrec,true);
if (qsatisfy) {return;}
matrhodrec[i-1][j] = 0;
}}
}
2. Выбор слова, удовлетворяющего текущему уровню сложности игры.
Для того, чтобы выбрать слово, удовлетворяющее текущему уровню сложности игры, необходимо отсортировать слова в массиве «придуманных» слов в порядке увеличения их длины. Затем сделать выборку слов, учитывая уровень сложности. Среди полученного множества выбрать произвольное слово.
Также при разработке алгоритма особое внимание уделялось удобному и простому управлению, которое обеспечивало бы следующее:
1. Игрок, придумав слово, сначала указывает добавляемую им букву.
2. Затем игрок указывает клетку, в которую он хотел бы поместить эту букву.
3. Затем нажимает на клетки с буквами в такой последовательности, в которой они следуют в придуманном им слове.
Также при разработке алгоритма учитывается следующее:
1. Компьютер проверяет наличие слова, придуманного игроком, среди слов, уже использованных в игре. Если это слово уже использовалось, то компьютер сообщает об этом игроку, и игрок делает ход заново. Для этого используется массив, в котором хранятся использованные в игре слова.
2. Компьютер «ищет» придуманное игроком слово в словаре. В случае отрицательного результата поиска компьютер сообщает об этом игроку и предлагает один из вариантов: 1) сохранить новое слово в словаре; 2) не сохранять это слово в словаре (при этом игрок делает ход заново).
3. Компьютер вычисляет количество очков, добавляемых на счета игроков. При этом учитывается то, что количество добавляемых очков равно количеству букв в придуманном слове.
Если компьютер «придумает» слово, определение которого игрок не знает, то в этом случае игроку предоставляется возможность прочитать толковое значение этого слова, нажав на кнопку «Толкование слова». При этом компьютер «ищет» данное слово в прилагаемом к комплексу толковом словаре и выводит на экран толковое значение этого слова.
2.2 Выбор среды программирования
Java существенно облегчает создание надежного программного обеспечения. Кроме исчерпывающей проверки на этапе компиляции, система предполагается анализ на этапе выполнения. Сам язык спроектирован так, чтобы вырабатывать у программиста привычку писать «правильно». Модель работы с памятью, в которой исключены использование указателей, делает невозможными целый класс ошибок.
Независимость от архитектуры.
Компилятор Java делает байт-коды, то есть модули программы имеют архитектурно-независимый формат, который может быть проинтерпретированный на множестве разных платформ. Это уже не исходные тексты, но еще не платформозависимые машинные коды.
2.3 Инструкция по использованию программы
После запуска программы перед пользователем появляется главное окно игры «Балда» (рис. 2.1)
рис 2.1 Начало игры
Чтобы выбрать уровень сложности игры, а также право первого хода, необходимо раскрыть пункт меню «Опции» и сделать желательные налаживания.
Чтобы начать игру надо выбрать пункт меню «Игра» потом «Новая» (рис 2.2). В избранном окне возможно избрать соперника, право первого хода и сетевую игру.
рис 2.2 Выбор типа игры
Чтобы сделать ход игрок должен:
1.Придумав слово, сначала указать букву, которая добавляется им.
2. Потом указать клетку, в которую он хотел бы поместить эту букву.
3. Нажимать на клетки с буквами в такой последовательности, в которой они следуют в придуманном им слове.
4. Для окончания введения нажать на любую букву придуманного слова еще раз.
После каждого хода игроков, компьютер подсчитывает количество очков каждого игрока и записывает придуманные ими слова в соответствующие области игрового поля.
Игровое поле в процессе игры выглядит таким образом (рис. 2.3)
рис 2.3 Процесс игры с компьютером
Если компьютер «придумал» слово, определение которого игрок не знает, то в этом случае игрок может прочитать значение этого слова, нажав на кнопку с придуманным словом. Пример толкования слова приведен на рисунке 2.4.
рис 2.4 Толкование слова
Если игрок не может придумать слово, то может воспользоваться кнопкой «Пропустить ход».
Для получения подсказки нажмите на кнопку с именем игрока(рис. 2.5)
рис 2.5 Подсказка
2.3.1 Сетевая игра
Особенностью игры является возможность играть по сети с двумя или более игроками одновременно(также в качестве соперника может быть компьютер). На рисунке 2.6 видно отображено окно начала сетевой игры.
рис 2.6 Сетевая игра
Игровое поле сетевой игры выглядит таким образом (рис 2.7)
рис 2.7 Процесс сетевая игра
Во время сетевой игры в случае составления слова отсутствующее в словаре разрешение на добавление решает игрок, который создал сервер игры.
Во время игры можно в любой момент пересмотреть путь созданных слов игроками. Для этого необходимо щелкнуть по созданному слову.
Нажатие на кнопку «Правила» отобразит следующее окно.(рис. 2.8)
рис 2.8 Правила
Выводы
Сегодня практически невозможно представить себе программу, которая не владеет интерфейсом пользователя.
Данная программа реализована с помощью Java, что дает двойное преимущество:
1. Платформонезависимость.
2. Представляет практическую ценность, потому что всегда будет существовать заинтересованность в продукции подобного рода благодаря положительному влиянию на мышление. И, несмотря на то, что логические игры никогда не занимают верхних строк в любых таблицах популярности компьютерных игр, но, однако, пользуются стойким спросом и способны приносить своим творцам немалый доход.
На практике применили глубокие знания о сетевой работе средствами Java. Реализовали многопоточность в программе с целью обеспечения клиент-серверной архитектуры, и избавиться «зависания» программы во время просчета хода компьютера и анимации создания слова.
Список использованной литературы
1. Гарднер М. «Математические головоломки и развлечения» – М.: «Оникс», 1994г.
2. Гарднер М. «Математические досуги» – М.: «Оникс», 1995г.
3. Герберт Шилдт. Полный справочник по Java. 7-e издание, М.: Изд-Во «Вильямс» 2007 – 1040 с.
4. Гик Е. Я. «Занимательные математические игры» – М.: «Знание», 1987г.
5. Кей С. Хорстманн. Java 2, 7-изд. М.: Изд-Во «Вильямс», 2007. — 2049 с.
6. Кинг Э. «Логика чисел: увлекательный математические игры» – М.: «Махаон», 1998г.
7. Лихтарников Л. М. «Задачи мудрецов» – М. «Просвещение», 1996г.

Advertisement
Бесплатно

Узнайте стоимость учебной работы онлайн

Информация о работе

Ваши данные

Дополнение
Файл JPanelGameField.java
package balda;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;

public final class JPanelGameField extends JPanel{
MainJPanel mainJPanel1;
BaldaJB baldaFieldJB[][];
Integer sizeWidthField, sizeHeightField;
GridBagLayout layoutGrid;
String ru_alphabet = «АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ»;
JFileChooser chooser = new JFileChooser();
File file;
boolean gameOver=false;
Boolean boolGamerIsPC=false;
boolean boolfirstStepPC;
boolean boolThisAppServer=false;
boolean boolServerStepFirst=false;
boolean boolServerStepNow=false;
boolean boolThisAppClient=false;
boolean boolqAlph,boolqUser,boolqTable,qSatisfy,qPodoshlo,boolqUseBukva;
String sNewWordFind;
String newLetter,newLetterFIX;
int iNew,jNew,iNewAlph,jNewAlph, iNewFIX, jNewFIX;
int iLastBukvaSel,jLastBukvaSel;
String curSlovo;
String masCurFieldWordALLPC[];
Integer CountWordALLPC;
int matrHOD[][];
int matrHOD_0[][];
int matrHodMain[][];
String matrAlph[][];
String masStringGamer_I_Word[][];
int masCountGamer_I_Word[];
String masUseWord[];
int countALLWord;
static final int MAX_COUNT_GAMER=10;
int countGamerActiveNow=0;//колво активных игроков
JPanelGamer jPanelGamer_I[];
Integer IDGamer1,IDGamer2,IDGamerCurStep;
boolean boolGameIsStarted, boolConnectWait,boolskipStep;
int phantomClientConn=0;
int ansFromServerOnAddNewWord=0;
public JPanelGameField(MainJPanel mainJPanel) throws InterruptedException, FileNotFoundException{
mainJPanel1 = mainJPanel;
layoutGrid = new GridBagLayout();
setLayout(layoutGrid);
setBorder(BorderFactory.createTitledBorder(BorderFactory.createLoweredBevelBorder(), «», TitledBorder.CENTER, TitledBorder.BOTTOM, new Font(«Arial», Font.BOLD, 12), Color.magenta));
sizeHeightField=5;
sizeWidthField=sizeHeightField;
createGameField();
}
public void createGameField() throws InterruptedException, FileNotFoundException{
gameOver=false;
if (mainJPanel1.jPanelMessage1!=null)
mainJPanel1.jPanelMessage1.jLabelGamer_stat.setText(«Новая игра начата!»);
sizeWidthField=sizeHeightField;
baldaFieldJB = new BaldaJB[sizeHeightField][sizeWidthField];
removeAll();
layoutGrid = new GridBagLayout();
setLayout(layoutGrid);
Integer counter=0;
phantomClientConn=0;
sizeWidthField=sizeHeightField;
for(int i=0;i<sizeHeightField;i++){
for(int j=0;j<sizeWidthField;j++){
baldaFieldJB[i][j] = new BaldaJB(mainJPanel1,this);
baldaFieldJB[i][j].setContentAreaFilled(false);
baldaFieldJB[i][j].iX=j;
baldaFieldJB[i][j].iY=i;
baldaFieldJB[i][j].setName(counter.toString());
baldaFieldJB[i][j].setPreferredSize(new Dimension(20, getFontMetrics(baldaFieldJB[0][0].fontSimpleAlpha).getHeight()+3));
baldaFieldJB[i][j].textJB=»»;
counter++;
//baldaFieldJB[i][j].setBorderPainted(false);
GBC gbc1 = new GBC(j, i).setFill(GBC.BOTH).setWeight(1, 1);
gbc1.setInsets(1,1,1,1);
add(baldaFieldJB[i][j], gbc1);
}
}
validate();
matrHOD=new int[sizeHeightField][sizeWidthField];
matrHOD_0=new int[sizeHeightField][sizeWidthField];
matrHodMain=new int[sizeHeightField][sizeWidthField];
masStringGamer_I_Word = new String[MAX_COUNT_GAMER][sizeHeightField*sizeWidthField];
masCountGamer_I_Word = new int[MAX_COUNT_GAMER];
masUseWord=new String[sizeHeightField*sizeWidthField];
for(int i=0;i<sizeHeightField;i++)
for(int j=0;j<sizeWidthField;j++)
matrHOD_0[i][j]=0;
countALLWord=0;
String DirPath = System.getProperty(«user.dir»);
chooser.setCurrentDirectory(new File(DirPath));
file = new File(DirPath+»\\dict.dat»);
String masAnyMIDWordForCurSizeGame[]=new String[10000];
String tempWord=»»;
int iCountWordForCurSizeGame=0;
if (file!=null){
//try {
Scanner sc = new Scanner(file,»utf8″);
while (sc.hasNextLine()) {
tempWord = sc.nextLine();
if (tempWord.length()==sizeWidthField) {
masAnyMIDWordForCurSizeGame[iCountWordForCurSizeGame]=tempWord;
iCountWordForCurSizeGame++;
}
}
//validate();
sc.close();
int randWord=(int) (Math.random() * (iCountWordForCurSizeGame — 1));
masUseWord[countALLWord]=masAnyMIDWordForCurSizeGame[randWord];
countALLWord++;
System.out.println(iCountWordForCurSizeGame);
System.out.println(sizeWidthField);
System.out.println(DirPath+»\\dict.dat»);
for(int j=0;j<sizeWidthField;j++)
baldaFieldJB[sizeHeightField/2][j].textJB=masUseWord[countALLWord-1].substring(j, j+1);
validate();
//} catch (FileNotFoundException ex) {
// System.out.println(«Ошибка выбора произвольного центрального слова»);
//}
}
if (Main.jFrameNewGame1==null)
mainJPanel1.jPanelMessage1.jLabelGamer_stat.setText(«Welcome!»);
else{
mainJPanel1.jPanelMessage1.jLabelGamer_stat.setText(«Игра началась!»);
boolGameIsStarted=true;
}
if (boolfirstStepPC==false){
boolqAlph=true;
boolqUser=true;
}
else
{
boolqAlph=false;
boolqUser=false;
}
matrAlph = new String[sizeHeightField][sizeWidthField];
if (boolThisAppClient==false){
for(int i=0;i<countGamerActiveNow;i++){
mainJPanel1.remove(jPanelGamer_I[i]);
mainJPanel1.remove(jPanelGamer_I[i].scrollPane);
jPanelGamer_I[i]=null;
}
countGamerActiveNow=0;
jPanelGamer_I=null;
jPanelGamer_I = new JPanelGamer[MAX_COUNT_GAMER];
}
countGamerActiveNow++;
jPanelGamer_I[countGamerActiveNow-1]=new JPanelGamer(mainJPanel1);
jPanelGamer_I[countGamerActiveNow-1].masJButtonWord = new JButtonWord[sizeHeightField*sizeWidthField];
masCurFieldWordALLPC = new String[2000];
if (!boolThisAppClient)
IDGamer1=0;
if (Main.jFrameNewGame1!=null){
if ((boolGamerIsPC==true) && ((boolThisAppServer==true) || (boolThisAppClient==true)))
jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.text=»Компьютер»+IDGamer1.toString();
else
jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.text=Main.jFrameNewGame1.jPanelNewGame1.jTextFieldGamerName.getText();
jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.setPreferredSize(new Dimension(getFontMetrics(jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.fontSimpleAlpha).stringWidth(jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.text), getFontMetrics(jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.fontSimpleAlpha).getHeight()));
jPanelGamer_I[countGamerActiveNow-1].jButtonGamerName.setName(«jButtonGamerName»);
GBC gbc1 = new GBC((countGamerActiveNow%2==0)?(2):0,
(countGamerActiveNow-1)/2 ,1,1).setFill(GBC.BOTH).setWeight(1, 1);
gbc1.setInsets(1,1,1,1);
mainJPanel1.add(jPanelGamer_I[countGamerActiveNow-1].scrollPane,gbc1);
if ((boolThisAppClient) || (boolThisAppServer))
IDGamer2=-1;
if ((boolThisAppClient==false) && (boolThisAppServer==false))
IDGamer1=0;
}