Witam,
Napisałem w Delphi grę kółko i krzyżyk z procedurą, która ma za zadanie wykonać ruch komputera.
Wszystko było ładnie, pięknie dopóki podczas testowania komputer dostawił sobie dwa krzyżyki a ja za cholerę nie mogę znaleźć błędu w kodzie. Szukam od trzech dni i nic, wszystko wydaje mi się ok, a komputer dalej stawia sobie dwa znaki (oczywiście nie zawsze). Będę baaardzo wdzięczny gdy ktoś poświęci trochę czasu na przejrzenie tego kodu i wytknie mi błąd. Komputer zaprogramowałem w ten sposób, aby możliwa była wygrana.
Dodam, że jako pierwszy ruch wykonuje gracz, a potem komputer.
Zmienne:
-
t[x] - zmienna t to tablica typu integer, która zapisuje co znajduje się na danym polu (nic=0, kółko(gracz)=1, krzyżyk(komputer)=10)
x to numer pola:
t[1] t[2] t[3]
t[4] t[5] t[6]
t[7] t[8] t[9]
-
zn - zmienna typu boolean. nazwa od słowa "znalazł" czyli przyjmuje wartość true gdy komputer znalazł odpowiedni ruch. Jest resetowana przy każdorazowym wywołaniu procedury ruchu komputera.
-
gr - zmienna typu integer. nazwa od słowa "gracz". Przyjmuje wartość 1 gdy ruch wykonuje gracz, a 2 gdy ruch wykonuje komputer.
-
r - zmienna typu integer. nazwa od słowa "random". Gdy na planszy nie ma żadnego krzyżyka, komputer losowo go dostawia, na podstawie tej właśnie zmiennej.
Plansza to 9 pól tekstowych typu Edit.
Edit1 Edit2 Edit3
Edit4 Edit5 Edit6
Edit7 Edit8 Edit9
procedure RuchKomputera;
begin
zn:=false;
{czesc sprawdzajaca czy komputer moze wygrac}
if (t[1]+t[2]+t[3]=20)AND(zn=false) then
begin
if t[1]=0 then begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
if t[2]=0 then begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
if t[3]=0 then begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
end;
if (t[4]+t[5]+t[6]=20)AND(zn=false) then
begin
if t[4]=0 then begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[6]=0 then begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
end;
if (t[7]+t[8]+t[9]=20)AND(zn=false) then
begin
if t[7]=0 then begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
if t[8]=0 then begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
if t[9]=0 then begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end;
if (t[1]+t[4]+t[7]=20)AND(zn=false) then
begin
if t[1]=0 then begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
if t[4]=0 then begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
if t[7]=0 then begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end;
if (t[2]+t[5]+t[8]=20)AND(zn=false) then
begin
if t[2]=0 then begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[8]=0 then begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
end;
if (t[3]+t[6]+t[9]=20)AND(zn=false) then
begin
if t[3]=0 then begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
if t[6]=0 then begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
if t[9]=0 then begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end;
if (t[1]+t[5]+t[9]=20)AND(zn=false) then
begin
if t[1]=0 then begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[9]=0 then begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end;
if (t[3]+t[5]+t[7]=20)AND(zn=false) then
begin
if t[3]=0 then begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[7]=0 then begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end;
{koniec czesci sprawdzajacej czy komputer moze wygrac}
{sprawdzanie czy gracz moze wygrac}
if (t[1]+t[2]+t[3]=2)AND(zn=false) then
begin
if t[1]=0 then begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
if t[2]=0 then begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
if t[3]=0 then begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
end;
if (t[4]+t[5]+t[6]=2)AND(zn=false) then
begin
if t[4]=0 then begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[6]=0 then begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
end;
if (t[7]+t[8]+t[9]=2)AND(zn=false) then
begin
if t[7]=0 then begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
if t[8]=0 then begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
if t[9]=0 then begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end;
if (t[1]+t[4]+t[7]=2)AND(zn=false) then
begin
if t[1]=0 then begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
if t[4]=0 then begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
if t[7]=0 then begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end;
if (t[2]+t[5]+t[8]=2)AND(zn=false) then
begin
if t[2]=0 then begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[8]=0 then begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
end;
if (t[3]+t[6]+t[9]=2)AND(zn=false) then
begin
if t[3]=0 then begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
if t[6]=0 then begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
if t[9]=0 then begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end;
if (t[1]+t[5]+t[9]=2)AND(zn=false) then
begin
if t[1]=0 then begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[9]=0 then begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end;
if (t[3]+t[5]+t[7]=2)AND(zn=false) then
begin
if t[3]=0 then begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
if t[5]=0 then begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
if t[7]=0 then begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end;
{koniec czesci sprawdzajacaej czy gracz moze wygrac}
{dostawianie znaku do juz istniejacego}
if (t[1]+t[2]+t[3]=10)AND(zn=false) then
begin
if t[1]=10 then begin randomize; r:=random(2); case r of
0: begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
1: begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
end; end;
if t[2]=10 then begin randomize; r:=random(2); case r of
0: begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
1: begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
end; end;
if t[3]=10 then begin randomize; r:=random(2); case r of
0: begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
1: begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
end; end; end;
if (t[4]+t[5]+t[6]=10)AND(zn=false) then
begin
if t[4]=10 then begin randomize; r:=random(2); case r of
0: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
1: begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
end; end;
if t[5]=10 then begin randomize; r:=random(2); case r of
0: begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
1: begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
end; end;
if t[6]=10 then begin randomize; r:=random(2); case r of
0: begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
1: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
end; end; end;
if (t[7]+t[8]+t[9]=10)AND(zn=false) then
begin
if t[7]=10 then begin randomize; r:=random(2); case r of
0: begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
1: begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end; end;
if t[8]=10 then begin randomize; r:=random(2); case r of
0: begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
1: begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end; end;
if t[9]=10 then begin randomize; r:=random(2); case r of
0: begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
1: begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
end; end; end;
if (t[1]+t[4]+t[7]=10)AND(zn=false) then
begin
if t[1]=10 then begin randomize; r:=random(2); case r of
0: begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
1: begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end; end;
if t[4]=10 then begin randomize; r:=random(2); case r of
0: begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
1: begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end; end;
if t[7]=10 then begin randomize; r:=random(2); case r of
0: begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
1: begin Edit4.Text:='X'; gr:=1; t[4]:=10; zn:=true; end;
end; end; end;
if (t[2]+t[5]+t[8]=10)AND(zn=false) then
begin
if t[2]=10 then begin randomize; r:=random(2); case r of
0: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
1: begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
end; end;
if t[5]=10 then begin randomize; r:=random(2); case r of
0: begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
1: begin Edit8.Text:='X'; gr:=1; t[8]:=10; zn:=true; end;
end; end;
if t[8]=10 then begin randomize; r:=random(2); case r of
0: begin Edit2.Text:='X'; gr:=1; t[2]:=10; zn:=true; end;
1: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
end; end; end;
if (t[3]+t[6]+t[9]=10)AND(zn=false) then
begin
if t[3]=10 then begin randomize; r:=random(2); case r of
0: begin Edit6.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
1: begin Edit9.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
end; end;
if t[6]=10 then begin randomize; r:=random(2); case r of
0: begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
1: begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end; end;
if t[9]=10 then begin randomize; r:=random(2); case r of
0: begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
1: begin Edit6.Text:='X'; gr:=1; t[6]:=10; zn:=true; end;
end; end; end;
if (t[1]+t[5]+t[9]=10)AND(zn=false) then
begin
if t[1]=10 then begin randomize; r:=random(2); case r of
0: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
1: begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end; end;
if t[5]=10 then begin randomize; r:=random(2); case r of
0: begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
1: begin Edit9.Text:='X'; gr:=1; t[9]:=10; zn:=true; end;
end; end;
if t[9]=10 then begin randomize; r:=random(2); case r of
0: begin Edit1.Text:='X'; gr:=1; t[1]:=10; zn:=true; end;
1: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
end; end; end;
if (t[3]+t[5]+t[7]=10)AND(zn=false) then
begin
if t[3]=10 then begin randomize; r:=random(2); case r of
0: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
1: begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end; end;
if t[5]=10 then begin randomize; r:=random(2); case r of
0: begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
1: begin Edit7.Text:='X'; gr:=1; t[7]:=10; zn:=true; end;
end; end;
if t[7]=10 then begin randomize; r:=random(2); case r of
0: begin Edit3.Text:='X'; gr:=1; t[3]:=10; zn:=true; end;
1: begin Edit5.Text:='X'; gr:=1; t[5]:=10; zn:=true; end;
end; end; end;
{koniec czesci dostawiajacej znak do juz istniejacego}
{czesc losujaca znak jezeli nie ma zadnego innego}
if zn=false then
begin
repeat
r:=0;
randomize;
r:=random(9);
Inc(r);
until t[r]=0;
case r of
1: begin t[1]:=10; Edit1.Text:='X'; gr:=1; zn:=true; end;
2: begin t[2]:=10; Edit2.Text:='X'; gr:=1; zn:=true; end;
3: begin t[3]:=10; Edit3.Text:='X'; gr:=1; zn:=true; end;
4: begin t[4]:=10; Edit4.Text:='X'; gr:=1; zn:=true; end;
5: begin t[5]:=10; Edit5.Text:='X'; gr:=1; zn:=true; end;
6: begin t[6]:=10; Edit6.Text:='X'; gr:=1; zn:=true; end;
7: begin t[7]:=10; Edit7.Text:='X'; gr:=1; zn:=true; end;
8: begin t[8]:=10; Edit8.Text:='X'; gr:=1; zn:=true; end;
9: begin t[9]:=10; Edit9.Text:='X'; gr:=1; zn:=true; end;
end;
end;
end;