首页 | 社区 | 博客 | 招聘 | 文章 | 新闻 | 下载 | 读书 | 代码
亲,您未登录哦! 登录 | 注册

五子棋源代码

打印文章

分享到:
unit Main;  

interface  

uses  
 Windows, Messages, SysUtils, Classes, Controls, Forms, Dialogs,  
 ExtCtrls, StdCtrls, ComCtrls, Buttons, Graphics, mmsystem;  

type  
 TForm1 = class(TForm)  
  StatusBar1: TStatusBar;  
  GroupBox1: TGroupBox;  
  GroupBox2: TGroupBox;  
  Panel1: TPanel;  
  Label1: TLabel;  
  BitBtn1: TBitBtn;  
  BitBtn2: TBitBtn;  
  Label3: TLabel;  
  Label4: TLabel;  
  BitBtn3: TBitBtn;  
  Image1: TImage;  
  Image2: TImage;  
  Label5: TLabel;  
  Label2: TLabel;  
  Label6: TLabel;  
  Label7: TLabel;  
  Label8: TLabel;  
  Label9: TLabel;  
  Label10: TLabel;  
  Timer1: TTimer;  
  Label11: TLabel;  
  procedure BitBtn2Click(Sender: TObject);  
  procedure BitBtn1Click(Sender: TObject);  
  procedure Image2MouseDown(Sender: TObject; Button: TMouseButton;  
   Shift: TShiftState; X, Y: Integer);  
  procedure FormCreate(Sender: TObject);  
  procedure BitBtn3Click(Sender: TObject);  
  procedure Timer1Timer(Sender: TObject);  
  procedure Label11MouseDown(Sender: TObject; Button: TMouseButton;  
   Shift: TShiftState; X, Y: Integer);  

 private  
  { Private declarations }  
 public  
  { Public declarations }  
 end;  

 FiveChess_Struct=record  
     x1 : integer;  
     y1 : integer;  
     x2 : integer;  
     y2 : integer;  
     state : byte;  
 end;  
 FiveChess_Data=array [0..14,0..14] of FiveChess_Struct;  

 Player = ( NON,White,Black);  

var  
 Form1: TForm1;  
 Start_Flag : Boolean;  
 FiveChess_Array:FiveChess_Data ;  
 Online: player;  
 whitewin,blackwin:byte;  
 whitetime,blacktime:integer;  
 px1,px2,py1,py2 : integer;  

 Undo_i,Undo_j : integer;  
function Ini_Main():Boolean ;  
implementation  

uses Option;  

{$R *.DFM}  
//{$R AOE.RES}  


procedure Ini_FiveChess_Array();  
var  
  i , j,k: integer;  
begin  

   For i:=0 to 14 do begin  
     For j:=0 to 14 do begin  
       FiveChess_Array[i,j].x1:=16+25*j;  
       FiveChess_Array[i,j].y1:=16+25*i;  
       FiveChess_Array[i,j].x2:=36+25*j;  
       FiveChess_Array[i,j].y2:=36+25*i;  
       FiveChess_Array[i,j].state:=0;  
       end;  
    end;  
end;  

procedure Draw_qipan();  
var  
   i,j : integer;  
begin  
   Form1.Image2.Canvas.Brush.Color:=RGB(247,207,16);  
   Form1.Image2.Canvas.FillRect(Rect(0,0,400,400));  
   Form1.Image2.Canvas.pen.Color:=RGB(0,0,0);  
   for i:=1 to 16 do begin  
     Form1.Image2.Canvas.MoveTo(0,25*i);  
     Form1.Image2.Canvas.LineTo (400,25*i);  
     Form1.Image2.Canvas.MoveTo(25*i,0);  
     Form1.Image2.Canvas.LineTo (25*i,400);  
   end;  

end;  


procedure Undo_Run();  
var  
   x1,x2,y1,y2 : integer;  
