Разработки программы, реализующей игру «Слова»
Принцип игры в том, что компьютер загадывает слово, а пользователь предлагает буквы, которые могут входить в это слово. Если эта буква есть в слове то компьютер ее пишет в соответствующих полях — столько раз, сколько она встречается в слове. Если нету такой буквы то к виселице добавляется круг к петле, изображающий голову. Пользователь продолжает угадывать буквы до тех пор, пока не отгадает все… Читать ещё >
Разработки программы, реализующей игру «Слова» (реферат, курсовая, диплом, контрольная)
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Московский государственный университет технологий и управления имени К. Г. Разумовского Университетский колледж информационных технологий Специальность 230 105 «Программное обеспечение вычислительной техники и автоматизированных систем»
КУРСОВОЙ ПРОЕКТ
по дисциплине «Технология разработки программных продуктов»
на тему Разработки программы, реализующей игру «Слова»
Студент С. Р. Пушица Руководитель проекта И. А. Кумскова МОСКВА 2012
Содержание Введение Постановка задачи. Спецификация на программный продукт
Проектирование
a. Функциональная схема
b. Диаграмма классов
Алгоритмы
Программирование
a. Обоснование выбора среды программирования
b. Оценка стиля программирования
c. Листинг программы
Отладка программы Тестирование
Руководство пользователя
Выводы
Игра в слова (Виселица) как развивающая игра.
Развивающие игры — это игры на развитие внимания, памяти, мышления и т. п. Игры должны быть оригинальными, интересными и нести в себе задачу, вопрос, проблему, которые необходимо решить ребенку, только в этом случае они выполняют свою цель. Одной из разновидностей развивающих игр являются настольные игры, которые в интересной красочной форме учат ребенка самостоятельности, сообразительности, образности мышления.
Например, детское домино с изображением геометрических фигур на фишках, не только научит ребенка взаимодействовать в коллективе, но и запомнить основные фигуры (круг, квадрат, треугольник, прямоугольник). В данном проекте под название «Игра в слова» необходима интуиция, логика. Играя, ребёнок осваивает новые роли, развивает навыки и расширяет жизненный опыт. У взрослых игра не исчезает, а превращается в рекреационную деятельность, имеющую ценность как дополнение к жизни. Теория функционального удовольствия К. Бюлера рассматривает удовольствие, получаемое непосредственно от игрового процесса в качестве главной мотивации. Согласно концепции игры, разработанной Гербертом Спенсером под влиянием идей Ф. Шиллера, игра является средством избавления от нереализованной энергии.
Принцип игры в том, что компьютер загадывает слово, а пользователь предлагает буквы, которые могут входить в это слово. Если эта буква есть в слове то компьютер ее пишет в соответствующих полях — столько раз, сколько она встречается в слове. Если нету такой буквы то к виселице добавляется круг к петле, изображающий голову. Пользователь продолжает угадывать буквы до тех пор, пока не отгадает все слово. За каждый не правильный ответ первый игрок добавляет одну часть туловища к виселице, в данном проекте их 9. Если туловище в виселице нарисовано полностью, то отгадывающий игрок проигрывает, считается повешенным. Если игроку удаётся угадать слово, он выигрывает.
Разработать программу, реализующую задачу «игра в слова «. Смысл игры заключается в том, что на экране есть поля с буквами, которые нужно угадать используя русский алфавит расположенный ниже игрового поля. Программа будет работать как на «быстрых», так и на «медленных» компьютерах одинаково.
Существующие аналоги.
Video Games Hangman — логическая игра, в которой необходимо угадывать названия современных видеоигр. На разгадывание названия отводится определенное количество попыток. Когда название разгадано, вы увидите год выхода игры, а также поддерживаемые платформы.
Hang The Alien - абсолютно аналогичная игра. Единственное отличие то что вместо человека на виселице находится инопланетянин.
KHangMan - пользователь должен отгадать слово буква за буквой. Ему даётся 10 попыток, каждая неудачная попытка пририсовывает деталь изображения виселицы. На момент текущей версии программа доступна на 24 языках.
Постановка задач
Задание: Разработать программу, реализующей функцию игры «Игры в слова».
Спецификация на программный продукт «Игра в слова«.
1.
Введение
.
1.1. Цели Разработка программы, реализующей функцию игры «Игра в слова».
1.2. Соглашения о терминах.
Курсив — выделение терминов.
1.3. Предполагаемая аудитория.
Документ предназначен для участников разработки.
1.4. Границы проекта.
Развивающий продукт. Область применения: домашние ПК.
2. Общее описание.
2.1. Видение продукта.
Совершенно новый продукт. Без возрастных ограничений.
2.2. Функциональность продукта.
Главная функция — развивать наблюдательность, логическое мышление пользователя. На экран выводятся русский алфавит и поле с зашифрованным словом, пользователь угадывает буквы пока не угадает слово полностью.
2.3. Классы и характеристики пользователей.
Все классы пользователей.
2.4. Среда функционирования продукта (операционная среда).
OC Windows.
2.5. Рамки, ограничения, правила и стандарты.
Ограничения накладываются внутренним устройством выбранного ПО.
2.6. Документация для пользователя.
Руководство пользователя.
3. Функции.
3.1. Таблица рекордов.
3.1.1. Сохранение имени пользователя в памяти (Средний приоритет).
3.1.2. Ввод и вывод имени и сохранение в файле.
3.2. Игра.
3.2.1. Основные функции игры (Высокий приоритет).
3.2.2. Выбор буквы.
3.2.3. Особенностей нет.
3.3. Регистрация пользователя.
3.3.1. Сохранение имени пользователя в памяти (Средний приоритет).
3.3.2. Ввод имени и сохранение его в памяти.
3.3.3. Отсутствие имени не позволяет начать игру.
4. Требование к интерфейсу.
4.1. Интерфейсы пользователей (UX).
Стандартный графический интерфейс
4.1.1. 640*480 — 1680*1050.
4.1.2. Мышь.
4.2. Программные интерфейсы.
Стандартные устройства.
4.3. Интерфейсы оборудования.
Стандартные интерфейсы.
4.4. Интерфейсы связи и коммуникации.
Стандартные интерфейсы передачи информации.
5. Другие нефункциональные требования.
5.1. Требования к производительности.
Хорошая производительность даже на очень старых ПК.
5.2. Требования к сохранности (данных).
Безопасная, так как не может повредить файлы ПК.
5.3. Критерии качества программного обеспечения.
Требования отсутствуют.
5.4. Требования к безопасности системы.
Мобильность, надёжность, стабильность.
6. Прочие требования.
Отказоустойчивость
Проектирование
Функциональная схема
Диаграмма классов
Алгоритмы
Игра Регистрация Рекорды
Программирование
Обоснование выбора среды программирования
При решении поставленной задачи оптимально использовать для представления информационных материалов язык Delphi (Object Pascal).
Delphi был очень удобен для создания продукта «Игра в слова» т.к.:
1. Интегрированный отладчик Delphi имеет много полезных свойств.
2. Высокоскоростной компилятор позволяет быстро и без проблем перевести Ваши программы в машинный код. Компилятор, встроенный в Delphi является на данный момент самым быстрым в мире.
3. Визуальное построение приложений позволяет быстро и качественно создать интерфейс Вашей программы.
4. Простые и функциональные способы построения баз данных (БД).
5. Разработчик программ может самостоятельно строить объекты для Delphi. Это очень полезно для составления уникальных приложений.
Оценка стиля программирования
1. Оценка модульности программы — 0.23
2. Оценка структурности кодирования — 50,44
3. Оценка структурированности — 0,342
4. Оценка читабельности — 0,421
Листинг файла Main.pas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class (TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
Button3: TButton;
procedure FormCreate (Sender: TObject);
procedure StringGrid1DrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
procedure StringGrid1SelectCell (Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
procedure Button1Click (Sender: TObject);
procedure Zapolnenie; //Эту процедуру создали мы сами
procedure StringGrid2DrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure StringGrid1KeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure Button3Click (Sender: TObject);
procedure Button2Click (Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
S:TStringList; //Сюда загружаем вопросы из текстового файла
Zagadal, ZagadalTemp: String; //То что загадал компьютер .
{ZadalTemp — Это строка для проверки. Из неё мы удаляем пробелы и сверяем с тем что есть}
implementation
{$R *.dfm}
procedure TForm1. FormCreate (Sender: TObject);
var i, j, k:Integer;
begin
StringGrid2.RowCount:=1;
StringGrid2.Height:=25;
StringGrid2.ScrollBars:=ssnone;
StringGrid2.DefaultColWidth:=25;
StringGrid2.FixedCols:=0;
StringGrid1.RowCount:=4;
StringGrid1.ColCount:=8;
StringGrid1.Width:=StringGrid1.DefaultColWidth*StringGrid1.ColCount;
StringGrid1.ScrollBars:=ssNone;
StringGrid1.FixedCols:=0;
StringGrid1.FixedRows:=0;
StringGrid1.Options:= [];
StringGrid1.Color:=Form1.Color;
Label1.WordWrap:=True;
Label1.AutoSize:=False;
Label1.Left:=10;
Label1.Top:=10;
Label1.Height:=50;
Label1.Width:=StringGrid1.Width;
Label1.Font.Style:=[fsBold];
Label1.Font.Size:=10;
StringGrid1.Left:=10;
StringGrid1.Top:=Label1.Top+Label1.Height+40;
StringGrid2.Top:=StringGrid1.Top+StringGrid1.Height+10;
Button1.Caption:='Начать игру';
Button1.Top:=StringGrid2.Top+StringGrid2.Height+20;
Form1.Height:=Button1.Top+Button1.Height+90;
Form1.Caption:='Игра в слова';
{Все с инспектором объектов типа закончили, дальше нужный код}
Button1.Click; //Имитируем нажатие кнопки
end;
{Обработчик события из вкладки Events. Это мы убираем выделение из StringGrid}
procedure TForm1. StringGrid1DrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Var
StringGrid: TStringGrid;
Can: TCanvas;
begin
StringGrid := Sender as TStringGrid;
Can := StringGrid. Canvas;
Can.Font := StringGrid. Font;
if (ARow >= StringGrid. FixedRows) and (ACol >= StringGrid. FixedCols)
then Can.Brush.Color := StringGrid. Color
else Can.Brush.Color := StringGrid2. Color;
If ActiveControl = Sender then // Эта строка «выключает» выделение
if (gdSelected in State) then
begin
Can.Font.Color := 0;
Can.Brush.Color := StringGrid1. Color;
end;
Can.FillRect (Rect);
Can.TextOut (Rect.Left+2,Rect.Top+2, StringGrid. Cells[ACol, ARow]);
end;
procedure TForm1. FormClose (Sender: TObject; var Action: TCloseAction);
begin
s.Free; //Освобождаем память
end;
{Обработчик события из вкладки Events для StringGrid1}
procedure TForm1. StringGrid1SelectCell (Sender: TObject; ACol,
ARow: Integer; var CanSelect: Boolean);
var s1: char; //Символ, в который ткнули мышью
i, j: integer; //Счетчики циклов
tempS:String; //Временная строка, которая составляется из угаданных символов
begin
{Если мы ткнули не в пустую ячейку, то s1 принимает значение из этой ячейки}
if length (StringGrid1.Cells[ACol, ARow])>0 then s1:= StringGrid1. Cells[ACol, ARow][9];
{Проверяем наличие выбранного символа в ответе}
if pos (s1,Zagadal)>0 then Begin //Если наш символ есть в тексте, то записываем его в StringGrid2
for i:=1 to length (Zagadal) do Begin //Проходим по всей длине загаданного слова
if Zagadal[i]=s1 then Begin //
StringGrid2.Cells[i-1,0]: =s1;//Каждый одинаковый символ записываем в соотв. ему позиции
end; //Т.е. если в слове 3 буквы О, то все 3 и запишутся в StringList2 на их позиции из ответа
end;
end; //Закончили проверку встречи символа
{tempS — это временная строка, которая составляется из символов внутри StringGrid2
Рассматриваем StringGrid2 как строку и заполняем tempS, исходя из наличия в StringGrid2 символов}
for i:=0 to StringGrid2. ColCount do Begin
tempS:=tempS+StringGrid2.Cells[i, 0];
{Очищаем пробелы из TempS}
for j:=length (tempS) downto 1 do Begin
if pos (' ', tempS)>0 then delete (tempS, pos (' ', tempS), 1);
end;
end; //Закончили работу с TempS
{Проверяем соответствие TempS и ZagadalTemp. В обоих строках удалены пробелы и остается проверять только на символы. Если они совпали, значит пользователь угадал слово и выводится сообщение — Ты победил}
if tempS=ZagadalTemp then Begin
ShowMessage ('Победа');
end;
StringGrid1.Cells[ACol, ARow]: =''; //Очищаем нажатую ячейку от Буквы, чтоб не нажимали тысячи раз уже нажатую
end;
procedure TForm1. Button1Click (Sender: TObject);
var i, j: Integer;
MyGrid: TStringGrid;
begin
zapolnenie; //Наша процедура, заполняющая таблицу Буквами
i:=1;
Randomize;
While odd (i) do i:=Random (S.Count-1); //Это строка проверяет i на нечетнссть.
{Так как вопросы нечет — Вопрос, Чет — ответ, логично Выбирать вопросы из нечетной строки, а ответы из четной. Пока i не примет нечетное значение идет выборка i
случайным образом}
Label1.Caption:=S.Strings[i]; //Вопрос выбран, отображаем его в Label1
Zagadal:=(S.Strings[i+1]); //Запоминаем ответ для в вопроса в глобальную переменную
ZagadalTemp:=Zagadal; //Это тот же ответ, только в нем мы исключим пробелы
StringGrid2.ColCount:=length (S.Strings[i+1]); //Отображаем в StringGrid2 столько ячеек сколько символов в ответе
StringGrid2.Width:=length (S.Strings[i+1])*StringGrid2.DefaultColWidth+15; //Меняем ширину в зависимости от длины ответа
for i:=0 to StringGrid2. ColCount do StringGrid2. Cells[i, 0]: =''; //При нажатии на кнопку очищаем StringGrid2 от прошлого ответа
for j:=length (ZagadalTemp) downto 1 do //Удаляем пробелы из ZagadalTemp
if pos (' ', ZagadalTemp)>0 then Delete (ZagadalTemp, pos (' ', ZagadalTemp), 1);
end;
{Созданная нами процедура заполняет StringGrid1, буквами}
procedure TForm1. zapolnenie;
var i, j, k:Integer;
begin
k:=192; // 192 — это Числовой код Буквы А. Заполняем нашу таблицу буквами А. Я
for j:=0 to 3 do Begin //4 строки
for i:=0 to 7 do StringGrid1. Cells[i, j]: =' '+chr (I+k); k:=k+8;i:=i+1; //8 колонок
end;
{===============}
S:=TStringList.Create; //Создаем контейнер для хранения строк
S.LoadFromFile ('HMRusBase.txt'); //Загружаем в него весь текстовый файл
Randomize; //Запускаем генератор случайных значений
end;
{Процедура для StringGrid2 из вкладки Events. Убирает выделение с ячейки}
procedure TForm1. StringGrid2DrawCell (Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
Var
StringGrid: TStringGrid;
Can: TCanvas;
begin
StringGrid := Sender as TStringGrid;
Can := StringGrid. Canvas;
Can.Font := StringGrid. Font;
if (ARow >= StringGrid. FixedRows) and (ACol >= StringGrid. FixedCols)
then Can.Brush.Color := StringGrid. Color
else Can.Brush.Color := StringGrid2. Color;
If ActiveControl = Sender then // Эта строка «выключает» выделение
if (gdSelected in State) then
begin
Can.Font.Color := 0;
Can.Brush.Color := StringGrid1. Color;
end;
Can.FillRect (Rect);
Can.TextOut (Rect.Left+2,Rect.Top+2, StringGrid. Cells[ACol, ARow]);
end;
{Игнорируем нажатие стрелок на клавиатуре, для исключения переходов по таблице через них}
procedure TForm1. StringGrid1KeyDown (Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key=VK_Up) or (Key=VK_Down) or (Key=VK_Left) or (Key=VK_RIGHT) then Key:=VK_Shift;
end;
procedure TForm1. Button3Click (Sender: TObject);
begin
if MessageDlg ('Выходим из программы ?',
mtConfirmation, [mbYes, mbNo], 0) = mrYes
then close;
end;
procedure TForm1. Button2Click (Sender: TObject);
begin
showmessage (`');
end;
end.
Отладка
Отладка программы «Игра в слова»
№ | Тип ошибки | Пример | Решение | |
Логическая ошибка | Не отображается русский алфавит в таблице | Заполняем нашу таблицу буквами А. Я begin k:=192; for j:=0 to 3 do Begin //4 строки for i:=0 to 7 do StringGrid1. Cells[i, j]: =' '+chr (I+k); k:=k+8;i:=i+1; //8 колонок end; | ||
Логическая ошибка | При нажатии на кнопку новая игра не очищались прошлые слова | Были добавлены следующие строки, for i:=0 to StringGrid2. ColCount do StringGrid2. Cells[i, 0]: =''; | ||
Логическая ошибка | При загрузке слов из текстового файла выводилась ошибка | Исправлена ошибка неверного чтения из файла. | ||
Логическая ошибка | Когда пользователь угадал слово программа сравнивала загаданное слово не с тем что выбирал пользователь. | sTemps — переменная хранящая слово угадывающее пользователем for j:=length (tempS) downto 1 do Begin if pos (' ', tempS)>0 then delete (tempS, pos (' ', tempS), 1); end; if tempS=ZagadalTemp then Begin ShowMessage ('Победа'); end; | ||
Логическая ошибка | Когда пользователь выбирал букву она оставалась в таблице | Было добавлено StringGrid1. Cells[ACol, ARow]: =''; | ||
Тестирование
№ | Название теста | Нормальные условия | Критические условия | Экстремальные условия | |
Загрузка слова из файла | Производится загрузка слова из файла и сравнивается с буквами, которые вводит пользователь. | Производится загрузка слова из некорректного файла — Вывод сообщения об ошибке. | Загрузка слова из несуществующего файла — Вывод сообщения об ошибке. | ||
Загрузка подсказки из файла. | Производится загрузка подсказки из файла и сравнивается с буквами, которые вводит пользователь. | Производится загрузка подсказки из некорректного файла — Вывод сообщения об ошибке. | Загрузка подсказки из несуществующего файла — Вывод сообщения об ошибке. | ||
Выбор буквы в таблице | Буква корректно выбирается и пропадает из таблицы. | Выбор уже отсутсвующей буквы не возможен. | Если пользователь выберет неправильную букву, то буква не пропадет | ||
Руководство пользователя
программа развивающая игра слово Запуск программы.
Запускаем файл «igra_v_slova.exe». Вам откроется фоновый режим программы.
После запуска игры откроется следующая форма:
Необходимо нажать на кнопку «Начать игру» для запуска новой игры.
Поле с загаданным словом.
Русский алфавит, из которого Вы будете угадывать загаданное слово
Поле с подсказками:
Для выходы из игры необходимо нажать кнопку «Выход»:
Выводы
В результате выполненных работ был получен программный продукт «Игра в слова» и комплект документации к нему. Программа реализовывалась полностью с соответствием технического задания.
В процессе выполнения работ были закреплены навыки работы в среде Delphi и получен опыт разработки программного продукта и документации к нему.