⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 大家都知道的井字棋delphi实现
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, ExtCtrls, Menus;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    Panel1: TPanel;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

type
  checktype=array[0..4,0..4] of integer;
var
  check,score:checktype;
  x1,y1:1..3;
  computer,man:boolean;
  computer1,computer2,man1,man2:boolean;

implementation

{$R *.DFM}

procedure checkwin;
var
  i:integer;
begin
//判断人机胜负
if man or computer  then
  begin
    for i:=0 to 2 do
      begin
        check[i,3]:=check[i,0]+check[i,1]+check[i,2];
        check[3,i]:=check[0,i]+check[1,i]+check[2,i];
      end;
      check[3,3]:=check[0,0]+check[1,1]+check[2,2];
      check[4,4]:=check[0,2]+check[1,1]+check[2,0];

      if ((check[0,0]<>0)and (check[0,1]<>0)and (check[0,2]<>0)and
          (check[1,0]<>0)and (check[1,1]<>0)and (check[1,2]<>0)and
          (check[2,0]<>0)and (check[2,1]<>0)and (check[2,2]<>0))   then
        begin
          form1.label1.Caption:='棋和万事兴,天下皆太平!';
          form1.label1.visible:=true;
          man:=false;
        end;
      if  ((check[0,3]=3) or (check[1,3]=3) or (check[2,3]=3)
           or (check[3,0]=3) or (check[3,1]=3) or (check[3,2]=3)
           or (check[3,3]=3) or (check[4,4]=3))   then
        begin
          form1.label1.caption:='大侠请再接再厉.';
          form1.label1.visible:=true;
          man:=false;
        end;
      if  ((check[0,3]=-3) or (check[1,3]=-3) or (check[2,3]=-3)
           or (check[3,0]=-3) or (check[3,1]=-3) or (check[3,2]=-3)
           or (check[3,3]=-3) or (check[4,4]=-3))   then
      begin
        form1.label1.caption:='恭喜你!你获胜了!!';
        form1.label1.visible:=true;
        man:=false;
      end;
  end;

//判断两位选手胜负
if man1 or man2 then
  begin
    for i:=0 to 2 do
      begin
        check[i,3]:=check[i,0]+check[i,1]+check[i,2];
        check[3,i]:=check[0,i]+check[1,i]+check[2,i];
      end;
      check[3,3]:=check[0,0]+check[1,1]+check[2,2];
      check[4,4]:=check[0,2]+check[1,1]+check[2,0];

      if ((check[0,0]<>0)and (check[0,1]<>0)and (check[0,2]<>0)and
          (check[1,0]<>0)and (check[1,1]<>0)and (check[1,2]<>0)and
          (check[2,0]<>0)and (check[2,1]<>0)and (check[2,2]<>0))   then
        begin
          form1.label1.Caption:='这是一个平局。';
          form1.label1.visible:=true;
          man1:=false;
          man2:=false;
        end;
      if  ((check[0,3]=3) or (check[1,3]=3) or (check[2,3]=3)
           or (check[3,0]=3) or (check[3,1]=3) or (check[3,2]=3)
           or (check[3,3]=3) or (check[4,4]=3))   then
        begin
          form1.label1.caption:='恭喜第一位选手,你胜出!';
          form1.label1.visible:=true;
          man1:=false;
          man2:=false;
        end;
      if  ((check[0,3]=-3) or (check[1,3]=-3) or (check[2,3]=-3)
           or (check[3,0]=-3) or (check[3,1]=-3) or (check[3,2]=-3)
           or (check[3,3]=-3) or (check[4,4]=-3))   then
      begin
        form1.label1.caption:='恭喜第二位选手,你胜出!';
        form1.label1.visible:=true;
        man1:=false;
        man2:=false;
      end;
  end;

//判断计算机双方胜负
if computer1 or computer2 then
  begin
    for i:=0 to 2 do
      begin
        check[i,3]:=check[i,0]+check[i,1]+check[i,2];
        check[3,i]:=check[0,i]+check[1,i]+check[2,i];
      end;
      check[3,3]:=check[0,0]+check[1,1]+check[2,2];
      check[4,4]:=check[0,2]+check[1,1]+check[2,0];

      if ((check[0,0]<>0)and (check[0,1]<>0)and (check[0,2]<>0)and
          (check[1,0]<>0)and (check[1,1]<>0)and (check[1,2]<>0)and
          (check[2,0]<>0)and (check[2,1]<>0)and (check[2,2]<>0))   then
        begin
          form1.label1.Caption:='这是一个平局。';
          form1.label1.visible:=true;
          computer1:=false;
          computer2:=false;
        end;
      if  ((check[0,3]=3) or (check[1,3]=3) or (check[2,3]=3)
           or (check[3,0]=3) or (check[3,1]=3) or (check[3,2]=3)
           or (check[3,3]=3) or (check[4,4]=3))   then
        begin
          form1.label1.caption:='计算机选手一胜出。';
          form1.label1.visible:=true;
          computer1:=false;
          computer2:=false;
        end;
      if  ((check[0,3]=-3) or (check[1,3]=-3) or (check[2,3]=-3)
           or (check[3,0]=-3) or (check[3,1]=-3) or (check[3,2]=-3)
           or (check[3,3]=-3) or (check[4,4]=-3))   then
      begin
        form1.label1.caption:='计算机选手二胜出。';
        form1.label1.visible:=true;
        computer1:=false;
        computer2:=false;
      end;
  end;
