Компьютерные игры "Морской бой" и "Автоматический видео-покер"

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 25.07.2012
Размер файла 353,1 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

ВВЕДЕНИЕ

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

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

В нашей курсовой работе представлены игры «Морской бой» и «Автоматический видео-покер». Данные программы предназначены для домашнего использования как время проведения досуга. Программы распространяються по принципу «freeware».

1. ОБЩИЙ РАЗДЕЛ

1.1 Цель разработки

С развитием вычислительной техники и совершенствованием программного обеспечения возникают невиданные ранее возможности для создания совершенно новых типов игр. Но языки программирования позволяют также перенести практически любую настольную игру на ЭВМ. Цель данной работы - создать компьютерный аналог всем известной настольной игры «Морской бой». Но в отличие от оригинальной программы, где обязательно должно быть минимум два участника, наша программа позволяет играть одному пользователю. Это достигается благодаря использованию в программе основных концепций искусственного интеллекта. Это значительно улучшает степень используемости программы и расширяет круг потенциальных пользователей. Целью разработки является программа, которая позволяет играть в морской бой и отличается следующими особенностями:

разработанная система полностью реализует основные возложенные на нее функции;

система оснащена дружеским интерфейсом;

разработанная система является интегрированной;

программа имеет хороший дизайн.

оптимизироваться для использования ее на компьютере со средней производительностью, с помощью разделения программы на отдельные модули;

позволяет пользоваться ею одному игроку за счет присутствия в программе элементов искусственного интеллекта

1.2 Характеристики используемых при работе аппаратно-программных средств

Программа была разработана на персональном компьютере со следующей конфигурацией:

- центральный микропроцессор - Intel Celeron 2400 МГц;

- оперативно запоминающее устройство - 512 Мб;

- накопитель на жестком диске - Seagate Barracuda 80 Гб;

- накопитель на гибком магнитном диске - 3,5'' емкостью 1,44 Мб;

- накопитель CD-RW - Nec CD-RW NR-9400A;

- видеоадаптер - Radeon 9200SE;

- монитор SAMSUNG Sync Master 765MB;

- клавиатура Genius Comfy KB-21e Scroll

- мышь Genius Optical;

- принтер Epson 460 Color;

- операционная система Windows XP.

Минимальные системные требования для работы с электронным учебником «Управление качеством»:

- центральный микропроцессор с тактовой частотой не менее 166 МГц;

- оперативно запоминающее устройство не менее 32 Мб;

- свободное пространство на диске 50 Мб;

- накопитель CD-ROM;

- клавиатура

- мышь;

- принтер;

- операционная система Windows XP

1.3 Обоснование выбора среды программирования

Программное приложение «Морской бой» выполнено в среде объектно-ориентированного программирования Delphi 6.

Delphi - это мощная система визуального объектно-ориентированного программирования, позволяющая решать множество задач, в частности:

создавать законченные приложения для Windows самой различной направленности, от чисто вычислительных и логических, до графических мультимедиа;

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

создавать свои динамически присоединяемые библиотеки (DDL) компонентов, форм, функций, которые затем можно использовать из других языков программирования;

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

формировать и печатать сложные отчеты, включающие таблицы, графики и т.п.;

создавать справочные системы (файлы .hlp), как для своих приложений , так и для любых других, с которыми можно работать не только из приложения но и просто через Windows;

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

Среда программирования Delphi 6 дает возможность скомпилировать готовый загрузочный exe файл, что дает возможность работы программы при отсутствии на компьютере Delphi.

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

2. СПЕЦИАЛЬНЫЙ РАЗДЕЛ

2.1 Постановка задачи

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

Программа должна предусмотреть:

разработанная система должна полностью реализовать основные возложенные на нее функции;

система должна быть оснащена дружеским интерфейсом;

разработанная система должна являться интегрированной;

программа должна иметь имеет хороший дизайн.

должна быть оптимизирована для использования ее на компьютере со средней производительностью, с помощью разделения программы на отдельные модули;

должна позволять пользоваться ею одному игроку за счет присутствия в программе элементов искусственного интеллекта

2.2 Анализ входной и выходной информации

В данной программе входной информацией будет являться:

- информация о расстановке кораблей на игровом поле игрока и его компьютерного соперника

- выбранная сложность противника

- настройки для программы, хранящиеся в файле conf.ini

- действия пользователя, т.е. содержание хода игрока, а также действия его компьютерного соперника

Выходные данные:

- результат игры (проиграл или выиграл игрок)

- список всех ходов игры, выводящийся в мемо-поле;

- информация о результате текущего хода - задет корабль, потоплен он или промах.

- количество подбитых кораблей у обоих сторон

- в конце игры, в случае поражения игрока, выводится информация о расстановке кораблей противника.

- предусмотрена возможность полного сохранения результатов игры в HTML-формате.

3. ТЕХНОЛОГИЧЕСКИЙ РАЗДЕЛ

3.1 Описание алгоритма

3.1.1 Описание схемы алгоритма программы

- открытие главного окна программы;

- настройка установок программы;

- установка сложности компьютерного соперника (слабый, средний, сильный);

- расстановка кораблей на игровом поле или загрузка схемы из файла;

- первый ход;

- процесс игры;

- сохранение результата в HTML;

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

игра программирование информация

3.1.2 Описание схемы данных

