第一篇:“24点”游戏秘籍
“24点”游戏秘籍
“24点”数学游戏,它能把枯燥的基本数字计算变得趣味盎然,能大大提高计算能力和计算速度,使得思维灵活敏捷,是一种寓教于乐的的智力竞赛游戏。
游戏规则:给定4个自然数,通过加、减、乘、除四则运算,可以任意交换数的位置,可以随意的添加括号,但是每个数只能且必须用上一次,连起来组成一个计算式子,得数就是24。
“24点”数学游戏通常是用扑克牌进行的,此时,给定的4个数就被限定在1~13的范围内。“24点”数学游戏可以是1个人玩,也可以是多人玩,比如4个人玩,把扑克牌中的大、小王拿掉,剩下的52张牌洗好后,每人分给13张,然后就是每人出一张牌,其中J、Q、K分别代表11、12、13,其他的牌就代表相应的1~10的自然数,谁先算出“24点”,谁就把这4张牌赢走,然后继续玩牌,最后谁的牌多谁就获胜。当如果算不出“24点”的话,各自就拿回来自己的牌,然后洗牌,再次继续进行。
要想算得又快又准,这就要靠平时的基本功了,而要有好的过硬的基本功,就要多练习了,只有多练,才能算得好,而且这又能很好地锻炼自己的反应能力和敏捷的判断能力,对学好数学很有帮助。而要玩好这个游戏,最重要的有2条:
1、熟悉加法口诀和乘法口诀;
2、利用括号,因为括号既能改变运算顺序,也可以改变运算符号。
下面通过一些例子来说明“24点”的一些基本算法。“24点”的基本算法(1)乘法
乘法式子有3×8=24,4×6=24,2×12=24,1×24=24等。
例1.3、3、5、6 解法
一、根据3×8=24,3已经有了,只要将其他3个数凑成8,有3×(5+6-3)=24。
解法
二、根据4×6=24,6已经有了,只要将其他3个数凑成4,有6×(5-3÷3)=24或者6×(3×3-5)=24。
解法
三、还是根据3×8=24,要将2个数凑成3,要将另2个数凑成8有(6-3)×(5+3)=24。
解法
四、先把其中两个数相乘,积不足24的用另外2个数补足,有3×5+3+6=24 解法
五、先把其中两个数相乘,积超过24的用另外2个数割去,有5×6-3-3=24 例2.2、2、4、8 解法
一、根据3×8=24,8已经有了,只要将其他3个数凑成8,有8×【(2+4)÷2】=24或者8×【4-2÷2】=24。
解法
二、根据4×6=24,4已经有了,只要将其他3个数凑成6,有4×(2+8÷2)=24。
解法
三、根据2×12=24,有2×(2×8-4)=24。
解法
四、根据8+16=24,8已有,将其他3个数凑成16,有8+2×2×4=24或者8+(2+2)×4=24。
解法
五、根据4+20=24,4已有,将其他3个数凑成20,有4+(2+8)×2=24。
“24点”的基本算法(2)除法
除法式子有24÷1=24,48÷2=24,72÷3=24,96÷4=24等。
例1.2、4、8、10 解法
一、根据48÷2=24,2已经有了,只要将其他3个数凑成48,有(4×10+8)÷2=24。
解法
二、不过容易想到2×12=24,故有(2+10)×(8÷4)=24。解法
三、根据96÷4=24,有【(2+10)×8】÷4=24。
解法
四、根据4×6=24,4已经有了,只要将其他3个数凑成6,有4×(2×8-10)=24。
解法
五、由乘减有:4×10-2×8=24。例2.2、3、7、10 解法
一、根据72÷3=24,3已经有了,只要将其他3个数凑成72,有(7×10+2)÷3=24。
解法
二、由乘减知道:2×10+7-3=24。
例3.4、6、9、10 解法
一、根据24÷1=24,有(4×6)÷(10-9)=24。
解法
二、根据96÷4=24,4已经有了,只要将其他3个数凑成96,有(9×10+6)÷4=24。
“24点”的基本算法(3)借助“乘法分配律” 例、1、4、4、5 分析:很明显,4×(1+5)=24。但是这3个数就凑成了24了,可惜还有一个数4用不到,根据规则,必须要将这个4用进去,怎么办?用到“乘法分配律”试试。
解:4×1+4×5=24。例2、6、8、8、9 8×(9-6)=8×9-8×6=24 例3、5、7、12、12 12×(7-5)=12×7-12×5=24 总结:在例1~例3中,我们用到了a×(b+c)=a×b+a×c, a×(b-c)=a×b-a×c
例4、2、2、6、9 分析,显然,有2×9+6=24,三个数就够了,但是还有一个数字2没有用到,这次又怎么办呢?
还是利用“乘法分配律”,24=2×9+6=2×9+6÷2×2=2×(9+6÷2)=24
“24点”的基本算法(4)分数
例1、1、5、5、5 分析:假设基本算式已经找到:5×?=24,则?=.用1,5,5能够凑成 吗? 解: =5-,于是得到5×(5-1÷)=24。
例2、3,3,8,8 分析:我们有基本算式8÷ =24。被除数8已有,另外三个数3,3,8能够凑成 吗?
解: =3-,于是有8÷(3-8÷3)=24。例3、1,4,5,6 解:根据4÷ =24,有4÷(1-5÷6)=24。或者6÷ =24,有6÷(5÷4-1)=24。
例4、2、6、9、9 2×9+6=2×9+6÷9×9=9×(2+6÷9)=24 例5、2、4、10、10 2×10+4=2×10+4÷10×10=10×(2+4÷10)=24 总结:在例1~例5中,我们用到了a×b+c=a×(b+c÷a), a×b-c=a×(b-c÷a).我们知道,符合“24点”数学游戏规则的每个具体的算式中,一定要知道出现四个数和三个运算符号。也就是说,一定要进行三次运算,出现三个运算结果。其中前两次结果是运算过程中的中间结果,⑴可以看成三个相连数中最前面一个数。如:4、5、6、6和3、4、5、8。⑵可以看成三个相连数中中间一个数。如:3、7、8、9和2、3、4、8。⑶可以看成三个相连数中最后面一个数。如:2、3、4、6和6、7、8、3。⑷可以看成三个相连数中最前面一个数减去1。如:4、5、6、8和5、6、7、6。
⑸可以看成三个相连数中最后面一个数加上1。如:3、4、5、4和5、6、7、3。
⑹可以看成三个相连数中中间一个数的2倍数。如:2、3、4、4和7、8、9、8。
⑺可以看成三个相连数中中间一个数的3倍数。如:6、7、8、3和8、9、10、3。
⑻三个数相连时,有时可以看作是两组两个数相连,如3、4、5可看作3与4或4与5两组两个数相连,计算时具体用哪个组合要看另一张牌的数。
3、四个数相连:四个数相连的概率极小,一共只有7个组合,每个组合都有解,不难。
“24点”的基本算法(6)相同数的计算方法
1、两个数相同
⑴两个数相同可以看作1。如5、5、2、8和7、7、3、6。⑵两个数相同可以看作0。如7、7、3、8和9、9、4、6。
⑶两个数相同可以看作这个数的2倍。如5、5、2、7和4、4、2、6。⑷两个数相同可以看作乘积,数较大时不宜使用。如5、5、2、1和3、3、6、8。
从上面的例子知道,当四张牌中出现任何一对数相同时,另两张牌如果是3和8,或者是4和6时则可解。并且根据两个相同数可以看作1的道理,四张牌中有两个相同,另外两张是下列情况时均可解。如9、9、7、3。(9÷9+7)×3=24,9、9、5、4。(5+9÷9)×4=24 9、9、9、3。(9-9÷9)×3=24,9、9、2、8。(2+9÷9)×8=24 9、9、8、3。(9÷9)×3×8=24,9、9、4、8。(4-9÷9)×8=249、9、6、3。(3+9÷9)×6=24,9、9、5、6。(5-9÷9)×6=24 9、9、7、4。(7-9÷9)×4=24,9、9、6、4。(9÷9)×6×4=24。
2、三个数相同
⑴三个数相同时可以看作是其中的一个数,如3、3、3、8和4、4、4、6。⑵三个数相同时可以看作是其中的一个数加上1,如5、5、5、4和7、7、7、3或7774。
⑶三个数相同时可以看作是其中的一个数减去1,如5、5、5、6和9、9、9、3。
从上面的例子可以知道,四张牌中出现三个相同数时,可以看作3个不同的数。如出现7、7、7时,可看作是6,7,8,当另外一个数是3或4时,应用此法便可解答。如出现3个4时,可看作3、4、5,当另一个数是6或8时,也可解。其他依此类推。
3、四个数相同:四个数相同出现的概率较少,一共有10个。这些组合中,只有四个3、4、5、6能够解答,其余的都没有解。
“24点”的基本算法(7)单数的计算方法
1、一个单数
随机取出的四张牌中几乎都会出现一张单数。当出现一张单数时,应根据这张单数的数目和另外三张双数之间的关系来做灵活调整。因为有3×8=24的基本算法,所以如单数是3,一般可以考虑把三个双数处理成8。如3、10、2、4有3×(10+2-4)=24或3、2、2、4有3×(2+2+4)=24。
如单数不是3,双数中有8时,可以将单数和其他两个双数处理成3。例如9、4、2、8有8×(9-2-4)=24或者9、10、2、8有8×(10-9+2)=24。
单数既不是3,双数不是8呢,有时可以将通过一个单数与2个双数和一个双数进行匀算后出现3和8,如9、6、4、4有(9-6)×(4+4)=24或9、6、2、4有(9-6)×2×4=24。
用以上方法不能求解时,就要考虑其他方法了。可将单数乘上双数变成一个双数后再和另外两个双数一起运算。在单数较大时可先减掉一个双数再乘上一个双数变成双数,再和另外一个双数运算。通常就是乘减或乘加运算。如3、4、6、6有3×4+6+6=24。3、4、2、6有3×4+2×6=24,9、6、4、2有(9-6)×2×4=24。
2、二个单数:可以通过二个单数之间相加或相减变成双数。
如3、3、2、2有(3+3)×(2+2)=24,9、3、8、2有(9-3)×8+2=24。
一般两个单数之间不宜相乘,因为相乘后又是单数。且数目较大,但是有例外。如7、7、1、2有(7×7-1)÷2=24。但是两个单数可以相除的话,不妨一试。如9、3、2、6有9÷3×(2+6)=24或9、3、4、4有9÷3×(4+4)=24。
(转自昌岗中路小学网页,作者:cgz53,发表日期:2011年9月14日)
第二篇:delphi24点游戏
第3章 “速算24”扑克游戏--单元、异常、逻辑
3.1 “速算24”扑克游戏效果说明
“速算24”是一个考察心算能力、有助于开发智力的扑克游戏。在给出4张扑克牌之后,要求应用这些扑克牌数字做数学运算,迅速构造出一个数学表达式,得出结果24。这个游戏的关键在于迅速判断用户输入的表达式是否正确,并做出相应的反馈,告诉用户是算对了还是算错了。游戏的初始界面如图3.1所示。
图3.1 游戏的初始界面
当用户单击“开始”按钮时,系统开始发牌,随机发出4张牌,如图3.2所示为随机开始的一局游戏,给出的4张纸牌分别为“9”,“8”,“9”,“2”。在文本框中输入运算表达式,比如,输入“8*(2+(9-9))”,单击“计算”按钮,系统会出现提示框,显示“您输入的表达式的计算结果为16!”,告诉你该表达式的结果不是“24”,如图3.3所示。单击“确定”按钮,再次在文本框中输入表达式,比如“8*(2+(9/9))”,单击“计算”按钮,系统会出现提示框,显示“您真行,我服了您!”,表明运算正确,如图3.4所示。
图3.2 系统随机发4张纸牌
图3.3 运算式不正确
图3.4 运算式正确
这个游戏具体的规则如下:
(1)单击“开始”按钮,游戏开始,系统将随机发牌。
(2)请迅速在文本框中输入运算表达式,然后单击“计算”按钮。
(3)这时系统会提示您的运算是对了还是错了,在弹出的对话框中单击“OK”按钮,再次输入新的运算表达式,重复上一步,直到您的运算表达式结果正确,这时系统会恭喜您!
(4)如果结果错了还想继续或者中途想计算另一局扑克牌,就单击“重新开始”按钮,得到新一局扑克牌进行游戏。
下面,我们开始循序渐进地创建这个小游戏。在最开始,游戏的界面和效果都会非常简单,在后面我们会逐渐地完善它。
第3章 “速算24”扑克游戏--单元、异常、逻辑
3.2 生成和建立程序(1)在程序中用到了Image组件,用于放置图片。还用到了Timer组件,用于计算用户操作时间。下面我们来生成游戏的基本框架。
3.2.1 Image组件
Image组件在Additional页上,用来在窗口中显示一幅图片。它拥有如下几个主要属性: 1.Picture属性
可以在picture属性中调入图像文件。Delphi支持多种图像格式,如位图(.BMP)、图标(.ICO)、图元(.WFM)、动画光标(.ANI)、JPEG图片(.JPG、.JPEG)等。
2.AutoSize属性
当AutoSize为True时,Image组件将根据它所包含的图像的大小来调整自身的大小;当AutoSize为False时,不论图像有多大,组件将保持设计时的大小。如果组件比图像小,那么只有一部分图像是可见的。
3.Stretch属性
当Stretch为True时,位图图像将根据组件的大小调整自身的大小,当组件大小改变时,上述三种文件也做相应变化。Stretch属性对图标没有作用。
上述的AutoSize和Stretch属性决定了图像在窗口中的显示尺寸。
图3.5演示的3个Image分别为:AutoSize为True,AutoSize为False,Stretch为True的情形。可以看到,Image的原始尺寸比图片宽,矮,在上面的属性设置下,就会有不同的显示效果。
图3.5 AutoSize和Stretch的设置 3.2.2 Timer组件
在Delphi中,组件分可视组件和非可视组件。可视组件是指那些在运行期间仍然能显示的组件,例如Label,Button,Image组件等。非可视组件是指那些在程序界面设计期间可见,而在程序运行时不可见的组件,例如在System页上的Timer组件。
Timer组件能够有规律地触发OnTimer事件,发送信息给应用程序,它是编制应用程序时最为重要的组件之一。
1.Timer组件的属性
Enabled属性表示Timer是打开还是关闭。用Interval属性设置两个OnTimer事件间的间隔,单位是毫秒。将间隔设置为0相当于关闭计时器,Interval是Cardinal类型的,最大值可到4294967295,当然程序中一般不会把Interval设成很大的值。2.Timer组件的使用
Timer是独立的对象,在启动与Windows无关的逻辑和应用事件时极其有用。可以模拟时钟或计时器,可视地显示经过的时间;可以用作系统延时,Delphi提示信息出现只需在该区域停顿几秒,就是Timer组件应用的一个例子;可以检查系统环境、事件,根据结果进行响应;也可以在窗口中闪烁一段正文或图像,提示某种操作或处理正在进行等等。
尽管Delphi的计时器每秒可以产生1000次激发,在编程中还必须注意程序对Timer触发的响应。如果程序处理OnTimer事件的时间超过Interval的设定值,就可能错过事件,因为当下一次触发到来时,系统正忙于处理上一事件,则这次触发就会被忽略。同时要注意其他的Windows应用程序是否会影响Timer的触发。如果后台正运行着一个占用处理器的程序,就可能会导致Timer的触发不准确,从而使前台程序运行出现错误。
这里要强调的是Timer组件是一个非可视组件,可以把它放置到窗体或者其他容器组件上的任何位置。3.实现游戏计时功能
在本章的游戏中,我们加入一个Timer组件,实现游戏的计时功能。
在窗体中加入一个Label组件,将此组件的Caption属性设置为“使用时间”,然后从组件面板上选择System页中的Timer组件。
在Unit1中加入Form1的一个私有成员SpendTime,记录用户计算所用的时间。代码如下所示:
private { Private declarations } SpendTime:Integer;在Form1的onCreate事件中加入如下代码。将SpendTime设置为0,并将Timer1的Enabled属性设置为False,使Timer1组件不能响应OnTimer事件;并将Timer1的Interval属性设置为1000,表示当Timer1有效时,每间隔1000ms(即1秒)发生一次OnTimer事件:
procedure TForm1.FormCreate(Sender: TObject);var i:integer;begin //初始化,设置数组RandomData的长度为4 //并将每个数组元素初始化为零
setLength(RandomData,4);for i := 0 to 3 do RandomData[i]:=0;SpendTime:=0;Timer1.Enabled:=False;Timer1.Interval:=1000;end;然后在标题为“开始”的“开始”按钮的OnClick事件中,加入如下所示的代码,将Timer1的Enabled属性设置为True,使Timer1组件有效,即现在Timer1能响应OnTimer事件,计时开始。并将SpendTime重新设置为0:
Timer1.Enabled:=True;Timer1.Interval:=1000;SpendTime:=0;//将SpendTime重新设为0 再在“计算”按钮的OnClick事件句柄中,增加下面的语句,使Timer1无效:
Timer1.Enabled:=False;最后双击Timer1组件,创建Timer1的OnTimer事件句柄,在其中加入如下所示的代码,将SpendTime加1,并设置Label5的Caption属性:
procedure TForm1.Timer1Timer(Sender: TObject);begin SpendTime:=SpendTime+1;Label5.Caption:='使用时间:'+IntToStr(SpendTime)+'秒';end;这样,每隔1秒钟,程序就刷新一次使用时间。
3.2.3 设计初始界面
按住Shift键,然后单击组件面板中Additional页中的Image组件,这时该组件边缘出现蓝色的边框,并且凹陷下去,表示可以在窗体上连续加入几个Image组件。选择好Image组件后,在窗体的左上角单击,加入1个Image组件,然后依次向右单击鼠标3次,再加入3个Image组件。最后再单击组件面板中最左边的箭头。
为了排列这4个Image组件,先利用Shift键将它们同时选上,然后右击,选择Align命令,在随后出现的Alignment对话框中的Horizontal选项组中选择Space equally,在Vertical选项组中选择Tops,表示这4个组件顶端对齐,水平方向上间距相等。
按照同样的方法加入4个Label组件、3个Button组件和1个Edit组件。按照表3.1所示设置各个组件的属性。
表3.1 各个组件的属性
组件名 Form1 Label1 属性名 Caption Caption AutoSize WordWrap Caption
属性值 速算24
1.单击“开始”按钮,游戏开始,系统将发出4张扑克牌
False False
2.要求用户利用扑克牌显示的数字,通过加减乘除运算,以最快的速度得出24(可以使用括号),JQKA和“王”算做1。然后在文本框中写好表达式,接
着单击“计算”按钮
Label2
Label3 AutoSize WordWrap Caption
False True
3.这时系统会计算输入表达式的结果,告诉用户是对还是错了。在弹出的对话框中单击“OK”按钮,如果错了可以再次输入新的表达式,重复上一步。直
到您的表达式正确,这时系统会恭喜算对了!
Label4 AutoSize WordWrap Caption AutoSize Caption Caption Caption Text
False True 在下面输入数学表达式
False 开始 计算 退出游戏 空
Button1 Button2 Button3 Edit1
现在同时选择Label1,Label2和Label3,将它们左对齐,垂直方向等距离排列。将Button1,Button2和Button3左对齐,垂直方向等距离排列。
下面放置4个Image组件,用于放置4张纸牌的图片。
先选择Image1,然后切换到对象查看器中的属性编辑器,选择属性选项页中的Picture属性,然后在Picture属性值栏中双击,或单击此属性值旁边的带有省略号的按钮,打开Picture Editor对话框,如图3.6所示。然后单击Load按钮,弹出Load Picture对话框,在此对话框中选择background.bmp文件。最后单击OK按钮,退出Picture Editor对话框。
图3.6 指定图片
使用同样的方法,设定其他3个Image组件的Picture属性。
保存我们的新项目,运行之后界面如图3.7所示,与运行时的界面图3.1稍有不同。这里是设计时界面,只有界面没有事件响应。是程序创建过程中的一个步骤的检验。但是,这个程序还没有什么具体的功能,为了让游戏运行起来,必须添加代码,创建相应的事件处理程序。
第3章 “速算24”扑克游戏--单元、异常、逻辑
生成和建立程序
3.2.4 事件处理
需要添加个事件:第一个用于响应单击开始按钮,在此事件中完成发牌,即随机显示图片;第二个用于响应单击计算按钮,解析用户在文本框中输入的表达式,计算表达式的结果,并判断表达式的结果是否等于;第三个用于响应单击退出游戏按钮,退出游戏(程
序)。
1.数据初始化
创建窗体的事件处理程序,在这里进行必要的初始化。第一步先在Unit1中添加Form1的私有成员数组:
private
{ Private declarations }
RandomData:array of Integer;然后,在对象查看器中选中Form1,选中Event选项卡,在OnCreate一栏对应的右边的空白栏中双击,创建OnCreate函数。添加如下代码。
procedure TForm1.FormCreate(Sender: TObject);
var
i:integer;
begin //初始化,设置数组RandomData的长度为4
//并将每个数组元素初始化为零
setLength(RandomData,4);
for i := 0 to 3 do
RandomData[i]:=0;
end;这里使用一个for循环语句,i是循环变量,格式是:for循环变量:=初值to末值do循环体。你也可以借助Delphi的自动完成功能,在输入for之后按下Ctrl+J键,生成如下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
for := to do
begin end;
end;在上述代码中,程序首先利用setLength函数设定可变数组RandomData的数组长度为4,然后,将数组的每一个单元都设置为0。这样,就完成了数组的数据初始化工作。
2.“开始”按钮的Click事件处理
()功能单击开始按钮时,系统就随机地发出张纸牌,显示在个组件中。
()代码首先,我们需要一个循环变量,一个字符串变量存放随机选取的图片的文件名。创建“开始”按钮的OnClick事件处理程序,在begin前头添加需要的变量,然后在此事件
中加入如下所示的代码。
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
filename:String;
begin
Randomize;//初始化随机数
for i := 0 to 3 do
begin RandomData[i]:=Random(13)+1;//产生一个1到13的随机数
filename:=IntToStr(RandomData[i])+'.bmp';//根据随机数,得到文件名
//根据i的不同为不同的Image组件载入图像文件
case i of 0 : Image1.Picture.LoadFromFile(filename);1 : Image2.Picture.LoadFromFile(filename);2 : Image3.Picture.LoadFromFile(filename);3 : Image4.Picture.LoadFromFile(filename);
end;
edit1.Text:='';
edit1.SetFocus;
end;
end;在Delphi内部,随机数的产生实际上也是在一套算法的控制之下,Randomize函数用于初始化产生随机数的种子,保证两次产生的随机数不同,而Random(i:integer)则利用初始化过后的随机数种子产生一个1~i之间的随机数。这里i设定为13,以配合扑克牌的张数13。
用来将一个整数转换成一个字符串,和上一章中的的功能恰好相反。我们已经预先准备了位图文件,它们都是形式,文件名则是利用数字命名。中特殊的字符串运算符将两个字符串串联起来,产生一个新的字符串,我们需要的位图文件后缀是,因此,在产生文件名的时候,在数字后面加上这个字符串。语句在上一章中已经讲过,单击开始按钮后,准备接受用户的输入,然后利用方法,把焦点设置到上。是提供的方法之一,用于设置输入
焦点到某个指定的组件。
3.“计算”按钮的OnClick事件
双击“计算”按钮,创建此组件的OnClick事件响应句柄,然后在代码编辑器中加入如下所
示的代码,用于计算用户输入的表达式。
procedure TForm1.Button2Click(Sender: TObject);
var
result:integer;
answer:String;
begin
result:=TotalCompute(Edit1.Text);
if(result=24)then Application.MessageBox('您真行,我服了您!','对了',MB_OK)
else
begin answer:='您输入的表达式的计算结果为'+IntToStr(Result)+'!';Application.MessageBox(PChar(answer),'错了',MB_OK);
end;
end;这段程序根据自定义函数的计算结果判断用户的输入正确与否,并且输出相应的结果以提示
用户。
在语句“result:=TotalCompute(Edit1.Text)”中用到了一个自定义的函数TotalComp-ute,我们用它来计算用户输入的表达式。现在我们还没编写这个函数的代码,所以,目前这段代码是无法运行的。没关系,可以先把它用“//”注释掉,然后随便给 result赋一个值,测试这个事件处理程序的其他部分是否运行正常,例如:
//result:=TotalCompute(Edit1.Text);
result:=24;这样,运行后,单击“计算”按钮后的显示如图3.8所示。
图3.8 成功的提示信息
我们用一个类型的变量存放出错信息,但是函数的第一个参数要求是(字符指针)类型,因此,我们用一个强制类型转换将转换
成。4.“退出游戏”按钮的OnClick事件
双击“退出游戏”按钮,创建此组件的OnClick事件处理程序,然后在代码编辑器中加入如
下所示的代码,用于退出程序。
procedure TForm1.Button3Click(Sender: TObject);
begin
Close;
end;在上一章中我们提到可以用代替,但这里使用来结束程序的运行。这样,可以通过事件来指定在什么条件下窗体可以关闭。
第3章 “速算24”扑克游戏--单元、异常、逻辑
生成和建立程序5.OnCloseQuery事件
当调用方法来关闭窗体时,事件发生。利用事件来指定在什么条件下窗体可以关闭。事件包含一布尔型的参量,可以用它来决定窗体是否关闭。的默认值为。可以利用事件来询问用户是否真的希望马上关闭窗体。我们在这里弹出一个对话框,代码如下所示:
procedure TForm1.FormCloseQuery(Sender: TObject;var CanClose: Boolean);begin if(MessageDlg('现在要退出游戏吗?', mtConfirmation, [mbOk, mbCancel], 0)= mrOk)then canClose:=True else canClose:=False;end;MessageDlg是一种提示对话框,第一个参数是对话框询问的讯息,是一个字符串;第二个参数则代表对话框的类型,mtConfirmation是一个TMsgDlgType的枚举类型,表示这个对话框是个确认对话框。TMsgDlgType类型如下所示:
type TMsgDlgType =(mtWarning, mtError, mtInformation, mtConfirmation, mtCustom);以上定义的对话框类型分别表示:警告、错误、提示、确认和自定义类型。
第三个参数是TMsgDlgBtn类型的集合,这个集合包含了类型为TMsgDlgBtn的按钮,TMsgDlgBtn的定义如下:
type TMsgDlgBtn =(mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mnNoToAll, mbYesToAll, mbHelp);在我们的程序中,利用了一个集合[mbOK, mbCancle],表示在对话框中显示两个按钮:OK和Cancel的组合。
最后一个参数是用来描述帮助索引的长整型变量,用来获取提示用户的帮助信息,这里我们没有任何帮助信息,先不管它。函数和用户交互,返回一个类型的数字,预先定义了一套数字,用来直观地表示对话框返回信息。如果用户单击了按钮,这个对话框返回,效果如图所示。
图3.9 关闭窗口时询问用户
现在,我们已经完成了程序的主体部分。第3章 “速算24”扑克游戏--单元、异常、逻辑
单元间的互相引用3.3.1 单元引用的概念
在第章关于单元的知识里,我们已经知道可以定义不包含窗体的单元,它集中定义了程序中使用的函数,这一节里,我们就要实现这样的一个单元,用来实现上面提到的函数。我们可以在任何单元中编写自己的函数,当然包括与窗体相连的单元。可是我们常常需要用到一些常用的函数,这时最好是创建一个不与窗体相连的独立单元,用它来容纳自己的函数,这称为独立的单元文件。当创建了不与窗体相连的独立单元文件后,项目中的其他单元就能很容易地共享这些函数,其他项目也可以很容易地调用这些函数了。对于单元间的引用,要用到语句。3.3.2 uses语句
语句告诉程序在最终的执行代码中需要用到哪些函数和过程。会自动把一些必须的单元包括进来,例如,,等。对于我们自己编写的单元,如果程序中使用了该单元的函数或代码,也需要包括在部分中。语句具有两种类型:公有引用和私有引用。在部分包含的语句代表的是本单元的公有引用,就是说,这部分的引用可以被其他引用本单元的单元继承性地引用。在部分的语句应包含在部分中的代码所需要的单元,去掉那些可以自动加入到程序中的单元。在部分包含的语句代表的是本单元的私有引用,就是说,这部分的引用只能被本单元内部使用。在部分的语句应只包含在部分中的代码所需的单元的名字。对于单元间的引用,要避免交叉引用。假设有两个单元和,如果出现在的部分的语句中,那么单元便不能出现在单元的的语句中。因为这样会产生对单元的循环访问,编译时会出现错误信息。3.3.3 创建另一个单元
创建一个不与窗体相连的单元文件的方法是,首先选择主菜单的命令,然后选择命令,此时弹出一个对话框,如图所示。在此图中选择选项卡中的,然后单击按钮。此时自动为我们创建一个名为的独立单元文件,并显示在代码编辑器中,我们只需在此加入函数即可。
图3.10 New Items对话框
单元创建之后,就需要实现单元之间的互相引用。这里有两种方法:(1)直接在Unit1中写入uses Unit2,代码如下所示:
var Form1: TForm1;implementation uses Unit2;(2)选择主菜单的File | Use Unit命令,此时Delphi弹出Use Unit对话框,如图3.11所示,在此窗口中列出当前文件没有连接的所有文件,只需选择需要连接的文件即可。当选择了某一文件并单击OK按钮后,当前文件就包含了对所选文件的引用。
图3.11 Use Unit对话框
如果当前文件已经连接了当前项目中所有其他文件,选择命令后,就会弹出如图所示的信息窗口,告诉程序员当前文件已经连接了当前项目中所有其他文件。
图3.12 Information对话框
此时再编译,程序就没有任何错误了。现在我们已经创建了,它将用作我们的数学函数定义单元。在开始定义这个单元之前,需要先了解一下关于的异常处理机制。第3章 “速算24”扑克游戏--单元、异常、逻辑
3.4 异 常 处 理
3.4.1 异常处理的概念 在应用程序开发中如何检测、处理程序的运行错误是一个很重要的问题。在 Delphi 的IDE(集成开发环境)中提供了一个完善的内置调试器,可以发现大部分程序错误。但并不是所有的错误都可以被发现,而且当程序涉及到与外设的数据交换或操作外设,如要求用户输入、读写磁盘等时,错误的发生是程序无法控制的,如输入非法字符、磁盘不能读写等。这些情况不仅会导致应用程序异常中止,而且可能引起系统的崩溃。针对这些问题,Delphi提供了一套强大的异常处理机制。巧妙地利用它,可以使程序更为强健,使用更为友好。
Delphi异常处理机制建立在Protected Blocks(保护块)的概念上。所谓保护块是指用保留字try和end封装的一段代码。保护块的作用是当应用程序发生错误时自动创建一个相应的Exception(“异常”类)。程序可以捕获并处理这个“异常”类,以确保程序的正常结束以及资源的释放和数据不受破坏。如果程序不进行处理,则系统会自动提供一个消息框。“异常”类是Delphi异常处理机制的核心,也是Delphi异常处理的主要特色。Delphi提供的所有“异常”类都是类Exception的子类。用户也可以从类Exception派生一个自定义的“异常”类。
3.4.2 资源保护方式
回收分配的资源是确保程序健壮性的一个关键。但默认情况下异常发生时程序会在出错点自动退出当前模块,因此需要一种特殊的机制来确保即使在异常发生的情况下,释放资源的语句仍能被执行,而Delphi的异常处理正提供了这种机制。
Delphi提供了一个保留字finally,用于实现资源的保护。
{分配资源}
try {资源使用情况} finally {释放资源}
end;try„finally„end就形成了一个资源保护块。finally后面的语句在任何情况下(不论程序是否发生异常)都会执行。
在异常保护的情况下,当异常发生时,系统会自动弹出一个消息框,在框中显示异常的消息。退出当前模块后异常类自动清除。
3.4.3 异常响应方式
异常响应为开发者提供了一个按需进行异常处理的机制。try„except„end形成了一个异常响应保护块。与finally不同的是:正常情况下except 后面的语句并不被执行,而当异常发生时程序自动跳到except处,进入异常响应处理模块。当异常被响应后异常类自动清除。
下面是异常响应方式的一般代码:
try {程序正常功能} except on ESomething do {响应特定异常} else {提供默认响应} end;保留字on„do用于判断异常类型。必须注意的是:except后面的语句必须包含在某一个on„do模块中,而不能单独存在。这是又一个与finally不同的地方。
3.4.4 提供默认响应
在异常响应模块中,一般我们只对希望响应的特定异常进行处理。如果一个异常发生而响应模块并没有包含对它的处理代码,则退出当前响应模块,异常类仍被保留。
为了保证任何异常发生后都能在当前响应模块中被清除,可以定义默认响应:
try {程序正常功能} except on ESomething do {响应特定异常} else {提供默认响应} end;由于else可以响应任何异常,包括我们一无所知的异常,因此在默认响应中最好只包括诸如显示一个消息框之类的处理,而不要改变程序的运行状态或数据。
第3章 “速算24”扑克游戏--单元、异常、逻辑
3.5 数学逻辑单元(1)
此游戏程序最关键的地方是如何将用户输入的字符串表达式解析成数学表达式。为了使程序结构清晰明了,我们将此解析代码和程序的主代码分开,单独编写成一个单元。
3.5.1 算法设计
游戏的难点是如何将一字符串形式的表达式解析成计算机能计算的算术表达式。例如对于字符串“3^(4*(9+4))”,如何让计算机解析、计算。
我们的想法是按照数学四则运算规则,先逐层进入最里层的括号,然后在括号内部计算乘方,接着进行乘(除)法运算,最后按顺序进行加(减)运算,当本层括号内部计算完成后,返回结果,去掉括号内部数据,退出到下一级括号(如果有)内进行计算。
这里面涉及的技术细节主要有下面几点:
(1)层层剥离括号,然后从最里层的括号开始计算。(2)对于每一个运算符号,找到符号两侧的数字,形成一个计算式。
(3)每一个子计算式完成后,运算结果返回到原始数列中,作为子串的一部分,继续进行上述计算。
3.5.2 字符串的相关函数
在游戏中,用户输入的都是字符数据,我们需要从这些字符中分析得到数字和运算符号,因此要用到与字符串操作有关的函数。
function Pos(sub , all:string):integer;这个函数含有两个参数:sub表示要查找的字符,all表示原字符串。函数在字符串all中寻找指定的字符sub的位置,如果字符串中不存在sub字符,则函数结果为0。
function LastDelimiter(sub,all :string):integer 这个函数含有两个参数:sub表示要查找的字符,all表示原字符串。函数返回在字符串all中所有查找到的指定字符sub的最后一个的位置,如果字符串中不存在sub字符,则函数结果为0。
function Copy(allstring:string;first,length:integer):string 这个函数的3个参数的含义分别是:allstring代表原来的字符串,first表示拷贝开始的位置,length表示要拷贝的子串长度。函数返回拷贝成功的子串。
procedure Delete(str:string;ppos,length:integer)这个过程用于删除字符串中的一段字符。参数str代表将要操作的字符串,ppos代表开始删除的位置,length表示将要删除多少个字符。function Length(S): Integer;Length函数返回字符串S的长度。
function Trim(const S: string): string;overload;function Trim(const S: WideString): WideString;overload;Trim函数返回字符串S去掉前面和后面的空格后的字符串。
下面的例子给出一个综合利用字符串处理函数编写的一个处理特定字符串的函数,它的功能是:输入一个字符串后,可以返回字符串中两个单括号之间的子字符串,并去掉前面和后面带着的空格:
function GetMyStr(const S: string): string;begin Result:=Trim(Copy(S,Pos('<',S)+1,Pos('>',S)-Pos('<',S)-1));end;比如我们在程序中写到GetMyStr(‘This is a test < Result to output > end of test’);,会得到字符串“Result to output”。
3.5.3 算法的代码编写
基于上述的考虑和知识基础,我们在声明部分定义下列几个主要函数:
(1)AnyLastPos函数定位最后一个算术运算符的位置。
function AnyLastPos(Str:String):integer;(2)AnyFirstPos函数定位最先一个算术运算符的位置。
function AnyFirstPos(Str:String):integer;(3)AnyFirstF函数判断最先出现的符号是+号、-号、*号还是/号。
function AnyFirstF(Str:String):Char;(4)SubCompute函数用于计算不带()号的加、减、乘、除运算。
function SubCompute(Str:String):integer;(5)TotalCompute函数用于计算表达式的结果。
function TotalCompute(Str:String):integer;1.寻找最后一个算术运算符
定义4个整数变量SubPos,PluPos,MulPos,DivPos,在给定的字符串中寻找+,-,*,/的最后位置,将这些位置存储在上述的4个变量中,然后比较4个符号出现的位置,得到数值最大的运算符;在返回的结果中,返回这个运算符的位置。
程序代码如下所示:
function 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
分别在给定的字符串中寻找+,-,*,/第一次出现的位置,然后比较4个符号出现的位置,得到数值最小的运算符。在返回的结果中,传递的是这个运算符的位置。
程序代码如下所示:
function AnyFirstPos(Str:String):integer;var SubPos:integer;PluPos:integer;MulPos:integer;DivPos:integer;ForPos:integer;FirstPos:integer;begin //定位字符串中最先一个运算符的位置
SubPos:=Pos('-',Str);PluPos:=Pos('+',Str);MulPos:=Pos('*',Str);DivPos:=Pos('/',Str);ForPos:=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(ForPos=0)then //如果没有^号
ForPos:=200;//将ForPos设置成一个不可能的值
if(FirstPos>SubPos)then FirstPos:=SubPos;if(FirstPos>PluPos)then FirstPos:=PluPos;if(FirstPos>MulPos)then FirstPos:=MulPos;if(FirstPos>DivPos)then FirstPos:=DivPos;if(FirstPos>ForPos)then FirstPos:=ForPos;
AnyFirstPos:=FirstPos;//结束函数,返回位置
end;第3章 “速算24”扑克游戏--单元、异常、逻辑
3.5 数学逻辑单元(2)
3.得到最先出现的运算符类型
这个函数的返回结果是Char类型,代表这是一个字符变量。实际上,它返回的是+、-、*、/ 这4个符号中最早出现的一个。
程序分别寻找4个符号最早出现的位置,然后判断最先出现的是哪一种符号,再根据符号类型返回代表运算符的字符。
在具体的实现过程中,因为我们要得到最先出现的运算符,所以判断的是每次寻找后各个运算符的位置的最小值。如果不存在这个运算符,则将代表这个运算符位置的相应变量设置为200。对于本程序来说,这是一个搜索过程中不可能达到的值,这样就排除了这个位置的继续比较的可能。
程序代码如下所示:
function 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设置成一个不可能的值
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;
AnyFirstF:=Operator;//结束函数,返回位置 end;4.计算不带括号的运算表达式
做完上述工作后,我们可以开始进行一些实际的运算了。
包括加、减、乘、除、乘方运算的表达式的程序算法如下所示:
(1)寻找乘方符号“^”,如果存在,则计算一次乘方,去掉计算过的部分,接着循环查找和计算子串的乘方。
(2)寻找乘号“*”或者除号“/”,如果存在,则计算一次乘(除)法,去掉计算过的部分,接着循环计算子串的乘除法。
(3)寻找加号“+”或者减号“-”,如果存在,则计算一次加(减)法,去掉计算过的部分,接着循环计算子串的加减法。
上述算法是严格按照顺序进行的,它体现了数学运算中的优先关系,经过上述的计算,子字符串被分解,计算完毕。
无论是乘方、乘除法还是加减法,内部实现的逻辑是基本一致的。下面,我们设定有一个运算表达式:3+2^5/4。
程序代码如下所示:
function 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;MulPos:=2000;// 将乘号所在位置设置成一个大于DivPos但不可能的值
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;MulPos:=2000;// 将乘号所在位置设置成一个大于DivPos但不可能的值
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;
SubCompute:=StrToInt(Middle);end;程序执行过程如下所示:
(1)定位字符串中第一个乘方符号“^”的位置First。这个式子中的First为4。
(2)如果存在乘方符号,即First不等于0,则继续进行计算,否则退出循环。
(3)进入循环体内部,得到“^”前面的子串tempStr(“3+2”),寻找tempStr中的最后一个运算符temp(这里是“+”),则Temp和First之间的字符就是乘方符号的第一个参数(“2”)。
(4)同样的逻辑,得到“^”后面的子串tempStr(“5/4”),寻找tempStr中的第一个运算符位置temp(“/”),则Temp和First之间的字符就是乘方符号的第二个参数(“5”)。
(5)去掉乘方符号和两个参数,得到左侧子串left(“3+”)和右侧子串right(“/4”)。
(6)利用这两个参数和乘方符号,计算乘方,将结果返回,并插入在left和right之间,得到一次计算后的新字符串(“3+32/4”)。
(7)判断新串内部是否包含“^”,如果包含,则返回到步骤(3),不包含则进入下一种运算。
第3章 “速算24”扑克游戏--单元、异常、逻辑
3.5 数学逻辑单元(3)5.计算整个表达式的值
TotalCompute函数利用循环,找到最内层的一对括号,然后调用SubCompute函数处理这一对括号中的表达式。SubCompute函数处理的表达式中已经没有括号了,因此SubCompute只需处理乘方、加、减、乘、除,返回结果,形成新的字符串。
当整个字符串缩减至空值时,整个表达式计算完成。
程序代码如下所示:
function 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(')',Str);//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;end.在程序中,“计算”按钮的OnClick事件处理程序中调用TotalCompute函数。函数中使用了一些数学函数和定位字符串的函数,这些函数Delphi已经在相应的系统单元中进行了定义,我们需要把这些系统单元包括到文件里面:
uses Sysutils,Math;将前面调用TotalCompute的注释去掉,把代码改回:
procedure TForm1.Button2Click(Sender: TObject);var result:integer;answer:String;begin result:=TotalCompute(Edit1.Text);if(result=24)then Application.MessageBox('您真行,我服了您!','对了',MB_OK)else begin
第三篇:c++24点游戏
c++24点游戏
#include “iostream” #include “string” using namespace std;
//定义Stack类
const maxsize=20;
enum Error_code { success, overflow, underflow };
template
bool empty()const;bool full()const;int size()const;void clear();
Error_code top(T &item)const;Error_code pop();
Error_code push(const T &item);private: int count;T entry[maxsize];};
template
template
bool Stack
template
bool Stack
template
template
template
Error_code Stack
template
Error_code Stack
template
Error_code Stack
Stack
int set;
// 判断程序中的异常,以便适时退出?//
void process(char c)
//计算两个数的 +-* / 运算// { int k=0;double a,b;sign.pop();
if(num.top(b)==success){
num.pop();
if(num.top(a)==success){ num.pop();k=1;} } if(k){ switch(c){
case '+': num.push(a+b);break;case '-': num.push(a-b);break;case '*': num.push(a*b);break;case '/': if(b==0){ set=4;num.push(-1);} else
num.push(a/b);break;} }
else {set=1;num.push(-1);} }
void get_command(string &str){
cout<<“n请输入要进行运算的表达式,包括” +,-,*,/,=,(,)“和数字,”< <<“注意: 以数字开头,等号结尾,中间括号要匹配.”< double do_command(const string &str){ string s=“"; double outcome=-1;char c; for(int i=0;str[i]!=' ';i++){ if(set!=0)break;//例外 则停止运行 while(1){ //分离数据与运算符 if(str[i]<='9' && str[i]>='0' || str[i]=='.'){ s+=str[i];i++;} else { if(s!=”“){ if(num.push(atof(s.c_str()))==overflow)set=3;s=”“;} break;} } char ch= str[i]; switch(ch){ //处理运算的优先级,并注意例外抛出 case '*': case '/': if(sign.top(c)==success)if(c=='*'||c=='/')process(c);if(sign.push(ch)==overflow)set=3;break;case '+': case '-': while(sign.top(c)==success){ if(c!='(')process(c);else break;} if(sign.push(ch)==overflow)set=3;break;case '(': if(sign.push(ch)==overflow)set=3;break;case ')': while(sign.top(c)==success){ if(c!='(')process(c);else break;} sign.pop();break;case '=': while(sign.top(c)==success){ if(c!='(')process(c);else break;} break; default: set=2;break;} } if(num.size()==1 && sign.size()==0)num.top(outcome);else set=1; if(set==0)cout<<”运算结果是:n“< if(set==1)cout<<”n您输入的不匹配,有错误发生。Result lost!“< if(set==4)cout<<”n 分母为0,不能进行除法运算,出现溢出,Lost result!“< return outcome;} void main()int f(){ double out;do { string str,s;set=0; get_command(str);s=str; if(str[0]=='-')str='0'+str;//处理表达式中的负号 for(int i=1;str[i]!=' ';i++){ if(str[i]=='-' && str[i-1]=='('){ str.insert(i,”0“);i++;} } out= do_command(str); cout< 我gai过此行 cout<<”如果你算的结果不等于24,需要重新计算请输入你算出的结果,程序有漏洞,请合作。“< return out;} int main(void) { int ii,zz,jj; printf(”0-12的4个数字nn“); for(jj=0;jj<2;) { for(ii=0;ii<4;ii++) { zz=rand()()% 12; cout< } cout<<”请用这4个数字算出24“< f(); cout<<”是否继续;是1否2"< cin>>jj; cout< } 晚会游戏节目大全(汇编完整版) 1.抢舞伴 道具:扫帚一把 1、挑选5男4女,最好是5个男boss,4个美女 2、放音乐,音乐声停,5个男人开始去抢舞伴,抢到后必须双手都抓住,剩下一个没抓到。然后给音乐,大家跳舞,没有舞伴的就抓着扫帚跳。 2.喝啤酒比赛 亮点在容器,用婴儿的奶瓶当酒具~~ 叫一棒大男人上台喝啤酒,规定时间内谁喝得多水胜出 嘿嘿,最后的结果就是,男boss们嘴巴子很痛,哈哈 3.抢凳子 道具:凳子(若干) 参加人员:8人或多人参加(其中一人为喊话员不参加比赛) 游戏规则:游戏开始先把凳子成圆形(按参加人数减一计算,即8人摆7张),然后,参加人员在凳子外面围成一圈,主持人敲鼓或放音乐时参加人员就沿着圆形顺时针或逆时针跑动(注意不能插队),当鼓声或音乐停下时参加人员要讯速找到一张凳子座下,因为凳子少一张,所以会有一人没凳子座,这个人就算是被淘汰了,这时要把凳子减少一张,其余的人继续玩,直到剩下最后一人为止,这人就算赢了。赢的人给予奖励。 4.击鼓传花 道具:鼓或音乐、花 参加人员:集体 游戏规则:参加者先围成一圈,当击鼓者开始击鼓时,花就开始传,当鼓停时,花到谁手,谁就是“幸运者”,就要表演节目。表演后,花就从这个“幸运者”开始传,节目依此进行。 5.顶气球比赛 道具:气球一个、绳子一条 参加人员:两组对抗(每组一般为3人到7人) 游戏规则:游戏开始前先把绳子沿场地的正中间拉开(像网球网一样),然后双方排开用头顶球,哪方先落地输。 6.比大小 道具:扑克牌。 游戏规则:一大帮人(最好5——8个)围在一起,各抽一张扑克牌,放(粘)在自己的额头上(自己不能看自己的牌),每个人都只能看见别人的牌而看不见自己的。中间摆一个大杯子,觉得自己的牌比别人大的可以往大杯里加啤酒(为了不伤到自己建议少加一点,当然如果你有心耍人而且能肯定自己的牌比别人的大可以加满)。加过一轮后,大家看自己的牌,牌最小的要把那杯酒喝完。 牌大小顺序:黑桃A最大,方块2最小。 7.夫妻双双把家还 道具:十个气球 游戏规则:我们邀请十组夫妻选手上台,手手相联,背背相对,齐心协力把夹在背上的气球,从起点运到终点,以用时最少者获胜。让我们看看谁是最默契的夫妻拍档。 手挽手,背靠背从起点到终点运球,比速度。 8.熊来了 参加人员:约束8-15人,分成若干组 游戏规则: (1)各组第一个人喊“熊来了” (2)然后第2个人问:“是吗?” (3)第1个人再对第2个人说:“熊来了”,此时2号再告诉3号“熊来了” (4)3号再反问2号“是吗?”,而2号也反问1号“是吗?” (5)前者再叫“熊来了”,2、3、4号传下去。 (6)如此每个人最初听到“熊来了”时要反问“是吗?”然后再回向前头,第二次听到“熊来了”时才传给别人,而前头的人不断的说“熊来了” (7)每组最后的人听到第2次的“熊来了”时,全组队员齐声说:“不得了了!快逃!”然后全组人一起欢呼,最先欢呼的那一组便得胜。 注意:正确了解规则,确实地重复回答。男女各半时可以用“熊来了”“我爱你”做口号,更有趣。 9.动物大连蹲 道具:动物头饰、迪斯科舞曲带 参加人员:分成若干队 游戏规则:各队抽出三名队员,随机抽取动物头饰,音乐开始后由主持人背对参赛队员随机喊某种动物“某某蹲、某某蹲、某某蹲完某某蹲”蹲错的被罚下场,最后哪队剩人最多为获胜。本游戏技巧在主持人 10.爆竹声响,瞎子吞蛋 道具:气球 15、蒙眼布 3、小方凳 3、小盘 3、鸡蛋 参加人员:分成若干组 游戏规则:各队抽出二名队员,比赛开始一队员用最快速度吹爆5个气球,吹完后另一队员蒙住双眼寻找鸡蛋,找到后以最快速度吃完二枚鸡蛋为获胜。 11.倒着说 游戏规则:先规定出题的字数,比如这一轮出题必须在四个字以内,也就是说出题的人可以任说一句话。“我是好人”那么答题人必须在5秒钟之内把刚才的那句话反过来说,也就是“人好是我”,如果说不出或者说错就算失败。 12.领袖风采 >具体方法:分2个小组,每个小组的组长推选2个组员,在1分钟内对指定产品进行推销。并由其它组员举手表决选出成功推销者。失败一方的领导受到相应处罚。 >目的:加强团队意识,由此可看出个体的不足会影响到团队的业绩,个人的成绩是团队业绩的基础。 13.纸拔河比赛趣味游戏(道具:报纸) 1、在报纸上挖两个人头大小的洞; 2、2人对坐各自把报纸套上进行拔河(站着拔亦可); 3、报纸破裂离开脖子的一方输。 14.心有灵犀猜成语 规则:以两人为一组。一个用肢体动作或语言(但不能说出成语中的任何一个字)向同伴提示!(纸片A4、成语) 15.占领阵地 规则:每队六人要求游戏开始后先共同站在一张报纸上,各人身体的任何部位,不得碰地,成功后再撕去一半报纸站,接着再撕去一半……直至失败,最后以最佳办法能站进最小报纸的队为胜。(报子) 16.双龙戏珠接力赛 规则:每组派两名队员将一个皮球夹在两人之间,向前行走,进行接力比赛。在行走过程中球不可以落地!看那一队在最短的时间内将行程走完(球) 17.一反常态 规则:上场的队员听主持人的号令,作出与号令相反的动作! 18.真假难辩 规则:四个一样的杯子里只有一个杯子里装有白酒,其余三个装的是水,让参赛的队员猜是谁喝的是酒。 共三组,每组两人.19.齐心协力 (18人)每队抽6名队员上场,2名运球,2名投球(必须采用背投式),2名接球(背上捆纸篓),限时3分钟,限时内投入球最多者为胜。(18人)--有竞赛效果、真正体现出齐心协力的主题。 20.钻竹竿 各组列队钻过竹竿,手不能触地,身体后仰钻过竹竿,碰掉竹竿者淘汰,竹竿从高向低调整,到最后竹竿最低的一组胜出。 二十四点游戏作文 在平平淡淡的学习、工作、生活中,大家都经常接触到作文吧,借助作文可以提高我们的语言组织能力。相信很多朋友都对写作文感到非常苦恼吧,以下是小编帮大家整理的二十四点游戏作文,欢迎大家借鉴与参考,希望对大家有所帮助。 星期六,上作文课的时候,老师突然从包里拿出一副扑克,我们一脸疑惑:有人说老师是让我们打扑克,有人说老师要教我们变魔术········我们正在议论纷纷,老师说:”今天我们要玩24点游戏。"同学们一听,可高兴了。 首先由陈欢欢抽牌,她抽的是3、7、8、11,题一亮出来,我们就开始思考。有的人眉头紧锁想着这道题该怎么写,有的人在本上算来算去。不到一分钟的时间,就有一位同学想到了这道题,激动的大喊:“我知道!我知道!”他给老师汇报一下答案,老师说对了。“他可真牛!我也要加油!”我在内心勉励自己。 轮到何家乐来抽题了,他抽到的是5、6、9、10,老师重复了一遍这四个数字,话音刚落,田奇轩就说出了答案,真不愧是“神算”!我们一个个目瞪口呆,我打心眼里非常的佩服他。 也遇到有难题,田奇轩抽到了9、9、10、11四个数字,我们绞尽脑汁也算不出来,为了不影响游戏的正常进行,老师把这道题擦去了。 这一节课在同学们的欢声笑语中结束了,真是非常有趣,我虽然没有得到奖励,但我也非常的开心 星期天下午,我做完作业后,请求爸爸陪我一起玩“算二十四点”的趣味游戏。爸爸愉快地答应了。 这是一项有趣的数学游戏,刚好这学期我们也学习到了。我首先拿来一副扑克牌,将里面的花牌和两张王牌抽出来放在一边,剩下的牌都是10以内的。我把牌平分成两份,和爸爸一人一份。游戏开始了,规则是每个数只允许用一次,用加减乘除计算,算出结果等于24,谁先答对谁赢。 我们各自抽出两张牌放在桌面上,数字分是4、8、7和5,我们看了一下这几个数字,爸爸思维敏捷,略一思索,就说出了答案,把这几个数连续相加等于24。我拍了一下脑门,这么简单,我怎么没想到呢?怪自己反应太慢了! 接着,我们又分别抽出两张牌,数字是4、9、5和8,我和爸爸相互看了一眼,这次爸爸没有抢答,大概是想把机会留给我。我绞尽脑汁,终于想出一个方法:首先用9减去5等于4,再用4乘4等于16,最后用16加8,不正好等于24吗?我高兴得站了起来,一蹦三尺高! 就这样,我和爸爸玩了好长时间,虽然我不是爸爸的对手,输了很多次,但是我也不甘示弱,有几次算得比爸爸还快呢。这次游戏,我发现自己反应速度快多了,计算能力也增强了。 多么有趣的数学游戏啊!如果你也感兴趣,那么也和爸爸妈妈玩一玩吧! 春节的气氛越来越来浓了,到处张灯结彩、喜气洋洋。连理个发都要等一到两个小时。在等待的过程中,我看见一个小孩子正无聊地站在那里,看来没有人跟他玩。于是我走过去问他:“我能跟你玩吗?”那个小孩立马说:“好呀!我们来玩24点。”但在玩的时候,我感到有点力不从心,老是没他算得快。我感到很失落,因为数学是我的强项。于是回去我要求爸妈和我玩 24点这个游戏的规则是:一副扑克牌,两人一人一半,每轮个随机出两张牌。每人尽量用加减乘除将这四张牌凑成24。先算出者把牌拿进,手上没牌者输。一开始我是个凑数的,一局都没赢。但玩着玩着,我发现了几个诀窍:五乘以五减一、四乘以六、三乘以八、二乘以十二、四十八除以二、七十二除以三。才慢慢赢了几局,于是我又信心满满了 寒假作业本上的一道思考题:1995乘以901减1998乘以899。我列了很长一段竖式才算了出来,爸爸指导我这道题可以用抵消和换位的诀窍,连口算都算得出来。我理解了很多事情只要找到诀窍,解决起来其实并不难。但千万不能心浮气躁,不然会把事情搞砸。 今天晚饭后,我请妈妈陪我玩二十四点游戏。妈妈很爽快地答应了。 首先,她发了四张牌“2、4、6、9”。我一拍脑袋就说:“我想到了,先用2*4=8,再用9—6=3,用得数8*3=24”,妈妈掐指一算,还真对了。所以,第一局我赢了。第二局,她发了“4、4、7、9”,我左思右想,百思不得其解。突然,脑子一转,想出了一个方案:9—7=2、2+4=6、6*4=24。这样,第二局我又赢了。妈妈有些坐不住了,很急切地想扳回局面。 接下来,爸爸听到我们的欢笑声,也跑过来想一起玩。妈妈开始发牌“2、4、6、6”。牌刚刚落桌,妈妈就一下子说了出来:“6—4=2、2*6=12、12*2=24”。这么快,我和爸爸还没有反应过来呢,妈妈真是咱们家的小才女! 然后,发出来的牌是“2、3、9、10”,这个牌亮出来之后,我们都陷入了深深的思考,一时间家里静悄悄的,时间仿佛一下子凝固了。我打破了沉默:“2*9=18、18—10=8、8*3=24”。爸爸妈妈夸我用了新的思路,爱动脑筋。这是,爸爸说:“我觉得,同样的数字,可能有不同的算法。你看啊,9/3=3、10—2=8、3*8=24。”我们都为他鼓起掌来。妈妈不急不慢地说:“我也有好方法:3*10=30、30/2=15、15+9=24。”’ 哦,原来一个题目还有不同的解决方案啊。真是太神奇了! 二十四点游戏真有趣,它让我们积极思考,大开脑洞。 星期天,我和XX一起玩了24点游戏。游戏规则很简单:每人分别抽四张牌,然后用“+、-、×、÷”这几种计算方法最后得数一定要得24,就行了。 游戏开始了,我们各抽了四张牌。唉!我的牌怎么这么糟呀!你看,四张都是A。这时,只听XX说:“我可以了,你看,5+5=10,10×2=20,20+4=24。”第一轮,我输了。但我并没有灰心丧气,因为后面还有机会,我一定要把握机会,好好赢一把。我又抽了四张牌“6、5、8、3”。我激动得马上脱口而出:“6-5=1,8×3=24,24÷1=24。现在是1比1平了。” XX说:“有什么的,我一定会在下一回合胜过你的。”第三回合到了,我又抽了四张牌“10、9、6、10”。我一看傻眼了。突然,只听XX大声地喊道:“6×4=24,24+1-1=24。2 比1我赢了。”我看着他那得意的样子,无计可施。 虽然这次游戏我输了,但是我觉得24点真有趣,同时也感到数学真的很奇妙。我今后一定要努力学习数学,灵活运用“+、-、×、÷”的混合运算,在下一次的24点游戏中,一定要用得得心应手,当个高手。 我最喜欢的游戏名字叫“二十四点”,它的游戏规则是这样的:先拿出一副牌,任意抽出四张,用加、减、乘或除法进行计算,算出的得数为二十四。 起先,我连游戏规则也弄不清楚,不理解它的意思。后来经过妈妈的`反复指导,我终于掌握了技巧。在找不到“三八二十四”或“”四六二十四“的时候,要换一种思路去算。 我喜欢它的主要原因是它可以在游戏中得到学习,在学习中得到快乐,训练我的反应能力和提高我的运算速度。在我苦思冥想的时候,我觉得这组数字很难,根本算不出来。而在妈妈的鼓励下,我没有放弃,当我破解这组数字的时候,那种喜悦的心情简直就像夏季里的三伏天吃凉西瓜一样,甜滋滋的。 虽然我和这项游戏刚接触不久,但是它带给我的快乐却是其它游戏无法媲美的。我已经深深地爱上了这项游戏,就好像”老鼠爱大米“。 晚上吃过饭后,爸爸、妈妈和我在家里玩二十四点游戏。 我先找到一些扑克牌,再把10以下的牌子整理出来。然后爸爸说:“我拿出四张牌,不管用加减还是乘除,只要能算出的得数是二十四就好了。”于是,爸爸就拿了四张牌,往桌子上一摆,我们都抢的算,看谁算得快,算得准。牌还是一出来,爸爸、就叫“知道了”,接着,妈妈也叫起来“算出来了”,可是。我还没有算好,我都急得像油锅里的蚂蚁。爸爸叫我不要急,要放松。听了爸爸的话,我的心就冷静了下来,认真地算。我算出来了,爸爸、妈妈都笑了,说:“楠楠,你平时还要多多练习口算。知道吗?”我调皮地说:“知道了,那你们就要经常跟我玩二十四点游戏。” 今天,玩二十四点游戏,给我带来有趣,也给我知道了一个道理。我喜欢玩二十四点游戏。第四篇:晚会游戏节目宝典秘籍
第五篇:二十四点游戏作文