begin  




   if (Undo_i<>-1) and (Undo_j<>-1) then  begin  
     FiveChess_array[Undo_i,Undo_j].state :=0;  
     x1:= FiveChess_Array[Undo_i,Undo_j].x1-2;  
     y1:= FiveChess_Array[Undo_i,Undo_j].y1-2;  
     x2:= FiveChess_Array[Undo_i,Undo_j].x2+2;  
     y2:= FiveChess_Array[Undo_i,Undo_j].y2+2;  
     Form1.Image2.Canvas.Brush.Color:=RGB(247,207,16);  
     Form1.Image2.Canvas.FillRect(rect(x1,y1,x2,y2));  
     Form1.Image2.Canvas.pen.Color:=RGB(0,0,0);  
     Form1.Image2.Canvas.MoveTo((x1+x2)div 2-1 , y1);  
     Form1.Image2.Canvas.LineTo((x1+x2)div 2-1 , y2);  
     Form1.Image2.Canvas.MoveTo(x1,(y1+y2)div 2-1);  
     Form1.Image2.Canvas.LineTo(x2,(y1+y2)div 2-1);  

     end;  

   If Online=black then  
     Online:=White  
   else  
     Online:=Black;    


end;  



function Ini_Main():Boolean ;  


begin  

   Result:=true;  

   px1:=0;  
   px2:=0;  
   py1:=0;  
   py2:=0;  

   Undo_i:=-1;  
   Undo_j:=-1;  

   whitetime:=0;  
   blacktime:=0;  

   form1.Label9.Caption :=inttostr(whitewin);  
   form1.Label10.Caption :=inttostr(blackwin);  


   Ini_FiveChess_Array;  
   Draw_Qipan;  
end;  






Function Judge_Success_on_off (X,Y,State:integer):Boolean;  
var  
   i,j,k,count : integer;  
begin  
   Count:=0;  
   Result:=false;  

   // 判断竖列  
   For i:=X-4 to X+4 do  
     if (i>=0) and (i<=15) then
      begin
         if FiveChess_array[i,y].state=state then
           begin
             Inc(Count) ;
             if count=5 then begin
               result:=true;
               break;
               end;
           end
         else
           Count:=0;
      end;
   //判断横行
   count:=0;
   For j:=y-4 to y+4 do
     if (j>=0) and (j<=15) then
      begin
         if FiveChess_array[X,j].state=state then
           begin
             Inc(Count) ;
             if count=5 then begin
               result:=true;
               break;
               end;
           end
         else
           Count:=0;
      end;
   //判断'\'方向
   count:=0;
   For k:=-4 to 4 do begin
       i:=X+k;
       j:=Y+k;
       if (j>=0) and (j<=15) And(i>=0) and(i<=15) then
        begin
         if FiveChess_array[i,j].state=state then
           begin
             Inc(Count) ;
             if count=5 then begin
               result:=true;
               break;
               end;
           end
         else
           Count:=0;
      end;
   end;
  //判断'/'方向
   count:=0;
   For k:=-4 to 4 do begin
       i:=X+k;
       j:=Y-k;
       if (j>=0) and (j<=15) And(i>=0) and(i<=15) then
        begin
         if FiveChess_array[i,j].state=state then
           begin
             Inc(Count) ;
             if count=5 then begin
               result:=true;
               break;
               end;
           end
         else
           Count:=0;
      end;
   end;

end;



procedure TForm1.BitBtn2Click(Sender: TObject);
begin
   Application.Terminate ;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   Start_Flag:=true;
   If Start_Flag then begin
    Form1.Image2.Enabled := true;
    Form1.Timer1.Enabled := true;
    Ini_Main;

   end;

end;

function Draw_Qizi_White(X,Y : Integer):boolean;
var
   i,j,x1,x2,y1,y2 : integer;
