Алгоритмы дискретной математики

Автор работы: Пользователь скрыл имя, 22 Марта 2013 в 09:49, курсовая работа

Краткое описание

Целью курсовой работы является получение опыта самостоятельной разработки в соответствии с заданием пользовательского приложения, работающего под управлением ОС Microsoft Windows, в среде разработки приложений Delphi 7, а также получение навыка составления пояснительной записки и оформления в соответствии с требованиями, принятыми на факультете «Информационные системы в управлении».
Задачами курсовой работы являются:
Разработка программы в соответствии с заданием;
Составление пояснительной записки в соответствии с требованиями.
Овладеть навыками самостоятельной работы;
Закрепить, углубить и расширить теоретические знания в соответствии с дисциплиной «Вычислительная математика».

Содержание

Задание 3
Реферат 4
Введение 5
Правила игры 6
Описание программы 6
Теоретические основы 7
Обзор используемых в программе компонентов Borland Delphi 9
Блок-схема программы 14
Системные требования и необходимое оборудование 22
Заключение 23
Список литературы 24
Листинг программы 25

Прикрепленные файлы: 1 файл

пояснительная записка по вычмату.doc 11.docx

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

 

procedure TForm1.Form1MouseUp(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

var

  Dest, Source     : TRect;

  OneMoreCondition : Boolean; // Хоть одно условие выполняется ?

  Vr1              : Word;

  Bitmap           : TBitmap;

  Crd              : array[0..4] of XY;

  BRes1            : Boolean;

begin

  OneMoreCondition := CheckPos(X,Y);   //Курсор в пределах окна программы ?

  if OneMoreCondition then    //Если да вычисляем координаты всех углов карты

  begin                       //и проверяем виден ли угол  в окне

    Crd[0].B := TRUE;

    Crd[0].X := X;

    Crd[0].Y := Y;

  end else Crd[0].B := FALSE;

  // OSX,OSY  cдвиг координат относительно мыши

  OneMoreCondition := CheckPos(X-OSX,Y-OSY);

  if OneMoreCondition then

  begin

    Crd[1].B := TRUE;

    Crd[1].X := X-OSX;

    Crd[1].Y := Y-OSY;

  end else Crd[1].B := FALSE;

  OneMoreCondition := CheckPos(X-OSX,Y-OSY+HCard);

  if OneMoreCondition then

  begin

    Crd[2].B := TRUE;

    Crd[2].X := X-OSX;

    Crd[2].Y := Y-OSY+HCard;

  end else Crd[2].B := FALSE;

  OneMoreCondition := CheckPos(X-OSX+WCard,Y-OSY);

  if OneMoreCondition then

  begin

    Crd[3].B := TRUE;

    Crd[3].X := X-OSX+WCard;

    Crd[3].Y := Y-OSY;

  end else Crd[3].B := FALSE;

  OneMoreCondition := CheckPos(X-OSX+WCard,Y-OSY+HCard);

  if OneMoreCondition then

  begin

    Crd[4].B := TRUE;

    Crd[4].X := X-OSX+WCard;

    Crd[4].Y := Y-OSY+HCard;

  end else Crd[4].B := FALSE;

  if NOT Drag then Exit;

  OneMoreCondition := FALSE;

  X := Crd[0].X;

  Y := Crd[0].Y;

  for Vr1 := 0 to 4 do

    if Crd[Vr1].B then

    begin

      Convert(Crd[Vr1].X, Crd[Vr1].Y);  // Переводим координаты к виду 1..9,1..4

      if Pack[Crd[Vr1].Y,Crd[Vr1].X].Card = 0 then   //Определяем, попадает ли карта

      begin                                          //каким-нибудь углом в свободную ячейку

        X := Crd[Vr1].X;

        Y := Crd[Vr1].Y;

        OneMoreCondition := TRUE;     //Попадает!

        Break;

      end;

    end;

  if NOT OneMoreCondition then Convert(X, Y);

  Dest   := Rect(0,0,Image1.Width,Image1.Height); // Определяем зону копирования для источника

  Source := Rect(0,0,Image1.Width,Image1.Height); // Определяем зону копирования  для приемника

  Form1.Canvas.CopyRect(Dest,Image1.Canvas,Source); // Востанавливаем фон

 

  // ЭТУ карту можно положить в ЭТУ ячейку ?

  BRes1 := (Pack[Y,X].Card = 0) AND OneMoreCondition;

  if X > 1 then  //Два свободных поля не идут подряд?

      BRes1 := BRes1  AND (Pack[Y,X-1].Card <> 0);

  if X = 1 then  //Если первая ячейка

      BRes1 := BRes1  AND (Pack[SPY,SPX].Card = 1)  //Перетаск. карта шестерка ?(SPX,SPY Начало старта)

  else           //Масть и старшинство?

      BRes1 := BRes1  AND ((Pack[SPY,SPX].Card - Pack[Y,X-1].Card = 1)

                                AND (Pack[SPY,SPX].Suit = Pack[Y,X-1].Suit));

 

  if BRes1 then  //Да! Кладем.

  begin

     Form1.Canvas.Draw(_Pos[Y,X].X,_Pos[Y,X].Y,CBitmap);

     UnX1 := X; UnY1 := Y; UnX2 := SPX; UnY2 := SPY;

     Pack[Y,X].Suit := Pack[SPY,SPX].Suit;

     Pack[Y,X].Card := Pack[SPY,SPX].Card;

     Pack[Y,X].BPos := Pack[SPY,SPX].BPos;

     Pack[SPY,SPX].Card:=0;

     Undo1.Enabled := TRUE;

     CheckStatus;

     SB1.Panels[2].Text := 'Осталось карт: ' + IntToStr(32 - (Lines[1]+Lines[2]+Lines[3]+Lines[4]));

     if Lines[1]+Lines[2]+Lines[3]+Lines[4] = 32 then

     begin

       for Y := 1 to 4 do

       begin

          Pack[Y,9].Suit := Pack[Y,1].Suit;

          Pack[Y,9].Card := 9;

          Pack[Y,9].BPos := (Y-1)*9+8;

          Bitmap := TBitmap.Create;

          Bitmap.LoadFromResourceName(hInstance, BitmapName[Pack[Y,9].BPos]);

          Form1.Canvas.Draw(_Pos[Y,9].X,_Pos[Y,9].Y,Bitmap);

          Bitmap.Free;

          Delay(2);

       end;

       Deal.Enabled := FALSE;

       Vr1 := MessageBox(Application.Handle, PChar('Вы выйграли! Попробуем ещё раз?'),'Пасьянс', MB_YESNO+MB_ICONINFORMATION);

       if Vr1 = mrYes then NewGame1.Click else Close;

     end;

  end else

  begin

     if (_Pos[SPY,SPX].X < 20)  OR

        (_Pos[SPY,SPX].X > 651) OR

        (_Pos[SPY,SPX].Y < 20)  OR

        (_Pos[SPY,SPX].Y > 401)

     then Exit;

     if Pack[SPY,SPX].Card <> 0 then Form1.Canvas.Draw(_Pos[SPY,SPX].X,_Pos[SPY,SPX].Y,CBitmap);

  end;

  if Drag then CBitmap.Free;

  Drag:=FALSE;

  Form1.Paint;

end;

 

procedure TForm1.FormPaint(Sender: TObject);

var

  Bitmap1 : TBitmap;

  X,Y     : Byte;

  ShiftX,

  ShiftY  : Byte;

begin

   Form1.ClientHeight := 440;

   Form1.ClientWidth := 670;

   ShiftY := 20;

   if GetSystemMetrics(SM_CXFULLSCREEN) < 800

    then ShiftX := 7

    else ShiftX := 20;

   for Y:=1 to 4 do    // Изменяем коор. с учётом поправки

    for X:=1 to 9 do

    begin

      _Pos[Y,X].X := _PosC[Y,X].X + ShiftX;

      _Pos[Y,X].Y := _PosC[Y,X].Y + ShiftY;

    end;

   for Y:=1 to 4 do

    for X:=1 to 9 do

      if Pack[Y,X].Card=0 then

      with Form1.Canvas do

      begin  //Затираем карту фоном

        Pen.Width := 1;

        Pen.Color := $00808040;

        Brush.Color := clGreen;

        RoundRect(_Pos[Y,X].X,_Pos[Y,X].Y,_Pos[Y,X].X+WCard,_Pos[Y,X].Y+HCard,6,6);

      end else

      begin

        Bitmap1 := TBitmap.Create;

        Bitmap1.LoadFromResourceName(hInstance, BitmapName[Pack[Y,X].BPos]);

        Form1.Canvas.Draw(_Pos[Y,X].X,_Pos[Y,X].Y,Bitmap1);

        Bitmap1.Free;

      end;

end;

 

procedure CheckStatus;

var

  X,Y:Byte;

  Suit:Suits;

begin

  for Y:=1 to 4 do

  begin

   Lines[Y]:=0;

   if Pack[Y,1].Card = 1 then

   begin

      Suit:=Pack[Y,1].Suit;

      Lines[Y]:=1;

      X:=2;

      while ((X<=9) and (Pack[Y,X].Card=X) and (Pack[Y,X].Suit=Suit)) do

      begin

       Lines[Y]:=X;

       Inc(X);

      end; { do }

   end; { if }

end; { for }

end; { End Of CheckStatus }

 

procedure TForm1.DealClick(Sender: TObject);

Var

  Cnt, X, Y, N   : Byte;

  I              : Integer;

  Card2          : CPack;

  ButtonSelected : Word;

  TCards2        : array[0..32] of CPack;

begin

  CheckStatus;

  Inc(Attempt);

  if (Lines[1]+Lines[2]+Lines[3]+Lines[4] = 32) OR (Attempt >= 5) then

  begin

    //Beep;

    Dec(Attempt);

    Exit;

  end;

  case Attempt of

      2 : SB1.Panels[1].Text := 'Вторая попытка';

      3 : SB1.Panels[1].Text := 'Последняя попытка';

   4..5 : SB1.Panels[1].Text := '';

  end;

  if Attempt <= 3 then

  begin

    if Attempt = 3 then SB1.Panels[0].Text := 'Нажмите F2 чтобы начать новую игру';

    Undo1.Enabled := FALSE;

    N := 0;

    Cnt := 32; { Предпологаемое  число оставшихся карт }

    // Собираем карты

    for Y := 1 to 4 do

    begin

      Dec(Cnt,Lines[Y]);

      for X := Lines[Y]+1 to 9 do

        if Pack[Y,X].Card<>0 then

        begin

          TCards2[N] := Pack[Y,X];

          with Form1.Canvas do

          begin  //Затираем карту фоном

            Pen.Width := 1;

            Pen.Color := $00808040;

            Brush.Color := clGreen;

            RoundRect(_Pos[Y,X].X,_Pos[Y,X].Y,_Pos[Y,X].X+WCard,_Pos[Y,X].Y+HCard,6,6);

          end;

          Inc(N);

          Delay(2);

        end;

    end;

    // Тасуем колоду

    Randomize;

    for I:=1 to 2000 do

    begin

      repeat

        X:=Random(Cnt);

        Y:=Random(Cnt);

      until X<>Y;

      Card2:=TCards2[X];

      TCards2[X]:=TCards2[Y];

      TCards2[Y]:=Card2;

    end;

    // Сдаем

    for Y:=1 to 4 do Inc(Lines[Y]);

    N:=0;

    for Y:=1 to 4 do

      for X:=Lines[Y] to 9 do

        if X = Lines[Y] then Pack[Y,X].Card:=0

        else begin

          CBitmap := TBitmap.Create;

          Pack[Y,X]:=TCards2[N];

          CBitmap.LoadFromResourceName(hInstance, BitmapName[Pack[Y,X].BPos]);

          Form1.Canvas.Draw(_Pos[Y,X].X,_Pos[Y,X].Y,CBitmap);

          CBitmap.Free;

          Inc(N);

          Delay(2);

        end;

  end

  else begin

    Deal.Enabled := FALSE;

    ButtonSelected := MessageBox(Application.Handle, PChar('Попытки исчерпаны. Попробуем ещё раз?'),'Пасьянс', MB_YESNO+MB_ICONINFORMATION);

    if ButtonSelected = mrYes then NewGame1.Click else Close;

  end;

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

  Deal.Enabled := FALSE;

  SB1.Panels[0].Text := 'Нажмите F2 чтобы начать новую игру';

  Attempt := 0;

  with Form1.Canvas do

  begin

     Pen.Width := 1;

     Pen.Color := $00808040;

     Brush.Color := clGreen;

  end;

end;

 

procedure TForm1.About1Click(Sender: TObject);

var

  S : PChar;

begin

  S := 'Пасьянс "Четыре линии"' + #13 +

       'Версия 1.0 Beta (20.12.2011)' + #13 + #13 +

       'Copyright ©  2011 by Alfa';

  MessageBox(Application.Handle, S, 'О программе', MB_ICONINFORMATION);

end;

 

procedure TForm1.Undo1Click(Sender: TObject);

var

  Bitmap : TBitmap;

  X, Y   : Byte;

begin

  Pack[UnY2,UnX2] := Pack[UnY1,UnX1];

  Pack[UnY1,UnX1].Card := 0;

  Bitmap := TBitmap.Create;

  Bitmap.LoadFromResourceName(hInstance, BitmapName[Pack[UnY2,UnX2].BPos]);

  Form1.Canvas.Draw(_Pos[UnY2,UnX2].X,_Pos[UnY2,UnX2].Y,Bitmap);

  Bitmap.Free;

  Form1.Canvas.RoundRect(_Pos[UnY1,UnX1].X,_Pos[UnY1,UnX1].Y,_Pos[UnY1,UnX1].X+WCard,_Pos[UnY1,UnX1].Y+HCard,6,6);

  X := UnX2; Y := UnY2;

  UnX2 := UnX1; UnY2 := UnY1;

  UnX1 := X; UnY1 := Y;

end;

 

procedure TForm1.Contens1Click(Sender: TObject);

begin

  Application.HelpFile := 'Solitaire4L.HLP';

  Application.HelpCommand(HELP_CONTENTS, 0);

end;

 

end.

2

 


Информация о работе Алгоритмы дискретной математики