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

📄 u_point24.pas

📁 用delphi做的速算24点扑克。实现功能齐全
💻 PAS
📖 第 1 页 / 共 2 页
字号:
   if (MulPos=0) then //如果没有*号
        MulPos:=200; //将MulPos设置成一个不可能的值
   if (DivPos=0) then //如果没有/号
        DivPos:=200; //将DivPos设置成一个不可能的值

   Operator:='-';
   tempPos:=SubPos;

   if(tempPos>PluPos) then
   begin
      tempPos:=PluPos;
      Operator:='+';
   end;
   if(tempPos>MulPos) then
   begin
      tempPos:=MulPos;
      Operator:='*';
   end;
   if(tempPos>DivPos) then
   begin
      //tempPos:=DivPos;
      Operator:='/';
   end;

   Result:=Operator; //结束函数,返回位置
end;
   //此计算用于计算不带()号的加、减、乘、除运算
function TFrm_Point.SubCompute(Str: String): integer;
var
Middle:String;
Mul2:String;
Right:String;
First:integer;
tempStr:String;
temp:integer;
Left:String;
Mul1:String;
MulPos:Integer;
DivPos:Integer;
Fuhao:Char;
begin
  Middle:='';
  Mul2:='';
  Right:='';

 //定位第一个^号位置 ,计算乘方
 First:=Pos('^',Str);
 while (First<>0) do//循环计算乘方
 begin
    tempStr:=Copy(Str,1,First-1);
    temp:=AnyLastPos(tempStr);
    Left:=Copy(Str,1,temp);
    Mul1:=Copy(str,temp+1,First-temp-1);
    tempStr:=Copy(str,First+1,Length(str)-First);
    temp:=AnyFirstPos(tempStr);
    if(temp=200) then
    begin
      Mul2:=tempStr;
      Right:='';
    end
    else
    begin
      Mul2 :=Copy(tempStr,1,temp-1);
      Right:=Copy(tempStr,temp,Length(tempStr)-temp+1);
    end;
    Middle:=FloatToStr(IntPower(StrToInt(Mul1),StrToInt(Mul2)));
    Str:=Left+Middle+Right;
    First:=Pos('^',Str);
 end;

 //定位第一个*号或/号的位置
 MulPos:=Pos('*',Str);
 DivPos:=Pos('/',Str);
 First:=MulPos;
 if (MulPos>DivPos) then
   First:=DivPos;
 if ((DivPos=0) and (MulPos<>0)) then
 begin
    First:=MulPos;
    DivPos:=2000; // 将除号所在位置设置成一个大于MulPos但又不可能的值
 end;
 if ((DivPos<>0) and (MulPos=0)) then
 begin
    First:=DivPos; // 将乘号所在位置设置成一个大于DivPos但不可能的值
    MulPos:=2000;
 end;
 while(First<>0) do//循环计算乘、除
 begin
    tempStr:=Copy(Str,1,First-1);
    temp:=AnyLastPos(tempStr);
    Left:=Copy(Str,1,temp);
    Mul1:=Copy(Str,temp+1,First-temp-1);
    tempStr:=Copy(Str,First+1,Length(Str)-First);
    temp:=AnyFirstPos(tempStr);
    if(temp=200) then
    begin
      Mul2:=tempStr;
      Right:='';
    end
    else
    begin
      Mul2 :=Copy(tempstr,1,temp-1);
      Right:=Copy(tempStr,temp,Length(tempStr)-temp+1);
    end;
    if(MulPos>DivPos) then
       Middle:=IntToStr(StrToInt(Mul1) div StrToInt(Mul2))
    else
       Middle:=IntToStr(StrToInt(Mul1)*StrToInt(Mul2));
    Str:=Left+Middle+Right;

    MulPos:=Pos('*',Str);
    DivPos:=Pos('/',Str);
    First:=MulPos;
    if (MulPos>DivPos) then
       First:=DivPos;

    if((DivPos=0) and (MulPos<>0)) then
    begin
       First:=MulPos;
       DivPos:=2000; // 将除号所在位置设置成一个大于MulPos但又不可能的值
    end;
    if((DivPos<>0) and (MulPos=0)) then
    begin
       First:=DivPos; // 将乘号所在位置设置成一个大于DivPos但不可能的值
       MulPos:=2000;
    end;
 end;
 //定位+、-号首先出现的位置
 First:=AnyFirstPos(Str);
 if (First=200) then//如果没有+、-号,则可以直接返回结果
 begin
   SubCompute:=StrToInt(Str);
   exit;
 end;
 Fuhao:=AnyFirstF(Str); //确定首先出现的符号是+号还是-号
 while (First<>0) do
 begin
     //如果找到+号或-号
     tempStr:=Copy(Str,1,First-1);
     temp:=AnyLastPos(tempStr);
     Left:=Copy(Str,1,temp);
     Mul1:=Copy(Str,temp+1,First-temp-1);
     tempStr:=Copy(Str,First+1,Length(Str)-First);
     temp:=AnyFirstPos(tempStr);
     if(temp=200) then
     begin
        Mul2:=tempStr;
        Right:='';
     end
     else
     begin
        Mul2 :=Copy(tempStr,1,temp-1);
        Right :=Copy(tempStr,temp,Length(tempStr)-temp+1);
     end;
     if (Fuhao='+') then
       Middle:=IntToStr(StrToInt(Mul1)+StrToInt(Mul2))
     else
       Middle:=IntToStr(StrToInt(Mul1)-StrToInt(Mul2));
     Str:=Left+Middle+Right;
     First:=AnyFirstPos(Str);
     if (First=200) then break;
     Fuhao:=AnyFirstF(Str);
   end;

   Result:=StrToInt(Middle);
