第一篇:24点游戏规则及攻略
24点游戏规则及攻略
游戏规则
给出4个数字,所给数字均为有整数(1至13之间),用加、减、乘、除(可加括号)把给出的数算成24,每个数必须用一次且只能用一次,先算出结果者获胜。
例:3、8、8、9 答案:3×8÷(9—8)=24 答案不唯一
游戏攻略
算24一般掌握以下方法
1。最常见的算法是3*8,4*6,2*12,所以最先考虑的应该是上述3种算法。一般情况已有其中的一个因子,而用其他3个数去另一个因子。
2。先乘后加。常见的有2*7+10,3*5+9,2*9+6,3*7+3。
3。先乘后减。常见的有3*9-3,4*7-4,5*6-6。这种类型里较难的是减数是由两个数相加而得,例如:2、5、7、9。
4。消去法。有时候,3个数就可以算出24,多出来一个数,用消去法,可将多余的数除去。如3、5、9、10,3*5+9=24,多一个10,可将10-5=5,将10消去。用乘法的分配律消去,如2,5,8,8,(5-2)*8=24,多一个8,可以将算式改为5*8-2*8,将多余的8消去。
5。会意法。如4、4、4、4,4*4表示4个4,再加2个4,就是6个4。又如,2、7、8、9,9+7是2个8,再乘于2,变成4个8,再减一个8等于3个8。
6。上天法。先将数乘得很大,最后再除于一个数得24,如10、10、4、4。
7。入地法。先将数算成分数或小数,最后乘于一个数得24,如3、3、7、7。
8。化除为乘法。用一个数除于一个分数,相当于乘与一个数,最后得24。如3、3、8、8。
第二篇:金银岛游戏攻略
《金银岛》流程攻略
第一章
一开始是在墓园里,和医生废话,BLABLA,然后去乡村小餐厅。有一个老酒鬼,跟他说话,BLABLA,然后那个酒鬼要求喝 朗姆酒,拿了酒杯,去酒桶里面给他拿酒。酒鬼喝酒之后,要求再一杯,但是酒桶已经空了。主角觉得他已经喝醉了。于是打 算用水来糊弄他。去屋子外面,有一口井,但是没有轱辘,于是去墓园,拿雕像上面的剑,回来之后安在井上。地下室有水桶 和笤帚,拿了。用水桶打水。然后给酒鬼。他居然分辨出来了……囧,然后要求要白兰地。还把杯子摔了,拿一片锋利的杯子 碎片。地下室有白兰地,去拿。主角在地下室的时候,好像有人来了,跟酒鬼说了一堆话,BLABLA,然后上去。酒鬼就已经在 地上了,旁边还多了一个漂亮 MM,说了一堆话之后,酒鬼死了,拿他脖子上的钥匙。去楼上酒鬼的房间(之前去,酒鬼不会让 你进的)。进房间之后,用钥匙打开箱子,用锋利的碎片把箱子的盖划开。得到地图。刚拿到地图,就有人来捣乱,跑到地下 室。让女士从地窖逃走,主角留下来,用笤帚捅地窖的天花板,模仿脚步声。上面的人中招,被吊灯撞到头,晕倒。
主角出来,说话,大意就是要按照地图寻宝。第一章结束。
第二章
一开始在一个城市中,依旧是说话,要主角送一封信。(注意墙上的海报,看看有用。)然后去一个叫 SPY INN 的酒馆,先不要进去,跟旁边的两个姐姐说话,BLABLA,得到足够的信息之后,进酒馆。跟一个身上有纹身看着很凶的人说话,话不投 机,他要打主角,然后酒馆老板出来,解救了主角。把信给老板,然后开始招募愿意跟着主角出海的水手。跟酒馆里每一个人 聊天,得到两个有用的信息,在酒馆中赌博的人和港口有一个人是水手,有可能招募进来。于是去找那个赌博的人,他手气极 好,一直赢,不愿意和主角走,让人不禁怀疑他是不是在作弊。于是决定找两个骰子(这是任务)。在酒馆中会拿到一个拐杖 之类的东西。从酒馆出来,再和旁边的姐姐说话,向她们要骰子,姐姐给派了任务,要主角把一个讨厌的人从她们的姐妹身边 赶走。先从这个场景出来,去街道上,会发现有警察围着一个人,去和警察聊天(此处注意聊天的内容,一会儿有用)。聊完 天之后,警察吩咐如果见到嫌疑犯要告诉他们。于是再返回酒馆门口,去跟那个讨厌的人说话,发现他是嫌疑犯,告诉警察,他就会走了,从姐姐那里得到骰子(不要忘记再聊天)。出这个场景,在警察那个场景,旁边有一个小门,进去,发现有几个 孩子手中有骰子,跟他们说话,他们会要求你回答问题,问题答
案在海报与之前和警察的对话中,通过考验之后,孩子们又要 求主角给他们一样真正属于海盗的东西。囧,现在手上没有,离开这个场景,去码头。在一个 SEA 什么的招牌下面,有我们要 找的第二个人,此人非常迷信,跟他说话,他说幸运符之类的东西丢了,不跟主角走,主角答应给他找到幸运符。旁边就有一 个 CAGE,上去拆一个圈下来。在旁边有一个桶的场景,上面有一个海盗用钩子,拿下来,拿下来的时候把颜料弄撒了,撒到一 只猫身上,白毛变黑了,那个迷信的人被吓跑了,汗。拿着钩子去找那群孩子,途中会看见迷信的人,他上边有一个镜子,上 前把 KNOT 解开,镜子就掉下来了,迷信的人又被吓跑了,囧。在镜子的碎片中拿起一个网,在物品栏中把拐杖,圆圈,网合成 一个捕捞器,回码头。用捕捞器在水里面把幸运符捞起来。拿着钩子去找那群孩子,把钩子给他们,他们就会把骰子给主角。现在手中有两个骰子,在物品栏中合并。去酒馆。酒馆中会有迷信的人,把幸运符给他,他答应跟主角走。去找赌博的人,把 骰子换掉,他就输了,然后落荒而逃。去追,说服他。然后和大家说话,这章就结束了(不要忘记和码头上的人说话。)
第三章
一开始是在船上。各个地方都走一下,和每个人说话,会发现很多事情:藏宝图不见了,有一个人病得要死了,MM 要主角 爬旗杆,囧。旗杆很好解决,爬上去,拿到一块白色的布。主角决定救生病的人。去找医生,医生说他给过药了,不管(真狠 心),再去找厨师,他说可以救,但是需要三样东西:绿色的东西、新鲜的肉、朗姆酒。在途中还会拿到很多东西:斧头,酒 杯,勺子,食物,水桶,小木棍(这个不太好找,在天花板上,注意一下),绳子。把后四样合成捕鼠器。用勺子在甲板下面 第二层的木桶中,得到绿色的东西。在甲板之上有一个房间,主角想进去的时候,船长不让他进去,于是有一个传话的任务,这里要故意说错,3 次之后,船长就会离开,去教训那个人,这样就可以进去他的房间。船长的房间中有笔,纸,还有一个保险 箱。需要密码,在船长桌子的地图上有很多数字,我试了一下,是 017/076,不知道这个是不是随机的。扒开保险箱,里面有货 仓的的东西的名单,用纸和笔抄下来。给厨师。厨师会给你货仓的钥匙,进货仓。有老鼠!用捕鼠器抓到老鼠。在货仓的最后 有朗姆酒桶,用斧子把绳子砍断,(然后我就卡住了……不知道怎么办了)引用第 6 楼 bigfishfish 于 2009-12-13 22:03 发表 的 :
到船头,鼠标放到左上角可以看到上桅杆的标志,上去以后可以拿到旗子的
一块布。用这块布去蘸船长办公室的墨水,可 以得到 black spot。把这块布从通风口扔下去,惊吓了那个拿 salisman 的人。然后去管他借 salisman,他同意。把 salisman 用在 barrel 上,就可以得到 rum 了。谢谢 bigfishfish 的攻略,强大。三样东西都拿到以后给厨师,他会给你汤,把汤拿给病 人,他就睡着了。主角决定用凉水把病人浇醒,去拿水。掉到桶里,囧。然后就是视频。居然有人在策划叛乱,主角决定把这 件事情告诉大家,不过还是先要找到地图。回到病人那里,与之对话。病人竟然说地图是 MM 拿的,主角的心碎了……和 MM 吵 了一架,MM 跑了,主角追。外面是风暴,MM 掉下去了……主角救。这条路上有三个可以抱住用以抵抗海浪的东西,抓住了就行,救到 MM。本章结束。
第四章
剧情过后,主角一个人在森林中。观察一下周围,发现四个坟墓。其中有一个上面有东西,不过现在还拿不到。去下一个 场景。发现英国国旗、一幅画、一个陷阱……主角掉下去了,陷阱里面有个包,在物品栏中打开,得到锤子和皮带还有骨头,还有很锋利的贝壳。用皮带挂在树枝上,从陷阱里面出来。回到坟墓那个场景,坟墓的边上有一个入口,可以进到森林里。进 去,走一段路,发现几个标志,区别是小人的个数,按照 4——1——3——1 的顺序走下去,就会到达营地。发现一个屋子,不 过门被挡住了,主角想用锤子把门打开,不过锤子坏了,把锤子头和骨头合起来,变成新锤子,把门打开。在地上捡起一小块 木头,把小木头和贝壳合在一起,变成锯子。出营地。回到坟墓,用锯子把剑割下来。回营地。主角要修理阶梯,把剑用在梯 子上,再上去。升起旗子。本章结束。
第五章
剧情和废话之后,两拨人打起来了。在屋子里拿东西,有水壶,纱布,椰子壳,火药,药的纸袋,调查纸袋,得到闪光弹 的做法,按照说明,一步一步来,得到闪光弹。去火药桶里面拿火药。上楼。在房顶上拿燃烧的木头。先把火药放进大炮,把 闪光弹也放进去,再点火。大功告成。下楼,从一个篱笆的缺口出去,直接到有船的那个场景,出现一个神秘人,找他借船,
他说要有奶酪才借给主角,主角说 BLABLA,把那人绕进去了,把船借给了主角。去救 MM 啦!上大船,发现一团糟,MM 的爸爸 还被杀了。在通风口上面捡到一块布,把它沾上一种液体(不知道是什么,不过是可燃的,此液体就在地上),去船长的房间,看见 MM,说话,BLABLA,要刀子把绳子割开。去找刀子。到自己的房间那个场景,去之前进不去的那个房间(也只有这一个房 间能进去),拿奶酪、粉底、手杖
第三篇:七宗罪游戏攻略
七宗罪游戏攻略
游戏目的:这款游戏的最大目的就是与身边的女性进行“深入交流”行为。不过她们绝不是发情的母狼一样见人就扑上去的(我这么说半点侮辱女性的意思都没有),你必须通过接近她并讨论她们喜爱的话题,逐步提升她们对你的好感度,才能逐渐对她们玩出新的花样,撩动她们的欲望。另外,天下应该没有什么女人是喜欢一个一毛不拔的贱男的,你的裤兜里也随时要拿得出能买得起一瓶1862 年陈酿的资金。掌握了好感度升降的要点之后,通关也仅仅是时间问题了。另外,也许是欧美人注重过程多于结果,你不用指望攻略完成后可以象日式恋爱AVG 那样看到什么精美的CG,这款游戏一切乐趣仅在于攻略的经过所带给你的满足感,至于通关后会有什么,你就不要寄予厚望了。
游戏各键的功能:W,A,S,D 或箭头键是走动,玩游戏时是箭头键,鼠标右键是切换选项;F1 键是看人物的简介和喜好(谈话中); 系统介绍:游戏的界面可以大致分为大地图画面、室内场景和小游戏场景。大地图画面中通过游标指向有蓝色文字围绕的建筑,按鼠标左键就可以进入该建筑。室内的场景又可以分为走动状态和交谈状态。在室内场景中许多设施都可以按功能键进入其小游戏场景,有详细的按键提示。下面只分析室内场景中的系统。游戏存档键是SAVE,要不然就没办法通关了!呵呵!图示的是交谈的状态,留意图示的数字图例。
1:游戏中最重要的指标:人物对你的好感度。这一条槽分为六格,许多人物的初始状态为第一格暗绿色,其他为暗红色。主角选择了该人物喜爱或者不反感的话题交谈,都会令好感度升高(暗绿色变成亮绿色)直到暗绿色这一格槽填满为止。这时必须到特定的地点与之交谈(在特定地点按选项进入交谈状态),画面下方交谈栏上出现有黄星的指示后选择到那项点击,下一段好感度槽会从暗红变成暗绿,同时已填满的好感度槽下出现黄色星星,表示好感度升级。最高会出现 5 颗星的“激情”状态。2:这里有三条槽,从上到下排列为粉红色桃子、蓝色面孔、红色闪电,分别代表主角的妄想度、压力度和愤怒度(名称都是我看主角的动作来猜的,翻译绝非官方)。在交谈中或一些特殊事件都可能使这些槽上升,其中任何一条槽被填满后主角就会进入“暴走”状态。主角暴走的时候动作之猥琐让我实在不忍心亵渎 “暴走”这个词,总之就是动作非常夸张和出轨,然后自动逃出室内进入大地图状态,而该室的人对主角的好感度会大降。具体来说,妄想度会影响所有女性角 色,压力度会影响所有角色,而愤怒度只影响最靠近的角色,这个角色的好感度无论多高都会下落归零。暴走过后导致暴走的那一条槽则会归零。3:小游戏数量的指示,要降低主角的妄想度、压力度和愤怒度多数要通过玩小游戏或者做一些特定动作(以下我会统称为“减压”),上面的七个叉子一样的灯表示最多可以减压七次,每减压一次就会亮一盏灯,灯全亮就不可以再减压了。交谈固定话题可以一次灭掉四盏灯。4:目前你的钱包的充实程度,大家都看得懂美刀的符号吧。不过我很奇怪主角在正式工作中往往一分钱都拿不到,难怪他要去偷去拐去坑去借,否则我看他连吃饭都成问题。5:对话栏,要提升某个人对主角的好感度,与之交谈是唯一的办法(除了某些特定的剧情以外)。不过如果谈到他/她反感的话题也可能会反而令好感度降低。每个人感兴趣和反感的话题都不同,应该使用别人感兴趣的话题来交谈,才能让好感度快速增长。话题可以在交谈的状态下在交谈栏用上下选择,每一类话题有独特的图标来表示,这些图标直观地表达的各种话题的意义。下面简单说明一下各个图标所代表的话题。当然,这些说明都是根据谈论这个话题时双方的身体语言判断的,具体意思�6�7�6�7要找法语达人才知道。图标大致可以分为两类,话题型图标和效果型图标,前者着重谈话的内容,后者则着重影响,特别是对暴走槽和金钱的影响。话题型图标:在对话过程中主角选择的话题如果对方感兴趣,那么人物头上会闪现代表该话题的图标并加上绿色轮廓,如果对方对话题反感,则他/她头上会出现话题的图标上面覆盖禁行标志。而随着对主角的好
感度越来越高,他/她对话题接受程度会越来越宽松。
因此可能会出现选择同一个话题对方好感度低时会再减好感度,而好感读高的时候会更增加的情况。红脸:对对方示意友好,好感度高的时候可能变成骚扰动作; 笑脸:说笑话,或者是打情骂俏; 哭脸:伤感话题或是牢骚话; 公文包:工作话题或者敬烟动作; 书本:报纸杂志之类,这个不太明白; 眼镜:娱乐类的话题; 美刀:钱,钱,钱,万恶的资本主义社会啊!小心文字里的数字,通常是要你买 单的数目。太极八卦:也许是星相占卜之类的话题,某些人会特别喜欢; 酒:请喝酒,有时要花钱; ×:其他话题,比如借钱,也可能是剧情选项; 手臂:摆酷耍帅,男主角唯一不愁的技能; 桃子:荤笑话或者是性骚扰动作,我还能说什么�6�7�6�7 天使:最重要的话题!可以一次灭掉四盏减压灯!功能型图标: 功能型图标选择的作用不外乎降低暴走槽或充实荷包两种作用。可分为有小游戏和无小游戏两类。有小游戏可玩的图标上会覆盖一个摇杆的标志。至于其作用如何,可以观察右边更小一点的圆点,粉红色表示可以降低妄想度,蓝色表示可以降低压力度,红色则表示降低愤怒度,如果是一个分成红粉蓝三等份的圆,则表示三种都可降低。美刀标志表示抢钱机会来了,天使头像的话就可以减压力灯。功能型图标不仅出现在对话状态,行走状态时遇到发挥相同效果的设施,在其按键提示和文字说明后面也出现类似图标(不过很小就是了)。练习关:房间 一个女人一间房,只有沙发没有床。主要用来熟悉各键的功能。靠近女人后按键选择可以让女人随行,来到沙发前选择后可以坐在沙发上和女人谈话。选择那个公文包图标的话题,然后再随便挑一两个没有图标的话题,就能使第一格好感度槽升满,按键选择,好感度升级。然后选择叉子+摇杆图标的话题,玩偷窥小游戏。接着到柜子前面按键选择玩抢钱小游戏(限时内招顺序根据提示按键就行了)。
最后到水池前按键选择洗碗,灭掉减压灯。以上四步各占25 分(分数在右下角表示),共100 分后可以按ESC,在最左边一栏有打勾那点击就可以进入第一关。以后各关完成后都是这样跳到下一关。第一关:SUKS 精品店 这里是精品店吗?我看是《生化危机》里那个人吃人的洋馆吧?一条鱼游进来会剩下鱼骨头游出去�6�7�6�7总之是很吐血。精品店主要卖化妆品、女用衣服和内衣、珠宝首饰和高跟鞋等等,所以里面都是女顾客。我们的衰男主角的第一份差事就是在这里了,目的是让女顾客经你的介绍掏钱买商品(话题的图标是×且后面的文字说明有数字表示购买金额),顾客每掏一次钱你都能拿到一定分数,只要让她们买到价值总额约5000 美刀的商品(是要她们买的才算,不是你所持有的金额)就能够凑齐100 分过关。不过,满屋子都是女人如果你只要他们的钱那实在太可惜了!
如果你和她们的好感度足够高,她们不但会在你身上大把地花银子,还能让你做到财色兼收!记住你与她们之间好感度的高低与她们肯花的钱成正比,所以你的主要任务是通过和她们聊天,找到她们喜好的话题来提升好感度,同时因为聊天的话题会不同程度 地影响你的妄想度、紧张度和愤怒度,小心不要让任何一条槽填满,否则后果是你辛苦积累的好感度将化为乌有。我们的目标是——(众喊)女的全推到,男的都剁掉!�6�7�6�7汗,不应该是“没有蛀牙”才对吗?我们先别管别管某些FQ 和小白的意见,先对我们的目标作个简单的分析吧!精品店除了你以外还有6 个人,为了不影响大家探索的乐趣,大黑在这里就不把你的目标的喜好话题都列出来,只是对她们的性格作一下点拨,其实按F1 的个人评论都有写的,不过既然大家都不懂这些鸟语,也就胡绉乱掰一下算是对大家有个交代。黑人女人:脾气古怪的女人,和她谈话妄想度会飙得很快!我不是种族歧视不过我真的不懂欣赏黑人的美�6�7�6�7 胖大婶:她出手很阔绰,可以在她身上捞钱(还是出卖色相啊�6�7�6�7)。女店员:因为长得漂亮常常会被老板(和我)进行性骚扰,喜欢谈笑。比较贪小便宜,会让主角偷公司的化妆品给她。好感度也很容易提高。年纪60 好几的老太太:什么??这�6�7�6�7我们的主角还真是不挑食的好孩子,这种为人民服务的精神现代社会已经不多见了。人家是老骥伏枥,壮心不已啊!欧买噶 短发女士:这么多人中最
正常的一位,同时也是手脚最不干净的。唉,卿本佳人,奈何作贼啊。老板:见过JS 耍黑的,就没见过这么黑的!有事没事跑来加我的紧张度和愤怒度不说,一见我手上有点钱,就把我的养老保险金都拿得一干二净�6�7�6�7(每次减几百或1000)工会在哪里?《劳动法》在哪里?天理又在哪里?!资本家在无情地榨取我们的剩余价值!我要控诉资本主义的罪恶!只见我们的主角轻松地踏入老板的办公室,脸不红心不跳地问老板借走了500 美刀,接着跟老板大谈美酒女人,听得老板心猿意马浮想联翩,然后马上又再借走500 美刀�6�7�6�7(可以无限循环)
本关的几个要点:
一,关于小游戏,在这关要加强一下对小游戏的训练!以后要快速减低导致你暴走的压力值都要靠玩小游戏。推荐本关几个比较容易玩的游戏: 1.虐待动物:对着金鱼缸用□键调查进入游戏。小动物会从上中下三路接近你,而你控制箭头键分别控制上中下三种奇门兵器的挥动,把它们全部轰至渣吧!50 分满分,通过后可以使愤怒度归零。2.偷天换日:孔乙己曰,知识分子窃书不算偷,那么珠宝业务员偷自家的首饰也没问题吧,那我们就华丽地本就属于我们的工资装到口袋里吧!对珠宝台按键选择带美刀图样的,在不被老板发现的情况下且要在限制时间结束前把屏幕提示的键按顺序按下,就可以通过。可以拿到200 美刀。3.壮志凌云(TOP GUN):对着圣诞树按□键。主角不忍圣诞树受到蚊虫滋扰决定用自己的“水枪”进行灭虫行动。控制水柱浇向蚊虫,每击落一体奖励5 分,如果是爆头(head shot)的话奖励10 分。问题是,这个游戏连音乐都是用TOP GUN 的�6�7�6�7拜托,光看到主角的脸已经很有把他揍扁的冲动了!50 分满分,通过后可以使愤怒度归零。4.如来神掌:约老板坐在办公室,选到叉子+摇杆的选项,就可以和老板互抽耳 光(很解气的游戏,难怪会减愤怒度)。一个滑标沿着一条竖槽从下向上升。升到最高都不按键主角就不作任何动作,如果滑标升到槽中间时用鼠标左键把它按停,主角就会起手把老板抽得眼冒金星,而且滑标升得越高主角抽得越狠,加分也越多;主角和老板轮流操作滑标互抽,在老板的滑标移动时准确地按键可以回避老板的攻击,阻止自己的分被倒扣。如果在滑标很低的情况下按一下键,主角会作出假动作,然后滑标继续上升过程中把它按停,主角击中老板的几率将大大提升。以后出现的互殴类小游戏都是这种玩法。50 分满分,通过后可以使愤怒度归零。注意这个游戏会降低老板一格半左右的好感度。5.自己动手,丰衣足食:与任何一人同坐在沙发上,选择叉子+摇杆+$的选项,如果你自问有《天下无贼》里面刘天王或者葛影帝的身手,欢迎前来挑战!手在右边,钱包在左边,向左移动手便向钱包移动。等手一沾到钱马上缩手,稍迟半秒就会触到钱包被对方发现报警。游戏时限内都没有被人发现的话就会奖励抽到的张数X10 的美刀。没钱徒的职业,俺又不缺那一点�6�7�6�7 另外除了小游戏以外,对某些设施的固定动作也有同样效果。比如说靠近服装模特的模型按键选择带有红点的叉子,主角会狠K 一下模型,然后愤怒大减;选择带有蓝点的叉子,主角则会拿起麦克风唱歌,舒缓不少紧张度�6�7�6�7
二,关于顾客和职员对店内物品的盗窃,谈话选项图标是×并且后面的文字说明中没有数字。不过我要提醒你,由俭入奢易,由奢入俭难!她们尝过偷窃的甜头以后,再要她们掏钱就困难了!
三,关于跟老板借钱的方法,上面语焉不详这里讲一下步骤:首先老板对你的好感度要达到三颗星却不能到四星,约老板坐进办公室,借500 刀。借到后马上和他玩互抽游戏,目的主要是降低好感度。然后再通过谈话把好感度提升到三颗星到四颗星之间,继续借钱。这样可以无限循环。在大赚特赚后就大发慈悲把老板放走了,然后过关使钱永远留在我的帐目里。
四,这一关的关键地点是更衣房,所有女性的最后一格好感度升级都要在里面进行。第二关:“伊甸园”俱乐部 从“繁重”的工作中解脱开来(是啊,我的腰都快断掉了),衰男主角
跑到一家叫“伊甸园”的舞厅去放松一下。激光舞池里放射出妖冶的光芒,引诱我探手把想要的一切都攫取到手中。
环顾四周,发现人不少。一个短牛仔裤戴墨镜的女孩在舞池内疯跳,白色西装的板寸头男人在我身边掠过,吧台前有个黑色西装貌似董事长的老伯独自喝着闷酒,两位美女一个金发一个褐发双双坐在红色沙发上聊天,戴着墨镜穿黑色T 恤的年轻男人醉熏熏地,步履蹒跚地走上舞台,拿起麦克风杀猪般嚎叫(你相信吗,这家伙是这里的老板),一个穿得很入时的胖大�6�7�6�7妈(怎么又来?)在台下叫好,秃头的黑人保安在我旁边呆呆地看着我,不知想要做什么。一个一个来吧,舞女是最容易钓到的角色,接受的话题也很多,带她到处去坐谈一下很快就能把好感度升满。其实不用升满,升到PASSION(激情)状态就行了,然后可以扮演大灰狼的角色,把她带到自己的家来。之后就可以采取不同的方式,只不过玩的小游戏不同而已。各种动作都会令你的分数不断上升。别忙,你家还有几个大衣架,可以帮她换各种内衣(换的时候妄想度会提升),不过熟练不是 很多。别忙!注意到你家厨房后面的拍照间了吗?换装之后就可以帮她拍摄撩人的照片了!不但有分数进帐还能有钱收,看来这家伙是一拍完马上转手倒卖掉,实在是没品得可以。继续攻略其他人物,这次换勾引胖大妈。
不泡不知道一泡下去才知道不妙,这位大妈还不是一般地难缠,主要是和她谈话愤怒度太容易升高,搞到每聊三四句就要去厕所玩一回“TOP GUN”。不过为了嘉许你的“勇气”,游戏设定你如果带她回家玩,能够拿到很高的分值(不过还不是最高)。那个黑人保安常常会主动找主角玩互殴游戏,为了证明我不是这么好斗的人我决定扔掉胖大妈后跟他好好地谈一谈。这一谈就不小心谈到了PASSION 状态,人生得一知己真是死而无憾。我于是发扬恶搞精神把黑人带到家里。结果发现@#$$..这主角哪是什么杂食动物,根本就是来者不拒午夜牛郎!不信你把他带到洗澡房就知道了,虽然依然有分可以拿,不过我还是绝对无法认同这种关系。白色西装的男人是店里的经理,如果你在餐桌前和别人互相扔派的话(选择笑脸话题)多半难逃他的法眼并遭到严厉呵斥。不要紧,和他的好感度够高就不会有这种情况了,优先与他打好关系吧。顺便一提,他和黑人保安一样是可以&%@#~!的,只不过我根本没有勇气把他也带回家�6�7�6�7 我原以为我那个精品店老板对待我已经够厚道了,结果发现我的财神爷踏破铁鞋无觅处,得来全不费工夫!找到那个黑色西装的“董事长”,努力提升他对你的好感度吧!随着好感度的提升你可以问他借1000,3000,甚至最高的时候是 10000!当然你也要懂得做人,三不五时请他喝一杯名酒以及吃饭时候主动买单也是必须的。他的好感度提升很慢,不过看到自己的荷包胀得要裂开,多花点时间是值得的。金发女郎和褐发女郎,这两个是不折不扣的冰山美人,我甚至认为她们可能是 LES。尤其是褐发的女人,脾气非常古怪,很喜欢宗教一类的话题。和她打交道要事先想好怎么降低自己的妄想度和愤怒度。
看到这个女人可以和主角聊着聊着就自己看起书来,我几乎要为主角的百折不挠而折服,甚至有把她倒吊起来SM 的冲动�6�7�6�7 本关要点:关键地点:入口右面隔间的沙发,多数人物的最后一格好感度要在这里升级。这一关的分数好拿得离谱,我还刻意控制了分数的上升。第三关:“东风”夜总会 这次主角来到了一个化装舞会。不过与其说这是舞会,还不如说是SM 俱乐部差不多。这里的攻略模式依然是提升好感度→升满后寻找特定场所进行最终升级加分。根据人物的性格不同可以找到各自攻略的最佳办法。没有很多要注意的事项,不过为了以后过关方便建议练习一下考验记忆力的小游戏(与男性谈话时降紧张度的小游戏)。第四关:格斗馆 这关一开始看到主角被一个穿得很“黑客帝国”的人修理得很惨。为了重塑自己在地痞流氓界的地位,主角再次发挥百折不挠的小强精神,到当地的武馆去提高自己的抗打击技能(还不够高吗?)!
这个游戏什么时候变得这么催人上进了?不过主角在这里依然可以发挥痞子本色,偷蒙
骗拐一样都不能少。只是这里的女性�6�7�6�7唉,大部分都长得违反安全强制性规范。过关条件:非常特殊的一关,分值只要75 分就可以过,而且还是强制性过关!因为不懂剧情就不说什么了,感觉上过得莫名其妙。过关要点:玩到这一关的人对拿分条件应该都比较熟悉了吧,这关也不例外。不过有些特殊的事件需要注意安排次序而已。
一,那个武馆的管理员老伯,一开始他的好感度是无法提高到第二格的。那是因为你和那个白发中国老头的关系不够好(他才是这里的老大)。先把他的好感度提到最高吧!
二,白发的中国老头他无论对主角好感度如何都不会跟随主角行动,所以你只能进入他所呆的场所来与他打好关系。不过我可以告诉你这家伙是个“老不修”,和他谈话尽管聊金钱美女好酒就行了。
三,当你拿到75 分时(胖女格斗家、白发中国老头、辫子美女各占25 分)后强制出现剧情,有一个光头女警察(其实就是上一关的SM 女王)来踢馆,跟你单挑。玩互殴小游戏,过了之后强制跳到下一关,所以如果你还想继续跟美女温存的话就先不要先加满分数。第五关:L’escaigox 酒会 这一关应该是最多人会卡住的关了,因为大家会发现所有人的好感度都无法超过三格,而厨房里有个厨师更是无论怎么谈话都无法提升他的好感度。其实,这个师傅才是你的救命恩人。主角和他谈到酒会的人对自己戒心极重,总是不肯敞开心扉,与自己深入交流。师傅为主角想到了一个好办法,不过好办法不能白送,师傅开出了条件:帮他做几件事情(其实也就是玩小游戏)。主角需要找到这些小游戏所在的地方,才能进行这些游戏。
第一个游戏:自助餐台旁;“俄罗斯方块”式拼图游戏,把下落的食物碎片拼成完整的就得分。要拿到100 分才算完成。完成后再和厨师对话,他会送你一样东西,应该是醒酒药吧。
第二个游戏:餐桌旁;转盘小游戏,转盘上一圈都是加分或减分数字,中间有红蓝两根指针,左键控制蓝色指针停留,根据停留的那格指示来加减分数。原来的分值为1000,目的是在规定时间内控制蓝色指针使分数降到250 以下。红色指针会来干扰你,有时候它停在加分区域使你的分数猛涨。掌握一下提前量控制好蓝色指针停留位置就行了。完成后同样和厨师对话,他会送你�6�7�6�7按摩棒�6�7�6�7。第三个游戏:冰库内;吃布丁游戏,第一次按键使布丁抛物线向自己飞来,第二次按键让口张开,左右键控制身体仰角,吃到一颗布丁可得15 分,75 分满分。再次和厨师对话,厨师会要求你从酒会的每个人身上偷1000 美刀,好象很吓人的数字,不过其实每张钞票面额都是500 的(天啊,真是有钱人的聚会),所以要完成并不难。只要靠近目标按键就可以进行游戏了,不必一定要坐到沙发上。还是和厨师对话,按键玩最后一个小游戏——“吐出个未来”,根据光标经过的按键指示来按相应的键,比较简单。完成以后主角就得到了终极武器——“吐真言”牌超级烈酒!然后可以和里面的人聊天了,好感度只要升到第三格,就可以给他们灌酒了。
选择长一点那个Offrir 什么的选项,最好在餐桌上给他们灌酒,你会见识到这种酒的威力。酒一旦灌下去,好感度马上升到第五格满的状态,而且他们会对几乎所有话题感兴趣。你只要和对方坐到入口旁边的沙发上,按□键就可以继续提升好感度。当好感度加满以后酒也醒得差不多了,再次按R1 查看他们的爱好话题,发现和之前完全不同!原来他们之前都虚伪地戴着假面具与我交谈啊!酒后吐真 言,看来古人诚不我欺也!好感度满了以后,其他五个人在沙发上谈话,按键选择就算CLEAR,加分。只有那个老太婆主管,必须要和她一起到冰库里热烈一番(小游戏要通过!)才能拿到分数(为什么我们的男主角每次都要做这么痛苦的事?)。每个人有40 分,其实只要CLEAR 三个人就足够分数进下一关了,如果大家觉得全CLEAR 比较麻烦就只搞定三个女的吧。
第六关:“诚信”公司 要点一:黑人女主管一开始无法提升好感度超过三格,必须将其他人物全部 CLEAR 之后再继续提升其好感度,要点二:这关一开始金钱会清空为0。不
要紧,保险箱可以玩小游戏拿(偷)钱。不过保险箱前面人来人往,实在不好下手。建议先把那个白衣服的男人好感度升到最高,在监视器组前面和他谈话,有一个图标指示为X 的选项,可以拿1W(是直接修改工资单吗?)。要点三:和这关的人谈话,紧张度和愤怒度升得超快,建议熟练掌握厕所的TOP GUN 小游戏。紧张度可以利用复印机进行“PP 照射”来降低(似乎老外都比较喜欢这套?),平常复印机附近都没人过来的,可以和女孩子来这里体验一下办公室激情行为(同时:复印叫那么大声干嘛?)。第七关:南柯一梦 这一关分为五小关,都是玩小游戏。这是最后的考验了,大家努力吧!7-1 偷天换日:任务是在老板和警卫们的眼皮底下把十幅画偷走。很简单,总之我没有试验过被发现会有什么后果。7-2 以牙还牙:考记忆力的小游戏,最多的时候要记住9 个图标。实在不行就用笔记吧。7-3 来而不往非礼也:最难的一组小游戏了,目的是要分别和六个人互殴并满足不同的条件。
第一人:要拿到五次PERFECT,并且得分要在100 以上。第二人:连续三次拿到PERFECT,并且得分要在50 以上。第三人:连续三次回避对方的攻击,并且得分要在50 以上。第四人:连续三次作出假动作并击中对方,并且得分要在50 以上。第五人:连续三次作出假动作并以PERFECT 状态击中对方,并且得分要在50 以上。老不修:不能回避对方的攻击!而且得分要在100 以上。7-4 奇异食客::三个小游戏,分别在餐桌吃果冻、吧台喝啤酒和餐台醉酒。7-5 针锋相对:看到哪个人对面座位是空的就坐下来吧。7-6 男人梦想:帮这游戏的所有美女——注意,是美女!不是什么丑女胖女阿婆!——换装和拍照,人生至此,夫复何求? 最后,我们的猛男同志左拥右抱地躺在温柔乡,过着只羡鸳鸯不羡仙的**生活。完!恭喜全关通过!!
第四篇: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< }