Strona 2 z 12

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 16:18
autor: lolasher
http://pastebin.com/TmDVb2jt nie patrz na jakieś literówki, czy coś w tym stylu, chyba pogubiłem średniki tam, w pascalu nie pisałem od lat.

Nie ma czegoś takiego jak "goto niezbędne do działania programu", goto jest niezbędne do brickowania xD
Ja tylko dobrze radzę, goto to jest średnio dobry pomysł, wszystko da się rozwiązać jakąś pętlą.


Wiesz co, wybitnie mi się dziś nudzi, wyślij mi ten kod w całości jaki masz ja ci go przerobię tak, żeby nie było żadnych goto, żeby pokazać, że się da :P

Re: [Pascal] Losowanie pytań

: 15 lip 2012, 16:52
autor: TheMediator95
Jak chcesz - wyśle Ci pełną wersję tej gry. Jeszcze pokombinuje z rekordami.
Wyślij mi na PW Twój adres E-mail.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 0:11
autor: lolasher
Tu masz stworzone parę takich "klocków", z których możesz złożyć tą grę, nie będę pisał wszystkiego za ciebie, bo wtedy się nie nauczysz ;)
Przepraszam, że tyle czasu mi się zeszło, okazało się, że jednak nagle zaczęło się dziać w moim nudnym życiu informatyka.

http://pastebin.com/GLYGcRkh


Jeżeli chcesz, żebym jeszcze coś napisał, bo nie wiesz jak, pytaj. Przedstawiłem jak zapisać pytania w tablicy rekordów oraz drogę to stworzenia procedury rysującej ramki, dokończenie jej można uznać za drobną pracę domową :3

Oryginalny kod był pisany strasznie "mechanicznie" i moim zdaniem nie nadawał się jako przykład do nauki, ale samo napisanie tej gry w sposób bardziej "właściwy" powinno dużo ci dać. Jak już złożysz grę z tych moich puzzli proponuję dodać jakiś edytor pytań zapisujący je do pliku, ale to już na samym końcu. Ta gra byłaby też dobrym sposobem do nauki programowania obiektowego, ale myślę, że nie wszystko na raz. W każdym razie powodzenia i jakby co służę pomocą.

//uznałem, że lepiej tu niż na PW, może kiedyś ktoś będzie szukał coś w tym rodzaju.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 13:54
autor: TheMediator95
Dzięki, ale nie wiem czy zauważyłeś ale to wcale nie rozwiązuje mojego problemu, aby te pytania wylosować. Dołożyłem do twojego kodu jeszcze dwa pytania i nie wiem jak je teraz wylosować w tablicy sam spójrz:

Kod: Zaznacz cały

program Gra;
uses crt, dos;

Type 
   pytanie = record
      question, a, b, c, d : string;
          answer : char;
   End;

Var q : array [1..10] of pytanie;


Function pytaj(q : pytanie)  : boolean;
var odp : char;
begin

  writeln(q.question);
  writeln(q.a);
  writeln(q.b);
  writeln(q.c);
  writeln(q.d);
  readln (Odp);
  if odp = q.answer then
     pytaj := true
  else
     pytaj := false;    
end;  

 

BEGIN
Randomize; // URUCHAMIAM SKRYPT GENERATORA LOSOWEGO
Random (); // CHCĘ WYLOSOWAĆ PONIŻSZE PYTANIA ZNAJDUJĄCE SIĘ W TABLICY REKORDÓW I JAK MAM TO ZROBIĆ ?? Co trzeba wpisać w nawiasach Random ??
Begin
  q[1].question := 'Jaka pojemnosc ma dyskietka 5.25 cala (Podwojnej gestosci) ?';
  q[1].a :=  'A. 1.44MB';
  q[1].b :=  'B. 5.25MB';
  q[1].c :=  'C. 360Kb';        
  q[1].d :=  'D. 520Kb';
  q[1].answer := 'c';
  Clrscr;

  If pytaj(q[1]) = true then
writeln('Dobrze')
else
writeln('Zle') ;   
end;

Begin
  q[2].question := 'Ile to 2 + 2 ?';
  q[2].a :=  'A. 1';
  q[2].b :=  'B. 2';
  q[2].c :=  'C. 3';        
  q[2].d :=  'D. 4';
  q[2].answer := 'd';
  Clrscr;

  If pytaj(q[2]) = true then
writeln('Dobrze')
else
writeln('Zle') ; 
end;