end;
     //用于计算表达式的结果
function TFrm_Point.TotalCompute(Str: String): integer;
var
First:integer;
Last:integer;
SubStr:String;
LeftStr:String;
Middle:String;
Right:String;
temp:integer;
begin
First:=LastDelimiter ('(',Str); //定位最后一个(号位置
while(First<>0) do
begin
    SubStr:=Copy(Str,First+1,Length(Str)-First);
    Last:= Pos (')',SubStr);
    Last:=Last+First;  //定位最后一个(号以后的最开始的)号位置
    LeftStr:=Copy(Str,1,First-1); //(号左边的字符串
    Middle:=Copy(Str,First+1,Last-First-1); //()号中间的字符串
    Right:=Copy(Str,Last+1,Length(Str)-Last); //)号右边的字符串
    temp:=SubCompute(Middle);  //进入下面的计算
    Middle:=IntToStr(temp);

    Str:=LeftStr+Middle+Right;
    First:=LastDelimiter ('(',Str);
end;

    Result:=SubCompute(Str);
end;

function TFrm_Point.isInputValid: Boolean;
var
tempStr,Current:String;
ppos:Integer;
InputData:array of Integer;
i:integer;
begin
   tempStr:=E_Point.Text;

   //去掉(和)号
   ppos:=Pos('(',tempStr);
   while(ppos<>0) do
   begin
      Delete(tempStr,ppos,1);//删除括号
      ppos:=Pos('(',tempStr);
   end;

   ppos:=Pos(')',tempStr);
   while(ppos<>0) do
   begin
      Delete(tempStr,ppos,1);//删除括号
      ppos:=Pos(')',tempStr);
   end;

   //获取输入的数字
   setLength(InputData,4);
   ppos:=AnyFirstPos(tempStr);
   InputData[0]:=StrToInt(Copy(tempStr,1,ppos-1));
   tempStr:=Copy(tempStr,ppos+1,Length(tempStr)-ppos);
   ppos:=AnyFirstPos(tempStr);
   InputData[1]:=StrToInt(Copy(tempStr,1,ppos-1));
   tempStr:=Copy(tempStr,ppos+1,Length(tempStr)-ppos);
   ppos:=AnyFirstPos(tempStr);
   InputData[2]:=StrToInt(Copy(tempStr,1,ppos-1));
   tempStr:=Copy(tempStr,ppos+1,Length(tempStr)-ppos);
   ppos:=AnyFirstPos(tempStr);
   InputData[3]:=StrToInt(Copy(tempStr,1,ppos-1));

   //将大于10的数设置为1
   for i:=0 to 3 do
   begin
     if(RandomData[i]>10) then
       RandomData[i]:=1;
   end;

   //利用循环判断当前字符是不是不属于4个数中的任何一个
   for i:=0 to 3 do
   begin
     Current:=Copy(tempStr,i+1,1);
     //如果不属于4个数中的任何一个,则返回false,表示输入有误
     if((InputData[i]<>RandomData[0])
        and (InputData[i]<>RandomData[1])
        and (InputData[i]<>RandomData[2])
        and (InputData[i]<>RandomData[3])) then
     begin
           isInputValid:=false;//返回False
           exit;
     end;
   end;

   Result:=true;

end;

procedure TFrm_Point.E_PointKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (E_Point.Text <> '') and (key = VK_RETURN) then
    Btn_Calc.Click;
end;

end.

⌨️ 快捷键说明

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