Данные, которые использовались для создания дипломного проекта: журналы, каталоги, internet. Данные, используемые программой хранятся в отдельных файлах:

- папка Shemes - хранит файлы схем игры

- папка Sounds - в ней хранятся звуки, которые программа использует во время своей работы

- файл config.ini - в нем содержатся основные установки, используемые программой

- файл fonts.txt - содержит шрифты программы

файл lt.ini - содержит координаты главного окна программы

3.1.3 Описание схемы взаимодействия программы

При запуске программы появляется главная форма с расположенными на ней графическими элементами управления. Это:

- два игровых поля для расположения на них кораблей

- поле, в котором отражается статистика игры

- мемо-поле, в котором отражается все ходы, сделанные в игре

- главное меню программы

- список для выбора сложности бота

- управляющие кнопки

На главной форме пользователь может играть.

На форме «Сохранение схемы» пользователь может сохранить схему расстановки кораблей.

На форме «Загрузка/Удаление схемы» пользователь может загрузить или удалить схему.

На форме «Настройки» пользователь может задать все необходимые настройки для игры.

На форме «О программе» можно узнать о разработчике программы.

3.2.Описание программы

Программный продукт Магазин «Морской бой» написан в среде визуального объектно-ориентированного программирования Delphi 6.

Данная программа состоит из:

ь MainUnit - главный модуль программы, отвечает за процесс игры;

ь ConfUnit - модуль, отвечающий за установку и сохранение настроек, заданных пользователем;

ь LoadDelShemeUnit - модуль, отвечающий за загрузку и удаление схем игры;

ь SaveShemeUnit - модуль, который отвечает за сохранение схемы игры;

ь HTMLUnit - модуль, который за сохранение результатов игры в формате HTML;

ь CleanerUnit - модуль, отвечающий за очистку ненужных данных в файлах схем;

ь AboutUnit - модуль окна «О программе»

Головная программа начинается с ключевого слова Program, после которого пишется имя программы. Оно совпадает с именем файла, в котором сохраняется проект. Это же имя присваивается исполняемому файлу приложения. По умолчанию это имя Project1. После заголовка в тексте программы располагается оператор uses. Этим оператором перечисляются модули, загружаемые программой. Первый модуль Forms - системный, а следующие - модули разработанных программ. Следующая строка текста - {$R *.RES} представляет собой директиву компилятора. Затем, после ключевого слова begin и до последнего завершающего программу end с точкой (end.), записано тело программы.

Рассмотрим теперь, как выглядят тексты модулей.

Модуль начинается с ключевого слова Unit, после которого пишется имя модуля. Оно совпадает с имеем файла, в котором сохраняется модуль. По умолчанию для первого модуля имя равно Unit1, для второго Unit2 и т.д.

Текст модуля состоит из двух основных разделов: interface - открытый интерфейс модуля и implementation - реализация модуля. Все, что помещается непосредственно в раздел interface (типы, переменные, константы, функции, процедуры), может быть использовано другими модулями программы. Все, что помещается в раздел implementation - внутреннее тело модуля. Внешние модули не могут видеть типы, переменные, константы, функции и процедуры, размещенные в разделе реализации.

В разделе interface после оператора uses, содержащего список подключаемых элементов, можно видеть заготовку объявления класса вашей формы, подготовленную в Delphi. Имя класса формы - TForm1. Класс содержит два раздела: private - закрытый раздел класса, и public - открытый раздел класса. То, что объявлено в разделе public, будет доступно для других классов и модулей. То, что объявлено в разделе private, доступно только в пределах данного модуля.

В таблице, расположенной ниже описаны те компоненты, которые использовались при создании программы.

Таблица 1

1

2

3

Shape

(фигура)

Размещает на форме объект, представляющий собой правильную геометрическую программу

Label

(метка)

Размещает в форме объекты, предназначенные для создания текстовой информации, надписей и примечаний.

Edit

(текстовое поле)

Размещает в форме текстовое поле, предназначенное для ввода текстовой информации, чисел и дат.

Button

(кнопка управления)

Размещает в форме кнопки управления для инициации действий, выполнения команд, запуска программ.

MainMenu

(главное меню)

Размещает на форме главное меню.

ComboBox

(поле со списком)

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

3.3 Процесс отладки программы

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

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

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

При входе в программу можно увидеть главную форму (см. рисунок 1)

Рис. 1

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

3.4 Анализ результатов решения задачи

Результатом разработки, проведенной в данном курсовом проекте, стала система, удовлетворяющая следующим требованиям:

разработанная система полностью реализует основные возложенные на нее функции;

система оснащена дружеским интерфейсом;

разработанная система является интегрированной;

программа имеет хороший дизайн.

оптимизироваться для использования ее на компьютере со средней производительностью, с помощью разделения программы на отдельные модули;

позволяет пользоваться ею одному игроку за счет присутствия в программе элементов искусственного интеллекта

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

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

3.5 Инструкция пользователя

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

Пункт меню Файл - Настройки отвечает за установление настроек программы.

Затем при помощи размещаются корабли на правом игровом поле.

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

После завершения игры её можно сохранить в формате HTML, выполнив пункт меню Файл - Сохранить в HTML.

Заключение

Результатом разработки, проведенной в данном курсовом проекте, стала система, удовлетворяющая следующим требованиям:

разработанная система полностью реализует основные возложенные на нее функции;

система оснащена дружеским интерфейсом;

