Wieza Hanoi

ManiaC
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 24 maja 2007, o 17:00
Płeć: Mężczyzna
Lokalizacja: Kielce

Wieza Hanoi

Post autor: ManiaC »

Mam pytanie:Umie ktos zrobic Wieze Hanoi w programie Eli?
jasny
Użytkownik
Użytkownik
Posty: 845
Rejestracja: 2 kwie 2006, o 23:32
Płeć: Mężczyzna
Lokalizacja: Limanowa
Pomógł: 191 razy

Wieza Hanoi

Post autor: jasny »

Mi się kiedyś nudziło to napisałem tę grę w pascalu w trybie graficznym :)

Kod: Zaznacz cały

program hanoi;

uses crt,graph;
type stos=array[1..10] of integer;
var n,z:integer;
    pal1,pal2,pal3:stos;
    p1,p2,p3,up,ruchy:integer;
const liczby:array[0..10] of string=('0','1','2','3','4','5','6','7','8','9','10');

procedure graf;
var ster,tryb:integer;
begin
ster:=0;
initgraph(ster,tryb,'BGI');
end;

procedure menu; forward;

procedure poczatek;
var m:char;
begin
graf;
settextstyle(1,0,8);setcolor(6);setbkcolor(10);
outtextxy(getmaxx div 2 -220,getmaxy div 2 -100,'Wieze Hanoi');
settextstyle(1,0,2);setcolor(1);
outtextxy(getmaxx div 2 -100,getmaxy div 2 +50,'Autor:  Tomek Biernat');
setcolor(red);setlinestyle(1,3,1);
rectangle(getmaxx div 2 -110,getmaxy div 2 +50,getmaxx div 2 +140,getmaxy div 2 +80);
settextstyle(0,0,0);setcolor(4);
outtextxy(30,getmaxy-40,'Nacisnij dowolny klawisz, aby kontynuowac');
m:=readkey;
menu;
end;

procedure koniec;
begin
cleardevice;
settextstyle(1,0,8);setcolor(6);setbkcolor(10);setlinestyle(0,0,0);
outtextxy(getmaxx div 2 -130,getmaxy div 2 -170,'KONIEC');
circle(getmaxx div 2 -40,getmaxy div 2 ,20);
circle(getmaxx div 2 +40,getmaxy div 2 ,20);
circle(getmaxx div 2 -40,getmaxy div 2 ,15);
circle(getmaxx div 2 +40,getmaxy div 2 ,15);
rectangle(getmaxx div 2 -70, getmaxy div 2+80,getmaxx div 2 +70,getmaxy div 2 +85);
rectangle(getmaxx div 2 -70, getmaxy div 2 +50,getmaxx div 2 -65,getmaxy div 2+80);
rectangle(getmaxx div 2 +70, getmaxy div 2 +50,getmaxx div 2 +65,getmaxy div 2+80);
delay(1500);
halt;
end;

procedure jane;
begin
sound(392);delay(400);
nosound;delay(100);
sound(392);delay(250);
nosound;delay(80);
sound(523);delay(400);
nosound;delay(80);
sound(523);delay(250);
nosound;delay(60);
sound(494);delay(200);
nosound;delay(60);
sound(392);delay(200);
nosound;delay(60);
sound(440);delay(500);
nosound;
end;

function power(x:integer):integer;
var i,w:integer;
begin
w:=1;
for i:=1 to x do w:=w*10;
power:=w;
end;

function cyfry(a:integer):string;
var r,i:integer;
    w:string;
begin
r:=0;
repeat r:=r+1; until power(r)>a;
w:=' ';
for i:=1 to r do begin
 w:=w+liczby[a div power(r-1)];
 a:=a-(a div power(r-1))*power(r-1);
 r:=r-1;
 end;
cyfry:=w;
end;

function max(x:integer):integer;
var i,k:integer;
begin
k:=1;
for i:=1 to x do k:=k*2;
max:=k-1;
end;