end;



procedure answering;
var
  i,j:integer;
  m,n,k:integer;
begin
//判断最佳落棋点
    for i:=0 to 2 do
        begin
            case (check[i,1]+check[i,2]) of
              2  : score[i,0]:=score[i,0]+50;
              -2 : score[i,0]:=score[i,0]+25;
              1  : score[i,0]:=score[i,0]+10;
              -1 : score[i,0]:=score[i,0]+8;
              0  : score[i,0]:=score[i,0]+4;
            end;
            case (check[i,0]+check[i,2]) of
              2  : score[i,1]:=score[i,1]+50;
              -2 : score[i,1]:=score[i,1]+25;
              1  : score[i,1]:=score[i,1]+10;
              -1 : score[i,1]:=score[i,1]+8;
              0  : score[i,1]:=score[i,1]+4;
            end;
            case (check[i,0]+check[i,1]) of
              2  : score[i,2]:=score[i,2]+50;
              -2 : score[i,2]:=score[i,2]+25;
              1  : score[i,2]:=score[i,2]+10;
              -1 : score[i,2]:=score[i,2]+8;
              0  : score[i,2]:=score[i,2]+4;
            end;
        end;
      for j:=0 to 2 do
        begin
          case (check[1,j]+check[2,j]) of
            2  :  score[0,j]:=score[0,j]+50;
            -2 :  score[0,j]:=score[0,j]+25;
            1  :  score[0,j]:=score[0,j]+10;
            -1 :  score[0,j]:=score[0,j]+8;
            0  :  score[0,j]:=score[0,j]+4;
          end;
          case (check[0,j]+check[2,j]) of
            2  :  score[1,j]:=score[1,j]+50;
            -2 :  score[1,j]:=score[1,j]+25;
            1  :  score[1,j]:=score[1,j]+10;
            -1 :  score[1,j]:=score[1,j]+8;
            0  :  score[1,j]:=score[1,j]+4;
          end;
          case (check[0,j]+check[1,j]) of
            2  :  score[2,j]:=score[2,j]+50;
            -2 :  score[2,j]:=score[2,j]+25;
            1  :  score[2,j]:=score[2,j]+10;
            -1 :  score[2,j]:=score[2,j]+8;
            0  :  score[2,j]:=score[2,j]+4;
          end;
        end;
      case (check[1,1]+check[2,2]) of
        2  :  score[0,0]:=score[0,0]+50;
        -2 :  score[0,0]:=score[0,0]+25;
        1  :  score[0,0]:=score[0,0]+10;
        -1 :  score[0,0]:=score[0,0]+8;
        0  :  score[0,0]:=score[0,0]+4;
      end;
      case (check[0,0]+check[2,2]) of
        2  :  score[1,1]:=score[1,1]+50;
        -2 :  score[1,1]:=score[1,1]+25;
        1  :  score[1,1]:=score[1,1]+10;
        -1 :  score[1,1]:=score[1,1]+8;
        0  :  score[1,1]:=score[1,1]+4;
      end;
      case (check[0,0]+check[1,1]) of
        2  :  score[2,2]:=score[2,2]+50;
        -2 :  score[2,2]:=score[2,2]+25;
        1  :  score[2,2]:=score[2,2]+10;
        -1 :  score[2,2]:=score[2,2]+8;
        0  :  score[2,2]:=score[2,2]+4;
      end;
      case (check[1,1]+check[2,0]) of
        2  :  score[0,2]:=score[0,2]+50;
        -2 :  score[0,2]:=score[0,2]+25;
        1  :  score[0,2]:=score[0,2]+10;
        -1 :  score[0,2]:=score[0,2]+8;
        0  :  score[0,2]:=score[0,2]+4;
      end;
      case (check[0,2]+check[2,0]) of
        2  :  score[1,1]:=score[1,1]+50;
        -2 :  score[1,1]:=score[1,1]+25;
        1  :  score[1,1]:=score[1,1]+10;
        -1 :  score[1,1]:=score[1,1]+8;
        0  :  score[1,1]:=score[1,1]+4;
      end;
      case (check[0,2]+check[1,1]) of
        2  :  score[2,0]:=score[2,0]+50;
        -2 :  score[2,0]:=score[2,0]+25;
        1  :  score[2,0]:=score[2,0]+10;
        -1 :  score[2,0]:=score[2,0]+8;
        0  :  score[2,0]:=score[2,0]+4;
      end;

      for i :=0 to 2 do
        for j:=0 to 2 do
          if check[i,j]<>0 then   score[i,j]:=0;
      k:=0;
      m:=0;
      n:=0;
      for i:=0 to 2 do
        for j:=0 to 2 do
          if score[i,j]>k then
            begin
              k:=score[i,j];
              m:=i;
              n:=j;
            end;

