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

Автор работы: Пользователь скрыл имя, 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 Кб (Скачать документ)

Свойство SimplePanel определяет, включает ли полоса состояния одну или множество панелей. Если SimplePanel = true, то вся полоса состояния представляет собой единственную панель, текст которой задается свойством SimpleText. Если же SimplePanel = false, то полоса состояния является набором панелей, задаваемых свойством Panels. В этом случае свойство SizeGrip определяет, может ли пользователь изменять размеры панелей в процессе выполнения приложения.

Каждая панель полосы состояния  является объектом типа TStatusPanels. Свойства панелей вы можете задавать специальным редактором наборов.

Основное свойство каждой панели — Text, в который заносится отображаемый в панели текст. Его можно занести в процессе проектирования, а затем можно изменять программно во время выполнения. Другое существенное свойство панели — Width (ширина).

Программный доступ к текстам отдельных  панелей можно осуществлять двумя  способами: через индексированное  свойство Panels или через его индексированное подсвойство Items.

Компонент TBitBtn

TBitBtn - кнопка вроде TButton, однако на ней можно разместить картинку (glyph). TBitBtn имеет несколько предопределенных типов (bkClose, bkOK и др), при выборе которых кнопка принимает соответствующий вид. Кроме того, нажатие кнопки на модальном окне (Form2.ShowModal) приводит к закрытию окна с соответствующим модальным результатом (Form2.ModalResult).

приводит  к закрытию окна с соответствующим  модальным результатом (Form2.ModalResult).

Этот  компонент доступен из модуля BUTTONS, и находится на странице Палитры  компонентов Additional.

Эта кнопка, будучи потомком TButton, может нести  на себе пиктограмму и имеет рад  дополнительных удобств в использовании. В Delphi уже определены стандартные  виды кнопок:

(Pb) property Kind: TBitBtnKind;

TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bklgnore, bkAll);

Для каждой из них определены: передаваемый форме  результат (ModalResult):

BitBtnModalResults: array[TBitBtnKind] of TModalResult =

(0, mrOk, mrCancel, 0, mrYes, mrNo, 0, mrAbort, mrRetry, mrlgnore, inrAll);

а также  название и картинки для разных состояний. Достаточно установить значение свойства Kind, и кнопка сразу приобретет нужный вид. Более того, некоторые из видов кнопок при нажатии сразу совершают определенные действия. Так, bkHelp осуществляет инициализацию системы помощи со своим (или ближайшим ненулевым родительским) контекстом. Кнопка вида bkClose закрывает форму, которой она принадлежит, вызывая ее метод Close.

 

 

 

 

 

 

 

 Блок-схема программы

Рисунок 1.1 – Блок-схема процедуры Delay

 

 

 

 

Рисунок 1.2 – Блок-схемы процедур: CheckPos

 

Рисунок 1.3 – Блок-схемы процедуры Convert

 

 

Рисунок 1.4 – Блок-схема процедуры CheckStatus

 

Демонстрация работы программы

Для начала работы с программой нужно  запустить приложение Solitaire4L. Появится окно программы (рисунок 1.5).

Рисунок 1.5 – окно программы «Четыре линии»

 

 

 

 

 

 

 

 

 

 

Для загрузки новой игры нужно открыть  раздел «Игра» и щелкнуть левой кнопкой  мышки по подразделу «Новая игра»  либо нажать f2.

Рисунок 1.6 – окно загруженной программы «Четыре линии»

 

 

 

 

 

 

 

 

 

 

 

При щелчке на подраздел «Содержание» раздела меню «?» появляется сообщение, содержащее описание цели и правил игры. (рисунок 1.7).

Рисунок 1.7 – Справка

 

 

При щелчке на подраздел «О программе» раздела меню «?» появляется сообщение, содержащее сведения о приложении (рисунок 1.8).

Рисунок 1.8 – О программе

 

По окончании игры программа  выдает пользователю сообщение с поздравлением (рисунок 1.9), после чего, вам будет предложено сыграть ещё раз.


Рисунок 1.9 – Конец игры

 

Системные требования и необходимое оборудование:

Для корректной работы данной игры необходимо следующее:

  1. Windows 7,Vista
  2. 1 МБ дискового пространства
  3. 2 МБ ОЗУ
  4. Манипулятор мышь или клавиатуры.

 

Заключение

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

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

Полученные  знания использованы на практике. Результатом  работы является приложение-игра «Четыре  линии», работающее под ОС Windows.

 

Список  литературы

         Курс лекций по дисциплине: «Программирование на языках высокого уровня», преподаватель ГОУ СибАДИ – Михайлов Е.М     http://www.delphicomponent.ru/  http://www.delphimaster.ru/articles/components_gauge.html

Иллюстрированный  самоучитель по Delphi 7 для начинающих:

http://inet-knigi.org/index.php?option=com_content&task=view&id=25&Itemid=36

Уэзeрeлл Ч. Этюды для программистов. М.: «Мир», 1982. –  312 c.

 

Листинг программы

 

unit Main4D;

 

interface

 

uses

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

  ComCtrls, Menus, ExtCtrls, StdCtrls;

 

type

  TForm1 = class(TForm)

    MainMenu1: TMainMenu;

    Game1: TMenuItem;

    Quit1: TMenuItem;

    SB1: TStatusBar;

    NewGame1: TMenuItem;

    Image1: TImage;

    Deal: TMenuItem;

    Help1: TMenuItem;

    About1: TMenuItem;

    N1: TMenuItem;

    N2: TMenuItem;

    Undo1: TMenuItem;

    Contens1: TMenuItem;

    N3: TMenuItem;

    procedure Quit1Click(Sender: TObject);

    procedure NewGame1Click(Sender: TObject);

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

      Y: Integer);

    procedure Form1MouseDown(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure Form1MouseUp(Sender: TObject; Button: TMouseButton;

      Shift: TShiftState; X, Y: Integer);

    procedure FormPaint(Sender: TObject);

    procedure DealClick(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure About1Click(Sender: TObject);

    procedure Undo1Click(Sender: TObject);

    procedure Contens1Click(Sender: TObject);

  private

   //  procedure AppMessage(var Msg: TMsg; var Handled: Boolean);

  public

    { Public declarations }

 

  end;

 

(*

     Diamonds - Бубны

     Hearts   - Черви

     Clubs    - Крести

     Spades   - Пики

*)

  Suits = (Diamonds,Hearts,Spades,Clubs);

 

  CPack = record   { Описание карты }

    Suit : Suits; { Масти }

    Card : Byte;  { Величина карты }

    BPos : Byte;  { Поз.  карты в колоде }

   end;

 

  XY = record

     X : Integer;

     Y : Integer;

     B : Boolean;

  end;

 

const

   { Координаты позиции  карт на экране }

  _PosC : array[1..4,1..9] of TPoint =

         (((x:0;y:0),  (x:70;y:0),  (x:140;y:0),  (x:210;y:0),  (x:280;y:0),  (x:350;y:0),  (x:420;y:0),  (x:490;y:0),  (x:560;y:0)),

          ((x:0;y:95), (x:70;y:95), (x:140;y:95), (x:210;y:95), (x:280;y:95), (x:350;y:95), (x:420;y:95), (x:490;y:95), (x:560;y:95)),

          ((x:0;y:190),(x:70;y:190),(x:140;y:190),(x:210;y:190),(x:280;y:190),(x:350;y:190),(x:420;y:190),(x:490;y:190),(x:560;y:190)),

          ((x:0;y:285),(x:70;y:285),(x:140;y:285),(x:210;y:285),(x:280;y:285),(x:350;y:285),(x:420;y:285),(x:490;y:285),(x:560;y:285)));

   BitmapName : array[0..35] of ShortString =

                ('B1_6','B2_7','B3_8','B4_9','B5_10','B6_J','B7_Q','B8_K','B9_A',

                 'C1_6','C2_7','C3_8','C4_9','C5_10','C6_J','C7_Q','C8_K','C9_A',

                 'P1_6','P2_7','P3_8','P4_9','P5_10','P6_J','P7_Q','P8_K','P9_A',

                 'T1_6','T2_7','T3_8','T4_9','T5_10','T6_J','T7_Q','T8_K','T9_A');

   HCard      : Byte = 96; { Высота карты }

   WCard      : Byte = 71; { Ширина карты }

 

var

  Form1      : TForm1;

  Pack       : array[1..4,1..9] of CPack; // Колода

  Lines      : array[1..4] of Byte;       // Длина "дорожки"

  TCards     : array[0..35] of CPack;

  Attempt    : Byte;    // Счетчик попыток

  Drag       : Boolean; // Потащили карту???

  CBitmap    : TBitmap;

  Background,

  Card       : TRect;

  OPX,OPY    : Integer;  // Предыдущие координаты при перемещении

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

  SPX,SPY    : Integer;  // Начало старта

  UnX1,UnX2,

  UnY1,UnY2  : Byte;

  _Pos : array[1..4,1..9] of TPoint;

 

procedure Convert(var X,Y:Integer);

procedure CheckStatus;

procedure Delay(MSecond : LongWord);

function  CheckPos(X,Y : Integer) : Boolean;

 

implementation

 

{$R *.DFM}

 

procedure Delay(MSecond : LongWord);

var

  StartValue, CurrentValue: LongWord;

begin

  if MSecond <= 0 then Exit;

                           //Слегонца подкорректируем значение

  MSecond := MSecond * 10; //чтобы  не задавать огромные числа  во

                           //входных параметрах

  StartValue := GetTickCount;

  repeat

    CurrentValue := GetTickCount;

  until CurrentValue >= StartValue+MSecond;

end;

 

procedure TForm1.Quit1Click(Sender: TObject);

begin

   Close;

end;

 

procedure TForm1.NewGame1Click(Sender: TObject);

const

  SuitOfCard : array[1..4] of Suits = (Diamonds,Hearts,Spades,Clubs);

var

  Card    : CPack;

  Bitmap1 : TBitmap;

  I       : Word;

  X,Y     : Byte;

begin

  for Y:=1 to 4 do //Очищаем стол

    for X:=1 to 9 do

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

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

  // Подготавливаем колоду}

  for Y:=1 to 4 do

    for X:=1 to 9 do

    begin

      Pack[Y,X].Suit:=SuitOfCard[Y]; { Простановка масти }

      Pack[Y,X].Card:=X;             { Простановка значения карты }

      Pack[Y,X].BPos:=(Y-1)*9+(X-1);   { \                          }

      TCards[(Y-1)*9+(X-1)]:=Pack[Y,X];  { Заполнение вспом. массива }

    end;

  Attempt:=1; { Первая попытка  }

  SB1.Panels[1].Text := 'Первая попытка';

  Deal.Enabled := TRUE;

  Undo1.Enabled := FALSE;

  SB1.Panels[0].Text := 'Нажмите F3 чтобы перетасовать оставшиеся карты';

  { Тасуем колоду }

  Randomize;

  for I:=1 to 2000 do

  begin

    repeat

       X:=Random(36);

       Y:=Random(36);

    until X<>Y;

    Card:=TCards[X];

    TCards[X]:=TCards[Y];

    TCards[Y]:=Card;

  end;

 

  { Выкладываем карты }

  for Y:=1 to 4 do

   for X:=1 to 9 do

   begin

     Bitmap1 := TBitmap.Create;

     Pack[Y,X]:=TCards[(Y-1)*9+(X-1)];

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

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

     Bitmap1.Free;

     Delay(2);

   end;

  CheckStatus;

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

  Delay(30);

{ Удаляем тузы и обновляем  колоду}

  for Y:=1 to 4 do

    for X:=1 to 9 do

      if TCards[(Y-1)*9+(X-1)].Card = 9 then

      begin

        Pack[Y,X].Card:=0;              { Пусто }

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

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

      end else Pack[Y,X]:=TCards[(Y-1)*9+(X-1)];

end;

 

function CheckPos(X,Y : Integer) : Boolean;

begin

  if ((X > 20) AND (X < 651)) AND ((Y > 20) AND (Y < 401))

   then CheckPos := TRUE

   else CheckPos := FALSE;

end;

 

Procedure Convert(var X,Y:Integer);

Var

X1,Y1 : Integer;

begin

  for Y1 := 1 to 4 do

    if (_Pos[Y1,1].Y+1 <= Y) AND (Y < _Pos[Y1,1].Y+HCard+1) then Break;

  for X1 := 1 to 9 do

    if (_Pos[1,X1].X+1 <= X) AND (X < _Pos[1,X1].X+WCard+1) then Break;

  X:=X1;

  Y:=Y1

end;

 

procedure TForm1.Form1MouseMove(Sender: TObject; Shift: TShiftState; X,

  Y: Integer);

var

  Dest, Source: TRect;

begin

  if Not Drag then Exit;

  if ((X < 0) OR (Y < 0) OR (X > 670) OR (Y > 440)) then Exit;//Не даём карте полностью уйти за пределы окна

  X := X-OSX;

  Y := Y-OSY;

  Form1.Canvas.CopyMode := cmSrcCopy;

  if OPY <= Y then

  begin

   Dest   := Rect(OPX,OPY,OPX+WCard,Y); // Определяем зону копирования  для источника

   Source := Rect(OPX,OPY,OPX+WCard,Y); // Определяем зону копирования для приемника}

  end else

  begin

   Dest   := Rect(OPX,Y+HCard,OPX+WCard,OPY+HCard); // Определяем зону копирования  для источника

   Source := Rect(OPX,Y+HCard,OPX+WCard,OPY+HCard); // Определяем зону копирования для приемника}

  end;

  Form1.Canvas.CopyRect(Dest,Image1.Canvas,Source);

  if OPX <= X then

  begin

   Dest   := Rect(OPX,OPY,X,OPY+HCard); // Определяем зону копирования для источника

   Source := Rect(OPX,OPY,X,OPY+HCard); // Определяем зону копирования для приемника}

  end else

  begin

   Dest   := Rect(X+WCard,OPY,OPX+WCard,OPY+HCard); // Определяем зону копирования  для источника

   Source := Rect(X+WCard,OPY,OPX+WCard,OPY+HCard); // Определяем зону копирования для приемника}

  end;

  Form1.Canvas.CopyRect(Dest,Image1.Canvas,Source);

  Form1.Canvas.Draw(X,Y,CBitmap);

  OPX := X;

  OPY := Y;

end;

 

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

  Shift: TShiftState; X, Y: Integer);

var

  Dest, Source: TRect;

begin

  Image1.Canvas.CopyMode := cmSrcCopy; //Обычная отрисовка при копировании

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

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

  {Впредь использовать Image для этих целей. PaintBox глючит, по крайней мере у меня}

  Image1.Canvas.CopyRect(Dest,Form1.Canvas,Source); //Скопируем состояние стола перед  перемещением для востановления  фона

  OSX := X;

  OSY := Y;

  Drag:=FALSE;

  if NOT CheckPos(X,Y) then Exit;

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

  SPX := X; // Запомним, если  придётся возвертаться

  SPY := Y;

  if Pack[Y,X].Card = 0 then Exit; //Если тута пуста

  Drag:=TRUE; //Кнопка нажата

  OSX := OSX - _Pos[Y,X].X; //Вычисление сдвига

  OSY := OSY - _Pos[Y,X].Y;

  CBitmap := TBitmap.Create;

  CBitmap.LoadFromResourceName(hInstance, BitmapName[Pack[Y,X].BPos]); // Загружаем изоб. карты

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

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

  //Впредь использовать Image для этих целей. PaintBox глючит, по крайней мере у меня

  Image1.Canvas.CopyRect(Dest,Form1.Canvas,Source); //Скопируем состояние стола перед  перемещением для востановления  фона

  Form1.Canvas.Draw(_Pos[Y,X].X,_Pos[Y,X].Y,CBitmap); //Поехали! Первая отрисовка карты

  OPX := _Pos[Y,X].X;

  OPY := _Pos[Y,X].Y;

end;

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