разработанная система является интегрированной;

программа имеет хороший дизайн.

оптимизироваться для использования ее на компьютере со средней производительностью, с помощью разделения программы на отдельные модули;

позволяет пользоваться ею одному игроку за счет присутствия в программе элементов искусственного интеллекта

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

ПРИЛОЖЕНИЕ 1

Исходный код программы

unit MainUnit;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Buttons, Menus, Gauges, ComCtrls, XPMan,

MMSystem, Registry;

type

TFormMain = class(TForm)

StatusGroupBox: TGroupBox;

StatusLabel: TLabel;

MissShape: TShape;

TargetShape: TShape;

MissLabel: TLabel;

TargetLabel: TLabel;

RotateButton: TSpeedButton;

DelButton: TSpeedButton;

DeleteShipPopupMenu: TPopupMenu;

N1: TMenuItem;

N2: TMenuItem;

PlayButton: TSpeedButton;

KillShape: TShape;

KillLabel: TLabel;

Bevel1: TBevel;

N11: TMenuItem;

N21: TMenuItem;

N31: TMenuItem;

N41: TMenuItem;

MainMenu1: TMainMenu;

N3: TMenuItem;

N4: TMenuItem;

N5: TMenuItem;

N8: TMenuItem;

N9: TMenuItem;

N6: TMenuItem;

N7: TMenuItem;

N10: TMenuItem;

N12: TMenuItem;

N13: TMenuItem;

N14: TMenuItem;

procedure FormShow(Sender: TObject);

procedure Shape1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure FormCreate(Sender: TObject);

procedure Shape65MouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure Shape65MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure N2Click(Sender: TObject);

procedure PlayButtonClick(Sender: TObject);

procedure N9Click(Sender: TObject);

procedure ReDrawAll;

procedure SetShip( StartTag:integer; FinishTag:integer; BoP:char );

procedure ReDraw( BoP:char );

procedure NewGame;

procedure Play;

function WriteCount:string;

procedure Zero( BoP:char );

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure KillShapeMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

private

public

path:string;

{ чтоб схемы сохранять можно было }

e_s, m_s:array[1..4, 1..4] of integer; //матрицы с координ. каждого корабля

{ для html }

e_sh, m_sh:array[1..8, 1..8] of integer; //матриксы с инфой об игровом поле

alph:string[8]; // -= смерть от напалма =-

{ для конфа }

game:integer; //0-не играемся, 1-играемся, 2-наигралися

end;

var

FormMain: TFormMain;

set_ships:array[1..4] of bool; //трю - кор. стоит

cnt:array[0..1] of integer; //запись счета

paluba:integer; //сколькипалубный кор. ставим сейчас

e_k_ships, m_k_ships:integer; //кол-во убитых кораблей

rotate, zalez:bool;

implementation

uses FunctionsUnit, ConfUnit, MBoxUnit, HistoryUnit, SaveShemeUnit,

LoadDelShemeUnit, HTMLUnit, NapalmUnit, CleanerUnit;

{$R *.dfm}

{ все что на форме помечено "+++" - пишется программно }

//дает заключительный таг корабля

function GetFinishTag( StartTag:integer; PalubaCount:integer;

Rot:bool ):integer;

var temp, tag_f:integer; str:string[2]; a,b :char;

begin

if Rot then

begin

a := 'c';

b := 'r';

end else

begin

a := 'r';

b := 'c';

end;

temp := GetNum( StartTag, a );

tag_f := GetNum( StartTag, b ) + ( PalubaCount - 1 );

//если за край залез кораблиг

if tag_f > 8 then begin

tag_f := 8;

zalez := true;

end;

if Rot then str := IntToStr( tag_f ) + IntToStr( temp )

else str := IntToStr( temp ) + IntToStr( tag_f );

GetFinishTag := StrToInt( str );

end;

//свой месадж бокс написал :(

function MesBox( Text:string; Caption:string ):bool;

begin

FormMBox.Label1.Caption := Text;

FormMBox.Caption := Caption;

FormMBox.ShowModal;

MesBox := FormMBox.a;

end;

//трю - если есть соседи около корабля

function CheckNeig( StartTag:integer; FinishTag:integer; BoP:char ):boolean;

var str:string; i, m:integer;

begin

CheckNeig := false; //чтоб не клюкавила

//берем соседей

str := GetNeigNums( StartTag, FinishTag );

m := Length( str ) div 2;

if BoP = 'b' then

for i := 1 to m do

if FormMain.e_sh[GetNum( GetTagFromStr( str, i ), 'r' ),

GetNum( GetTagFromStr( str, i ), 'c' )] = 1 then

begin

CheckNeig := true;

Exit;

end;

if BoP = 'p' then

for i := 1 to m do

if FormMain.m_sh[GetNum( GetTagFromStr( str, i ), 'r' ),

GetNum( GetTagFromStr( str, i ), 'c' )] = 1 then

begin

CheckNeig := true;

Exit;

end;

end;

//проверяет, убит кор. или нет

function CheckKillShip( PalubaCount:integer; BoP:char ):boolean;

var i, r, c, tmp:integer;

begin

for i := 1 to PalubaCount do begin

if BoP = 'b' then begin //координаты берем

r := GetNum( FormMain.e_s[PalubaCount, i], 'r' );

c := GetNum( FormMain.e_s[PalubaCount, i], 'c' );