procedure rysuj(a,b,c:stos;d,e,f,g,h:integer);
var i:integer;
begin
cleardevice;
setlinestyle(0,0,0);setcolor(4);
rectangle(getmaxx div 2 -7*g-5,getmaxy div 2 +60,getmaxx div 2 +7*g+5,getmaxy div 2 +64);
rectangle(getmaxx div 2 -2,getmaxy div 2 +60-20*g-5,getmaxx div 2 +2,getmaxy div 2 +60-e*20);
rectangle(getmaxx div 2 -21*g-30,getmaxy div 2 +60,getmaxx div 2 -7*g-20,getmaxy div 2 +64);
rectangle(getmaxx div 2 -14*g-27,getmaxy div 2 +60-20*g-5,getmaxx div 2 -14*g-23,getmaxy div 2 +60-d*20);
rectangle(getmaxx div 2 +7*g+20,getmaxy div 2 +60,getmaxx div 2 +21*g+30,getmaxy div 2 +64);
rectangle(getmaxx div 2 +14*g+23,getmaxy div 2 +60-20*g-5,getmaxx div 2 +14*g+27,getmaxy div 2 +60-f*20);
setfillstyle(0,2);
for i:=1 to d do begin
 rectangle(getmaxx div 2 -14*g-25-7*a[i],getmaxy div 2 +60-i*20,getmaxx div 2 -14*g-25+7*a[i],getmaxy div 2 +60-(i-1)*20);
 outtextxy(getmaxx div 2 -14*g-27,getmaxy div 2 +65-i*20,liczby[a[i]]);
 end;
for i:=1 to e do begin
 rectangle(getmaxx div 2 -7*b[i],getmaxy div 2 +60-i*20,getmaxx div 2 +7*b[i],getmaxy div 2 +60-(i-1)*20);
 outtextxy(getmaxx div 2 -2,getmaxy div 2 +65-i*20,liczby[b[i]]);
 end;
for i:=1 to f do begin
 rectangle(getmaxx div 2 +14*g+25-7*c[i],getmaxy div 2 +60-i*20,getmaxx div 2 +14*g+25+7*c[i],getmaxy div 2 +60-(i-1)*20);
 outtextxy(getmaxx div 2 +14*g+23,getmaxy div 2 +65-i*20,liczby[c[i]]);
 end;
if h>0 then begin
 rectangle(getmaxx div 2 -7*h,getmaxy div 2 -g*20-20,getmaxx div 2 +7*h,getmaxy div 2-(g-1)*20-20);
 outtextxy(getmaxx div 2 -2,getmaxy div 2 -g*20-15,liczby[h]);
 end;
outtextxy(getmaxx div 2 -14*g-27,getmaxy div 2 +75,'1');
outtextxy(getmaxx div 2 -2,getmaxy div 2 +75,'2');
outtextxy(getmaxx div 2 +14*g+23,getmaxy div 2 +75,'3');
end;

procedure naj;
var f:text;
    a:stos;
    i:integer;
    m:char;
begin
assign(f,'BGI\w.xxx');
reset(f);
cleardevice;
outtextxy(40,20,'Najlepsze wyniki:');
for i:=1 to 10 do begin
 readln(f,a[i]);
 outtextxy(20,30+20*i,'Poziom');
 outtextxy(60,30+20*i,cyfry(i));
 outtextxy(85,30+20*i,':');
 if a[i]=0 then outtextxy(93,30+20*i,' -') else begin
   if a[i]=max(i) then setcolor(5);
   outtextxy(93,30+20*i,cyfry(a[i]));end;
 setcolor(1);
 end;
close(f);
outtextxy(30,260,'Nacisnij r, aby zresetowac wyniki.');
outtextxy(30,280,'Nacisnij m, aby powrocic do menu.');
repeat m:=readkey; until (m='r') or (m='m');
case m of
 'm':menu;
 'r':begin
   rewrite(f);
   for i:=1 to 10 do writeln(f,0);
   close(f);
   naj;
   end;
 end;
end;

procedure graj2; forward;

procedure zapisz(aa,bb,cc:stos;dd,ee,ff,gg,hh,razy:integer);
var p:text;
    i:integer;
begin
assign(p,'BGI\z.xxx');
rewrite(p);
writeln(p,gg);
writeln(p,dd,' ',ee,' ',ff);
for i:=1 to dd do write(p,aa[i],' ');writeln(p);
for i:=1 to ee do write(p,bb[i],' ');writeln(p);
for i:=1 to ff do write(p,cc[i],' ');writeln(p);
writeln(p,hh);
write(p,razy);
close(p);
cleardevice;
outtextxy(20,20,'Gra zostala zapisana.');
delay(1000);
graj2;
end;

procedure czytaj;
var p:text;
    i:integer;
begin
assign(p,'BGI\z.xxx');
reset(p);
readln(p,n);
readln(p,p1,p2,p3);
for i:=1 to p1 do read(p,pal1[i]);
for i:=p1+1 to n do pal1[i]:=0;
readln(p);
for i:=1 to p2 do read(p,pal2[i]);
for i:=p2+1 to n do pal2[i]:=0;
readln(p);
for i:=1 to p3 do read(p,pal3[i]);
for i:=p3+1 to n do pal3[i]:=0;
readln(p);
readln(p,up);
read(p,ruchy);
close(p);
cleardevice;
outtextxy(20,20,'Gra zostala wczytana.');
delay(1000);
if up>0 then z:=1;
graj2;
end;

