Логическая игра «Морской бой»

Автор работы: Пользователь скрыл имя, 17 Февраля 2011 в 16:34, курсовая работа

Описание работы

Программный продукт «Логическая игра «Морской бой»», используемый пользователем персонального компьютера.
Разработчиком программы является студент Томского Политехнического Университета группы 8880 специальности «Информационные системы и технологии в бизнесе» Погребной Вадим Юрьевич.
Программный продукт создается на основании выданного задания от преподавателя кафедры АИКС Луневой Е.Е.
Первым этапом разработки программного продукта будет составление функциональной спецификации, в которой будет описана программа с точки зрения пользователя, её основные функции. Вторым этапом будет разработка основных модулей программы и их функциональных возможностей, кодирование программы, отладка и тестирование программы.

Файлы: 1 файл

Пояснительная записка.doc

— 552.50 Кб (Скачать файл)

         А также содержит следующие функции:

  1. Связанные с формой приложения и являющиеся методами компонентов

      void __fastcall ExitClick(TObject *Sender);    

    Выход из приложения.

          void __fastcall GridField1DragOver(TObject *Sender, TObject *Source, int X,

                  int Y, TDragState State, bool &Accept);   

    Перетаскивание объекта над полем.

          void __fastcall ShipsDragOver(TObject *Sender, TObject *Source, int X,

                  int Y, TDragState State, bool &Accept);

    Функция для обеспечения возможности  перетаскивания корабля.

          void __fastcall ShipsMouseDown(TObject *Sender, TMouseButton Button,

                  TShiftState Shift, int X, int Y);

    Необходима  для поворота корабля на 90 градусов.

          void __fastcall AboutClick(TObject *Sender);  

    Вызов окна «о программе».

          void __fastcall CompClick(TObject *Sender);   

    Переход в режим игры с компьютером.

          void __fastcall HumanClick(TObject *Sender);     

    С человеком.

          void __fastcall FightClick(TObject *Sender);        

    Начать бой.

          void __fastcall NewGameClick(TObject *Sender); 

    Новая игра.

          void __fastcall Ready1Click(TObject *Sender);    

    Готовность 1-го игрока.

          void __fastcall Ready2Click(TObject *Sender);    

    Готовность 2-го игрока.

          void __fastcall GridField1MouseDown(TObject *Sender, TMouseButton Button,

                  TShiftState Shift, int X, int Y);          

    Выстрел.

          void __fastcall Timer1Timer(TObject *Sender);    

    Работа таймера 1, необходим для прорисовки линий и стрельбы компьютера.

          void __fastcall Timer2Timer(TObject *Sender);

    Работа таймера 1, необходим для замедления выстрелов компьютера.

          void __fastcall Timer3Timer(TObject *Sender);

    Работа таймера 1, необходим для показа победы игрока.

          void __fastcall FormDestroy(TObject *Sender);    

    При уничтожении формы, очистка памяти.

          void __fastcall FormPaint(TObject *Sender);     

    Прорисовка формы, в случае перекрывания другими окнами.

          void __fastcall ResultsClick(TObject *Sender);   

    Показать результаты.

          void __fastcall FormDragOver(TObject *Sender, TObject *Source, int X, int Y,

                  TDragState State, bool &Accept);

    Для запрета перемещения кораблей вне  поля. 

     
  1. Созданные программистом (все в разделе  private)

      void SaveRes (int);              

    Сохранение  результатов игры в файл, параметр определяет победителя.

      void SaveBM (int);               

    Сохранение  изображения поля, на которое был произведен выстрел. Параметр определяет это поле и соответствующий ему указатель на изображение.

      void DelBM (int);                

    Удаление  изображения, параметр вводится для соответствия указателю на изображение, необходимого для удаления.

      void SetWindow (bool);           

    Установки свойств окна. При ложном значении параметра установить изначальные свойства окна, в обратном случае свойства, предотвращающие перекрывание изображений на форме.

      void SeaDraw (int, int, int, bool);

    Рисование на канве, номер которой указан первым параметром. Ее координаты указываются следующими двумя параметрами типа int, ложное значение последнего параметра указывает на промах игрока, правдивое – на попадание.

      void NullCpu ();      

    Обнуление Cpu.

      void NewShips (int);             

    Создание объектов – кораблей, задание им необходимых свойств. Объекты располагаются на панели под номером, указанным параметром.

      void Newfield (int);             

    Создание динамического массива для поля боя игрока под номером, указанным параметром.

      void DelShips (int);             

    Удаление кораблей на панели под номером параметра типа int.

      void Delfield (int);             

    Удаление  массивов.

      bool CheckShips (int);           

    Проверка  правильной расстановки кораблей, проверяются корабли указанные параметром.

      void CheckDestr ();              

    Проверка  на непригодные клетки для стрельбы, функция предназначена для стрельбы компьютера, она отмечает неподходящие клетки специальной меткой, стрельба по ним производиться не будет.

      void CreateShips ();             

    Случайная расстановка кораблей компьютером.

      void CompShot ();                

    Выстрел компьютера. Выполняется алгоритм случайного выбора клетки на поле, при попадании по кораблю, случайным образом выбирается возможное направление пораженного корабля, стрельба производится до тех пор, пока корабль не будет убит. Запоминание информации о стрельбе производится с помощью переменной Cpu.

      void ChangeCur (char *, int);    

    Смена курсоров производится в соответствии с указанным файлом в первом параметре. Курсор запоминается с помощью константы, имя которой указано во втором параметре.

 

        1. Тестирование  и отладка

         В процессе создания программы возникали  различные проблемы, как со сложностью реализации некоторых участков программы, так и с ошибками в программном  коде.

         Первые  сложности возникли при создании функции автоматического расположения кораблей. Для проверки правильности необходимо было провести большое количество тестов с графическим изображением результатов, для этого стало  необходимым создание временных  переменных. Результаты были не сразу правильными. В начале положение кораблей стало заходить за рамки поля, для устранения проблемы понадобились новые переменные для хранения информации о границах. Затем корабли стали накладываться друг на друга, ошибка была в неправильной работе циклов, для отладки их работы использовалась печать в контрольных точках, слежение за значениями переменных. Дальнейшие тесты были удовлетворительными, по настоящий момент ошибки в этой функции не замечены.

         Также возникла проблема при создании функции отслеживания клеток, в которые уже не нужно производить выстрелы компьютеру. На начальном этапе эта функция была рекурсивной, но многочисленные тесты показали, что компьютер продолжает производить выстрелы в эти клетки, а иногда даже программа зависала в результате зацикливания. В дальнейшем был придуман новый алгоритм, который стал более объемным, но зато он качественно и точно работает, что подтверждают тесты. Он проверяет поля не рекурсивно, а сразу для всех неубитых кораблей. Тестирование проводилось с помощью слежения за значениями переменных и их изменения в ходе работы программы.

         Огромной  проблемой стала отладка точной работы программы и ее интерфейса, так как при вызове одной из функций необходимо активировать и  деактивировать, сделать видимыми и убрать из видимости другие компоненты и функции. Для примера, если во время выполнения выстрела, производилась попытка свернуть приложение или перекрыть его другим окном, то нарушалось изображение на полях боя. Для устранения пришлось изменять свойства окна, была создана специальная функция.

         Для тестирования функций, вызываемых в  концовке боя, использовалось изменение  значений некоторых параметров для  ускорения процесса.

 

        1. Заключение
    1. Достоинства и недостатки программы

         В любом программном продукте есть свои достоинства и недостатки. Рассмотрим достоинства и недостатки «Логической игры «Морской бой»».

         Достоинства:

      • Удобный и простой интерфейс;
      • Возможность соревноваться с предыдущими результатами игр;
      • Минимальная загруженность оперативной памяти;
      • Возможность игры с человеком, что редко встречается в компьютерных реализациях этой игры;
      • Богатое графическое оформление игры.

         Недостатки:

      • Отсутствие справки к программе;
      • Довольно примитивный интеллект компьютера;
      • Отсутствие дополнительных функций игры, увеличивающих интерес к ней;
      • Возможность испортить графику игры перекрыванием другими приложениями или меню Пуск.
    1. Развитие  программы

         Для развития логической игры «Морской бой» необходимо изучить пожелания пользователя данного программного продукта и в связи с этим внести необходимые изменения в данный продукт. На данном этапе необходимо улучшить дизайн, разработать более интересные варианты логики компьютера. Также можно добавить уровни сложности игры, возможность выбора размеров игрового поля и даже игру по сети.

    1. Итоги работы

         Итогами данной работы являются углубление познаний в объектно-ориентированном программировании и проектировании,  изучение работы с графикой, специальными компонентами windows-форм, основами искусственного интеллекта.

 

        1. Список  литературы
  1. Страуструп  Б. «Язык программирования С++.» – М: Бином, 1999. -  990с.
  2. Уолнем К. «Объектно-ориентированное программирование на языке BORLAND C++» - Мн.: ООО «Попурри», 1997. – 640 с.:ил.
  3. «Программирование в C++ Builder 6» [Электронный ресурс], формат pdf, 1150 с.
  4. «Borland С++ Builder. Освой самостоятельно» [Электронный ресурс], формат pdf, 705 с.

 

        1. Приложение

         Текст программы (основные моменты)

 

         ResultsFrm.cpp 

    //Загрузка  результатов

    void TResultsForm::LoadRes ()

    {

    ifstream infile ("SeaButResults.txt");

    if (!infile) return; 

    //Обнуление  всех меток

    Name1->Caption = '\0';

    Name2->Caption = '\0';

    Name3->Caption = '\0';

    Name4->Caption = '\0';

    Name5->Caption = '\0';

    Name6->Caption = '\0';

    Name7->Caption = '\0';

    Name8->Caption = '\0';

    Name9->Caption = '\0';

    Name10->Caption = '\0';

Информация о работе Логическая игра «Морской бой»