end

else begin

r := GetNum( FormMain.m_s[PalubaCount, i], 'r' );

c := GetNum( FormMain.m_s[PalubaCount, i], 'c' );

end;

//валим в темп значение по этому адресу

if BoP = 'b' then tmp := FormMain.e_sh[r,c] else tmp := FormMain.m_sh[r,c];

//если туда не попали - выходим

if ( tmp <> 3 ) then begin

Result := false;

Exit;

end;

end;

//инкриментим кол-во убитых кораблей

if BoP = 'b' then inc( e_k_ships ) else inc( m_k_ships );

Result := true;

end;

//сканит set_ships и говорит, какой кораблик еще не установлен

function GetPaluba:integer;

var i:integer;

begin

for i := 1 to 4 do

if set_ships[i] = false then begin

GetPaluba := i; //берем n-палубный не установ. корабль

FormMain.StatusLabel.Caption := 'Сейчас ставим:';

FormMain.ManKillLabel.Caption := IntToStr( i ) + ' - палубный';

Exit;

end;

GetPaluba := 0; //значит все на месте

end;

//пишет на форме лабелы с инфой об игре ( тока для мена )

procedure WriteInfo( Kill, Lost:integer );

begin

with FormMain do begin

if Kill <> -1 then

ManKillLabel.Caption := ManKillLabel.Caption + ' ' + IntToStr( Kill );

if Lost <> -1 then

ManLostLabel.Caption := ManLostLabel.Caption + ' ' + IntToStr( Lost );

end;

end;

//ищит подбитые таги с стренге

function GetRedTag( StrWithTags:string ):integer;

var i, l, r, c, tg:integer;

begin

l := Length( StrWithTags ) div 2;

for i := 1 to l do begin

tg := GetTagFromStr( StrWithTags, i ); //берем i-ый таг

r := GetNum( tg, 'r' );

c := GetNum( tg, 'c' );

if FormMain.m_sh[r,c] = 3 then begin //если попадание

Result := tg; //отдаем его

Exit; //и уходим ( больше одного не нужно, потому что )

end;

end;

Result := -1; //ни че не нашли

end;

//убирает таги, в которые уже стреляли

function FilterTargetTags( Str:string ):string;

var i, r, c, l:integer; res, tmp:string[8];

begin

res := '';

l := Length( Str ) div 2;

for i := 1 to l do begin

tmp := IntToStr( GetTagFromStr( Str, i ) );

r := StrToInt( tmp[1] );

c := StrToInt( tmp[2] );

if ( FormMain.m_sh[r,c] = 0 ) or ( FormMain.m_sh[r,c] = 1 ) then

res := res + tmp;

end;

Result := res;

end;

//бот выбирает таг корабля

function BotFireTag:integer;

var cross, tg:string[8]; i, j, k, r:integer; ran:boolean; stat:char;

begin

{ ламер - мочит на шару

перец - не учитывает положение подбитых кораблей

матер - boom bye yeah !!! }

Result := -1; //чтоб компилятер не ругался

ran := false; //пока ранений нету

r := -1;

//сложность

if FormMain.DiffComboBox.ItemIndex = 0 then i := 9

else i := 1;

//ищим попадание

while ( i <= 8 ) do begin

for j := 1 to 8 do

if FormMain.m_sh[i,j] = 3 then begin //нашел подбитый кораблик

ran := true; //а вот и ранение

cross := GetCoDTags( i, j, true );

if FormMain.DiffComboBox.ItemIndex = 2 then

r := GetRedTag( cross ); //смотрим на ранения

if r <> -1 then begin

tg := IntToStr( i ) + IntToStr( j ); //берем текущий таг

//определяем положение корабля

if GetNum( StrToInt( tg ), 'r' ) = GetNum( r, 'r' ) then stat := 'r'

else stat := 'c';

cross := FilterRedLineTags( cross, GetNum( r, stat ), stat );

end;

//выкидываем подбитые таги

cross := FilterTargetTags( cross );

//если есть хоть один таг, то палим

if cross <> '' then begin

Randomize; //ни хера не помогает :)

k := Random( Length( cross ) div 2 );

inc( k );

//результат - таг для функции Fire

Result := GetTagFromStr( cross, k );

Exit;

end;

end;

inc( i );

end;

//не нашел ни одного раненого бойца и палит на шару

if ran = false then Result := GetRandomTag;

end;

//пишет мему с ходами

procedure WriteStepsMemo( Row, Col, Kill:integer; BoP:char );

var n, w, r, s:string; t:integer;

begin

if BoP = 'b' then w := 'Бот: ' else w := 'Игрок: ';

case Kill of

-1: r := 'промазал';

0: r := 'подбил';

else begin

r := 'убил';

s := ' (' + IntToStr( Kill ) + ')';

end

end;

with FormMain.StepsMemo.Lines do begin

t := Count + 1;

if t < 10 then

n := '00' + IntToStr ( t ) + ') '

else

n := '0' + IntToStr ( t ) + ') ';

Add( n + w + FormMain.alph[Row] + IntToStr( Col ) + ' - ' + r + s );

end;

end;

//пишет одно заданное число во все заданные элементы матрицы

procedure WriteNumsInBigMatrix( StrWithTags:string; Number:integer;

BoP:char );

var i, l, r, c:integer;

begin

l := Length( StrWithTags ) div 2;