procedure czynapewno;
var m:char;
begin
cleardevice;setcolor(1);
outtextxy(getmaxx div 2 -150,40,'Czy na pewno chcesz zakonczyc gre?');
outtextxy(getmaxx div 2 -75,60,'t - Tak,  n - Nie');
repeat m:=readkey; until (m='t') or (m='n');
case m of
't':menu;
'n':graj2;
end;
end;

procedure graj;
var i:integer;
begin
repeat
cleardevice;
outtextxy(20,30,'Wybierz poziom (podaj liczbe krazkow od 1 do 10), po czym nacisnij Enter');
textcolor(6);gotoxy(10,5);
readln(n);
until (n>0) and (n<=10);
cleardevice;
for i:=0 to n-1 do begin
 pal1[n-i]:=i+1;
 pal2[i+1]:=0;
 pal3[i+1]:=0;
 end;
p1:=n; p2:=0; p3:=0;up:=0;ruchy:=0;
graj2;
end;

procedure graj2;
var i:integer;
    w:char;
    f:text;
    a:stos;
label poloz;
begin
if z=1 then goto poloz;
cleardevice;
rysuj(pal1,pal2,pal3,p1,p2,p3,n,up);
setcolor(1);
outtextxy(40,getmaxy div 2 +130,'Ruchy:'); setcolor(5);
outtextxy(100,getmaxy div 2 +130,cyfry(ruchy));
repeat
repeat
w:=readkey;
case w of
 '1':begin if p1>0 then begin up:=pal1[p1]; pal1[p1]:=0; p1:=p1-1; z:=1;end;end;
 '2':begin if p2>0 then begin up:=pal2[p2]; pal2[p2]:=0; p2:=p2-1; z:=1;end;end;
 '3':begin if p3>0 then begin up:=pal3[p3]; pal3[p3]:=0; p3:=p3-1; z:=1;end;end;
 'q':czynapewno;
 's':zapisz(pal1,pal2,pal3,p1,p2,p3,n,up,ruchy);
 end;
until z=1;
poloz:
cleardevice;
rysuj(pal1,pal2,pal3,p1,p2,p3,n,up);
setcolor(1);
outtextxy(40,getmaxy div 2 +130,'Ruchy:'); setcolor(5);
outtextxy(100,getmaxy div 2 +130,cyfry(ruchy));
repeat
w:=readkey;
case w of
 '1':begin if (pal1[p1]>up) or (p1=0) then begin p1:=p1+1; pal1[p1]:=up; up:=0; ruchy:=ruchy+1;z:=2;end;end;
 '2':begin if (pal2[p2]>up) or (p2=0) then begin p2:=p2+1; pal2[p2]:=up; up:=0; ruchy:=ruchy+1;z:=2;end;end;
 '3':begin if (pal3[p3]>up) or (p3=0) then begin p3:=p3+1; pal3[p3]:=up; up:=0; ruchy:=ruchy+1;z:=2;end;end;
 'q':begin z:=2;czynapewno;end;
 's':begin z:=2;zapisz(pal1,pal2,pal3,p1,p2,p3,n,up,ruchy);end;
 end;
until z=2;
cleardevice;
rysuj(pal1,pal2,pal3,p1,p2,p3,n,up);
setcolor(1);
outtextxy(40,getmaxy div 2 +130,'Ruchy:'); setcolor(5);
outtextxy(100,getmaxy div 2 +130,cyfry(ruchy));
until (p1=0) and (p2=0);
cleardevice;
rysuj(pal1,pal2,pal3,p1,p2,p3,n,up);
setcolor(1);
outtextxy(40,getmaxy div 2 +130,'Twoj wynik to:'); setcolor(5);
outtextxy(160,getmaxy div 2 +130,cyfry(ruchy)); setcolor(1);
assign(f,'BGI\w.xxx');
reset(f);
for i:=1 to 10 do readln(f,a[i]);
close(f);
if (ruchy<a[n]) or (a[n]=0) then begin
 outtextxy(40,getmaxy div 2 +142,'Ustanowiles nowy rekord!');
 a[n]:=ruchy;
 rewrite(f);
 for i:=1 to 10 do writeln(f,a[i]);
 close(f);
 end
else begin
 outtextxy(40,getmaxy div 2 +142,'Rekord wynosi');setcolor(5);
 outtextxy(160,getmaxy div 2 +142,cyfry(a[n]));setcolor(1);
 end;