begin
   result := false;
   for i:=0 to 14 do
     For j:=0 to 14 do begin
       if (X> FiveChess_Array[i,j].x1)and(X<FiveChess_Array[i,j].x2)
      and (y> FiveChess_Array[i,j].y1)and(y<FiveChess_Array[i,j].y2)
      and (FiveChess_Array[i,j].state=0)  then
      begin
         if FiveChess_Array[Undo_i,Undo_j].state<>0 then begin  
          Form1.Image2.Canvas.Brush.Color:=Rgb(100,100,100);  
          Form1.Image2.Canvas.FillRect (Rect(px1,py1,px2,py2));  
         end;  

         Form1.Image2.Canvas.Brush.Color:=Rgb(255,255,255);  
         Form1.Image2.Canvas.Ellipse ( FiveChess_Array[i,j].x1,  
         FiveChess_Array[i,j].y1,FiveChess_Array[i,j].x2,FiveChess_Array[i,j].y2);  
         Form1.Image2.Canvas.Brush.Color:=RGB(255,255,255);  
         Form1.Image2.Canvas.Ellipse ( FiveChess_Array[i,j].x1-2,  
         FiveChess_Array[i,j].y1-2,FiveChess_Array[i,j].x2-2,FiveChess_Array[i,j].y2-2);  
         FiveChess_array[i,j].state:=1;  

         Undo_i:=i;  
         Undo_j:=j;  


         Form1.Image2.Canvas.Brush.Color:=clred;  
         px1:= FiveChess_Array[i,j].x1+3;  
         py1:= FiveChess_Array[i,j].y1+3;  
         px2:= FiveChess_Array[i,j].x2-7;  
         py2:= FiveChess_Array[i,j].y2-7;  
         Form1.Image2.Canvas.Ellipse (px1,py1,px2,py2);  





         if Judge_Success_on_off(i,j, FiveChess_Array[i,j].state) then  
          begin  
             whitewin:=whitewin+1;  
             if whitewin>1 then  
              Application.MessageBox ('臭棋篓!比鱼头还臭!','胜败乃兵家常事',0)  
             else  
              Application.MessageBox ('白方已胜利!','胜败乃兵家常事',0);  

             form1.label9.caption:=inttostr(whitewin);  
             form1.Image2.Enabled :=false;  
             Form1.Timer1.Enabled := false;  
          end;  

         Result := true;  
         break;  
      end;  
   end;  
end;  

function Draw_Qizi_Black(X,Y : Integer): boolean;  
var  
   i,j,x1,x2,y1,y2 : integer;  
begin  
   result:=false;  
   for i:=0 to 14 do  
     for j:=0 to 14 do begin  
       if (X> FiveChess_Array[i,j].x1)and(X<FiveChess_Array[i,j].x2)
         and (y> FiveChess_Array[i,j].y1)and(y<FiveChess_Array[i,j].y2)
         and (FiveChess_Array[i,j].state=0)  then
         begin
           if FiveChess_Array[Undo_i,Undo_j].state<>0 then begin  
             Form1.Image2.Canvas.Brush.Color:=Rgb(255,255,255);  
             Form1.Image2.Canvas.FillRect (Rect(px1,py1,px2,py2));  
           end;  
           Form1.Image2.Canvas.Brush.Color:=RGB(0,0,0);  
           Form1.Image2.Canvas.Ellipse ( FiveChess_Array[i,j].x1,  
              FiveChess_Array[i,j].y1,FiveChess_Array[i,j].x2,FiveChess_Array[i,j].y2);  
           Form1.Image2.Canvas.Brush.Color:=RGB(100,100,100);  
           Form1.Image2.Canvas.Ellipse ( FiveChess_Array[i,j].x1-2,  
           FiveChess_Array[i,j].y1-2,FiveChess_Array[i,j].x2-2,FiveChess_Array[i,j].y2-2);  

           FiveChess_array[i,j].state := 2;  

           Undo_i:=i;  
           Undo_j:=j;  

           Form1.Image2.Canvas.Brush.Color:=clred;  
           px1:= FiveChess_Array[i,j].x1+3;  
           py1:= FiveChess_Array[i,j].y1+3;  
           px2:= FiveChess_Array[i,j].x2-7;  
           py2:= FiveChess_Array[i,j].y2-7;  
           Form1.Image2.Canvas.Ellipse (px1,py1,px2,py2);  


           if Judge_Success_on_off(i,j, FiveChess_Array[i,j].state) then  
            begin  
               blackwin:=blackwin+1;  
               if blackwin>1 then  
                Application.MessageBox ('不会吧!难道比鱼头还臭!','胜败乃兵家常事',0)  
               else  
                Application.MessageBox ('黑方已胜利!','胜败乃兵家常事',0);  

               form1.label10.caption:=inttostr(blackwin);  
               form1.Image2.Enabled :=false;  
               Form1.Timer1.enabled := False;  
            end;  
           Result:=true;  
           break;  
         end;  
   end;  
