Nie procedure to co?


(Moore96) #1

Witam.Mam następujący problem.Postanowiłem napisać prostą gierkę w trybie tekstowym.Zrobiłem menu,które wygląda tak:

1.Nowa gra

2.Logowanie

3.Wyjście

Problem w tym,że jak biorę 2 czyli logowanie i tam jest następujące coś:

1.Logowanie

2.Nowe konto

3.Wróć

Chodzi o to,że jak biore 3 to chcę żeby wyszło do głównego menu.Ale nie moge go zrobić jako procedurę gdyż mam w niej kilka 'if'',i procedura też by je musiała mieć.Troche pozawijałem mam nadzieję,że skumacie.Skoro nie procedura to co?Piszę w Turbo Pascalu 7.0 i 5.5.


(rozwalkompa) #2

Jak nie procedura, to funkcja :slight_smile:

Na przykład, że jeśli zwróci 0, to jest poprawinie zakończona i pojawia się menu początkowe i po wybraniu "wróć" też zwróci 0, w innym wypadku 1.


(Moore96) #3

Nie dokońca o to mi chodziło.No bo właśnie menu się wtdy nie pojawi.Ale nie ważne.Mam o wiele większy problem.Kompilator wypisuje mi ciągle błąd Unknow identifier:

uses crt;

var a,b:string;

s:string;

plik:Text;

...........................

............................

clrscr;

textcolor(yellow);

gotoxy(25,7);

write('1.Nowa gra');

gotoxy(25,8);

write('2.Aktualny wynik');

gotoxy(25,9);

write('3.Wyjcie');

gotoxy(1, 10);

readln(a);

if a='3' then

begin

end;

if a='2' then

clrscr;

assing(plik, C:\wynik.txt);

reset(plik);

close(plik);

........................

Co zrobić?!HELP!


(B Brachaczek) #4

Chyba raczej:

assiGN (plik, 'C:\wynik.txt');

Literówka i cudzysłowy. I używaj znacznika Code.


(kostek135) #5

A nie prościej użyć kotwice(label), gdy ma wrócić, a punkt do którego ma wrócić ustawić na początku wykonywania menu?


(B Brachaczek) #6

To najgorsza rzecz, jaką można w takiej sytuacji zrobić. Lepiej już wszystko powrzucać do procedur, a główny kod programu zamknąć w pętlę REPEAT UNTIL. Moore , jeśli chcesz, mogę pokazać przykładowy kod na coś takiego, jeśli jeszcze nie wiesz, jak to zrobić.


(Moore96) #7

Jak byś był tak uprzejmy:)


(B Brachaczek) #8

Oto przykładowy szkielet (mam nadzieję, że o to właśnie Ci chodziło):

PROGRAM Gra;


USES

	CRT;


VAR

	zakoncz_program : Boolean; {będziemy tej zmiennej używać globalnie}


PROCEDURE Menu; FORWARD;

PROCEDURE NowaGra; FORWARD;

PROCEDURE MenuLogowanie; FORWARD;

PROCEDURE Logowanie; FORWARD;

PROCEDURE NoweKonto; FORWARD;

PROCEDURE JakasProceduraKoncowa; FORWARD;


PROCEDURE Menu ();

	VAR

		znak : Char;

	BEGIN

		ClrScr();

		GotoXY(25,7);

		WriteLn('1. Nowa gra');

		GotoXY(25,8);

		WriteLn('2. Logowanie');

		GotoXY(25,9);

		WriteLn('3. Wyjście');


		REPEAT znak := ReadKey UNTIL znak in ['1', '2', '3'];


		CASE znak OF

			'1' : NowaGra();

			'2' : MenuLogowanie();

			ELSE zakoncz_program := TRUE;

		END;

	END;


PROCEDURE NowaGra ();

	BEGIN

		ClrScr();

		WriteLn('Hello');

		zakoncz_program := TRUE;

	END;


PROCEDURE MenuLogowanie ();

	VAR

		znak : Char;

	BEGIN

		ClrScr();

		GotoXY(25,7);

		WriteLn('1. Logowanie');

		GotoXY(25,8);

		WriteLn('2. Nowe konto');

		GotoXY(25,9);

		WriteLn('3. Wstecz');


		REPEAT znak := ReadKey UNTIL znak in ['1', '2', '3'];


		CASE znak OF

			'1' : Logowanie();

			'2' : NoweKonto();

		END;

	END;


PROCEDURE Logowanie ();

	BEGIN

		ClrScr();

		WriteLn('Logowanie');

		zakoncz_program := TRUE;

	END;


PROCEDURE NoweKonto ();

	BEGIN

		ClrScr();

		WriteLn('Nowe konto');

		zakoncz_program := TRUE;

	END;


PROCEDURE JakasProceduraKoncowa ();

	BEGIN

	END;


BEGIN

	zakoncz_program := FALSE;

	REPEAT

		Menu();

	UNTIL zakoncz_program;

	JakasProceduraKoncowa();

END.

(Moore96) #9

Thx teraz pójdzie już z górki:)