if ruchy<>max(n) then begin
 outtextxy(40,getmaxy div 2 +154,'Minimalna ilosc ruchow w tym poziomie to');
 outtextxy(360,getmaxy div 2 +154,cyfry(max(n)));
end
else outtextxy(40,getmaxy div 2 +154,'Gratulacje, to minimalna ilosc ruchow w tym poziomie!');
jane;
outtextxy(40,getmaxy div 2 +170,'Nacisnij Enter, aby powrocic do menu.');
textcolor(11);
readln;
menu;
end;

procedure klawisze;
var m:char;
begin
cleardevice;
outtextxy(20,20,'Celem gry jest przeniesienie krazkow z pierwszego stosu na trzeci.');
outtextxy(20,40,'Nie mozna polozyc wiekszego krazka na mniejszy.');
outtextxy(20,60,'Aby podniesc krazek z wybranego stosu, nacisnij 1, 2, lub 3.');
outtextxy(20,80,'Nacisnij ponownie 1, 2, lub 3, aby polozyc krazek na wskazany stos.');
outtextxy(20,100,'Nacisnij s, aby zpisac gre.');
outtextxy(20,120,'Nacisnij q, aby wyjsc z gry do menu.');
outtextxy(20,155,'Wcisnij Enter, aby powrocic do menu.');
textcolor(11);
readln;
menu;
end;

procedure menu;
var m:char;
begin
cleardevice;
setbkcolor(11);settextstyle(4,0,6);setcolor(6);
outtextxy(getmaxx div 2 -70,120,'MENU');settextstyle(2,0,5);setcolor(1);
outtextxy(getmaxx div 2 -50,getmaxy div 2,'Wybierz opcje:');
outtextxy(getmaxx div 2 -40,getmaxy div 2 +30,'1 - Zacznij gre');
outtextxy(getmaxx div 2 -40,getmaxy div 2 +50,'2 - Instrukcje');
outtextxy(getmaxx div 2 -40,getmaxy div 2 +70,'3 - Wczytaj gre');
outtextxy(getmaxx div 2 -40,getmaxy div 2 +90,'4 - Najlepsze wyniki');
outtextxy(getmaxx div 2 -40,getmaxy div 2 +110,'5 - Wyjscie');
repeat m:=readkey;until (m='1') or (m='2') or (m='3') or (m='4') or (m='5');
case m of
 '1':graj;
 '2':klawisze;
 '3':czytaj;
 '4':naj;
 '5':koniec;
end;
end;


begin
poczatek;
readln;
end.
Będzie działało, jeśli w katalogu gdzie jest skompilowany powyższy kod będzie folder BGI z plikami egavga.bgi, goth.chr, litt.chr, trip.chr (pliki są standardowo w pascalu, treba poszukać) :)
Ostatnio zmieniony 24 maja 2007, o 22:38 przez jasny, łącznie zmieniany 1 raz.
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

Wieza Hanoi

Post autor: Rafal88K »

Jasny całkiem spory kawałek kodu Ja też mam tylko w C++ i nie jest to gra tylko program, który pokazuje co mamy zrobić żeby jak najszybciej wygrać:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

void hanoi(int ile, int x, int y, int pom)
{
     if(ile>0)
     {
            hanoi(ile-1, x, pom, y);
            cout << "Przenies krazek z " << x << " na " << y << endl;
            hanoi(ile-1,pom,y,x);
     }
}

int main()
{
    int iIle, iZ, iNa, iPomocnicza;
    cout << "Podaj 4 liczby np.: 3 1 3 2" << endl;
    cout << "Oznacza, ze masz 3 krazki i przenosisz krazk z 1-ego na 3-eci drazek." << endl;
    cout << endl;
    cin >> iIle >> iZ >> iNa >> iPomocnicza;
    hanoi(iIle,iZ,iNa,iPomocnicza);
    cout << endl;
    system("pause");
    return 0;
}
ManiaC
Użytkownik
Użytkownik
Posty: 2
Rejestracja: 24 maja 2007, o 17:00
Płeć: Mężczyzna
Lokalizacja: Kielce

Wieza Hanoi

Post autor: ManiaC »

Dziala tylko jest jeden problem zanioslem gosciowi od infy i powiedzial mi ze woli gdybym to zrobil w eli to bedzie mial gotowy material (pewnie sam nie umie zrobic:P) No i nie mam zrobic gry tylko "animacja" I na poczatku ma sie pytac ile klockow ma byc i czas miedzy kolejnymi przelozeniami klocków.
ODPOWIEDZ