end;  

procedure TForm1.Image2MouseDown(Sender: TObject; Button: TMouseButton;  
 Shift: TShiftState; X, Y: Integer);  

begin  
     if Online = White then  begin  
      if draw_Qizi_white(X,Y) then  
        Online := Black  
      end  
     else  
        if draw_Qizi_Black(X,Y) then  
         Online:=White;  



end;  

procedure TForm1.FormCreate(Sender: TObject);  
begin  
   Online:=white;  
   form1.Label11.Caption :='人不到伤痕累累'#13+'就不会懂得后悔!';  
   Start_Flag:=false;  
   Form1.Image2.Enabled := false;  
     



end;  

procedure TForm1.BitBtn3Click(Sender: TObject);  
begin  
    form2.show;  

end;  

procedure TForm1.Timer1Timer(Sender: TObject);  
begin  
   if online=white then  
     whitetime:=whitetime +1  
   else  
     blacktime:=blacktime +1;  

   Form1.Label7.caption:=inttostr(whitetime);  
   Form1.Label8.caption:=inttostr(blacktime);  



end;  

procedure TForm1.Label11MouseDown(Sender: TObject; Button: TMouseButton;  
 Shift: TShiftState; X, Y: Integer);  
begin  
   if (Button = mbleft) and (ssShift in shift) And (form1.Image2.Enabled = true)then  
     Undo_Run;  

   end;  


end.  

end;  


//////////////////////////  


unit Option;  

interface  

uses  
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,  
 StdCtrls, Buttons;  

type  
 TForm2 = class(TForm)  
  GroupBox1: TGroupBox;  
  RadioButton1: TRadioButton;  
  RadioButton2: TRadioButton;  
  BitBtn1: TBitBtn;  
  BitBtn2: TBitBtn;  
  GroupBox2: TGroupBox;  
  RadioButton3: TRadioButton;  
  RadioButton4: TRadioButton;  
  RadioButton5: TRadioButton;  
  procedure FormCreate(Sender: TObject);  
  procedure BitBtn1Click(Sender: TObject);  
  procedure BitBtn2Click(Sender: TObject);  
 private  
  { Private declarations }  
 public  
  { Public declarations }  
 end;  

var  
 Form2: TForm2;  


implementation  


uses  
   Main;  
{$R *.DFM}  

procedure TForm2.FormCreate(Sender: TObject);  
begin  
    form2.RadioButton1.Checked := true;  
    form2.RadioButton3.Checked := true;  
end;  

procedure TForm2.BitBtn1Click(Sender: TObject);  
begin  
   if form2.RadioButton1.Checked = true then  
     Online := White  
   else  
     Online := Black;  

   if  form2.RadioButton3.Checked then  
      begin  
         whitewin:=0;  
         blackwin:=0;  
      end ;  


   Ini_main;  


   form2.close;  




end;  

procedure TForm2.BitBtn2Click(Sender: TObject);  
begin  
   form2.Close ;  
end;  

end.

本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )

编程爱好者论坛

本栏最新文章