Автор работы: Пользователь скрыл имя, 05 Апреля 2014 в 15:23, курсовая работа
Алгори́тм, от имени учёного аль-Хорезми (перс. خوارزمی [al-Khwārazmī]) — точный набор инструкций, описывающих порядок действий исполнителя для достижения результата решения задачи за конечное время. В старой трактовке вместо слова «порядок» использовалось слово «последовательность», но по мере развития параллельности в работе компьютеров слово «последовательность» стали заменять более общим словом «порядок». Это связано с тем, что работа каких-то инструкций алгоритма может быть зависима от других инструкций или результатов их работы.
Техническое задание на разработку ПС………………………………………...3
1 Теоретическая часть…………………………………………………………….4
1.1 Сведения об алгоритмах……………………………………………….4
1.2 Сведения об игре «пятнашки»………………………………………..8
2 Функциональное описание……………………………………………………11
Заключение………………………………………………………………………12
Список использованных источников…………………………………………..13
Приложение А …………………………………………………………………..14
Приложение Б …………………………………………………………………...15
Приложение В ………………………………………………………………...…16
Если сумма
является нечётной, то решения головоломки не существует.
Для обобщённых пятнашек (с бо́льшим, чем 15, количеством костяшек) задача поиска кратчайшего решения является NP-полной.
Если допустить поворот коробки на 90 градусов, при котором изображения цифр окажутся лежащими на боку, то можно перевести неразрешимые комбинации в разрешимые (и наоборот). Таким образом, если вместо цифр на костяшки нанести точки и не фиксировать положение коробки, то неразрешимых комбинаций вообще не окажется.
2 Функциональное описание
В курсовой работе используются основные возможности языка в работе со структурами, файлами, графикой.
В данной игре предполагалось создание:
1) интуитивно понятного интерфейса;
2)скромного, но графически точного табло, где осуществляется перемещение цифр;
3) удобного для пользователя управления.
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсового проекта разработана программа, реализующая игру «пятнашки».
Блок-схема реализации программы представлена в приложении А, внешний вид окна программы представлен в приложении Б, исходный текст программы представлен в приложении В.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ А
Блок-схема реализации программы на рисунке 2.
ПРИЛОЖЕНИЕ Б
Основное окно программы на рисунке 3. Окно с окончанием игры на рисунке 4.
Рисунок 3 – основное окно Рисунок 4 – победа
ПРИЛОЖЕНИЕ В
Листинг программы:
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, XPMan, ExtCtrls;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
tmr1: TTimer;
lbl1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure tmr1Timer(Sender: TObject);
private
procedure ButClicked(Sender: TObject);
procedure CreatFishkas();
procedure KillOldFihkas();
function position(const x, y: integer): integer;
procedure victopia();
{ Private declarations }
public
{ Public declarations }
end;
type Tfish = TButton; // указываем тип фишек
const
W = 80; // ширина фишки
D = 10; // растояние между фишками
L = D + W; // растояние между "х" у фишек
NXM = 3; // размер поля 4х4
N = 1; M = 9; // размерность массива фишек
POLET = 10; POLEL = 10; //начальные позиции поля фишек на форме
prefix = 'Fishka';
var
Form1: TForm1;
btn: array[N..M] of Tfish;
sorseAr: array[N..M] of boolean;
zeroX, zeroY: integer;
XYmatrix: array[1..M, 1..2] of integer;
timtemp:TDateTime;
implementation
{$R *.dfm}
//размер формы
procedure FormSize;
begin
Form1.Width := (POLEL * 2) + (L * NXM);
Form1.Height := (L * NXM) + POLET + 90;
Form1.Lbl1.Left:=Round(Form1.
Form1.Lbl1.Top:=Form1.Height-
end;
procedure TForm1.FormCreate(Sender: TObject);
var i, ty, lx: integer;
begin
timtemp:=time;
randomize; i := 0;
// заполняем массив координатами на которые будут случайным образом ставиться
// фишки при начале новой игры
ty := POLET; lx := POLEL;
for i := N to M do begin
XYmatrix[i, 1] := lx;
XYmatrix[i, 2] := ty;
lx := lx + L;
if i mod NXM = 0 then begin
ty := ty + L;
lx := POLEL;
end;
end;
FormSize();
end;
procedure TForm1.FormShow(Sender: TObject);
begin
CreatFishkas();
end;
// клик по пункту меню - "новая игра"
procedure TForm1.N1Click(Sender: TObject);
begin
KillOldFihkas();
FormSize();
CreatFishkas();
timtemp:=time;
end;
{ сбрасывает все элементы массива в true,
массив отвечает за
неповторяющиеся порядковые
которые выбираются случайным образом
нужно при иницилизации новой игры}
function dump(): boolean;
var i: integer;
begin
i := 0;
for i := N to M do
sorseAr[i] := true; ;
end;
//алгоритм выборки
function choose(): integer;
var i: integer;
begin
i := 0;
result := random(M) + 1;
while sorseAr[result] = false do
result := random(M) + 1;
sorseAr[result] := false;
end;
procedure TForm1.CreatFishkas;
// НОВАЯ ИГРА, создание игрового поля
var
i, ty, lx, ch: integer;
begin
randomize;
dump();
// But.Enabled:=false; BitBtn1.Enabled:=true; BitBtn2.Enabled:=true;
ty := POLET; lx := POLEL;
for i := N to M do begin
btn[i] := Tfish.Create(Self);
btn[i].Width := W;
btn[i].Height := W;
btn[i].Font.Size := 34;
btn[i].Font.Name := 'Garamond Premr Pro';
btn[i].Font.Style := [fsBold];
ch := choose(); // получаем случайным образом число 1-16, числа не повторяются
btn[i].Left := XYmatrix[ch, 1]; // получаем координату Х
btn[i].Top := XYmatrix[ch, 2]; // получаем координату У
btn[i].Tag := ch; // в Tag - текущее положение фишки
btn[i].Name := prefix + inttostr(i);
if i <> M then begin
btn[i].Caption := inttostr(i);
btn[i].OnClick := ButClicked;
end else begin // пустая кнопка
btn[i].Caption := '';
zeroX := btn[i].Left; zeroY := btn[i].Top;
end;
btn[i].Parent := Self;
end;
end;
// определяет позицию на которой стоит фишка в данный момент по ее координатам
function TForm1.position(const x, y: integer): integer;
var i: integer;
begin
i := 0;
result := -32;
for i := N to M do begin
if ((XYmatrix[i, 1] = x) and (XYmatrix[i, 2] = y)) then begin
result := i; break;
end;
end;
end;
// перемещение фишки на новую позицию
procedure TForm1.ButClicked(Sender: TObject);
var X, Y, ps: integer;
begin
X := Tfish(Sender).left; Y := Tfish(Sender).Top;
if ((X = zeroX + L) and (Y = zeroY)) or
((X = zeroX - L) and (Y = zeroY)) or
((X = zeroX) and (Y = zeroY + L)) or
((X = zeroX) and (Y = zeroY - L)) then begin
Tfish(Sender).Left := zeroX;
Tfish(Sender).Top := zeroY;
Tfish(FindComponent(prefix + inttostr(M))).left := X;
Tfish(FindComponent(prefix + inttostr(M))).top := Y;
ps := position(zeroX, zeroY);
if ps <> -32 then
Tfish(Sender).Tag := ps else
ShowMessage('Ошибка в логике программы, координаты');
zeroX := X; zeroY := Y;
victopia(); // проверка - ПОБЕДА или играем дальше
end;
end;
// проверка - ПОБЕДА или играем дальше...
procedure TForm1.victopia;
var i: integer; b: boolean;
begin
b := true; i := 0;
for i := N to M - 1 do
begin
if strtoint(Tfish(FindComponent(
Tfish(FindComponent(prefix + inttostr(i))).Tag then
begin
b := false; break;
end;
end;
if b then ShowMessage('ПОБЕДА! ТаДаМ)))
Ваше время:'+TimeToStr(Time-
end;
procedure TForm1.KillOldFihkas;
// уничтожаем кнопки-фишки, нужно перед началом новой игры
var i: integer;
begin
for i := N to M do
FreeAndNil(btn[i]);
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Application.Terminate();
end;
procedure TForm1.tmr1Timer(Sender: TObject);
begin
form1.Refresh;
lbl1.Caption:=TimeToStr(Time-
end;
end.