for i := 1 to l do begin

r := GetNum( GetTagFromStr( StrWithTags, i ), 'r' );

c := GetNum( GetTagFromStr( StrWithTags, i ), 'c' );

if BoP = 'b' then FormMain.e_sh[r,c] := Number

else FormMain.m_sh[r,c] := Number;

end;

end;

//помечает в матрице убитый корабль ( результ - кол-во палуб убитого корабля )

function MarkKillShip( BoP:char ):integer;

var i, s, f:integer;

begin

Result := 0;

for i := 1 to 4 do begin

if CheckKillShip( i, BoP ) = true then begin

if BoP = 'b' then begin

s := FormMain.e_s[i, 1];

f := FormMain.e_s[i, i];

end

else begin

s := FormMain.m_s[i, 1];

f := FormMain.m_s[i, i];

end;

if BoP = 'b' then WriteInfo( i, -1 )

else WriteInfo( -1, i );

//чтоб избежать кривого отображения, сначала помечаем его соседей

WriteNumsInBigMatrix( GetNeigNums( s, f ), 2, BoP );

//помечаем в матрице грохнутые корабли

WriteNumsInBigMatrix( GetShipTags( s, f ), 4, BoP );

Randomize;

if ( BoP = 'b' ) and ( FormConf.KillCheckBox.Checked ) then

case Random(5) of

0: sndPlaySound( 'sounds\KillShip1.wav', SND_ASYNC );

1: sndPlaySound( 'sounds\KillShip2.wav', SND_ASYNC );

2: sndPlaySound( 'sounds\KillShip3.wav', SND_ASYNC );

3: sndPlaySound( 'sounds\KillShip4.wav', SND_ASYNC );

4: sndPlaySound( 'sounds\KillShip5.wav', SND_ASYNC );

end;

Result := i;

end;

end;

end;

//3абивает матрицу данными - попал / промазал

//1 - палить дальше низя ( промах, карочи )

function Fire( ShapeTag:integer; BoP:char ):integer;

var r, c, temp:integer; //BoP - кто стреляет

begin

Result := 0;

r := GetNum( ShapeTag, 'r' );

c := GetNum( ShapeTag, 'c' );

if BoP = 'b' then temp := FormMain.m_sh[r,c]

else temp := FormMain.e_sh[r,c];

//уже стрелял туда

if ( temp = 2 ) or ( temp = 3 ) or ( temp = 4 ) then Exit;

{ -- принцип записи ходов --

если промах - пишем в мему промах,

если попал - определяем убитый корабль (если есть), то пишем его,

если нет убитого - пишем просто попадание }

if temp = 0 then WriteStepsMemo( r, c, -1, BoP );

case temp of

0: begin

temp := 2; //не попал

if ( BoP = 'p' ) and ( FormConf.MissCheckBox.Checked ) then

sndPlaySound( 'sounds\Miss.wav', SND_ASYNC );

Result := 1;

end;

1: begin

temp := 3; //попал

if ( BoP = 'p' ) and ( FormConf.TargetCheckBox.Checked ) then

sndPlaySound( 'sounds\Target.wav', SND_ASYNC );

end;

end;

if BoP = 'b' then begin

FormMain.m_sh[r,c] := temp;

if temp = 3 then WriteStepsMemo( r, c, MarkKillShip( 'p' ), BoP );

FormMain.ReDraw( 'p' );

end

else begin

FormMain.e_sh[r,c] := temp;

if temp = 3 then WriteStepsMemo( r, c, MarkKillShip( 'b' ), BoP );

FormMain.ReDraw( 'b' );

end;

if temp = 2 then Exit;

// --- ниже код не прет, если промах ---

if m_k_ships = 4 then begin

if FormConf.EndGameCheckBox.Checked then

sndPlaySound( 'sounds\Looser.wav', SND_ASYNC );

inc( cnt[0] );

ShowMessage( 'Учись играть !' );

end

else

if e_k_ships = 4 then begin

if FormConf.EndGameCheckBox.Checked then

sndPlaySound( 'sounds\Winner.wav', SND_ASYNC );

inc( cnt[1] );

ShowMessage( 'Ты надрал бота !' );

end;

//если уже есть лузер, то ни че не делаем

if ( m_k_ships = 4 ) or ( e_k_ships = 4 ) then begin

FormMain.game := 2; //закончили играть

FormMain.ReDraw( 'b' ); //покажем проигравшему игроку кораблики бота

//пишем счет

FormMain.CountLabel.Caption := FormMain.WriteCount;

Exit;

end;

end;

//изменяет содержимое попы

procedure ChangePopUpMenu;

var i:integer;

begin

//элем. попы присваиваем значение элем. сет_шыпа

for i := 1 to 4 do

FormMain.DeleteShipPopupMenu.Items[i+1].Enabled := set_ships[i];

end;

//раздаем таги всем всем всем шейпам ( как-то по-пи@ерски 3вучит )

procedure SetTags;

var i, t, j, p:integer; temp:string[2];

begin

for p := 0 to 1 do begin

t := 1; j := 1;

for i := 0 to 127 do

if Application.MainForm.Components[i] is TShape then

with Application.MainForm.Components[i] as TShape do

if Tag = t then

begin

temp := IntToStr( t ) + IntToStr( j );

Tag := StrToInt( temp );

inc( j );

if j = 9 then

