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

📄 u_point24.pas

📁 用delphi做的速算24点扑克。实现功能齐全
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit U_Point24;

interface

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

type
    TmathVar = set of Char;
  TFrm_Point = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    Image4: TImage;
    E_Point: TEdit;
    Btn_Calc: TButton;
    Menu_Point: TMainMenu;
    F1: TMenuItem;
    N_Start: TMenuItem;
    N_GameRu: TMenuItem;
    N_Exit: TMenuItem;
    Label1: TLabel;
    Label2: TLabel;
    Lab_Time: TLabel;
    Tim_Point: TTimer;
    But_ReSet: TButton;
    //读取第一个运算符的位置以得到表达式的第一个数字
    function AnyFirstPos(Str: string): Integer;
        //读取最后一个运算符的位置以得到表达式的最后一个数字
    function AnyLastPos(Str: string): Integer;
    //判断最先出现的符号是+号、-号、*号还是/号
    function AnyFirstF(Str:String):Char;
    //此计算用于计算不带()号的加、减、乘、除运算
    function SubCompute(Str:String):integer;
    //用于计算表达式的结果
    function TotalCompute(Str:String):integer;
    Function isInputValid():Boolean;
    procedure FormCreate(Sender: TObject);
    procedure N_StartClick(Sender: TObject);
    procedure N_GameRuClick(Sender: TObject);
    procedure N_ExitClick(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure But_ReSetClick(Sender: TObject);
    procedure Tim_PointTimer(Sender: TObject);
    procedure E_PointKeyPress(Sender: TObject; var Key: Char);
    procedure Btn_CalcClick(Sender: TObject);
    procedure E_PointKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    RanDomData : array of Integer; //存放四个随机数
    SpendTime : Integer;
    
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Frm_Point: TFrm_Point;
  mathVar : TmathVar = ['0','1','2','3','4','5','6','7','8','9','(',')',
               '+','-','*','/',#13,#8];{#13 回车 #8 退格}
implementation

uses U_Help;

{$R *.dfm}

{===================================初始化================================}
// 程序启动时图片框读取背景图片
procedure TFrm_Point.FormCreate(Sender: TObject);
begin
    Image1.Picture.LoadFromFile('pic\bg.bmp');
    Image2.Picture.LoadFromFile('pic\bg.bmp');
    Image3.Picture.LoadFromFile('pic\bg.bmp');
    Image4.Picture.LoadFromFile('pic\bg.bmp');
end;

//菜单
   //开始游戏
{随机读取4张牌同时启动计时器}
procedure TFrm_Point.N_StartClick(Sender: TObject);
var
    i : Integer;
begin
    SpendTime := 0;
    Btn_Calc.Enabled := True;
    Tim_Point.Enabled := True;
    Randomize;//初始化随机数
    SetLength(RanDomData, 4);
    for i := 0 to 3 do
    begin
        RanDomData[i] := Random(13) + 1;
    end;
    Image1.Picture.LoadFromFile('pic\' + IntToStr(RanDomData[0]) + '.bmp');
    Image2.Picture.LoadFromFile('pic\' + IntToStr(RanDomData[1]) + '.bmp');
    Image3.Picture.LoadFromFile('pic\' + IntToStr(RanDomData[2]) + '.bmp');
    Image4.Picture.LoadFromFile('pic\' + IntToStr(RanDomData[3]) + '.bmp');
end;
   //游戏规则
procedure TFrm_Point.N_GameRuClick(Sender: TObject);
begin  //启动帮助
    Frm_Help.Show;
end;
   //退出
procedure TFrm_Point.N_ExitClick(Sender: TObject);
begin
    close;
end;

procedure TFrm_Point.FormCloseQuery(Sender: TObject;
  var CanClose: Boolean);
begin
    if Application.MessageBox('是否要退出游戏?', '系统询问',
                             MB_OKCANCEL + MB_ICONQUESTION) = IDOK then
    begin
        CanClose := true;
    end
    else
    begin
        CanClose := False;
    end;
end;

procedure TFrm_Point.But_ReSetClick(Sender: TObject);
begin
    But_ReSet.Caption := '重新发牌';
    N_Start.Caption := '重新游戏';
    N_Start.Click;
    E_Point.Clear;
end;

procedure TFrm_Point.Tim_PointTimer(Sender: TObject);
begin
    SpendTime := SpendTime + 1;
    Lab_Time.Caption := IntToStr(SpendTime);
end;

procedure TFrm_Point.E_PointKeyPress(Sender: TObject; var Key: Char);
begin
    if Btn_Calc.Enabled and (not (key in mathVar)) then
    begin
        Application.MessageBox('请输入合法字符!', '系统提示',
                                MB_OK + MB_ICONWARNING);
        key := #0;
    end;
end;
{=========================================================================}
   //计算
procedure TFrm_Point.Btn_CalcClick(Sender: TObject);
var
    resu:integer;
    answer:String;
begin
    if E_Point.Text = '' then
    begin
        Application.MessageBox('请输入数学表达式!', '系统提示',
                                MB_OK + MB_ICONINFORMATION);
        exit;
    end;
   //resu := 0;
   Tim_Point.Enabled:=False;
   try
       if (not IsInputValid()) then
       begin
         Application.MessageBox('您输入的数至少有一个不是系统所发4张扑克中的一个',
                    '输入错误',MB_OK+MB_ICONERROR);
         Tim_Point.Enabled:= True;
         exit;
       end;
       resu:=TotalCompute(E_Point.Text);
       if (Abs(resu-24)<0.001) then
       begin
            Application.MessageBox('您真行,我服了您!','对了',
                                        MB_OK+MB_ICONINFORMATION);
            N_Start.Click;
            E_Point.Clear;
       end
       else
       begin
            answer:='您输入的表达式的计算结果为'+IntToStr(Resu)+'!';
            Application.MessageBox(PChar(answer),'错了',MB_OK+MB_ICONERROR);
            Tim_Point.Enabled:= True;
       end;
   except
        Application.MessageBox('您的输入有误','输入错误',
                                MB_OK+MB_ICONWARNING);
        Tim_Point.Enabled:= True;
        exit;
   end;
end;
{=========================================================================}
    //读取第一个运算符的位置以得到表达式的第一个数字
function TFrm_Point.AnyFirstPos(Str: string): Integer;
var
SubPos:integer;
PluPos:integer;
MulPos:integer;
DivPos:integer;
FirstPos:integer;
begin
   //定位字符串中最先一个运算符的位置
   SubPos:=Pos('-',Str);
   PluPos:=Pos('+',Str);
   MulPos:=Pos('*',Str);
   DivPos:=Pos('/',Str);
   FirstPos:=200;
   if (SubPos=0) then //如果没有-号
        SubPos:=200; //将SubPos设置成一个不可能的值
   if (PluPos=0) then //如果没有+号
        PluPos:=200; //将PluPos设置成一个不可能的值
   if (MulPos=0) then //如果没有*号
        MulPos:=200; //将MulPos设置成一个不可能的值
   if (DivPos=0) then //如果没有/号
        DivPos:=200; //将DivPos设置成一个不可能的值

    if(FirstPos > SubPos) then
      FirstPos := SubPos;
    if (FirstPos > PluPos) then
      FirstPos := PluPos;
    if (FirstPos>MulPos) then
      FirstPos := MulPos;
    if (FirstPos > DivPos) then
      FirstPos:=DivPos;

    Result := FirstPos; //结束函数,返回位置
end;
    //读取最后一个运算符的位置以得到表达式的最后一个数字
function TFrm_Point.AnyLastPos(Str: string): Integer;
var
SubPos:integer;
PluPos:integer;
MulPos:integer;
DivPos:integer;
Pos:Integer;
begin
   //定位字符串中最后一个运算符的位置
   SubPos:=LastDelimiter('-',Str);
   PluPos:=LastDelimiter('+',Str);
   MulPos:=LastDelimiter('*',Str);
   DivPos:=LastDelimiter('/',Str);
   Pos:=SubPos;
   if (Pos<PluPos) then
        Pos:=PluPos;
   if (Pos<MulPos) then
        Pos:=MulPos;
   if (Pos<DivPos) then
        Pos:=DivPos;
   Result:=Pos; //结束函数,返回位置
end;
//判断最先出现的符号是+号、-号、*号还是/号
function TFrm_Point.AnyFirstF(Str: String): Char;
var
SubPos:integer;
PluPos:integer;
MulPos:integer;
DivPos:integer;
Operator:char;
tempPos:integer;
begin
   SubPos:=Pos('-',Str);
   PluPos:=Pos('+',Str);
   MulPos:=Pos('*',Str);
   DivPos:=Pos('/',Str);

   if (SubPos=0) then //如果没有-号
        SubPos:=200; //将SubPos设置成一个不可能的值
   if (PluPos=0) then //如果没有+号
        PluPos:=200; //将PluPos设置成一个不可能的值

⌨️ 快捷键说明

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