Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Список используемых источников
1 Архангельский, А.Я. Программирование в Delphi 7 / А.Я. Архангельский. — Москва: Бином-Пресс 2003. — 1152 с. 2 Деникин, А. А. Могут ли видеоигры быть искусством? // Международный журнал исследований культуры. - № 2(11). — М.: Эйдос, 2013, С. 90-96. 3 Культин, Н.Б. Основы программирования в Delphi 7 / Н.Б. Культин. — Петербург: БХВ, 2003. – 608 с. 4 Кэнту, М. Delphi 7 для профессионалов / М. Кэнту. — Санкт-Петербург: 2004. — 1101 с. 5 Пестриков, В.М. Delphi на примерах / В.М. Пестриков, А.Н. Маслобоев. — Петербург: БХВ, 2005. — 497 с. 6 Фленов, М. «Библия Delphi» / М. Фленов. — Петербург: БХВ, 2004. — 880 с.
ПРИЛОЖЕНИЕ А Листинг программы
БЛОК - СХЕМА
нет
да
нет
да
Листинг программы
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Menus; type TForm1 = class(TForm) MainMenu1: TMainMenu; Timer1: TTimer; N1: TMenuItem; N2: TMenuItem; N3: TMenuItem; N4: TMenuItem; procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Timer1Timer(Sender: TObject); procedure N1Click(Sender: TObject); procedure N3Click(Sender: TObject); procedure N4Click(Sender: TObject); private { Private declarations } public { Public declarations } end; // объявление нового типа col_row col_row = record col: integer; row: integer; end; const MAX_SIZE = 32; // максимальное кол-во парных картинок MAX_H = 8; // максимальный размер поля - 8х8 MAX_W = 8; var Form1: TForm1; Pole: array [1..MAX_H,1..MAX_W] of integer; { Pole[i,j] < 100 - код картинки, клетка закрыта; Pole[i,j] > 100 и < 200 - клетка открыта, т.е. игрок видит картинку; Pole[i,j] > 200 - игрок нашел пару для этой картинки }
Pictures: TBitmap; // картинки, загруженные из файла n: integer; // колво открытых пар картинок count: integer; // количества открытых в данный момент клеток open1: col_row; // координаты 1-й открытой клетки open2: col_row; // координаты 2-й открытой клетки
W: integer; // кол-во клеток по горизонтали H: integer; // кол-во клеток по вертикали // произведение W и H должно быть кратно 2-м WK: integer; // ширина клетки HK: integer; // высота клетки
implementation uses Unit2,Unit3; {$R *.dfm} // рисуетклеткуполя procedure Kletka(col,row: integer); var x,y: integer; // левый верхний угол клетки (координаты) src, dst: Trect; // источник и получатель битового образа
begin // преобразуем координаты клетки // в координаты на поверхности формы x:= (col-1)*WK; y:= (row-1)*HK;
if Pole[col,row] > 200 then // для этой клетки найдена пара // клетку надо убрать с поля begin // установить цвет границы, закраски и текста Form1.Canvas.Brush.Color:= clBtnFace; Form1.Canvas.Pen.Color:= clBtnFace; Form1.Canvas.Font.Color:= clBtnFace; end;
if (Pole[col,row] > 100) and (Pole[col,row] < 200) then // клетка открыта - вывести картинку begin
// Pole[col,row] = номер картинки + 100, // где 100 - признак того, что клетка открыта // определим положение картинки в Pictures src:= Bounds((Pole[col,row]-100 -1)*WK,0,WK,HK);
// координаты картинки (клетки) на форме dst:= Bounds(x,y,HK-2,WK-2);
// вывестикартинкувклеткуForm1.Canvas.CopyRect(dst,Pictures.Canvas,src);
// установить цвет границы и цифры Form1.Canvas.Pen.Color:= clBlack; Form1.Canvas.Font.Color:= clBlack; Form1.Canvas.Brush.Style:= bsClear; end;
if (Pole[col,row] > 0) and (Pole[col,row] < 100) then // клетка закрыта, рисуем только контур begin Form1.Canvas.Brush.Color:= clBtnFace; Form1.Canvas.Pen.Color:= clBlack; Form1.Canvas.Font.Color:= clBtnFace; end;
// отрисоватьклетку Form1.Canvas.Rectangle(x,y,x+WK-2,y+HK-2); //Form1.Canvas.TextOut(x+15,y+15, IntToStr(Pole[col,row])); Form1.Canvas.Brush.Color:= clBtnFace;
end; // отрисовываетполе procedure ShowPole; var row,col: integer; begin for row:=1 to H do for col:=1 to W do Kletka(row,col); end;
// новаяигра Procedure NewGame; var
k: integer; // кол-вопарныхкартинок r: integer; // случайноечисло buf: array[1..MAX_SIZE] of integer; // в buf[i] записываем, сколько чисел i // записали в массив Pole i,j: integer; // индексы массивов Sender: TObject; np: integer; // кол-вопарныхкартинок lol: string; begin
Pictures:= TBitmap.Create; // загрузитькартинкиизфайла
lol:='pictures'; Randomize; if (Random(9)+1) mod 2 = 0 then lol:=lol + '1';
lol:=lol + '.bmp';
Pictures.LoadFromFile(lol);
HK:= Pictures.Height-1; // высотакартинки WK:= HK; // ширинакартинки
np:= Round(Pictures.Width / WK); if np <= 15 then H:= 4 else H:=5; W:= Round(np*2/H);
// установить размера поля Form1.ClientHeight:= H * HK; Form1.ClientWidth:= W * WK;
Form1.Timer1.Enabled:= False; Form1.Timer1.Interval:= 200;
n:= 0; k:= Trunc(H*W/2);
for i:=1 to k do buf[i]:= 0;
// запишем в массив Pole случайные числа от 1 до 2 // каждое число должно быть записано два раза for i:=1 to H do for j:=1 to W do begin repeat r:= random (k) + 1; until buf[r] < 2; Pole[i,j]:= r; // кодкартинки inc(buf[r]); end; // здесь поле сгенерировано n:=0; ShowPole; end;
// созданиеформы procedure TForm1.FormCreate(Sender: TObject); var np: integer; // кол-во парных картинок lol: string; begin NewGame; end;
procedure TForm1.FormPaint(Sender: TObject); begin ShowPole; end;
// щелчоквклетке procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var col_: integer; // номер клетки по горизонтали row_: integer; //номер клетки по вертикали
begin col_:= Trunc(X/WK) + 1; row_:= Trunc(Y/HK) + 1;
if Pole[col_,row_] > 200 then // щелчок в на месте одной из двух // уже найденных парных картинок exit;
// открытых клеток нет if count = 0 then begin count:= 1; open1.col:= col_; open1.row:= row_;
// клетка помечается как открытая Pole[open1.col,open1.row]:= Pole[open1.col,open1.row] + 100; Kletka(open1.col,open1.row); exit; end;
// открыта одна клетка, надо открыть вторую if count = 1 then begin open2.col:= col_; open2.row:= row_;
// если открыта одна клетка и щелчок сделан // в этой клетке, то ничего не происходит if (open1.col = open2.col) and (open1.row = open2.row) then exit else begin count:= 2; // теперьоткрытыдвеклетки Pole[open2.col,open2.row]:= Pole[open2.col,open2.row] + 100; Kletka(open2.col,open2.row); // отрисуемвторуюклетку
// проверим, открытыекартинкиодинаковые? if Pole[open1.col,open1.row] = Pole[open2.col,open2.row] then // открыты две одинаковые картинки begin n:= n+1; Form1.Timer1.Enabled:= True; // запуститьтаймер // процедур обработки события OnTimer // "сотрет" две одинаковые картинки end; end; exit; end; if count = 2 then begin // открыты 2 клетки с разными картинками // закроем их и откроем новую, в которой // сделанщелчок
// закрытьоткрытыеклетки Pole[open1.col,open1.row]:= Pole[open1.col,open1.row] - 100; Pole[open2.col,open2.row]:= Pole[open2.col,open2.row] - 100; Kletka(open1.col,open1.row); Kletka(open2.col,open2.row);
// запись в open1 номера текущей клетки open1.col:= col_; open1.row:= row_; count:= 1; // счетчик открытых клеток
// открыть текущую клетки Pole[open1.col,open1.row]:= Pole[open1.col,open1.row] + 100; Kletka(open1.col,open1.row); end; end;
// обработкасобытиятаймера procedure TForm1.Timer1Timer(Sender: TObject); begin // в массиве Pole клетки помечаются как совпавшие Pole[open1.col,open1.row]:= Pole[open1.col,open1.row] + 100; Pole[open2.col,open2.row]:= Pole[open2.col,open2.row] + 100; count:= 0;
// отрисоватьклетки Kletka(open2.col,open2.row); Kletka(open1.col,open1.row);
// остановкатаймера Form1.Timer1.Enabled:= False;
if n = Trunc(W*H/2) then // открытывсепары begin Form1.Canvas.Font.Name:= 'Times New Roman'; Form1.Canvas.Font.Size:= 13; Form1.Canvas.Font.Color:= clBlack; Form1.Canvas.TextOut(70,150,'Поздравляю! Вы нашли все пары!'); Form1.Canvas.Font.Size:= 10; Form1.Canvas.TextOut(160,200,' Конецигры!'); end;
end; // выбор в меню команды Новая игра
procedure TForm1.N1Click(Sender: TObject); begin InvalidateRect(0, nil, True); NewGame; end;
procedure TForm1.N3Click(Sender: TObject); begin Form3.Show; end; procedure TForm1.N4Click(Sender: TObject); begin Form2.Show; end;
end. Date: 2016-07-22; view: 304; Нарушение авторских прав |