Ĺadny brzuch
Witam. Mam następujące pytanie. W pierwszym numerze KŚ-Espert był opublikowany artykuł jak napisać w Delphi grę edukacyjną. Wszystko było by OK tylko, że program zawsze wczytuje te same pytania.
Teraz pytanie: jak zrobić, żeby za każdym razem (po włączeniu programu) było losowanych np. 10 pytań z np. 100 zdefiniowanych w programie ?
Tylko przydało by się jakieś zabezpieczenie, żeby nie wylosowało podwójnie tych samych pytań...
Jak ktoś coś wie niech da znać. Dzięki...
Poniżej kod programu...
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type Ttest = class(TForm) panelPytanie: TPanel; panelOdpowiedzi: TPanel; panelStatystyka: TPanel; tekstPytanie: TLabel; radioOdpowiedz1: TRadioButton; radioOdpowiedz2: TRadioButton; radioOdpowiedz3: TRadioButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; tekstLiczbaPytan: TLabel; tekstLiczbaPoprawnych: TLabel; tekstLiczbaNiepoprawnych: TLabel; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const liczbaPytan = 3; var test: Ttest; pytania: array [1..liczbaPytan] of String; odpowiedzi1: array[1..liczbaPytan] of String; odpowiedzi2: array[1..liczbaPytan] of String; odpowiedzi3: array[1..liczbaPytan] of String; poprawne: array[1..liczbaPytan] of Integer; aktualnePytanie: Integer; liczbaPoprawnych: Integer; implementation {$R *.dfm} procedure uaktualnijNapisy(numerPytania: Integer); begin test.Caption:='Gra Edukacyjna. Pytanie ' + intToStr(aktualnePytanie) + '/' + intToStr(liczbaPytan); test.tekstPytanie.Caption:=pytania[numerPytania]; test.radioOdpowiedz1.Caption:=odpowiedzi1[numerPytania]; test.radioOdpowiedz2.Caption:=odpowiedzi2[numerPytania]; test.radioOdpowiedz3.Caption:=odpowiedzi3[numerPytania]; test.tekstLiczbaPytan.Caption:=intToStr(aktualnePytanie - 1); test.tekstLiczbaPoprawnych.Caption:=intToStr(liczbaPoprawnych); test.tekstLiczbaNiepoprawnych.Caption:=intToStr(aktualnePytanie - liczbaPoprawnych -1 ); end; procedure Ttest.FormCreate(Sender: TObject); begin pytania[1]:='Kto jest redaktorem naczelnym Komputer Świata ?'; odpowiedzi1[1]:='Ziemowit Buchalski'; odpowiedzi2[1]:='Wiesław Małecki'; odpowiedzi3[1]:='Łukasz Czejkawski'; poprawne[1]:=2; pytania[2]:='Ile wynosi pojemność konta pocztowego w portalu o2.pl ?'; odpowiedzi1[2]:='1000 MB'; odpowiedzi2[2]:='1 GB'; odpowiedzi3[2]:='250 MB'; poprawne[2]:=2; pytania[3]:='Co oznacza skrót RTS ?'; odpowiedzi1[3]:='Runtime Transfer System'; odpowiedzi2[3]:='Redudant Traffic System'; odpowiedzi3[3]:='Real Time Strategy'; poprawne[3]:=3; liczbaPoprawnych:=0; aktualnePytanie:=1; uaktualnijNapisy(aktualnePytanie); end; function ktoraOdpowiedzWybrano: Integer; begin if test.radioOdpowiedz1.Checked then begin test.radioOdpowiedz1.Checked:=False; ktoraOdpowiedzWybrano:=1; end else if test.radioOdpowiedz2.Checked then begin test.radioOdpowiedz2.Checked:=False; ktoraOdpowiedzWybrano:=2; end else if test.radioOdpowiedz3.Checked then begin test.radioOdpowiedz3.Checked:=False; ktoraOdpowiedzWybrano:=3; end else ktoraOdpowiedzWybrano:=-1; end; procedure Ttest.Button1Click(Sender: TObject); var wybranaOdpowiedz: Integer; begin wybranaOdpowiedz:=ktoraOdpowiedzWybrano(); if wybranaOdpowiedz=-1 then ShowMessage('Zaznacz jeda opcje') else begin if wybranaOdpowiedz=poprawne[aktualnePytanie] then liczbaPoprawnych:=liczbaPoprawnych+1; {przechodzimy do nastepnego pytania} aktualnePytanie:=aktualnePytanie+1; if aktualnePytanie <= liczbaPytan then uaktualnijNapisy(aktualnePytanie) else begin test.tekstLiczbaPytan.Caption:=intToStr(liczbaPytan ); test.tekstLiczbaPoprawnych.Caption:=intToStr(liczbaPoprawnych); test.tekstLiczbaNiepoprawnych.Caption:=intToStr(liczbaPytan - liczbaPoprawnych ); ShowMessage('Odpowiedziales(-as) juz na wszytkie pytania'); end; end; end; end.
Zapobiaganie ponownemu wylosowaniu liczb:
http://forum.ks-eksp...28&hl=losowanie
http://forum.ks-eksp...76&hl=losowanie
http://forum.ks-eksp...24&hl=losowanie
http://forum.ks-eksp...69&hl=losowanie
Jesli chodzi o losowe pytania (np. 10 ze 100) to losuj liczby z zakresu 1-100 i pytania o tych numerach wrzucaj do tablicy z pytaniami :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Teraz pytanie: jak zrobić, żeby za każdym razem (po włączeniu programu) było losowanych np. 10 pytań z np. 100 zdefiniowanych w programie ?
Tylko przydało by się jakieś zabezpieczenie, żeby nie wylosowało podwójnie tych samych pytań...
Jak ktoś coś wie niech da znać. Dzięki...
Poniżej kod programu...
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type Ttest = class(TForm) panelPytanie: TPanel; panelOdpowiedzi: TPanel; panelStatystyka: TPanel; tekstPytanie: TLabel; radioOdpowiedz1: TRadioButton; radioOdpowiedz2: TRadioButton; radioOdpowiedz3: TRadioButton; Label2: TLabel; Label3: TLabel; Label4: TLabel; tekstLiczbaPytan: TLabel; tekstLiczbaPoprawnych: TLabel; tekstLiczbaNiepoprawnych: TLabel; Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; const liczbaPytan = 3; var test: Ttest; pytania: array [1..liczbaPytan] of String; odpowiedzi1: array[1..liczbaPytan] of String; odpowiedzi2: array[1..liczbaPytan] of String; odpowiedzi3: array[1..liczbaPytan] of String; poprawne: array[1..liczbaPytan] of Integer; aktualnePytanie: Integer; liczbaPoprawnych: Integer; implementation {$R *.dfm} procedure uaktualnijNapisy(numerPytania: Integer); begin test.Caption:='Gra Edukacyjna. Pytanie ' + intToStr(aktualnePytanie) + '/' + intToStr(liczbaPytan); test.tekstPytanie.Caption:=pytania[numerPytania]; test.radioOdpowiedz1.Caption:=odpowiedzi1[numerPytania]; test.radioOdpowiedz2.Caption:=odpowiedzi2[numerPytania]; test.radioOdpowiedz3.Caption:=odpowiedzi3[numerPytania]; test.tekstLiczbaPytan.Caption:=intToStr(aktualnePytanie - 1); test.tekstLiczbaPoprawnych.Caption:=intToStr(liczbaPoprawnych); test.tekstLiczbaNiepoprawnych.Caption:=intToStr(aktualnePytanie - liczbaPoprawnych -1 ); end; procedure Ttest.FormCreate(Sender: TObject); begin pytania[1]:='Kto jest redaktorem naczelnym Komputer Świata ?'; odpowiedzi1[1]:='Ziemowit Buchalski'; odpowiedzi2[1]:='Wiesław Małecki'; odpowiedzi3[1]:='Łukasz Czejkawski'; poprawne[1]:=2; pytania[2]:='Ile wynosi pojemność konta pocztowego w portalu o2.pl ?'; odpowiedzi1[2]:='1000 MB'; odpowiedzi2[2]:='1 GB'; odpowiedzi3[2]:='250 MB'; poprawne[2]:=2; pytania[3]:='Co oznacza skrót RTS ?'; odpowiedzi1[3]:='Runtime Transfer System'; odpowiedzi2[3]:='Redudant Traffic System'; odpowiedzi3[3]:='Real Time Strategy'; poprawne[3]:=3; liczbaPoprawnych:=0; aktualnePytanie:=1; uaktualnijNapisy(aktualnePytanie); end; function ktoraOdpowiedzWybrano: Integer; begin if test.radioOdpowiedz1.Checked then begin test.radioOdpowiedz1.Checked:=False; ktoraOdpowiedzWybrano:=1; end else if test.radioOdpowiedz2.Checked then begin test.radioOdpowiedz2.Checked:=False; ktoraOdpowiedzWybrano:=2; end else if test.radioOdpowiedz3.Checked then begin test.radioOdpowiedz3.Checked:=False; ktoraOdpowiedzWybrano:=3; end else ktoraOdpowiedzWybrano:=-1; end; procedure Ttest.Button1Click(Sender: TObject); var wybranaOdpowiedz: Integer; begin wybranaOdpowiedz:=ktoraOdpowiedzWybrano(); if wybranaOdpowiedz=-1 then ShowMessage('Zaznacz jeda opcje') else begin if wybranaOdpowiedz=poprawne[aktualnePytanie] then liczbaPoprawnych:=liczbaPoprawnych+1; {przechodzimy do nastepnego pytania} aktualnePytanie:=aktualnePytanie+1; if aktualnePytanie <= liczbaPytan then uaktualnijNapisy(aktualnePytanie) else begin test.tekstLiczbaPytan.Caption:=intToStr(liczbaPytan ); test.tekstLiczbaPoprawnych.Caption:=intToStr(liczbaPoprawnych); test.tekstLiczbaNiepoprawnych.Caption:=intToStr(liczbaPytan - liczbaPoprawnych ); ShowMessage('Odpowiedziales(-as) juz na wszytkie pytania'); end; end; end; end.
Zapobiaganie ponownemu wylosowaniu liczb:
http://forum.ks-eksp...28&hl=losowanie
http://forum.ks-eksp...76&hl=losowanie
http://forum.ks-eksp...24&hl=losowanie
http://forum.ks-eksp...69&hl=losowanie
Jesli chodzi o losowe pytania (np. 10 ze 100) to losuj liczby z zakresu 1-100 i pytania o tych numerach wrzucaj do tablicy z pytaniami :)