Разработка игры морской бой

Автор работы: Пользователь скрыл имя, 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 файл

Морской бой.doc

— 325.00 Кб (Скачать документ)

     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;

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

Информация о работе Разработка игры морской бой