begin

inc( t );

j := 1;

end;

end;

end;

end;

//пишет маленькую матрицу

procedure WriteSmallMatrix( StartTag:integer; FinishTag:integer;

PalubaCount:integer; BoP:char );

var str:string[8]; i:integer;

begin

str := GetShipTags( StartTag, FinishTag ); //берем все таги корабля

//пишем таги в маленькую матрицу

for i := 1 to PalubaCount do

if BoP = 'b' then

FormMain.e_s[PalubaCount, i] := GetTagFromStr( str, i )

else FormMain.m_s[PalubaCount, i] := GetTagFromStr( str, i );

//перепис. данные в большую

WriteNumsInBigMatrix( str, 1, BoP );

end;

//из матрицы перерисовывает кораблики на поле

procedure TFormMain.ReDraw( BoP:char );

var i, start, finish, temp:integer;

begin

if BoP = 'b' then

begin

start := 0; finish := 63;

end

else begin

start := 64; finish := 127;

end;

//нашел кораболь - не рабей

//перерисуй его скорей !

for i := start to finish do

if Application.MainForm.Components[i] is TShape then

with Application.MainForm.Components[i] as TShape do begin

if BoP = 'b' then temp := e_sh[GetNum( Tag, 'r' ), GetNum( Tag, 'c' )]

else temp := m_sh[GetNum( Tag, 'r' ), GetNum( Tag, 'c' )];

//цвета посмотрим

case temp of

//пусто

0: Brush.Color := FormConf.GetColor( FormConf.GridComboBox.Text );

//есть кораблик ( не рысуется для бота в процессе игры )

1: if BoP = 'p' then

Brush.Color := FormConf.GetColor( FormConf.ShipComboBox.Text )

else if ( game = 2 ) or ( FormNapalm.cht ) then

Brush.Color := FormConf.GetColor( FormConf.ShipComboBox.Text );

//промах

2: Brush.Color := FormConf.GetColor( FormConf.MissComboBox.Text );

//подбил !

3: Brush.Color := FormConf.GetColor( FormConf.TargetComboBox.Text );

//total destroy

4: Brush.Color := FormConf.GetColor( FormConf.KillComboBox.Text );

end;

end;

end;

procedure TFormMain.ReDrawAll;

begin

ReDraw( 'b' );

ReDraw( 'p' );

//меняем "хелп" на форме

with FormMain do begin

MissShape.Brush.Color := FormConf.GetColor( FormConf.MissComboBox.Text );

TargetShape.Brush.Color := FormConf.GetColor( FormConf.TargetComboBox.Text );

KillShape.Brush.Color := FormConf.GetColor( FormConf.KillComboBox.Text );

end;

end;

//рисуем n-палубный корабль

procedure DrawShip( StartTag:integer; FinishTag:integer; Rot:bool );

var i:integer; din, stat:char; color:TColor;

begin

if paluba = 0 then exit; //если без этого - глюки будуть !

//rc - row или col который мы не изменяем

if Rot = false then

begin

stat := 'r';

din := 'c';

end else

begin

stat := 'c';

din := 'r';

end;

color := FormConf.GetColor( FormConf.ShipComboBox.Text );

//чекаем соседок и "залезность"

if CheckNeig( StartTag, FinishTag, 'p' ) or zalez

then color := clRed;

//красим этот диапазон

for i := 64 to 127 do

if Application.MainForm.Components[i] is TShape then

with Application.MainForm.Components[i] as TShape do

//если координата влезает в диапазон ... хорошо значит

if GetNum( Tag, stat ) = GetNum( StartTag, stat ) then

if ( GetNum( Tag, din ) >= GetNum( StartTag, din ) ) and

( GetNum( Tag, din ) <= GetNum( FinishTag, din ) )

then Brush.Color := color;

zalez := false;

end;

//удаляет корабель

procedure DelShip( PalubaCount:integer );

var str:string[8]; i:integer;

begin

FormMain.PlayButton.Enabled := false; //хоть один кор. удалил - не играемся

//берем все таги этого корабля

str := '';

for i := 1 to PalubaCount do

str := str + IntToStr( FormMain.m_s[PalubaCount, i] );

//пишем в эти адреса нули

WriteNumsInBigMatrix( str, 0, 'p' );

//"убираем" этот корабль

set_ships[PalubaCount] := false;

paluba := GetPaluba;

ChangePopUpMenu;

FormMain.ReDraw( 'p' );

end;

//пишет нули во все элементы большой матрицы

procedure TFormMain.Zero( BoP:char );

var i, j:integer;

begin

for i := 1 to 8 do

for j := 1 to 8 do

if BoP = 'b' then FormMain.e_sh[i,j] := 0

else FormMain.m_sh[i,j] := 0;

end;

//чистим конкретное игровое поле

procedure Clear( BoP:char );

begin

FormMain.Zero( BoP );

FormMain.ReDraw( BoP );

end;

//чистим игровые поля

procedure ClearAll;

begin

Clear( 'b' );

Clear( 'p' );

FormMain.ReDrawAll;

end;

function TFormMain.WriteCount:string;

var temp:integer;

begin

temp := cnt[0] + cnt[1];

Result := 'Счет: ' + IntToStr( cnt[0] ) + ' - ' + IntToStr( cnt[1] ) +

' ( ' + IntToStr( temp ) + ' )';

end;

