Witam. Potrzebuję pomocy. Mam program napisany w Delphi (gra kółko i krzyżyk pomiędzy klientem a serwerem) nie mam pojęcia jak poprawić błędy, a znalazłem ich kilka. Oto one (możliwe, że jest ich więcej):
-po rozegranej partii nie czyści ekranu po stronie serwera.
-przy nie rozstrzygnięciu gry (X u serwera) u klienta pojawia się, ze jest jeszcze ruch przeciwnika (nie można dać nowej partii, trzeba rozłączyć grę).
-jeśli się gra jako O po stronie serwera (a nie X) to gra dobrze pokazuje, ze jest nie rozstrzygnieta.
-gdy gra sie jako X po stronie serwera i wygrał klient (O), to u klienta pokazuje, ze jest jeszcze ruch przeciwnika
-gra po obu stronach pokazuje, ze jest nie rozstrzygnięta lub ruch przeciwnika, gdy serwer jest O (a klient powinien wygrać)
-jak się naciska nowa gra to nieraz nie kasuje ani po jednej stronie ani po drugiej (zostaje wygrał gracz)
Jak widać błędy dotyczą działania gry. Będę wdzięczny za pomoc. Jeżeli ktoś potrafi to proszę poprawić kod. Wydaje mi się, że dla osoby, która zna dobrze Delphi zadanie to nie jest bardzo trudne. Z góry dziękuję za pomoc.
Kod klient:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ScktComp, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
klient: TClientSocket;
Edit1: TEdit;
Label1: TLabel;
Button1: TButton;
StatusBar: TStatusBar;
Edit2: TEdit;
Label2: TLabel;
Button2: TButton;
pole: TPanel;
a11: TSpeedButton;
a12: TSpeedButton;
a13: TSpeedButton;
a21: TSpeedButton;
a22: TSpeedButton;
a23: TSpeedButton;
a31: TSpeedButton;
a32: TSpeedButton;
a33: TSpeedButton;
odp: TLabel;
procedure Button1Click(Sender: TObject);
procedure klientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure klientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure klientConnecting(Sender: TObject; Socket: TCustomWinSocket);
procedure klientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button2Click(Sender: TObject);
procedure a11Click(Sender: TObject);
procedure a12Click(Sender: TObject);
procedure a13Click(Sender: TObject);
procedure a21Click(Sender: TObject);
procedure a22Click(Sender: TObject);
procedure a23Click(Sender: TObject);
procedure a31Click(Sender: TObject);
procedure a32Click(Sender: TObject);
procedure a33Click(Sender: TObject);
procedure zero();
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
gracz: string;
implementation
{$R *.dfm}
procedure TForm1.zero();
begin
a11.Caption := '';
a12.Caption := '';
a13.Caption := '';
a21.Caption := '';
a22.Caption := '';
a23.Caption := '';
a31.Caption := '';
a32.Caption := '';
a33.Caption := '';
odp.Caption := '';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Button1.Caption = 'Polacz' then
begin
klient.Port := STRtoINTDEF(Edit2.Text,3500);
klient.Host := Edit1.Text;
klient.Active := True;
Button1.Caption := 'Rozlacz';
end
else
begin
Button1.Caption := 'Polacz';
klient.Active := FALSE;
end;
end;
procedure TForm1.klientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
Button2.Enabled := True;
StatusBar.SimpleText := 'Polaczony.';
end;
procedure TForm1.klientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
Button2.Enabled := false;
StatusBar.SimpleText := 'Rozlaczony.';
Button1.Caption := 'Polacz';
klient.Active := FALSE;
pole.Enabled := FALSE;
end;
procedure TForm1.klientConnecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar.SimpleText := 'Poczekaj na akceptacje.';
end;
procedure TForm1.klientRead(Sender: TObject; Socket: TCustomWinSocket);
var
buf: string;
begin
buf := Socket.ReceiveText;
if Pos(buf,'wygralX') > 0 then
begin
odp.Caption := 'Wygral gracz X';
button2.Enabled := TRUE;
pole.Enabled := FALSE;
end;
if Pos(buf,'wygralO') > 0 then
begin
odp.Caption := 'Wygral gracz O';
button2.Enabled := TRUE;
pole.Enabled := FALSE;
end;
if Pos(buf,'remis') > 0 then
begin
odp.Caption := 'Gra nie roztrzygnieta.';
button2.Enabled := TRUE;
pole.Enabled := FALSE;
end;
if Pos(buf,'XX') > 0 then
begin
StatusBar.SimpleText := 'Grasz jako X';
gracz := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'OO') > 0 then
begin
StatusBar.SimpleText := 'Grasz jako O';
gracz := 'O';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
////////////////////////
if Pos(buf,'a11') > 0 then
begin
if gracz = 'X' then
a11.Caption := 'O'
else
a11.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a12') > 0 then
begin
if gracz = 'X' then
a12.Caption := 'O'
else
a12.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if buf = 'a13' then
begin
if gracz = 'X' then
a13.Caption := 'O'
else
a13.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a21') > 0 then
begin
if gracz = 'X' then
a21.Caption := 'O'
else
a21.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a22') > 0 then
begin
if gracz = 'X' then
a22.Caption := 'O'
else
a22.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a23') > 0 then
begin
if gracz = 'X' then
a23.Caption := 'O'
else
a23.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a31') > 0 then
begin
if gracz = 'X' then
a31.Caption := 'O'
else
a31.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a32') > 0 then
begin
if gracz = 'X' then
a32.Caption := 'O'
else
a32.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a33') > 0 then
begin
if gracz = 'X' then
a33.Caption := 'O'
else
a33.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
buf := '';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
klient.Socket.SendText('gra');
zero();
button2.Enabled := FALSE;
StatusBar.SimpleText := 'Oczekuje na wybranie gracza';
end;
procedure TForm1.a11Click(Sender: TObject);
begin
if a11.Caption = '' then
begin
klient.Socket.SendText('a11');
pole.Enabled := FALSE;
a11.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a12Click(Sender: TObject);
begin
if a12.Caption = '' then
begin
klient.Socket.SendText('a12');
pole.Enabled := FALSE;
a12.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a13Click(Sender: TObject);
begin
if a13.Caption = '' then
begin
klient.Socket.SendText('a13');
pole.Enabled := FALSE;
a13.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a21Click(Sender: TObject);
begin
if a21.Caption = '' then
begin
klient.Socket.SendText('a21');
pole.Enabled := FALSE;
a21.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a22Click(Sender: TObject);
begin
if a22.Caption = '' then
begin
klient.Socket.SendText('a22');
pole.Enabled := FALSE;
a22.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a23Click(Sender: TObject);
begin
if a23.Caption = '' then
begin
klient.Socket.SendText('a23');
pole.Enabled := FALSE;
a23.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a31Click(Sender: TObject);
begin
if a31.Caption = '' then
begin
klient.Socket.SendText('a31');
pole.Enabled := FALSE;
a31.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a32Click(Sender: TObject);
begin
if a32.Caption = '' then
begin
klient.Socket.SendText('a32');
pole.Enabled := FALSE;
a32.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
procedure TForm1.a33Click(Sender: TObject);
begin
if a33.Caption = '' then
begin
klient.Socket.SendText('a33');
pole.Enabled := FALSE;
a33.Caption := gracz;
odp.Caption := 'Ruch przeciwnika';
end;
end;
end.
Kod serwer:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ScktComp, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
serwer: TServerSocket;
StatusBar: TStatusBar;
Button3: TButton;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
Button2: TButton;
pole: TPanel;
a11: TSpeedButton;
a12: TSpeedButton;
a13: TSpeedButton;
a21: TSpeedButton;
a22: TSpeedButton;
a23: TSpeedButton;
a31: TSpeedButton;
a32: TSpeedButton;
a33: TSpeedButton;
odp: TLabel;
procedure serwerAccept(Sender: TObject; Socket: TCustomWinSocket);
procedure Button3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure serwerClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure serwerClientConnect(Sender: TObject; Socket: TCustomWinSocket);
procedure serwerClientRead(Sender: TObject; Socket: TCustomWinSocket);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure a21Click(Sender: TObject);
procedure a11Click(Sender: TObject);
procedure a12Click(Sender: TObject);
procedure a13Click(Sender: TObject);
procedure a22Click(Sender: TObject);
procedure a23Click(Sender: TObject);
procedure a31Click(Sender: TObject);
procedure a32Click(Sender: TObject);
procedure a33Click(Sender: TObject);
procedure sprawdz(znak: string);
procedure zero();
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
gracz: string;
implementation
{$R *.dfm}
procedure TForm1.zero();
begin
a11.Caption := '';
a12.Caption := '';
a13.Caption := '';
a21.Caption := '';
a22.Caption := '';
a23.Caption := '';
a31.Caption := '';
a32.Caption := '';
a33.Caption := '';
odp.Caption := '';
end;
procedure TForm1.sprawdz(znak: string);
var
koniec: integer;
begin
koniec := 0;
if (a11.Caption = znak) and (a21.Caption = znak) and (a31.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a12.Caption = znak) and (a22.Caption = znak) and (a32.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a13.Caption = znak) and (a23.Caption = znak) and (a33.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a11.Caption = znak) and (a12.Caption = znak) and (a13.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a21.Caption = znak) and (a22.Caption = znak) and (a23.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a31.Caption = znak) and (a32.Caption = znak) and (a33.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a11.Caption = znak) and (a22.Caption = znak) and (a33.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a13.Caption = znak) and (a22.Caption = znak) and (a31.Caption = znak) and (koniec = 0) then
begin
odp.Caption := 'Wygral gracz '+znak;
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('wygral'+znak);
end;
if (a11.Caption <> ) and (a12.Caption <>
) and (a13.Caption <> ) and (a21.Caption <>
) and (a22.Caption <> ) and (a23.Caption <>
) and (a31.Caption <> ) and (a32.Caption <>
) and (a33.Caption <> '') and (koniec = 0) then
begin
odp.Caption := 'Gra nie roztrzygnieta.';
pole.Enabled := FALSE;
koniec := 1;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('remis');
end;
end;
procedure TForm1.serwerAccept(Sender: TObject; Socket: TCustomWinSocket);
begin
if Application.MessageBox('Akceptujesz polaczenie?','Proba polaczenia',MB_YesNo) = ID_NO then
begin
serwer.Close;
StatusBar.SimpleText := 'Oczekuje ...';
end
else
begin
StatusBar.SimpleText := 'Połączenie z: ' + Socket.RemoteAddress;
end;
serwer.Open;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Serwer.Port := STRtoINTDEF(Edit1.text,3500);
if button3.Caption = 'Serwer [off]' then
begin
serwer.Active := TRUE;
button3.Caption := 'Serwer [on]';
StatusBar.SimpleText := 'Oczekuje ...';
end
else
begin
serwer.Active := FALSE;
button3.Caption := 'Serwer [off]';
StatusBar.SimpleText := '';
button2.Enabled := FALSE;
button1.Enabled := FALSE;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Serwer.Active := false;
end;
procedure TForm1.serwerClientDisconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar.SimpleText := 'Oczekuje ...';
button2.Enabled := FALSE;
button1.Enabled := FALSE;
end;
procedure TForm1.serwerClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
StatusBar.SimpleText := 'Proba polaczenia z: ' + Socket.RemoteAddress;
end;
procedure TForm1.serwerClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
buf: string;
begin
buf := Socket.ReceiveText;
if Pos(buf,'gra') > 0 then
begin
StatusBar.SimpleText := 'Wybiez czy grasz O czy X';
button2.Enabled := TRUE;
button1.Enabled := TRUE;
end;
////////////////////////
if Pos(buf,'a11') > 0 then
begin
if gracz = 'X' then
a11.Caption := 'O'
else
a11.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a12') > 0 then
begin
if gracz = 'X' then
a12.Caption := 'O'
else
a12.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a13') > 0 then
begin
if gracz = 'X' then
a13.Caption := 'O'
else
a13.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a21') > 0 then
begin
if gracz = 'X' then
a21.Caption := 'O'
else
a21.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a22') > 0 then
begin
if gracz = 'X' then
a22.Caption := 'O'
else
a22.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a23') > 0 then
begin
if gracz = 'X' then
a23.Caption := 'O'
else
a23.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a31') > 0 then
begin
if gracz = 'X' then
a31.Caption := 'O'
else
a31.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a32') > 0 then
begin
if gracz = 'X' then
a32.Caption := 'O'
else
a32.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
if Pos(buf,'a33') > 0 then
begin
if gracz = 'X' then
a33.Caption := 'O'
else
a33.Caption := 'X';
pole.Enabled := TRUE;
odp.Caption := 'Twój ruch.';
end;
sprawdz('X');
sprawdz('O');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('OO');
button1.Enabled := FALSE;
button2.Enabled := FALSE;
Statusbar.SimpleText := 'Grasz jako X';
pole.Enabled := TRUE;
gracz := 'X';
zero();
odp.Caption := 'Ruch przeciwnika.';
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('XX');
button1.Enabled := FALSE;
button2.Enabled := FALSE;
Statusbar.SimpleText := 'Grasz jako O';
pole.Enabled := TRUE;
gracz := 'O';
zero();
odp.Caption := 'Ruch przeciwnika.';
end;
procedure TForm1.a21Click(Sender: TObject);
begin
if a21.Caption = '' then
begin
a21.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a21');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a11Click(Sender: TObject);
begin
if a11.Caption = '' then
begin
a11.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a11');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a12Click(Sender: TObject);
begin
if a12.Caption = '' then
begin
a12.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a12');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a13Click(Sender: TObject);
begin
if a13.Caption = '' then
begin
a13.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a13');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a22Click(Sender: TObject);
begin
if a22.Caption = '' then
begin
a22.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a22');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a23Click(Sender: TObject);
begin
if a23.Caption = '' then
begin
a23.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a23');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a31Click(Sender: TObject);
begin
if a31.Caption = '' then
begin
a31.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a31');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a32Click(Sender: TObject);
begin
if a32.Caption = '' then
begin
a32.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a32');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
procedure TForm1.a33Click(Sender: TObject);
begin
if a33.Caption = '' then
begin
a33.Caption := gracz;
pole.Enabled := False;
serwer.Socket.Connections[serwer.Socket.ActiveConnections -1].SendText('a33');
odp.Caption := 'Ruch przeciwnika.';
sprawdz('X');
sprawdz('O');
end;
end;
end.