Prawdziwe oblicze Informatyki. Tysiące linijek kodu i kompilatory które nigdy nie wybaczają.
Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post14 lip 2012, 17:49

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
Ostatnio zmieniony 31 sie 2012, 19:56 przez TheMediator95, łącznie zmieniany 1 raz.

Awatar użytkownika

pc.qwerty

Zasłużony użytkownik
Posty: 3276
Rejestracja: 01 lip 2010, 12:28
    Mac OS X Opera

Post14 lip 2012, 18:43

W teorii można treść pytań umieścić w tablicy, a numerek losować sobie za pomocą randomize.
There is no cloud. It's just someone else's computer.

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post14 lip 2012, 19:07

W teorii... A można prosić o przykład tej teorii ?
Tu by było potrzebne coś w stylu: jednej zmiennej przypisać sekwencje instrukcji.

Awatar użytkownika

Ult1me

Administrator
Posty: 2415
Rejestracja: 05 sie 2008, 15:48
Lokalizacja: Wrocław
    Windows 7 Opera
Kontakt:

Post14 lip 2012, 20:16

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ź.
Komputery:
Spoiler
Laptop (mój główny komputer): Acer Aspire 5750G | Intel Core i3 2330M (Sandy Bridge) 0.8-2.2GHz | Intel HM65 | 6GB RAM DDR3 | Intel HD Graphics 3000 + nVidia GeForce GT540M (nVidia Optimus) | Crucial MX100 256GB SSD | Broadcom 802.11n Network Adapter | Broadcom NetLink Gigabit Ethernet | Realtek ALC269 (+Dolby Advanced Audio)

Laptop służbowy: HP ProBook

Komputer brata (mój stary): Intel Pentium DualCore E6300 (2x 2.8@1.6-3.25 GHz EIST, 64bit, Intel-VT) | Gigabyte EP43T-UD3L (P43, ICH10) | 2x2 GB RAM DDR3 1066MHz GoodRAM | Palit GeForce GT220 | 2x500 GB (Seagate + SpinPoint F3)

Stacja do napraw: Intel Pentium 4 630 (3.00@2.43 GHz, 64bit, HT, Prescott) | ASUS P5GPL (Intel i915, ICH6) | 2x512 MB RAM DDR1 Kingston (PC-3200) | Gainward GeForce 7300 GT 256 MB DDR2 | jakiś dysk :)

Komputer na części: Intel Pentium III 600 MHz Slot 1 | ASUS P3B-F | 128 MB SDR SDRAM | GeForce 2 MX400 (?) | Seagate 8.4GB PATA

Lumia 625
Dowódca Grupy Odwetowej Mafii C-QUAM, łączącej fanów fal długich, średnich i krótkich, nak***iania kabli j**anych, France Bleu Alsace, The Mighty KBC, Voice of Korea, Warszawskiej Radiostacji Centralnej z najwyższym masztem świata Konstantynowie koło Gąbina, oraz Radiowego Centrum Nadawczego z prawie najwyższymi masztami w Solcu Kujawskim

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post14 lip 2012, 20:37

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.

Awatar użytkownika

lolasher

Zasłużony użytkownik
Posty: 2432
Rejestracja: 10 paź 2008, 19:28
Lokalizacja: Zadupie pod Siedlcami ;)
    Windows 8 Opera

Post14 lip 2012, 21:30

To robisz tablicę rekordów, wygoogluj o rekordach, jeżeli ich nie znasz i wszystko stanie się jasne.

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post14 lip 2012, 21:40

No nie wiem... Coś tam wiem o rekordach jeszcze zobaczę (Tj jeszcze wrócimy do tego tematu).

Awatar użytkownika

Ult1me

Administrator
Posty: 2415
Rejestracja: 05 sie 2008, 15:48
Lokalizacja: Wrocław
    Windows 7 Opera
Kontakt:

Post14 lip 2012, 22:02

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ę.
Komputery:
Spoiler
Laptop (mój główny komputer): Acer Aspire 5750G | Intel Core i3 2330M (Sandy Bridge) 0.8-2.2GHz | Intel HM65 | 6GB RAM DDR3 | Intel HD Graphics 3000 + nVidia GeForce GT540M (nVidia Optimus) | Crucial MX100 256GB SSD | Broadcom 802.11n Network Adapter | Broadcom NetLink Gigabit Ethernet | Realtek ALC269 (+Dolby Advanced Audio)

Laptop służbowy: HP ProBook

Komputer brata (mój stary): Intel Pentium DualCore E6300 (2x 2.8@1.6-3.25 GHz EIST, 64bit, Intel-VT) | Gigabyte EP43T-UD3L (P43, ICH10) | 2x2 GB RAM DDR3 1066MHz GoodRAM | Palit GeForce GT220 | 2x500 GB (Seagate + SpinPoint F3)

Stacja do napraw: Intel Pentium 4 630 (3.00@2.43 GHz, 64bit, HT, Prescott) | ASUS P5GPL (Intel i915, ICH6) | 2x512 MB RAM DDR1 Kingston (PC-3200) | Gainward GeForce 7300 GT 256 MB DDR2 | jakiś dysk :)

Komputer na części: Intel Pentium III 600 MHz Slot 1 | ASUS P3B-F | 128 MB SDR SDRAM | GeForce 2 MX400 (?) | Seagate 8.4GB PATA

Lumia 625
Dowódca Grupy Odwetowej Mafii C-QUAM, łączącej fanów fal długich, średnich i krótkich, nak***iania kabli j**anych, France Bleu Alsace, The Mighty KBC, Voice of Korea, Warszawskiej Radiostacji Centralnej z najwyższym masztem świata Konstantynowie koło Gąbina, oraz Radiowego Centrum Nadawczego z prawie najwyższymi masztami w Solcu Kujawskim

Awatar użytkownika

SzymekRak

Zasłużony użytkownik
Posty: 548
Rejestracja: 09 lip 2008, 11:55
Lokalizacja: gdzieś bardzo daleko
    Linux Opera

Post15 lip 2012, 11:48

Można by było pójść na łatwiznę i zrobić oddzielne tablice z pytaniami, odpowiedziami, i numerem poprawnej odpowiedzi.
nie wiem

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post15 lip 2012, 12:15

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;
...

Awatar użytkownika

SzymekRak

Zasłużony użytkownik
Posty: 548
Rejestracja: 09 lip 2008, 11:55
Lokalizacja: gdzieś bardzo daleko
    Linux Opera

Post15 lip 2012, 13:02

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.
nie wiem

Awatar użytkownika

lolasher

Zasłużony użytkownik
Posty: 2432
Rejestracja: 10 paź 2008, 19:28
Lokalizacja: Zadupie pod Siedlcami ;)
    Windows 8 Opera

Post15 lip 2012, 13:19

I przy okazji: ja bym nie dał rady napisać tak długiego programu bez użycia procedur i funkcji ;)

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post15 lip 2012, 14:09

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.

Awatar użytkownika

lolasher

Zasłużony użytkownik
Posty: 2432
Rejestracja: 10 paź 2008, 19:28
Lokalizacja: Zadupie pod Siedlcami ;)
    Windows 8 Opera

Post15 lip 2012, 14:17

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:

Awatar użytkownika

TheMediator95

Posty: 468
Rejestracja: 29 kwie 2010, 10:35
    Windows 7 Opera
Kontakt:

Post15 lip 2012, 14:24

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ę.

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 4 gości