//ставит корабли рандомом

procedure RandomSetShips( BoP:char );

var r, c, i, j, k, t_s, t_f:integer; str_tmp:string[2]; n, rot:bool;

begin

j := 0;

Clear( BoP );

for i := 1 to 4 do begin

while ( j < 1 ) do begin

Randomize;

zalez := false;

r := Random( 8 );

c := Random( 8 );

inc( r ); inc( c );

//опред. направление

k := Random( 2 );

if k = 0 then rot := false else rot := true;

str_tmp := IntToStr( r ) + IntToStr( c ); //первый таг

t_s := StrToInt( str_tmp );

t_f := GetFinishTag( t_s, i, rot ); //послед. таг

n := CheckNeig( t_s, t_f, BoP ); //соседи

//если соседей нету и кораблик не залез за поле

if ( n = false ) and ( zalez = false ) then begin

WriteSmallMatrix( t_s, t_f, i, BoP );

j := 2;

end;

end;

j := 0;

end;

//легче так сделать, чтоб не исп. ПАЛУБУ

if BoP = 'p' then begin

for i := 1 to 4 do set_ships[i] := true; //все стоить

paluba := 0;

ChangePopUpMenu;

FormMain.PlayButton.Enabled := true; //можно играть

if FormConf.PlayCheckBox.Checked then FormMain.Play;

end;

end;

//дождались ...

procedure TFormMain.Play;

begin

game := 1;

with FormMain do begin

StatusGroupBox.Caption := ' Статус: игра ';

StatusLabel.Caption := 'Игрок';

ManKillLabel.Caption := 'Убил:';

ManLostLabel.Caption := 'Потерял:';

//нажать уже низя

RanSetShipsButton.Enabled := false;

RotateButton.Enabled := false;

DelButton.Enabled := false;

PlayButton.Enabled := false;

DiffComboBox.Enabled := false;

end;

RandomSetShips( 'b' ); //теперь бот корабли ставит

if ( FormNapalm.cht ) then FormMain.ReDraw( 'b' );

end;

procedure TFormMain.SetShip( StartTag:integer; FinishTag:integer; BoP:char );

begin

if FormConf.SetCheckBox.Checked then

sndPlaySound( 'sounds\SetShip.wav', SND_ASYNC );

WriteSmallMatrix( StartTag, FinishTag, paluba, BoP );

set_ships[paluba] := true;

paluba := GetPaluba;

ChangePopUpMenu;

if ( FormConf.PlayCheckBox.Checked ) and ( paluba = 0 ) then Play

else

if paluba = 0 then FormMain.PlayButton.Enabled := true; //можно играть

end;

procedure TFormMain.NewGame;

var i:integer;

begin

ClearAll;

with FormMain do begin

StatusGroupBox.Caption := ' Статус: расстановка ';

StatusLabel.Caption := 'Сейчас ставим:';

ManKillLabel.Caption := '1 - палубный';

ManLostLabel.Caption := '';

PlayButton.Enabled := false;

RotateButton.Enabled := true;

DelButton.Enabled := true;

RanSetShipsButton.Enabled := true;

DiffComboBox.Enabled := true;

FormNapalm.cht := false; //чит

StepsMemo.Clear;

end;

game := 0; //ставим корабли (играть низя)

paluba := 1;

zalez := false;

e_k_ships := 0;

m_k_ships := 0;

for i := 1 to 4 do set_ships[i] := false;

ChangePopUpMenu;

end;

procedure ClearCount;

begin

cnt[0] := 0; cnt[1] := 0; //счет 0-0

FormMain.CountLabel.Caption := 'Счет: 0 - 0 ( 0 )';

end;

procedure TFormMain.FormShow(Sender: TObject);

begin

SetTags; //раздаем таги всем шейпам

NewGame; //дефултовые параметры

end;

procedure TFormMain.FormCreate(Sender: TObject);

var Reg:TRegistry;

begin

path := ExtractFilePath( Application.ExeName );

Caption := Application.Title;

Reg := TRegistry.Create;

Reg.RootKey := HKEY_CURRENT_USER;

if Reg.KeyExists( 'sf' ) = false then begin

Reg.OpenKey( 'sf', true );

Reg.WriteInteger( '_left', Left );

Reg.WriteInteger( '_top', Top );

end

else Reg.OpenKeyReadOnly( 'sf' );

Left := Reg.ReadInteger( '_left' );

Top := Reg.ReadInteger( '_top' );

Reg.Free;

RanSetShipsButton.Caption := 'В случайном'#13'порядке';

alph := 'абвгдежз'; //для записи ходов

ClearCount;

end;

procedure TFormMain.Shape1MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var j:integer;

begin

if ( game = 0 ) or ( game = 2 ) then Exit;

j := 0;

if Fire( (Sender as TShape).Tag, 'p' ) = 1 then

while ( j < 1 ) do

if Fire( BotFireTag, 'b' ) = 1 then j := 2;

end;

procedure TFormMain.Shape65MouseMove(Sender: TObject; Shift: TShiftState;

X, Y: Integer);

var tag_s, tag_f:integer;

begin

if game <> 0 then exit;

ReDraw( 'p' );

tag_s := (Sender as TShape).Tag;

tag_f := GetFinishTag( tag_s, paluba, rotate );

DrawShip( tag_s, tag_f, rotate );

end;

procedure TFormMain.Shape65MouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var s, f:integer;