Begin
  q[3].question := 'Ile to 3! ?';
  q[3].a :=  'A. 3';
  q[3].b :=  'B. 6';
  q[3].c :=  'C. 9';        
  q[3].d :=  'D. 12';
  q[3].answer := 'b';
  Clrscr;

  If pytaj(q[3]) = true then
writeln('Dobrze')
else
writeln('Zle') ; 
end;
END.
Ogólnie uważam że świetny pomysł z tym że można pytania umieścić w tablicy rekordów jako funkcja (Sam bym raczej na to nie wpadł), ale to nadal nie zmienia faktu że nie wiem jak wylosować te pytania. Instrukcję Goto będę jeszcze używał do powrotu do miejsca na planszy po zadaniu pytania (Nie mam zamiaru tego zmieniać). A jeśli chodzi o Obramowanie pola gry to w sumie nie pomyślałem że mogę dać to w procedurę - dlatego tak zrobię, ale to co napisałeś ta procedura o nazwie "kreska" nie bardzo się nada gdyż w nowej wersji mojej gry, obramowanie nie będzie złożone wyłącznie ze znaku "*" , tylko odpowiednio dla pozycji kursora ze znaków tablicy kodów ASCII. Tak więc wystarczy że fragment mojego programu (Odpowiadający za obramowanie) skopiuję do procedury, a później ją wywołam dwukrotnie i tym samym skrócę swój i tak długi już kod.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 14:10
autor: pc.qwerty
Według mnie te wszystkie if...else są strasznie zagmatwane. Spróbuję naskrobać coś podobnego i dam znać.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 15:53
autor: lolasher

Kod: Zaznacz cały

program Gra;
uses crt, dos;

Type 
   pytanie = record
      question, a, b, c, d : string;
          answer : char;
   End;

Var q : array [1..10] of pytanie;


Function pytaj(q : pytanie)  : boolean;
var odp : char;
begin
  Clrscr;
  writeln(q.question);
  writeln(q.a);
  writeln(q.b);
  writeln(q.c);
  writeln(q.d);
  readln (Odp);
  if odp = q.answer then
     pytaj := true
  else
     pytaj := false;    
end;  

 
var punkty : integer;
BEGIN

  punkty :=0;
  Randomize; 
  



  q[1].question := 'Jaka pojemnosc ma dyskietka 5.25 cala (Podwojnej gestosci) ?';
  q[1].a :=  'A. 1.44MB';
  q[1].b :=  'B. 5.25MB';
  q[1].c :=  'C. 360Kb';        
  q[1].d :=  'D. 520Kb';
  q[1].answer := 'c';
  
  q[2].question := 'Ile to 2 + 2 ?';
  q[2].a :=  'A. 1';
  q[2].b :=  'B. 2';
  q[2].c :=  'C. 3';        
  q[2].d :=  'D. 4';
  q[2].answer := 'd';
  
  q[3].question := 'Ile to 3! ?';
  q[3].a :=  'A. 3';
  q[3].b :=  'B. 6';
  q[3].c :=  'C. 9';        
  q[3].d :=  'D. 12';
  q[3].answer := 'b';

  
  repeat
  
  If pytaj(q[(1+Random(3))]) = true then
     begin
	    inc(punkty);
	   writeln('Dobrze');
	   writeln(punkty);
	 end
  else
     writeln('Zle') ;   
	 
  until  punkty = 2 	 
  




END.

W językach programowania jest taka instytucja jak pętla, radzę się z tym zapoznać, bo daleko tak nie uciągniesz. Goto można nazwać bardzo prymitywną pętlą. Warunek zakończenia pętli dałem jakikolwiek, bo to i tak tylko dla przykładu.

I parę uwag:
-na co tyle begin endów? nie wciskaj ich wszędzie, potrzebne są kiedy chcesz kilka instrukcji zapisać jako jedną (np w if, albo pętli for)
-rób wcięcia w kodzie, bo zabłądzisz, dzięki temu widać, które instrukcje należą do którego bloku.

