Автор работы: Пользователь скрыл имя, 07 Ноября 2011 в 21:04, курсовая работа
В нашей курсовой работе представлены игры «Морской бой» и «Автоматический видео-покер». Данные программы предназначены для домашнего использования как время проведения досуга. Программы распространяються по принципу «freeware».
Введение ................................................................................................................. 3
1. Общий раздел ………………………………………………............................. 4
1.1. Цель разработки …………….………………………………….................... 4
1.2. Характеристика используемых при работе аппаратно-программных средств .................................................................................................................... 4
1.3. Обоснование выбора среды программирования ......................................... 9
2. Специальный раздел ........................................................................................ 11
2.1. Постановка задачи ........................................................................................ 11
2.2. Анализ входной и выходной информации …............................................. 12
3. Технологический раздел ................................................................................. 13
3.1. Описание алгоритма ..................................................................................... 13
3.1.1. Описание алгоритма магазина «UniversalShop» ................................... 13
3.2. Описание программы «UniversalShop»..................................................... 14
3.3. Описание процесса отладки программы .................................................... 25
3.4. Анализ результатов решения задачи……………………………………..
3.5. Инструкция пользователя ............................................................................ 26
Заключение
Приложение 1 Исходный код программы
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.
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.
sndPlaySound( 'sounds\Looser.wav', SND_ASYNC );
inc( cnt[0] );
ShowMessage( 'Учись играть !' );
end
else
if e_k_ships = 4 then begin
if FormConf.EndGameCheckBox.
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.
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.
with
Application.MainForm.
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.
with Application.MainForm.
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.
with Application.MainForm.
//если координата влезает в диапазон ... хорошо значит
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;
//легче так сделать, чтоб не исп. ПАЛУБУ