📄 u_point24.pas
字号:
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 + -