Strona 1 z 12

[Pascal] Losowanie pytań \ Projekt "Gra 2.1"

: 14 lip 2012, 17:49
autor: TheMediator95
Witam !
Aktualnie pracuję nad nowym programem, a właściwie grą w Pascalu. Owa gra ma polegać na tym że: Użytkownik jeździ pionkiem po ekranie i gdy trafi w wyznaczony punkt (na ekranie) odpowiada na pytanie jeśli na nie odpowie jedzie dalej, kiedy nie wraca na początek. Miejsca w których mają znajdować się pytania są rozmieszczone na planszy, która jest generalnie odniesieniem do układu kartezjańskiego. Mój problem polega na tym że chcę aby za każdym razem gdy gracz przegrywa (wraca na początek) miejsca w których są pytania, albo chociaż pytania się zmieniały (Logika w tym jest taka żeby gracz nie musiał odpowiadać na te same pytania w wypadku gdy źle odpowie na pytanie. Gra kończy się gdy pionek gracza dojedzie do wyznaczonego punktu (W moim programie jest to x=24 i y=19). Cały projekt jest w fazie początkowej, planuje jeszcze dodać, różne bajery typu: Zapisywanie i wczytywanie gry, zmiana koloru planszy, gra na czas itp. , Ale najpierw muszę jakoś ogarnąć generacje losową pytań, liczę że mi ktoś w tym pomoże, próbowałem już wrzucić to w procedurę ale wyskakuje że instrukcja "goto" nie może współistnieć z procedurami - czy coś takiego. W Googlach wszyscy napalali się na napisanie gry w "Milionerzy" więc tam nic nie ma ciekawego (Bo ta gra nie potrzebuje wykorzystania etykiet w Pascalu). Liczę na konstruktywne podpowiedzi, na koniec dorzucam mój Hiper Super Ekstra kod źródłowy w fazie Pre-Pre-Pre Alfa :trollface:
Oto on:

Kod: Zaznacz cały

program Gra;
uses crt, dos;
var wybor, x, y, a, b : Byte;
klawisz, Odp : char;
Punkty : Integer;
label Menu, Rozpocznij, Poczatek, Start, Koniec;
label P1, P2, P3;
BEGIN
Punkty := 0;
Cursoroff;
Menu: //MENU GRY
	Writeln ('Witaj !');
	Writeln;
	Writeln ('1. Nowa gra');
	Writeln ('2. Samouczek');
	Writeln ('3. Ustawienia');
	Writeln ('4. Wyj',chr(152),'cie');
	Readln (wybor);
	clrscr;
Case wybor of
 1:
 Begin
Rozpocznij: //ROZPOCZĘCIE GRY
   Begin //Obramowanie - POKAZUJE JAKA DUŻA JEST PLANSZA
		For b:=3 to 20 do
		  Begin
		    a:= 2;
		    gotoxy (a,b);
		    Writeln (chr(186));
		  End;
		For b:= 3 to 20 do
		  Begin
		    a:= 25;
		    gotoxy (a,b);
		    Writeln (chr(186));
		  End;
		For a:= 3 to 25 do
		  Begin
		    b:= 2;
		    gotoxy (a,b);
		    Writeln (chr(205));
		  End;
		For a:= 3 to 25 do
		  Begin
		    b:= 20;
		    gotoxy (a,b);
		    Writeln (chr(205));
		  End;
	Gotoxy(2,2);
	  Writeln (chr(201));
	Gotoxy(2,20);
	  Writeln (chr(200));
	Gotoxy(25,2);
	  Writeln (chr(187));
	Gotoxy(25,20);
	  Writeln (chr(188));
   End; 
Poczatek: //MIEJSCE POCZĄTKOWE PIONKA
 x:= 3;
 y:= 3;
  Gotoxy (x,y);
  Writeln (chr(254));
Start: // TO CO JEST POD STRAT BĘDZIE SIĘ POWTARZAĆ, ABY PROGRAM SIĘ NIE ZAKOŃCZYŁ PO PIERWSZYM RUCHU GRACZA.
klawisz:= readkey;
Case Klawisz of //OGARNIĘCIE KLAWISZY STERUJĄCYCH
 'a': dec(x);
 's': inc(y);
 'w': dec(y);
 'd': inc(x);
End;
	If (x > 24) Then x:= 24; //WARUNKI JEŚLI KTOŚ BĘDZIE PRÓBOWAŁ PRZEKROCZYĆ PLANSZĘ
	If (y > 19) Then y:= 19;
	If (x < 3) Then x:= 3;
	If (y < 3) Then y:= 3;
	If (x = 24) and (y = 19) Then Goto Koniec;
  Clrscr;
 Gotoxy (x,y); 
 Writeln (chr(254)); //WYŚWIETLENIE PIONKA
   Begin //Obramowanie - POWTÓRKA Z OBRAMOWANIA, POKAZUJE JAKA DUŻA JEST PLANSZA.
		For b:=3 to 20 do
		  Begin
		    a:= 2;
		    gotoxy (a,b);
		    Writeln (chr(186));
		  End;
		For b:= 3 to 20 do
		  Begin
		    a:= 25;
		    gotoxy (a,b);
		    Writeln (chr(186));
		  End;
		For a:= 3 to 25 do
		  Begin
		    b:= 2;
		    gotoxy (a,b);
		    Writeln (chr(205));
		  End;
		For a:= 3 to 25 do
		  Begin
		    b:= 20;
		    gotoxy (a,b);
		    Writeln (chr(205));
		  End;
	Gotoxy(2,2);
	  Writeln (chr(201));
	Gotoxy(2,20);
	  Writeln (chr(200));
	Gotoxy(25,2);
	  Writeln (chr(187));
	Gotoxy(25,20);
	  Writeln (chr(188));
   End;
Goto Start; //IDŹ DO ETYKIETY START (TJ. UMOŻLIWIA WIELOKROTNE RUCHY.
Randomize;
  P1: //NIEUZUPEŁNIONE (NA RAZIE) PYTANIE 1
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln (''); // TREŚĆ PYTANIA
   Readln (Odp); // OCZEKIWANIE NA ODPOWIEDŹ
   If (Odp = '') Then //PRZYPADEK GDY ODPOWIEDŹ PRAWIDŁOWA
	Begin
	Punkty := Punkty + 1;
	Writeln ('');
	End
   Else // GDY ODPOWIEDŹ NIE PRAWIDŁOWA
    Begin
    Punkty := Punkty - 1;
    Writeln ('');
    End;
   Clrscr; // CZYSZCZENIE EKRANU I
   Goto Start; // PRZEJŚCIE DO ETYKIETY START POZWALAJĄCEJ NA DOKONANIE NASTĘPNEGO RUCHU.
  P2: //NIEUZUPEŁNIONE (NA RAZIE) PYTANIE 2
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Readln (Odp);
   If (Odp = '') Then
	Begin
	Punkty := Punkty + 1;
	Writeln ('');
	End
   Else
    Begin
    Punkty := Punkty - 1;
    Writeln ('');
    End;
   Clrscr; 
   Goto Start; 
  P3: //NIEUZUPEŁNIONE (NA RAZIE) PYTANIE 3
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Readln (Odp);
   If (Odp = '') Then
	Begin
	Punkty := Punkty + 1;
	Writeln ('');
	End
   Else
    Begin
    Punkty := Punkty - 1;
    Writeln ('');
    End;
   Clrscr; 
   Goto Start; 
Koniec: // ETYKIETA KOŃCOWA - GDY PIONEK OSIĄGNIE WYŻEJ WYMIENIONE WSPÓŁRZĘDNE
 Clrscr;
 Goto Menu;
End;
 2: //NIEDOKOŃCZONA INSTRUKCJA WIELOKROTNEGO WYBORU.
	Begin
	
	End;
 3:
	Begin
	
	End;
 4: Halt;
End; 	
END.
// P1, P2, P3 TO ETYKIETY DLA PYTAŃ KTÓRE CHCE ABY BYŁY GENEROWANIE LOSOWO - I W TYM JEST PROBLEM.
Liczę na pomoc,
i Pozdrawiam. Ustawienia');
Writeln ('4

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 18:43
autor: pc.qwerty
W teorii można treść pytań umieścić w tablicy, a numerek losować sobie za pomocą randomize.

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 19:07
autor: TheMediator95
W teorii... A można prosić o przykład tej teorii ?
Tu by było potrzebne coś w stylu: jednej zmiennej przypisać sekwencje instrukcji.

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 20:16
autor: Ult1me
pc.qwerty pisze:W teorii można treść pytań umieścić w tablicy, a numerek losować sobie za pomocą randomize.
robisz tablicę dwuelementową, w jednym elemencie dajesz pytanie, w drugim odpowiedź, i tak przez n razy. Potem niech program losuje z tej tablicy dowolny jej element, i niech sprawdzi odpowiedź.

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 20:37
autor: TheMediator95
To nic nie da gdyż tablica może mieć elementy jednego typu (A ja potrzebuje do tego dwóch typów String na pytanie i Char/Real/Integer na odpowiedź) z resztą potrzebuje więcej niż jedną linijkę tekstu na zadanie pytania (1 linijka na zadanie pytania i następne 4 na warianty odpowiedzi A, B, C lub D) <-- To jest to co zrozumiałem z tej twojej teorii, bo nie rozumiem dokładnie o co ci chodzi z tym Losowaniem w tablicy, chyba że chodziło tobie o tablice dwuwymiarową, dwu dwuelementową a nie tylko dwuelementową, ale tak czy siak to nie jest rozwiązanie problemu.

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 21:30
autor: lolasher
To robisz tablicę rekordów, wygoogluj o rekordach, jeżeli ich nie znasz i wszystko stanie się jasne.

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 21:40
autor: TheMediator95
No nie wiem... Coś tam wiem o rekordach jeszcze zobaczę (Tj jeszcze wrócimy do tego tematu).

Re: [Pascal] Losowanie pytań

: 14 lip 2012, 22:02
autor: Ult1me
Mediator14 pisze:To nic nie da gdyż tablica może mieć elementy jednego typu (A ja potrzebuje do tego dwóch typów String na pytanie i Char/Real/Integer na odpowiedź) z resztą potrzebuje więcej niż jedną linijkę tekstu na zadanie pytania (1 linijka na zadanie pytania i następne 4 na warianty odpowiedzi A, B, C lub D) <-- To jest to co zrozumiałem z tej twojej teorii, bo nie rozumiem dokładnie o co ci chodzi z tym Losowaniem w tablicy, chyba że chodziło tobie o tablice dwuwymiarową, dwu dwuelementową a nie tylko dwuelementową, ale tak czy siak to nie jest rozwiązanie problemu.
tak, dwuwymiarową n-elementową, wybacz, siedzę ostatnio w historii nie w informatyce. Ale tak, tabela rekordów dałaby tu radę.

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 11:48
autor: SzymekRak
Można by było pójść na łatwiznę i zrobić oddzielne tablice z pytaniami, odpowiedziami, i numerem poprawnej odpowiedzi.

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 12:15
autor: TheMediator95
Dobra wszystko fajnie, zrobię sobie pytania, odpowiedzi i numery poprawnej odpowiedzi osobno, ale jak zrobię przypuśćmy 150 pytań to jaką instrukcją mam je losować ? i do tego po wykonaniu instrukcji przejść do Etykiety Start żeby móc dalej grać ? Tam w tym kodzie co podałem na początku brakuje chociaż jednego odwołania do współrzędnej, dla przykładu podam:

Kod: Zaznacz cały

....
  P3: 
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Writeln ('');
   Readln (Odp);
   If (Odp = '') Then
   Begin
   Punkty := Punkty + 1;
   Writeln ('');
   End
   Else
    Begin
    Punkty := Punkty - 1;
    Writeln ('');
    End;
   Clrscr; 
If (x=3) and (y=4) Then // JEŚLI PIONEK PRZEJDZIE TO TEJ POZYCJI TO:
Begin
{*NORMALNIE ZROBIŁBYM GOTO P1; - CO NIE JEST ROZWIĄZANIEM PROBLEMU BO WTEDY ZAWSZE PYTANIE JEST W TYM SAMYM MIEJSCU
TUTAJ MIAŁOBY BYĆ LOSOWANIE TYCH PYTAŃ, ALE NIE WIEM JA SIĘ MAJĄ DO TEGO TABLICE I REKORDY SKORO I TAK NIMI NIC NIE WYLOSUJE FUNKCJĄ RANDOM BO TA FUNKCJA LOSUJE TYLKO POJEDYNCZE ZMIENNE\LICZBY*}
End;
   Goto Start; 
Koniec: 
 Clrscr;
 Goto Menu;
...

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 13:02
autor: SzymekRak
Na początku kodu instrukcja:

Kod: Zaznacz cały

Randomize;
A potem coś w tym stylu przy wejściu na pole:

Kod: Zaznacz cały

n:=1+Random(149);
Da Ci to losową liczbę z przedziału 1-150.

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 13:19
autor: lolasher
I przy okazji: ja bym nie dał rady napisać tak długiego programu bez użycia procedur i funkcji ;)

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 14:09
autor: TheMediator95
SzymekRak pisze: A potem coś w tym stylu przy wejściu na pole:

n:=1+Random(149);

Da Ci to losową liczbę z przedziału 1-150.
Wiem jak się losuje liczbę - Ale jak bym to umieścił przypuśćmy w Rekordzie czy w Tablicy to nie wiem jak to wylosować całe sekwencje instrukcji w tej tablicy\rekordzie. Chyba trzeba obrać inny tok myślenia żeby rozwiązać ten problem, myślałem nad jakimiś zmiennymi pomocniczymi.
lolasher pisze:I przy okazji: ja bym nie dał rady napisać tak długiego programu bez użycia procedur i funkcji ;)
Procedury i Funkcje wykorzystam do Ustawień kolorów w grze, Zapisywaniu gry itp.

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 14:17
autor: lolasher
Mediator14 pisze:Wiem jak się losuje liczbę - Ale jak bym to umieścił przypuśćmy w Rekordzie czy w Tablicy to nie wiem jak to wylosować całe sekwencje instrukcji w tej tablicy\rekordzie. Chyba trzeba obrać inny tok myślenia żeby rozwiązać ten problem, myślałem nad jakimiś zmiennymi pomocniczymi.
Masz tablicę z rekorami, w których jeden rekord zawiera pytanie i odpowiedź (czy jak to tam miało być). Losujesz numer i wybierasz element tablicy o tym indeksie.
Mediator14 pisze:Procedury i Funkcje wykorzystam do Ustawień kolorów w grze, Zapisywaniu gry itp.
Ja bym użył także do losowania i wyświetlania pytań i w ogóle wszystkiego co się da. Za długi moim zdaniem masz ten kod w głównej pętli i się zgubisz. No chyba, że się nie zgubisz to rób jak chcesz, osobiście uważam, że wszędzie tam gdzie użyłeś etykiet i goto, lepiej użyć procedur. Bo w tej chwili masz taki skaczący labirynt :hyhy:

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 14:24
autor: TheMediator95
lolasher pisze:Masz tablicę z rekorami, w których jeden rekord zawiera pytanie i odpowiedź (czy jak to tam miało być). Losujesz numer i wybierasz element tablicy o tym indeksie.
Tablice z rekordami ? Możesz podać przykład, bo nie rozumiem jak ty sobie to wyobrażasz.
lolasher pisze:Ja bym użył także do losowania i wyświetlania pytań i w ogóle wszystkiego co się da. Za długi moim zdaniem masz ten kod w głównej pętli i się zgubisz. No chyba, że się nie zgubisz to rób jak chcesz, osobiście uważam, że wszędzie tam gdzie użyłeś etykiet i goto, lepiej użyć procedur. Bo w tej chwili masz taki skaczący labirynt
Tam gdzie mam etykiety nie mogę użyć procedury/funkcji ponieważ procedury/funkcje nie obsługują instrukcji Goto która jest niezbędna do mojej gry (Żeby pionek mógł się przemieszczać) - Próbowałem już wsadzić to w procedurę.