begin

if paluba = 0 then Exit;

s := (Sender as TShape).Tag;

f := GetFinishTag( s, paluba, rotate );

if (Sender as TShape).Brush.Color <> clRed then SetShip( s, f, 'p' );

end;

procedure TFormMain.N2Click(Sender: TObject);

var p:integer;

begin

if (Sender as TMenuItem).Tag = -1 then exit; //атменка

p := StrToInt( (Sender as TMenuItem).Caption[1] ); //берем "палубность" корабля

if FormConf.DelShipCheckBox.Checked then begin

if MesBox( 'Вы точно хотите удалить ' + (Sender as TMenuItem).Caption +

' корабль ?', 'Удаление корабля' ) = true

then DelShip( p )

else Exit;

Exit;

end;

DelShip( p );

end;

procedure TFormMain.PlayButtonClick(Sender: TObject);

begin

case (Sender as TSpeedButton).Tag of

0: Play;

1: if rotate then rotate := false else rotate := true;

2: DeleteShipPopupMenu.Popup( FormMain.Left + DelButton.Left + 2, FormMain.Top + DelButton.Top + 74 );

3: begin //рандом

RandomSetShips( 'p' );

ReDraw( 'p' );

end;

end;

end;

procedure TFormMain.N9Click(Sender: TObject);

begin

case (Sender as TMenuItem).Tag of

11: begin

if FormConf.NewGameCheckBox.Checked then begin

if MesBox( 'Создать новую игру ?', 'Новая игра' ) = true

then NewGame

else Exit;

Exit;

end;

NewGame;

end;

12: FormConf.ShowModal;

13: begin

if FormConf.ExitCheckBox.Checked then begin

if MesBox( 'Вы точно хотите выйти ?', 'Выход' ) = true

then Close

else Exit;

Exit;

end;

Close;

end;

14: if game <> 2 then ShowMessage( 'Текущая игра должна быть закончена' )

else FormHTML.ShowModal;

15: begin

FormMain.NewGame;

ClearCount;

end;

21: if paluba = 0 then FormSaveSheme.ShowModal

else ShowMessage( 'Все корабли должны быть поставлены' );

22: FormLoadDelSheme.ShowModal;

23: FormCleaner.ShowModal;

31: FormHistory.ShowModal;

32: ShowMessage('Инфу о найденых ошибках,'#13'лагах, багах,'#13 +

'можете слать сюда:'

+ #13#13 + 'kulbes@mail.ru');

end;

end;

procedure TFormMain.FormClose(Sender: TObject; var Action: TCloseAction);

var Reg:TRegistry;

begin

Reg := TRegistry.Create;

Reg.RootKey := HKEY_CURRENT_USER;

Reg.OpenKey( 'sf', true );

Reg.WriteInteger( '_left', Left );

Reg.CloseKey;

Reg.OpenKey( 'sf', true );

Reg.WriteInteger( '_top', Top );

Reg.CloseKey;

end;

procedure TFormMain.KillShapeMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

FormNapalm.ShowModal;

end;

end.

Размещено на Allbest.ru


Подобные документы

  • Описание аппаратных и программных средств, операционной системы. Описание входной и выходной информации. Информационно-логическая модель данных. Схема взаимодействия входной и выходной информации. Расчет трудоемкости и стоимости обработки информации.

    курсовая работа [2,4 M], добавлен 05.07.2015

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

    дипломная работа [2,0 M], добавлен 10.11.2014

  • Основные параметры устройства отображения информации. Обоснование выбора используемых ресурсов микроконтроллера и схемы включения. Разработка схемы алгоритма. Описание и отладка программы. Схема электрическая принципиальная и листинг трансляции программы.

    курсовая работа [121,3 K], добавлен 12.12.2014

  • Требования к программному продукту: базе данных и интерфейсу. Анализ входной, выходной и постоянной информации. Выбор и обоснование выбора среды разработки, программной реализации, описание внутренней среды. Логическая и физическая модель данных.

    курсовая работа [2,1 M], добавлен 04.05.2014

  • Описание правил игры "Морской бой". Особенности современных компьютеров и искусственного интеллекта. Создание общей блок-схемы программы, ее внешний вид. Необходимые переменные, процедуры и функции. Характеристика объектов, используемых в приложении.

    курсовая работа [950,1 K], добавлен 05.11.2012

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

    курсовая работа [460,1 K], добавлен 26.06.2015

  • Описание операционной системы, аппаратных и программных средств. Анализ входной и выходной информации. Структура таблиц базы данных. Построение информационно-логической модели. Блок-схема работы программы. Расчет трудоемкости на обработку информации.

    курсовая работа [1,2 M], добавлен 05.07.2015

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

    курсовая работа [2,9 M], добавлен 24.03.2023

  • Создание баз данных с использованием Database Desktop. Проведение автоматизации рабочего места кассира. Описание входной и выходной информации. Выбор среды реализации, состава и параметров технических средств. Проектирование интерфейса программы.

    курсовая работа [1021,5 K], добавлен 22.01.2015

  • Анализ входной, выходной и постоянной информации. Математическая формулировка задачи и выбор метода обработки заданных параметров. Разработка алгоритма и его описание. Инструкция по эксплуатации программы, результаты проведенных расчетов и их анализ.

    курсовая работа [100,2 K], добавлен 11.02.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.