PS. Gadam o wcięciach, a sam dopiero zauważyłem jak mam krzywo. No nic, ale i tak rób :P

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 16:16
autor: pc.qwerty
Kurwełe, lolasher był szybszy :S
No ale jak już zrobiłem, to daję swoją wersję. Zawiera amazing efekty graficzne oraz wcięcia w kodzie!!!
Tylko trzeba podokurwiać więcej pytań, bo są bricki z losowaniem (dwa identyczne pod rząd, nigdy nie udało mi się wylosować #3, itp).

Kod: Zaznacz cały

program mafijny_quiz; uses crt, sysutils;

type
	tzapytanie = record
	tresc:string;
	odp1:string;
	odp2:string;
	odp3:string;
	odp4:string;
	odp_prawidlowa:integer;
end;

var
	pytanie:array [0..666] of tzapytanie;
	i:integer;
	liczba_pytan:integer;
	numer_pytania:integer;
	fakju:boolean;
	odpowiedz:char;
	dawaj_inne_pytanie:boolean;

begin
	//nakurwienie pytań
	//z pliku byłoby fajniej (chyba)
	with pytanie[0] do
	begin
		tresc:='Na jakiej częstotliwości nadawany jest Program I Polskiego Radia?';
		odp1:='224 kHz';
		odp2:='225 kHz';
		odp3:='227 kHz';
		odp4:='6095 kHz';
		odp_prawidlowa:=2;
	end;
	with pytanie[1] do
	begin
		tresc:='W której z wymienionych lokalizacji znajdowała się najmocniejsza radiostacja na świecie?';
		odp1:='Allouis';
		odp2:='Droitwich';
		odp3:='Konstantynów';
		odp4:='Taldom';
		odp_prawidlowa:=3;
	end;
	with pytanie[2] do 
	begin
		tresc:='Która firma produkuje karty graficzne bez sterowników?';
		odp1:='3dfx';
		odp2:='AMD';
		odp3:='Matrox';
		odp4:='NVIDIA';
		odp_prawidlowa:=2;
	end;


	//UWAGA, ZAGROŻENIE ZDROWIA LUB ŻYCIA
	//żeby losowanie nie miało bricków, trzeba dokurwić więcej pytań

	//można jeszcze sprawdzić ile w ogóle jest nakurwionych pytań
	for i:=0 to 666 do
	begin
		if pytanie[i].tresc='' then
		begin
			liczba_pytan:=i-1;
			break;
		end;
	end;

	//komora mieszania jest pusta, następuje zwolnienie blokady
	randomize;

	//i rozpoczynamy nakurwianie
	fakju:=false;	
	repeat
		dawaj_inne_pytanie:=false;
		textcolor(3); for i:=1 to 80 do write('*');
		textcolor(8); writeln('WYJŚCIE: wduś ESC');
		textcolor(7); writeln;

		numer_pytania:=random(liczba_pytan);
		
		writeln(pytanie[numer_pytania].tresc);
		writeln('1. '+pytanie[numer_pytania].odp1);
		writeln('2. '+pytanie[numer_pytania].odp2);
		writeln('3. '+pytanie[numer_pytania].odp3);
		writeln('4. '+pytanie[numer_pytania].odp4);
		writeln;
		write('Wstukaj odpowiedź: ');
		
		repeat
			odpowiedz:=readkey;
			case odpowiedz of
				'1':i:=1;
				'2':i:=2;
				'3':i:=3;
				'4':i:=4;
				#27:begin clrscr; halt; end;
			end;
			if i=pytanie[numer_pytania].odp_prawidlowa then 
			begin
				gotoxy(0,wherey); clreol;
				textcolor(10+128);
				writeln('DOBRZE!!!!!');
				delay(5000);
				gotoxy(0,wherey-1); clreol;
				textcolor(10);
				writeln('DOBRZE!!!!!');
				textcolor(7);
				dawaj_inne_pytanie:=true;
			end
			else begin
				textcolor(4+128);
				gotoxy(0,wherey);
				writeln('TY TŁUMOKU, POPRAWNA ODPOWIEDŹ TO NR '+inttostr(pytanie[numer_pytania].odp_prawidlowa)+' !!!!!!!!!!!!!');
				delay(5000);
				gotoxy(0,wherey-1);
				textcolor(4);
				writeln('TY TŁUMOKU, POPRAWNA ODPOWIEDŹ TO NR '+inttostr(pytanie[numer_pytania].odp_prawidlowa)+' !!!!!!!!!!!!!');
				textcolor(7);
				dawaj_inne_pytanie:=true;
			end;
		until dawaj_inne_pytanie=true;
	until fakju=true;
end.
/me popiera używanie pętli zamiast goto

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 16:23
autor: funcek
begin
tresc:='Która firma produkuje karty graficzne bez sterowników?';
odp1:='3dfx';
odp2:='AMD';
odp3:='Matrox';
odp4:='NVIDIA';
odp_prawidlowa:=2;
end;
DOBRZE!!!!!!!!1111

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 17:09
autor: lolasher
pc.qwerty pisze:Kurwełe, lolasher był szybszy :S
Ale za to ja nie znałem bardzo fajnej instrukcji "with", człowiek się uczy całe życie.

Nie mogę się dopatrzeć co u ciebie w kodzie jest źle z losowaniem, ale u mnie (chyba) działa dobrze na trzech pytaniach.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 17:17
autor: pc.qwerty
NOWA WERSJA NAKURWIACZA!!!!!!!!
Ficzery: dokurwienie procedur, odbrickowane losowanie dwóch identycznych pytań pod rząd, zablokowanie klawiszy innych niż 1, 2, 3, 4, esc przy odpowiadaniu... i wciąż ani jednego goto :trollface:

Kod: Zaznacz cały

program mafijny_quiz; uses crt, sysutils;

type
	tzapytanie = record
	tresc:string;
	odp1:string;
	odp2:string;
	odp3:string;
	odp4:string;
	odp_prawidlowa:integer;
end;

var
	pytanie:array [0..666] of tzapytanie;
	i:integer;
	liczba_pytan:integer;
	numer_pytania:integer;
	fakju:boolean;
	odpowiedz:char;
	dawaj_inne_pytanie:boolean;
	ostatnie_pytanie:integer;
   odpowiedz_dokurwiona:boolean;

procedure losuj;
begin
	numer_pytania:=random(liczba_pytan);
end;

procedure zapytuj;
begin
	fakju:=false;	
	repeat
		dawaj_inne_pytanie:=false;

		repeat losuj; until numer_pytania<>ostatnie_pytanie;
		ostatnie_pytanie:=numer_pytania;

		textcolor(3); for i:=1 to 80 do write('*');
		textcolor(8); writeln('WYJŚCIE: wduś ESC');
		textcolor(7); writeln;
		
		writeln(pytanie[numer_pytania].tresc);
		writeln('1. '+pytanie[numer_pytania].odp1);
		writeln('2. '+pytanie[numer_pytania].odp2);
		writeln('3. '+pytanie[numer_pytania].odp3);
		writeln('4. '+pytanie[numer_pytania].odp4);
		writeln;
		write('Wstukaj odpowiedź: ');
		
      odpowiedz_dokurwiona:=false;

		repeat
			repeat
            odpowiedz:=readkey;
			   case odpowiedz of
				  '1':begin i:=1; odpowiedz_dokurwiona:=true; end;
				  '2':begin i:=2; odpowiedz_dokurwiona:=true; end;
				  '3':begin i:=3; odpowiedz_dokurwiona:=true; end;
				  '4':begin i:=4; odpowiedz_dokurwiona:=true; end;
				  #27:begin clrscr; halt; end;
            end;
         until odpowiedz_dokurwiona=true;
			
			if i=pytanie[numer_pytania].odp_prawidlowa then 
			begin
				gotoxy(0,wherey); clreol;
				textcolor(10+128);
				writeln('DOBRZE!!!!!');
				delay(5000);
				gotoxy(0,wherey-1); clreol;
				textcolor(10);
				writeln('DOBRZE!!!!!');
				textcolor(7);
				dawaj_inne_pytanie:=true;
			end
			else begin
				textcolor(4+128);
				gotoxy(0,wherey);
				writeln('TY TŁUMOKU, POPRAWNA ODPOWIEDŹ TO NR '+inttostr(pytanie[numer_pytania].odp_prawidlowa)+' !!!!!!!!!!!!!');
				delay(5000);
				gotoxy(0,wherey-1);
				textcolor(4);
				writeln('TY TŁUMOKU, POPRAWNA ODPOWIEDŹ TO NR '+inttostr(pytanie[numer_pytania].odp_prawidlowa)+' !!!!!!!!!!!!!');
				textcolor(7);
				dawaj_inne_pytanie:=true;
			end;
		until dawaj_inne_pytanie=true;
	until fakju=true;
end;

begin
	//nakurwienie pytań
	//z pliku byłoby fajniej (chyba)
	with pytanie[0] do
	begin
		tresc:='Na jakiej częstotliwości nadawany jest Program I Polskiego Radia?';
		odp1:='224 kHz';
		odp2:='225 kHz';
		odp3:='227 kHz';
		odp4:='6095 kHz';
		odp_prawidlowa:=2;
	end;
	with pytanie[1] do
	begin
		tresc:='W której z wymienionych lokalizacji znajdowała się najmocniejsza radiostacja na świecie?';
		odp1:='Allouis';
		odp2:='Droitwich';
		odp3:='Konstantynów';
		odp4:='Taldom';
		odp_prawidlowa:=3;
	end;
	with pytanie[2] do 
	begin
		tresc:='Która firma produkuje karty graficzne bez sterowników?';
		odp1:='3dfx';
		odp2:='AMD';
		odp3:='Matrox';
		odp4:='NVIDIA';
		odp_prawidlowa:=2;
	end;

	//można jeszcze sprawdzić ile w ogóle jest nakurwionych pytań
	for i:=0 to 666 do
	begin
		if pytanie[i].tresc='' then
		begin
			liczba_pytan:=i;
			break;
		end;
	end;

	//komora mieszania jest pusta, następuje zwolnienie blokady
	randomize;

	//i rozpoczynamy nakurwianie
	zapytuj;
end.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 17:32
autor: lolasher
Widzę masz znajomość, ja musiałem składnie pętli googlować, żeby to napisać,bo już z pascala nic nie pamiętam.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 17:47
autor: pc.qwerty
/me googlował tylko tablicę rekordów, repeat i case :trollface:

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 20:58
autor: TheMediator95
lolasher pisze:

Kod: Zaznacz cały

program Gra;
uses crt, dos;

Type 
   pytanie = record
      question, a, b, c, d : string;
          answer : char;
   End;

Var q : array [1..10] of pytanie;


Function pytaj(q : pytanie)  : boolean;
var odp : char;
begin
  Clrscr;
  writeln(q.question);
  writeln(q.a);
  writeln(q.b);
  writeln(q.c);
  writeln(q.d);
  readln (Odp);
  if odp = q.answer then
     pytaj := true
  else
     pytaj := false;    
end;  

 
var punkty : integer;
BEGIN

  punkty :=0;
  Randomize; 
  



  q[1].question := 'Jaka pojemnosc ma dyskietka 5.25 cala (Podwojnej gestosci) ?';
  q[1].a :=  'A. 1.44MB';
  q[1].b :=  'B. 5.25MB';
  q[1].c :=  'C. 360Kb';        
  q[1].d :=  'D. 520Kb';
  q[1].answer := 'c';
  
  q[2].question := 'Ile to 2 + 2 ?';
  q[2].a :=  'A. 1';
  q[2].b :=  'B. 2';
  q[2].c :=  'C. 3';        
  q[2].d :=  'D. 4';
  q[2].answer := 'd';
  
  q[3].question := 'Ile to 3! ?';
  q[3].a :=  'A. 3';
  q[3].b :=  'B. 6';
  q[3].c :=  'C. 9';        
  q[3].d :=  'D. 12';
  q[3].answer := 'b';

  
  repeat
  
  If pytaj(q[(1+Random(3))]) = true then
     begin
	    inc(punkty);
	   writeln('Dobrze');
	   writeln(punkty);
	 end
  else
     writeln('Zle') ;   
	 
  until  punkty = 2 	 
  




END.

W językach programowania jest taka instytucja jak pętla, radzę się z tym zapoznać, bo daleko tak nie uciągniesz. Goto można nazwać bardzo prymitywną pętlą. Warunek zakończenia pętli dałem jakikolwiek, bo to i tak tylko dla przykładu.

I parę uwag:
-na co tyle begin endów? nie wciskaj ich wszędzie, potrzebne są kiedy chcesz kilka instrukcji zapisać jako jedną (np w if, albo pętli for)
-rób wcięcia w kodzie, bo zabłądzisz, dzięki temu widać, które instrukcje należą do którego bloku.

PS. Gadam o wcięciach, a sam dopiero zauważyłem jak mam krzywo. No nic, ale i tak rób :P
Wielkie dzięki, nareszcie mam podwaliny do losowania pytań. Jeszcze tylko parę rzeczy dam w procedurę i będzie ok.
Wiem co to są pętle :D, ale goto muszę użyć.
To co teraz napiszę może się wydawać dziwne ale, używam niepotrzebnie Beginów i Endów zamiast wcięć. :trollface:
pc.qwerty pisze:NOWA WERSJA NAKURWIACZA!!!!!!!!
Mój nakurwiacz będzie lepszy :P.c

No, to jak wszytko już wiem to nie pozostaje wam nic innego niż czekanie na moją koksiarską grę, żeby móc ją skrytykować i wynaleźć nowe Bricki.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 21:02
autor: pc.qwerty
Wiem co to są pętle , ale goto muszę użyć.
No ale nie musisz.

Re: [Pascal] Losowanie pytań

: 18 lip 2012, 21:29
autor: lolasher
Potwierdzam, jest bardzo niewiele rozwiązań, gdzie goto jest lepsze od pętli. I zwykle w takich przypadkach jeszcze lepsza jest rekurencja. Nie pytajcie o przykład, nie potrafię podać, wiem tylko, że takie coś chyba jest ^^