//人机游戏时,判断机子落棋
      if man or computer then
        begin
          form1.stringgrid1.Cells[n,m]:='X';
          check[m,n]:=1;
        end;

//计算机下棋时,判断双方落棋
      if computer1 then
        begin
          form1.stringgrid1.Cells[n,m]:='X';
          check[m,n]:=1;
        end;
      if computer2 then
        begin
          form1.stringgrid1.Cells[n,m]:='0';
          check[m,n]:=-1;
        end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  computer:=false;
  man:=false;
  computer1:=false;
  computer2:=false;
  man1:=false;
  man2:=false;
  timer1.Enabled:=false;
end;

procedure TForm1.StringGrid1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if man then
    begin
      x1:=trunc(x/20);
      y1:=trunc(y/20);
    end;
  if man1 or man2 then
    begin
      x1:=trunc(x/20);
      y1:=trunc(y/20);
    end;

end;

procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if ((man) and (check[y1,x1]=0)) then
    begin
      stringgrid1.cells[x1,y1]:='0';
      check[y1,x1]:=-1;
      computer:=true;
      man:=false;
      checkwin;
      answering;
      computer:=false;
      man:=true;
      checkwin;
    end;

  if (man1 and (check[y1,x1]=0)) then
    begin
      stringgrid1.cells[x1,y1]:='X';
      check[y1,x1]:=1;
      man1:=false;
      man2:=true;
      checkwin;
    end;
  if (man2 and (check[y1,x1]=0)) then
    begin
      stringgrid1.cells[x1,y1]:='0';
      check[y1,x1]:=-1;
      man2:=false;
      man1:=true;
      checkwin;
    end;

end;

procedure TForm1.N2Click(Sender: TObject);
var
  i,j:0..2;
begin
  for j:=0 to 2 do
    for i:=0 to 2 do
      begin
        stringgrid1.Cells[i,j]:='';
        check[i,j]:=0;
        score[i,j]:=0;
      end;
  for j:=0 to 2 do  check[j,3]:=0;
  for i:=0 to 2 do  check[3,i]:=0;
  check[3,3]:=0;
  check[4,4]:=0;

  label1.Caption:='';
  label1.Visible:=false;

  computer1:=false;
  computer2:=false;
  man1:=false;
  man2:=false;

  stringgrid1.Cells[1,1]:='X';
  check[1,1]:=1;
  computer:=false;
  man:=true;
end;

procedure TForm1.N3Click(Sender: TObject);
var
  i,j:integer;
begin
  computer1:=false;
  computer2:=false;
  man1:=false;
  man2:=false;
  
  computer:=false;
  man:=true;
  for j:=0 to 2 do
    for i:=0 to 2 do
      begin
        stringgrid1.Cells[i,j]:='';
        check[i,j]:=0;
        score[i,j]:=0;
      end;
  for j:=0 to 2 do  check[j,3]:=0;
  for i:=0 to 2 do  check[3,i]:=0;
  check[3,3]:=0;
  check[4,4]:=0;

  label1.Caption:='';
  label1.Visible:=false;
  showmessage('请先下!');

end;

procedure TForm1.N7Click(Sender: TObject);
begin
  close;
end;

procedure TForm1.N4Click(Sender: TObject);
var
  i,j:0..2;
begin
  for j:=0 to 2 do
    for i:=0 to 2 do
      begin
        stringgrid1.Cells[i,j]:='';
        check[i,j]:=0;
        score[i,j]:=0;
      end;
  for j:=0 to 2 do  check[j,3]:=0;
  for i:=0 to 2 do  check[3,i]:=0;
  check[3,3]:=0;
  check[4,4]:=0;

  label1.Caption:='';
  label1.Visible:=false;

  computer:=false;
  man:=false;
  computer1:=false;
  computer2:=false;

  man1:=true;
end;

procedure TForm1.N5Click(Sender: TObject);
var
  i,j,x,y:0..2;
begin
  for j:=0 to 2 do
    for i:=0 to 2 do
      begin
        stringgrid1.Cells[i,j]:='';
        check[i,j]:=0;
        score[i,j]:=0;
      end;
  for j:=0 to 2 do  check[j,3]:=0;
  for i:=0 to 2 do  check[3,i]:=0;
  check[3,3]:=0;
  check[4,4]:=0;

  label1.Caption:='';
  label1.Visible:=false;

  computer:=false;
  man:=false;
  man1:=false;
  man2:=false;

  computer1:=true;
  if MessageDlg('请指定第一位计算机选手的第一个落子是否是最佳。',
     mtConfirmation, [mbYes, mbNo], 0) = mrYes then
    begin
      answering;
      computer1:=not computer1;
      computer2:=not computer2;
    end
  else
    begin
      randomize;
      x:=random(2);
      y:=random(2);
      stringgrid1.Cells[y,x]:='X';
      check[x,y]:=1;
      computer1:=not computer1;
      computer2:=not computer2;
    end;
  timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  answering;
  computer1:=not computer1;
  computer2:=not computer2;
  checkwin;
  if (not computer1 and not computer2) then
    timer1.Enabled:=false;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -