Розробка інформаційного та програмного забезпечення для реалізації гри "Тетріс"
Суть гри "Тетріс", опис алгоритму програми та процедур програмування гри: модулі tetobj, int, game. Опис головних структур програми, розробка інтерфейсу та лістингу ігрової програми з використанням об’єктно-орієнтованої мови програмування Object Pascal.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | украинский |
Дата добавления | 26.04.2012 |
Размер файла | 718,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Міністерство освіти і науки України
Самбірський технікум економіки та інформатики
Курсова робота на тему:
Розробка інформаційного та програмного забезпечення для реалізації гри «Тетріс»
Виконала: студентка групи А 4-го курсу
заочного відділення
спеціальності «розробка програмного забезпечення»
Сивак Марія
Перевірив: Юзефович І.В.
Зміст
1. Постановка задачі
2. Метод розв'язку задачі
3. Опис алгоритму
4. Опис програми
4.1 Опис головних структур та змінних програми
4.2 Опис головних процедур та функцій
5. Опис інтерфейсу
6. Результат роботи
7. Лістинг програми
Висновки
Список використаної літератури
1. Постановка задачі
Розробити алгоритм програми, що виконує переміщення фігур по екрану згори донизу, координацію їх місцезнаходження у відповідності до дій граючого.
Фігури складаються з квадратів однакового розміру, набір фігур - кінцевий, послідовність випадання фігур - випадкова.
Гравець має вкладати фігури на дно стакана з якомога більшою густиною (кількість незаповнених квадратів має бути мінімальною). При цьому ряд, повністю заповнений квадратами, має автоматично зникати із стакану. Квадрати не повинні накладатись один на одного.
Гравець може зупинити та продовжити гру. Рівень визначає кількість квадратів та швидкість на початку гри.
2. Метод розв'язку задачі
Програма написана на мові Паскаль. Використовуються такі стандартні модулі: graph (обробки кодів натиснутих клавіш), graph (для роботи в графічному відео режимі), та windos (використовується таймер).
Використане об'єктно - орієнтоване програмування. Основні об'єкти - це фігура та стакан.
Виконується обробка подій від таймера, натиснутих клавіш, вибраних пунктів меню.
3. Опис алгоритму
4. Опис програми
програмний гра тетріс object pascal
4.1 Опис головних структур та змінних програми
Типізовані константи:
Кількість клітинок у стакані:
maxX : byte =20;
maxY : byte =30;
Розмір однієї клітинки:
size : byte =12;
Рівень складності - визначає початкову швидкість руху та заповненість стакану:
level : byte =1;
Проміжок часу між переміщеннями фігури вниз:
speed:real=0.4
Об'єкти:
Фігура:
TBlock=object
mx,my,x,y:byte; Координати фігури та кількість квадратів по висоті і ширині
matr:TmatrixBlock; Елемент матриці дорівнює одиниці , якщо є квадрат
t:byte; Тип фігури
pos:1..4; Положення фігури
p,p2:pointer; вказівники на малюнок квадрата та на стан екрана до того, як була намальована фігура
s,s2:word;
procedure initmatrix; надання пачаткового значення матриці
constructor init;
constructor init2(t1,pos1:byte); ініціалізація з наданням полям t, pos відповідних значень.
rocedure rotate;virtual; поворот фігури
procedure draw;virtual; вимальовування фігури
procedure clear;virtual; стирає фігуру
destructor done;
end;
Стакан:
Tfield=object
x 1, y 1: integer ; координати поля
matr:TMatrixField; якщо відповідна комірка заповнена, містить одиницю
constructor init(level:byte); Надання початкових значень в залежності від рівня level
procedure draw; Вимальовування стакана
procedure clear ; Зникнення стакану з екрана
function full:boolean; Повертає true якщо стакан повний
function fline (n:byte):boolean; Повертає true якщо рядок n повний
procedure dline (n:byte); Знищує n- ний рядок
private
x2,y2:integer; ширина та висота
end;
Рамка:
tramka=object
x,y,width,heigth:integer; координати , ширина та висота
lighted:boolean; Якщо true , то рамка підсвічена
col1,col2,col3:integer; Кольори фону, активної та неактивної рамки
private
p:pointer; вказівник на стан екрану до того, як було виведено вікно
s:word; відповідний розмір пам' яті
public
constructor init( x1, y1, xx , yy :word);
procedure mkactive; Встановлення вікна на рамку
procedure light; Підсвічення рамки
procedure unlight; Рамка неактивного кольору
procedure draw; Вимальовування рамки
procedure clear; Повертає кран до попереднього стану
destructor done;
end;
Вертикальне меню:
tsubmenu=object(tramka)
punkts:menutype; масив з назв пунктів меню
n:byte; кількість пунктів
col4:integer; Колір пункту меню
constructor init(const pnk:menutype;n1:byte;x1,y1:word);
procedure draw;
function result:byte; Виконує переміщення між пунктами та повертає номер обраного пункту
private h:integer; Висота одного пункту
end;
Горизонтальне меню:
tmainmenu=object(tsubmenu)
constructor init(const pnk:menutype;n1:byte);
procedure draw;
function result:byte;
procedure getkoords(i:byte;var xI,yI:word);
end;
4.2 Опис головних процедур та функцій
Модуль tetobj:
procedure kv ( var p : pointer ; VAR s : word ) - повертає вказівник на малюнок квадрата та відповідний розмір пам'яті
Модуль Int:
procedure drawmenu ( var res : longint ); Виконує виведення на екран та обробку меню.
procedure entername(score:longint;var name:string); Введення імені гравця
procedure best; Виведення таблиці кращих результатів
procedure clearbest; Очищення таблиці результатів
Модуль Game:
procedure startgame(var bl:tblock;var f:tfield;var score:integer); Основна процедура, яка виконує рух фігури по полю, викликає меню та обробляє результати.
function fall ( const bl : tblock ; const f : tfield ): boolean ; Повертає значення True , якщо фігура впала на дно стакана.
function left(const bl:tblock; const f:tfield):boolean;
function right(const bl:tblock; const:tfield):boolean;
function CanBeRotated(const block:tblock;const field:tfield): boolean; Ці функції повертають значення true якщо можливо виконати, відповідно, рух фігури вліво, вправо, або її поворот .
procedure NextFigure(var t1,p1:integer); Виводить наступну фігуру, повертає її тип і положення
procedure OutScore(score : integer); Виводить рахунок на екран
5. Опис інтерфейсу
Після запуску програми на екрані з'являються ігрове поле з фігурою, інформація про наступний блок та рахунок. Гра на початку знаходиться в стані паузи. Вгорі екрану - меню.
Головне меню містить такі пункти:
* Гра ( Game)
* Кращі результати (Best Results)
* Налаштування (Options)
Вибрати необхідний пункт можна за допомогою клавіш-стрілок та клавіші 'enter'. При цьому відкриється відповідне підменю.
Меню 'Гра' дозволяє розпочати нову гру, продовжити розпочату, або вийти з гри.
Меню 'Кращі рeзультати' - переглянути таблицю кращих результатів або очистити її.
За допомогою меню 'Налаштування', можна змінити розмір екрану, або вибрати рівень, з якого починати гру. На першому рівні на початку гри стакан пустий. На наступних рівнях найнижчі горизонтальні ряди ігрового поля заповнені.
Якщо в будь-який момент під час гри натиснути клавішу Esc, то викличеться меню. Гру буде призупинено. За допомогою пункту Continue її можна буде продовжити.
6. Результат роботи
Мал. 6.1 Вікно програми
Мал. 6.2 Введення імені
7. Лістинг програми
program main;
uses tetobj,game,crt,graph,ramki,int;
var bl:tblock;f:tfield;
score:integer;
s:string;
procedure myinitgraph;
var gd,gm:integer;
begin
gd:=detect;
initgraph(gd,gm,'c:/bp/bgi');
if graphresult<>0 then
begin writeln('Graphic Error');readkey;halt end;
end;
begin
release(heaporg);
randomize;
myinitgraph;
repeat startgame(bl,f,score) until 1=2;
entername(score,s);
closegraph;
end.
unit TetObj;
interface
uses crt,graph;
const maxX:byte=20;
maxY:byte=30;
size:byte=12;
level:byte=1;
speed:real=0.4;
type TMatrixField=array[0..31,1..45]of 0..1;
TMatrixBlock=array[1..4,1..4]of 0..1;
TBlock=object
mx,my,x,y:byte;
matr:TmatrixBlock;
t:byte;
pos:1..4;
p,p2:pointer;
s,s2:word;
procedure initmatrix;
constructor init;
constructor init2(t1,pos1:byte);
procedure rotate;virtual;
procedure draw;virtual;
procedure clear;virtual;
destructor done;
end;
Tfield=object
x1,y1:integer;
matr:TMatrixField;
constructor init(level:byte);
procedure draw;
procedure clear;
function full:boolean;
function fline (n:byte):boolean;
procedure dline (n:byte);
private
x2,y2:integer;
end;
implementation
constructor tfield.init;
var i,j:byte;
begin
for i:=1 to maxX do
for j:=1 to maxY do
matr[i,j]:=0;
for i:=0 to maxX+1 do
matr[i,maxY+1]:=1;
for j:=1 to maxY do begin
matr[0,j]:=1;
matr[maxX+1,j]:=1;
end;
randomize;
for i:=1 to level-1 do
for j:=1 to MaxX div 2 do
matr[random(maxX-2)+1,maxY-i+1]:=1;
x1:=20;y1:=40;
x2:=size*maxX;
y2:=size*maxY;
setviewport(x1,y1,x1+x2,y1+y2,true);
end;
procedure tblock.initmatrix;
var i,j:byte;
begin
for i:=1 to 4 do
for j:=1 to 4 do
matr[i,j]:=0;
case t of
1:case pos of
1,3: begin
mx:=4;
my:=1;
for j:=1 to mx do matr[j,1]:=1;
end;
2,4: begin
mx:=1;
my:=4;
for j:=1 to my do
matr[1,j]:=1;
end;
end;
2: case pos of
1,3: begin
mx:=3;
my:=2;
matr[1,1]:=1;
matr[2,1]:=1;
matr[2,2]:=1;
matr[3,2]:=1;
end;
2,4: begin
mx:=2;
my:=3;
matr[1,2]:=1;
matr[1,3]:=1;
matr[2,1]:=1;
matr[2,2]:=1;
end;
end;
3: case pos of
1: begin
mx:=3;
my:=2;
matr[2,1]:=1;
matr[1,2]:=1;
matr[2,2]:=1;
matr[3,2]:=1;
end;
2: begin
mx:=2;
my:=3;
matr[1,1]:=1;
matr[1,2]:=1;
matr[1,3]:=1;
matr[2,2]:=1;
end;
3: begin
mx:=3;
my:=2;
matr[2,2]:=1;
matr[1,1]:=1;
matr[2,1]:=1;
matr[3,1]:=1;
end;
4: begin
mx:=2;
my:=3;
matr[2,1]:=1;
matr[2,2]:=1;
matr[2,3]:=1;
matr[1,2]:=1;
end;
end;
4: case pos of
1,3: begin
mx:=3;
my:=2;
matr[2,1]:=1;
matr[3,1]:=1;
matr[1,2]:=1;
matr[2,2]:=1;
end;
2,4: begin
mx:=2;
my:=3;
matr[1,1]:=1;
matr[1,2]:=1;
matr[2,2]:=1;
matr[2,3]:=1;
end;
end;
5: begin
mx:=2;
my:=2;
for i:=1 to 2 do
for j:=1 to 2 do
matr[i,j]:=1;
end;
6: case pos of
1: begin
mx:=2;
my:=3;
matr[2,1]:=1;
matr[2,2]:=1;
matr[2,3]:=1;
matr[1,3]:=1;
end;
2: begin
mx:=3;
my:=2;
matr[1,1]:=1;
matr[2,1]:=1;
matr[3,1]:=1;
matr[3,2]:=1;
end;
3: begin
mx:=2;
my:=3;
matr[1,1]:=1;
matr[1,2]:=1;
matr[1,3]:=1;
matr[2,1]:=1;
end;
4: begin
mx:=3;
my:=2;
matr[1,1]:=1;
matr[1,2]:=1;
matr[2,2]:=1;
matr[3,2]:=1;
end;
end;
7: case pos of
1: begin
mx:=2;
my:=3;
matr[1,1]:=1;
matr[1,2]:=1;
matr[1,3]:=1;
matr[2,3]:=1;
end;
2: begin
mx:=3;
my:=2;
matr[1,2]:=1;
matr[2,2]:=1;
matr[3,2]:=1;
matr[3,1]:=1;
end;
3: begin
mx:=2;
my:=3;
matr[2,1]:=1;
matr[2,2]:=1;
matr[2,3]:=1;
matr[1,1]:=1;
end;
4: begin
mx:=3;
my:=2;
matr[1,2]:=1;
matr[1,1]:=1;
matr[2,1]:=1;
matr[3,1]:=1;
end;
end;
end;
end;
procedure kv ( var p: pointer;VAR s:word );
var p2:pointer;
S2:WORD;
begin
s:=imagesize(0,0,size,size);
getmem(p2,s);
getimage(0,0,size,size,p2^);
setfillstyle(1,4);
setcolor(12);
bar(0,0,size,size);
rectangle(2,2,size-1,size-2);
getmem(p,s);
getimage(0,0,size,size,p^);
putimage(0,0,p2^,normalput);
freemem(p2,s);
p2:=nil;
end;
constructor tblock.init;
var x1,y1,x2,y2,i,j:integer;
begin
randomize;
t:=random(100)mod 7 +1;
pos:=random(3)+1;
initmatrix;
x:=(maxX-mx) div 2;
y:=2;
kv(p,s);
p2:=nil;
end;
constructor tblock.init2;
begin
t:=t1;
pos:=pos1;
initmatrix;
x:=(maxX-mx) div 2;
y:=2;
kv(p,s);
p2:=nil;
end;
procedure tblock.draw;
var i,j:byte;
begin
s2:=imagesize(0,0,mx*size,my*size);
getmem(p2,s2);
getimage((x-1)*size,(y-1)*size,(x-1+mx)*size,
(y-1+my)*size,p2^);
for i:=1 to mx do
for j:=1 to my do
if matr[i,j]<>0 then putimage((x+i-2)*size,
(y+j-2)*size,p^,normalput);
end;
procedure tblock.clear;
var x1,x2,y1,y2:integer;
begin
putimage((x-1)*size,(y-1)*size,p2^,normalput);
freemem(p2,s2);
p2:=nil;
end;
procedure tblock.rotate;
begin
if pos<4 then inc(pos)else pos:=1;
x:=x+((mx+1) div 2);
y:=y+((my+1) div 2);
x:=x-((mx+1) div 2);
y:=y-((my+1) div 2);
initmatrix;
end;
procedure tfield.draw;
var i,j:byte;
p:pointer;
s,r,a,b:word;
col:word;
ar:array [1..5,1..4]of word;
begin
setfillstyle(1,blue);
bar(0,0,x2,y2);
setcolor(3);
for i:=1 to maxX-1 do
line(size*i,0,size*i,y2);
for i:=1 to maxY-1 do
line(0,size*i,x2,size*i);
ar[1,1]:=75*maxX*size div 100+4;
ar[1,2]:=35*maxY*size div 150-4;
ar[1,3]:=12;
ar[1,4]:=MaxX*size div 6;
ar[2,1]:=7*maxX*size div 10+3;
ar[2,2]:=75*maxY*size div 150-2;
ar[2,3]:=14;
ar[2,4]:=MaxX*size div 8;
ar[3,1]:=3*maxX*size div 10-6;
ar[3,2]:=1*maxY*size div 10-4;
ar[3,3]:=13;
ar[3,4]:=MaxX*size div 10;
for i:=1 to 3 do begin
setcolor(ar[i,3]);
a:=ar[i,1];b:=ar[i,2];
r:=ar[i,4];
{1}line(a,b,a+(r*3 div 10) ,b-(r*95)div 100);
line(a-(r*3 div 10) ,b-(r*95)div 100,a,b);
line(a+(r*3 div 10),b-(r*95)div 100,a-(r*3 div 10),
b-(r*95)div 100);
{2}line(a,b,a+(r*3 div 10) ,b+(r*95)div 100);
line(a-(r*3 div 10) ,b+(r*95)div 100,a,b);
line(a-(r*3 div 10),b+(r*95)div 100,a+(r*3 div 10),
b+(r*95)div 100);
{3}line(a,b,a-(r*95)div 100,b+(r*3 div 10));
line(a-(r*95)div 100,b-(r*3 div 10),a,b);
line(a-(r*95)div 100,b-(r*3 div 10),a-(r*95)div 100,
b+(r*3 div 10));
{4}line(a,b,a+(r*95)div 100,b+(r*3 div 10));
line(a+(r*95)div 100,b-(r*3 div 10),a,b);
line(a+(r*95)div 100,b-(r*3 div 10),a+(r*95)div 100,
b+(r*3 div 10));
{5}line(a+(45*r)div 100,b-(88*r)div 100,a,b);
line(a+(88*r)div 100,b-(45*r)div 100,a,b);
line(a+(45*r)div 100,b-(88*r)div 100,a+(88*r)div 100,
b-(45*r)div 100);
{6}line(a-(45*r)div 100,b-(88*r)div 100,a,b);
line(a-(88*r)div 100,b-(45*r)div 100,a,b);
line(a-(45*r)div 100,b-(88*r)div 100,a-(88*r)div 100,
b-(45*r)div 100);
{7}line(a-(45*r)div 100,b+(88*r)div 100,a,b);
line(a-(88*r)div 100,b+(45*r)div 100,a,b);
line(a-(45*r)div 100,b+(88*r)div 100,a-(88*r)div 100,
b+(45*r)div 100);
{8}line(a+(45*r)div 100,b+(88*r)div 100,a,b);
line(a+(88*r)div 100,b+(45*r)div 100,a,b);
line(a+(45*r)div 100,b+(88*r)div 100,a+(88*r)div 100,
b+(45*r)div 100);
end;
kv( p,s );
for i:=1 to maxX do
for j:=1 to maxY do
if matr [i,j] = 1 then putimage( (i-1)*size,
(j-1)*size,p^,normalput );
freemem( p,s );
p:=nil;
end;
procedure tfield.clear;
begin
setviewport(x1,y1,x1+x2,y1+y2,true);
setfillstyle(1,0);
bar(0,0,x2,y2)
end;
function tfield.full;
var i:byte;
begin
full:=false;
for i:=1 to maxX do
if matr[i,2]<>0 then full:=true ;
end;
function tfield.fline;
var i:byte;
t:boolean;
begin
t:=true;
for i:=1 to maxX do
if matr[i,n]=0 then t:=false;
fline:=t;
end;
procedure tfield.dline;
var i,j:byte;
pr:^pointer;
sz:word;
begin
for j:=n downto 2 do
for i:=1 to maxX do
matr[i,j]:=matr[i,j-1]
end;
destructor tblock.done;
begin
if p<>nil then freemem (p,s);
if p2<>nil then freemem (p2,s2 );
p:=nil;
p2:=nil;
end;
begin
end.
unit ramki;
interface
uses graph,crt;
type menutype=array[1..10]of string[15];
tramka=object
x,y,width,heigth:integer;
lighted:boolean;
col1,col2,col3:integer;
private
p:pointer;
s:word;
public
constructor init( x1, y1, xx , yy :word);
procedure mkactive;
procedure light;
procedure unlight;
procedure draw;
procedure clear;
destructor done;
end;
tsubmenu=object(tramka)
punkts:menutype;
n:byte;
col4:integer;
constructor init(const pnk:menutype;n1:byte;x1,y1:word);
procedure draw;
function result:byte;
private h:integer;
end;
tmainmenu=object(tsubmenu)
constructor init(const pnk:menutype;n1:byte);
procedure draw;
function result:byte;
procedure getkoords(i:byte;var xI,yI:word);
end;
implementation
constructor tramka.init;
begin
x:=x1;
y:=y1;
width:=xx;
heigth:=yy;
lighted:=false;
col1:=2;
col2:=4;
col3:=14;
end;
procedure tramka.mkactive;
begin
setviewport( x,y,x+width, y+heigth ,true);
end;
procedure tramka.light;
begin
if not lighted then begin
mkactive;
setcolor(red);
setlinestyle(0,$11,1);
rectangle(1,1,width-1,heigth-1) ;
lighted:=true;
end;
end;
procedure tramka.unlight;
begin
if lighted then begin
mkactive;
setcolor(14);
setlinestyle(0,$11,1);
rectangle(1,1,width-1,heigth-1) ;
lighted:=false;
end;
end;
procedure tramka.draw;
begin
mkactive;
s:=imagesize( 0,0,width ,heigth );
getmem( p,s);
getimage( 0,0,width,heigth,p^ );
setfillstyle(1,green);
bar( 0,0,width,heigth );
light;
end;
destructor tramka.done;
begin
if p<>nil then freemem(p,s);
p:=nil;
end;
procedure tramka.clear;
begin
mkactive;
unlight;
putimage(0,0,p^,normalput);
if p<>nil then freemem(p,s);
p:=nil;
end;
constructor tsubmenu.init;
var i:byte;
begin
n:=n1;
h:=15;
tramka.init(x1,y1,80,n*h+4);
for i:=1 to n do punkts[i]:=pnk[i];
col4:=14;
end;
procedure tsubmenu.draw;
var i:byte;
begin
tramka.draw;
setfillstyle(1,col4);
for i:=1 to n do begin
bar(3,(i-1)*h+3,width-3,(i)*h);
setcolor(col4);
rectangle(3,(i-1)*h+3,width-3,(i)*h) ;
setcolor(0);
outtextXY( 4, (i-1)*h+h div 2 , punkts[i])
end;
setcolor( red ); outtextXY( 4, h div 2 , punkts[1]);
rectangle(3,3,width-3,h);
end;
function tsubmenu.result;
var c:char; var i:byte;
begin
c:='q';
draw;
i:=1;
repeat
c:=readkey;
case c of
#72: begin
setcolor( 0 );
outtextXY( 4,(i-1)*h+h div 2,punkts[i] );
setcolor(col4);
rectangle(3,(i-1)*h+3,width-3,(i)*h) ;
if i=1 then i:=n
else i:=i-1;
setcolor ( red );
outtextXY( 4,(i-1)*h+h div 2,punkts[i] );
rectangle(3,(i-1)*h+3,width-3,(i)*h) ;
end;
#80: begin
setcolor( 0 );
outtextXY( 4,(i-1)*h+h div 2,punkts[i] );
setcolor(col4);
rectangle(3,(i-1)*h+3,width-3,(i)*h) ;
if i=n then i:=1
else i:=i+1;
setcolor ( red );
outtextXY( 4,(i-1)*h+h div 2,punkts[i] );
rectangle(3,(i-1)*h+3,width-3,(i)*h) ;
end;
end;
until (c=#13) or (c=#27) ;
if (c=#13) then result:=i
else result:=0;
while keypressed do readkey;
end;
constructor tmainmenu.init;
var i:byte;
begin
n:=n1;
heigth:=20;
width:=getmaxX-4;
h:=width div n;
tramka.init(2,2,width,heigth);
for i:=1 to n do punkts[i]:=pnk[i] ;
col4:=14;
end;
procedure tmainmenu.draw;
var i:byte;
begin
tramka.draw;
setfillstyle(1,col4);
setlinestyle(0,$aa,1);
for i:=1 to n do begin
bar((i-1)*h+3,3,i*h-1,heigth-3);
setcolor(col4);
rectangle((i-1)*h+3,3,i*h-1,heigth-3) ;
setcolor(black);
outtextXY( (i-1)*h+5, heigth div 2, punkts[i])
end;
setcolor( red ); outtextXY( 5, heigth div 2 , punkts[1]);
rectangle(3,3,h-1,heigth-3);
end;
function tmainmenu.result;
var c:char; var i:byte;
begin
c:='q';
draw;
i:=1;
repeat
c:=readkey;
case c of
#75: begin
setcolor( 0 );
outtextXY( (i-1)*h+5, heigth div 2 , punkts[i]);
setcolor(col4);
rectangle((i-1)*h+3,3,i*h-1,heigth-3) ;
if i=1 then i:=n
else i:=i-1;
setcolor ( red );
outtextXY( (i-1)*h+5, heigth div 2 , punkts[i]);
rectangle((i-1)*h+3,3,i*h-1,heigth-3) ;
end;
#77: begin
setcolor( 0 );
outtextXY( (i-1)*h+5, heigth div 2 , punkts[i]);
setcolor(col4);
rectangle((i-1)*h+3,3,i*h-1,heigth-3) ;
if i=n then i:=1
else i:=i+1;
setcolor ( red );
outtextXY( (i-1)*h+5, heigth div 2 , punkts[i] );
rectangle((i-1)*h+3,3,i*h-1,heigth-3) ;
end;
end;
until (c=#13);
if c=#13 then result:=i
else result:=n+1;
end;
procedure tmainmenu.getkoords;
begin
yI:=heigth+2;
xI:=x+(i-1)*h;
end;
begin
end.
unit int;
interface
uses ramki,graph,crt,tetobj;
procedure drawmenu(var res:longint);
procedure entername(score:longint;var name:string);
procedure best;
procedure clearbest;
implementation
procedure drawmenu;
var xI,yI:word;
i,j,k:byte;
C,d:CHAR;
block:tblock;
field:tfield;
x1,y1,x2,y2:integer;
smenu,op:tsubmenu;
mmenu:tmainmenu;
const men:menutype=('Game','Best Results','Options',
'','','','','','','');
smen1:menutype=('Start','Continue','Exit',
'','','','','','','');
smen3:menutype=('Size','Level',
'','','','','','','','');
smen2:menutype=('Results','Clear',
'','','','','','','','');
speed:menutype=('Level1','Level2','Level3',
'Level4','Level5','','','','','');
sz:menutype=('Small','Normal','Large',
'','','','','','','');
begin
mmenu.init(men,3);
i:=mmenu.result;
mmenu.unlight;
mmenu.getkoords(i,xI,yI);
case i of
1:begin
smenu.init(smen1,3,xI,yI);
j:=smenu.result;
smenu.clear;
if j=1 then res:=1;
if j=2 then res:=2;
if j=3 then res:=-3;
smenu.done;
end;
2:begin
smenu.init(smen2,2,xi,yi);
j:=smenu.result;
smenu.clear;
if j=1 then res:=-1;
if j=2 then res:=-2;
smenu.done;
end;
3:begin
smenu.init(smen3,2,xI,yI);
j:=smenu.result;
smenu.unlight;
if j=1 then begin
op.init(sz,3,smenu.x+smenu.width,smenu.y+3);
k:=op.result;
op.clear;
op.done;
if k=1 then res:=3;
if k=2 then res:=4;
if k=3 then res:=5;
end;
if j=2 then begin
op.init(speed,5,smenu.x+smenu.width,smenu.y+3);
k:=op.result;
op.clear;
op.done;
if (k>=1)and(k<=5)then res:=5+k;
end;
smenu.clear;
smenu.done;
end;
end;
end;
procedure entername;
type t=record
name:string;
score:longint;
end;
tf=file of t;
var a,b:tf;
c,d,t1:t;
ram:tramka;
i:byte;
bool:boolean;
begin
bool:=false;
assign(a,'file.txt');
reset(a);
assign(b,'temp.txt');
rewrite(b); t1.score:=score;
i:=0;
while (not eof(a))and(i<=12) do
begin
i:=i+1;
read(a,c);
write(b,c);
end;
close(a); close(b); rewrite(a); reset(b);
c.score:=1000000;
read(b,d);
write(a,c);
while not eof(b) do
begin
c:=d;
read(b,d);
if (d.score=score)
then begin
ram.init((GetMaxX-300)div 2,(GetMaxY-200)div 2,300,200);
ram.draw;
SetTextJustify(1,1);
OutTextXY(ram.width div 2, 30, 'Enter your nane:');
SetTextJustify(0,2);
setfillstyle(1,10);
bar((ram.width-150)div 2,115,(ram.width+150)div 2,135);
GotoXY(33,17);
textcolor(red);
textbackground(1);
readln(name);
t1.name:=name;
write(a,t1);
ram.clear;
ram.done;
bool:=true;
end;
write(a,d);
end;
close(a);
close(b);
if bool then best;
end;
procedure best;
type t=record
name:string;
score:longint;
end;
tf=file of t;
var a:tf;
i:byte;
x:t;
ram:tramka;
st:string;
begin
ram.init((GetmaxX-400)div 2,(GetMaxY-300)div 2,400,300);
ram.draw;
assign(a,'file.txt');
reset(a);
read(a,x);
for i:=1 to 10 do if not eof(a) then
begin
GoToXY(100,100);
read(a,x);
str(x.score,st);
outTextXY(20,50+i*15,x.name);OutTextXY(200,50+i*15,st);
end;
while keypressed do readkey;readkey;
ram.clear;
ram.done;
end;
procedure clearbest;
type t=record
name:string;
score:longint;
end;
tf=file of t;
var f:tf;
tt:t;
i:byte;
begin
assign(f,'file.txt');
rewrite(f);
tt.score:=100000;
write(f,tt);
for i:=1 to 50 do begin
tt.name:='noname';
tt.score:=5;
write(f,tt);
end;
close(f);
end;
begin
end.
unit game;
interface
uses graph,crt,windos,tetobj,ramki,int;
procedure startgame(var bl:tblock;var f:tfield;
var score:integer);
function time:real;
implementation
var ramka,r:tramka;
ng:boolean;
const cont:boolean=false;
ch:char=#27;
function time;
var h,m,s,ms : word;
begin
Gettime(h,m,s,ms);
time:=3600*h+60*m+s+ms/100;
end;
function fall(const bl:tblock; const f:tfield):boolean;
var t:boolean;
i,j:byte;
begin
t:=false;
for i:=1 to bl.mx do
for j:=bl.my downto 1 do
if ( bl.matr[i,j]<>0 )and
( f.matr[bl.x+i-1,bl.y+j]<>0 )
then t:=true;
fall:=t;
end;
function left(const bl:tblock; const f:tfield):boolean;
var t:boolean;
i,j:byte;
begin
t:=false;
for j:=1 to bl.my do
for i:=bl.mx downto 1 do
if ( bl.matr[i,j]<>0 )and
( f.matr[bl.x+i-2,bl.y+j-1]<>0 )
then t:=true;
left:=t;
end;
function right(const bl:tblock; const f:tfield):boolean;
var t:boolean;
i,j:byte;
begin
t:=false;
for j:=1 to bl.my do
for i:=bl.mx downto 1 do
if ( bl.matr[i,j]<>0 )and
( f.matr[bl.x+i,bl.y+j-1]<>0 )
then t:=true;
right:=t;
end;
procedure AddBlock( const b:tblock; var f:tfield);
var i,j:byte;
begin
for i:=1 to b.mx do
for j:=1 to b.my do
if b.matr[i,j]=1 then f.matr[b.x+i-1,b.y+j-1]:=1;
b.done;
end;
procedure NextFigure(var t1,p1:integer);
var bb:tblock;
begin
ramka.clear;
ramka.draw;
ramka.light;
OutTextXY(10,10,'Next:');
bb.init;
bb.x:=4-(bb.mx div 2);
bb.y:=5-(bb.my div 2);
bb.draw;
t1:=bb.t;
p1:=bb.pos;
bb.done;
end;
function CanBeRotated(const block:tblock;
const field:tfield):boolean;
var m,i,j:byte;
t:boolean;
begin
if block.mx>block.my then m:=block.mx else m:=block.my;
t:=true;
for i:=1 to m do
for j:=1 to m do
if field.matr[block.x+i-1,block.y+j-1]<>0 then
t:=false;
CanBeRotated:=t;
end;
procedure OutScore(score : integer);
var strsc:string;
begin
r.clear;
r.draw;
r.light;
str(score,strsc);
outtextxy(5,10,'Score:');
outtextxy(5,25, strsc);
end;
procedure changeoptions(k:byte;var speed:real);
begin
if k=1 then begin size:=15;
maxX:=15;
maxY:=24;
end;
if (k=2) then begin size:=12;
maxX:=20;
maxY:=30
end;
if k=3 then begin size:=12;
maxX:=25;
maxY:=35
end;
if k=4 then speed:=0.5;
if k=5 then speed:=0.45;
if k=6 then speed:=0.4;
if k=6 then speed:=0.37;
if k=7 then speed:=0.33;
if (k>=4)and(k<=8)then level:=k-3;
end;
procedure StartGame;
var i,j:byte;
tm,sc:real;
k1,k2:integer;
re:longint;
stt:string;
begin
re:=0;
score:=0;
sc:=score;
f.init(level);
f.draw;
ramka.init(350,50,6*size,7*size);
ramka.draw;
r.init(350,200,50,50);
r.draw;
nextfigure( k1,k2 );
Outscore(score);
setviewport( f.x1,f.y1,f.x1+size*maxX,f.y1+size*maxY, false);
while (not f.full)do begin
tm:=time;
bl.init2(k1,k2);
nextfigure( k1,k2 );
setviewport( f.x1,f.y1,f.x1+size*maxX,f.y1+size*maxY, false);
bl.draw;
{ch:='/'; }
while (not fall(bl,f))do begin delay(1000);
if keypressed then begin
ch:=readkey;
if ch=#0 then ch:=readkey;
bl.clear;
case ch of
#75: if not left(bl,f) then bl.x:=bl.x-1;
#77: if not right(bl,f) then bl.x:=bl.x+1;
#72: if canberotated(bl,f)then bl.rotate;
end; bl.draw; end;
if (time>=tm+speed)or (ch=#80) then begin
bl.clear;
bl.y:=bl.y+1;
tm:=time ;
bl.draw;
end;
if (ch=#27) then BEGIN
ramka.unlight;r.unlight;
REPEAT cont:=true;
drawmenu(re);
ch:='?';
if re=-1 then best ;
if re=-2 then begin clearbest;best;end;
if (re>=3)or(re=1)or(re=-3) then begin
if cont then begin
entername(score,stt);
bl.done;
f.clear;
ramka.clear;
r.clear;
ramka.done;
r.done;
changeoptions(re-2,speed);
end;
if re=-3 then halt;
exit;end;
UNTIL RE=2;
ch:='?';
ramka.light;r.light;
setviewport( f.x1,f.y1,f.x1+size*maxX,
f.y1+size*maxY, false);
END;
end;
addblock(bl,f);
bl.done;
for j:=1 to maxY do begin;
if f.fline(j) then begin
f.dline(j);
f.clear;
f.draw;
score:=score+10;
outscore( score );
setviewport( f.x1,f.y1,f.x1+size*maxX,f.y1+size*maxY ,true);
if score>=sc+50 then begin
sc:=score;
speed:=0.8*speed;
end;
end;
CH:=' '
end;
end;
cont:=false;
bl.done;
f.clear;
ramka.clear;
r.clear;
ramka.done;
r.done;
entername(score,stt);
drawmenu(re);
end;
begin
CONT:=FALSE;
end.
Висновки
Виконавши дану курсову роботу на тему «Реалізація гри «Тетріс»», я засвоїла та вдосконалила навички роботи в середовищі програмування Pascal, отримані протягом навчального семестру.
Я створила ігрову програму, в якій були використані усі елементи, що я вивчала протягом року: таймер, меню, об'єкти, динамічне створення об'єктів, повідомлення Windows та ін.
В основі середовища Pascal лежить використання мови програмування Object Pascal -- об'єктно-орієнтованого розширення мови Pascal реалізації Turbo Pascal фірми Borland.
Таким чином, програма, створена в середовищі Pascal за допомогою об'єктно-орієнтованої мови складається із об'єктів.
Крім випадку, коли об'єкти створюються в середовищі під час створення форми (шляхом розміщення відповідного компонента на формі), в Pascal підтримується динамічне створення об'єкту під час виконання програми, що і було використане у моїй програмі.
Отже у сучасному світі, де технології розвиваються надзвичайно швидко, використання середовищ програмування із швидким і простим створенням інтерфейсу є дуже актуальним. Тому я обрала саме середовище Pascal.
Список використаної літератури
1. У. Сустаков. Мова програмування Pascal. М.: Радіо і зв'язок. 1994.
2. Д. Ликов. А. Бабонин. Мова програмування Pascal для персонального комп'ютера. М.: Радіо і зв'язок. 1993.
3. М. Русаків та інших. Довідник виконуваних функцій Borland Pascal 7.0. Київ: Діалектика. 1994.
4. Р. Виземан. Word for Windows (програми для персональних комп'ютерів). М.: Текст. 1994.
5. Excel 5.0 - англійська і російська версії. СПб: BHV-Санкт-Петербург. 1994.
6. Кнут Д. Искусство программирования для ЭВМ. Основные алгоритмы.- М., 1976. Т. 1. Получисленные алгоритмы.- М., 1977. Т. 2. Сортировка и поиск.- М., 1978. Т. 3.
7. Майерс Г. Надежностьпрограммногообеспечения.- М., 1980.
8. Майерс Г. Искусство тестированияпрограмм.-М., 1982.
9. Поляков Д.Б., Круглов И.Ю. Программирование в средеТурбо Паскаль. Версия 5.5. М., 1992.
10. Пильщиков В.Н. Сборник упражнений по языку Паскаль.-М., 1989.
11. Проценко В.С., Чаленко П.Й., Ставровський А.Б. Техніка програмування мовою Сі.- К., 1993.
12. Рейнгольд Э., Нивергельт Ю., Део Н. Комбинаторные алгоритмы. М., 1980
13. Слэйгл Дж. Искусственный интеллект. М.: Мир, 1973.
14. Ставровський А.Б., Коваль Ю.В. Вступний курс програмування.- К., 1998.
15. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс.- М., 1997.
16. Форсайт Р. Паскаль для всех.- М., 1987.
17. Boyer R.S., Moore J.S. A faststringsearching algorithm.- Comm.ACM, 1977.- № 10
18. Morris J.H. Jr, Pratt V.R. A linearpatternmatching algorithm.- Tech.Rept. 40, Comput. Centre, UniversityofCalifornia, Berkeley.- 1970
Размещено на Allbest.ru
Подобные документы
Проектування архітектури гри "Тетріс". Аналіз вимог до неї. Вивчення особливостей реалізації, кодування та тестування програми. Алгоритм побудови робочого поля. Вибір мови програмування. Розробка і налагодження тексту програми. Інструкції з експлуатації.
курсовая работа [460,9 K], добавлен 04.03.2014Розробка логічної гри "Тетріс" у складі набору об’єктно-орієнтованих моделей, програмного коду з використанням об’єктно-орієнтованної мови Java. Проектування архітектури гри, аналіз вимог до неї, опис реалізації, кодування та тестування програми.
курсовая работа [2,2 M], добавлен 24.10.2010Розробка програми для моделювання роботи алгоритму Дейкстри мовою C# з використанням об’єктно-орієнтованих принципів програмування. Алгоритм побудови робочого поля. Програмування графічного інтерфейсу користувача. Тестування програмного забезпечення.
курсовая работа [991,4 K], добавлен 06.08.2013Редагування за допомогою текстового редактора NotePad вхідного файлу даних. Програмна реалізація основного алгоритму з використанням засобів об'єктно-орієнтованого програмування. Об’ява та опис класів і об'єктів. Розробка допоміжних програмних засобів.
курсовая работа [69,4 K], добавлен 14.03.2013Постановка задачі: створення списку співробітників інституту. Аналіз мов програмування та вибір мови PascalABC.Net - 32-розрядної програми, яка може працювати на сучасних версіях Windows. Опис функцій та процедур, реалізації інтерфейсу користувача.
курсовая работа [277,8 K], добавлен 25.06.2015Цілі і завдання розробки, її предмет і актуальність. Опис предметної області, цілі і завдання програми. Вибір методу рішення, опис процесу програмування і вибір інструментальних засобів для реалізації проекту, опис вхідних та вихідних даних, інтерфейсу.
курсовая работа [327,1 K], добавлен 01.09.2014Розробка та схема алгоритму проектованої гри. Особливості мови програмування та середовища "Microsoft Visual Studio C++ 2008 Express Edition". Лістинг програми та загальний опис її роботи, аналіз отриманих результатів та оцінка практичної ефективності.
курсовая работа [762,8 K], добавлен 03.05.2015Модель аналізу-синтезу компіляції. Формальний опис вхідної мови програмування. Вибір технології програмування, проектування таблиць транслятора та вибір структур даних. Опис програми реалізації лексичного аналізатора. Розробка дерев граматичного розбору.
курсовая работа [75,8 K], добавлен 26.12.2009Створення програми для роботи з веб-камерою з автоматичним визначенням встановленої камери на комп'ютері. Характеристика апаратної конфігурації програми. Опис мови і середовища програмування. Розробка алгоритму, інструкції для програміста та користувача.
курсовая работа [1,2 M], добавлен 26.07.2013Методи первинної обробки даних - згладжування та характеристика сплайнів. Загальна характеристика об'єктно-орієнтованої мови Java. Принципи побудови графічного інтерфейсу. Розробка алгоритму програми та інтерфейсу користувача програмного продукту.
дипломная работа [3,3 M], добавлен 10.10.2013