24点游戏简介[模版]

时间:2019-05-13 03:02:17下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《24点游戏简介[模版]》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《24点游戏简介[模版]》。

第一篇:24点游戏简介[模版]

24点数学游戏

“巧算24点”是一种趣味数学游戏,游戏方式简单易学,能健脑益智,是一项极为有益的益智游戏活动。学生通过熟练掌握24点游戏的运算技巧,极大限度地调动眼、脑、手、口、耳多种感官的协调活动,对于培养孩子快捷的心算能力和反应能力很有帮助。

第二篇:观摩点简介

全国基层水利服务体系建设现场会(北方片)

观摩点简介

二○○一一年八月·宁夏

目 录

观摩线路图..............................................................................................................................................1 青铜峡市邵刚水利工作站......................................................................................................................2 青铜峡市邵岗镇玉泉村农民用水协会..................................................................................................3 青铜峡市大坝水利工作站......................................................................................................................4 中卫市镇罗水利工作站..........................................................................................................................5 沙坡头区九塘农村饮水安全工程..........................................................................................................6 中卫市镇罗镇李嘴农民用水协会..........................................................................................................7 中卫市沙坡头区抗旱服务队..................................................................................................................8

观摩线路图

青铜峡市邵刚水利工作站

邵刚水利工作站建于1984年,是青铜峡市水务局所属的不定级别定额补助事业单位,实行市水务局主管、镇政府协管的管理体制。共有职工4名,其中站长1名。全站工作人员均通过基层农业科技服务资格考试,其中具有水利初级职称3人,大学学历1人,50岁以上的1人,40岁以下的3人。该站有办公房屋7间140平方米,仓库等其他房屋7间136平方米,有9台套抗旱泵。

该站主要工作职责是:制定镇村用水计划,负责用水测量监测;指导农民用水者协会工作;水利工程的建设、管理、维护技术性劳务服务;小型农田水利建设的规划、技术指导和质量监督;辖区防汛抗旱和水土保持的监督指导工作;受主管局委托开展水政执法工作。该站管理区域面积121.22平方公里,涉及13个行政村65个村民小组,灌溉面积42087公顷。有支、斗、农渠1449条786千米,支、斗、农沟456条169千米,过境干沟3条31公里,泵站5座。

多年来,邵刚水利工作站坚持以服务基层为中心工作,充分发挥基层水利工作站服务、协调、监督、管理、经营的职能,围绕农田灌溉节水增效工作,指导组建农民用水者协会7家,开展用水管理、测量水监督、协会人员培训等工作,全镇农田灌溉年用水量从过去2004年的0.63亿立方米减少到2010年的0.51亿立方米;积极参与农田水利项目建设,开展技术服务和质量监督的实施,先后参与了人畜饮水工程、农业综合开发等项目及春秋两季农田水利建设,改造中低产田4600余亩,建设泵站5座,辖区支、斗、农渠的砌护率达到30%,全镇农业基础设施得到极大的改善;全面开展水土保持监督和防汛抗旱检查、指导工作,取得了明显成效。同时利用院内闲置土地,兴建预制场,一方面解决职工5%的差额工资,提高职工福利待遇;另一方面积极开展渠道砌护和过程维修,提高工程质量,大力发展多种经营。得到了各级组织高度评价和表彰,多次获得区、市、局表彰奖励。青铜峡市邵岗镇玉泉村农民用水协会

邵岗镇玉泉农民用水协会组建于2005年,是一个以村为单位组建的用水协会,共有用水户516户,管辖支渠1条长1200米,斗农渠6条长6500米,各类水利配套建筑物156座,泵站1座,抗旱泵7套,灌溉面积1560亩。

协会按照有关政策规定和协会章程、制度,选举产生了协会执委和会长。现有会长1名,执委4名。协会实行自主管理、自主经营、自我服务、民主决策、市场化运作、镇村监督协调、水管单位和市水务局业务指导、广大农民监督的运行管理方式。协会经费来源为支斗渠维修管理费,包含在农业灌溉水价中。协会财务由邵刚镇委托镇经管站代管;支斗渠维修管理费的60%用于支付协会人员工资,30%用于水利工程维护管理费,10%用于办公费用。协会管理的南附设渠和肖家小渠两条支渠,实行个人承包经营责任制。

目标考核激励机制:根据管理支渠前三年的实际用水量,确定用水指标和亩均水费标准,由协会与承包人签订目标管理责任书,实行目标管理。年终,通过对承包人的绩效考核,兑现承包人的工资。用水管理机制:由水管单位制定该灌域支渠的用水计划并进行供水,承包人组织支渠管理人员和淌水员为用水户提供用水服务,渠道全部实行“一把锹淌水”制度,减少了水量浪费。5年间亩均节水率为38.3%。水费收缴管理机制:实行“开票到户制”和“收费到户制”。承包人凭票向农民收缴水费,农户见票付款,做到票款两清。监督制约机制:按照“水量公开、水价公开、水费公开、多方监督”的要求,水管单位和协会及时向用水户公布灌溉面积、用水量、水价和水费,接受镇村组织及用水户的监督。财务管理机制:实行“协会用、镇管、市监督”的制度,由镇总会委托镇经管站代管协会财务,对返还的支斗渠维管费进行集中管理。由协会提出协会人员工资、协会日常办公开支和水利工程维修方案和开支申请,总会按照使用比例进行审核批准,并监督执行。

青铜峡市大坝水利工作站

大坝水利工作站组建于1984年,是青铜峡市水务局所属的定额补助事业单位,实行市水务局主管、镇政府协管的管理体制。共有职工5名,其中站长1名。全站工作人员均通过基层农业科技服务资格考试,其中具有水利初级职称3人,大专学历1人,40岁以下的4人。该站有办公房屋9间180平方米,仓库等其它房屋7间140平方米,有11台套抗旱泵。工作人员工资实行财政定额补助95%,差额5%通过多种经营解决。该站管理区域面积204平方公里,涉及15个行政村84个村民小组,灌溉面积8.2万亩。有支、斗、农渠1667条833公里,支、斗、农沟779条389公里,过境干沟3条23公里,补水泵站9座。多年来,大坝水利工作站认真履行工作职责,坚持以供水服务为中心工作,充分发挥基层水利工作站服务、协调、监督、管理、经营的职能。

加强农田灌溉管理。围绕农田灌溉节水增效工作,指导组建农民用水者协会13家,开展用水管理、测量水监督、人员培训等工作。2006年西贴渠农民用水户协会成立,水利工作站站长当选为西贴渠农民用水协会会长(兼大坝镇农民用水协会秘书长),负责管理占全镇灌溉面积1/6的西贴渠,为大坝镇5个村民小组1540户1.3万亩农田灌排提供服务,实现了供、管、收一体化。协会在运行管理中,不断修订和完善了协会章程、各项管理制度,规范操作程序,做到水量、水价、水费、面积“四公开”,让群众淌放心水,缴明白费。2010年协会全年实用水量1771万立方米,比2006年实用水量的1870万立方米,减少99万立万米,节水率5.3%,为辖区内其他农民用水协会起到了示范带动作用。全镇农田灌溉年用水量从2003年的1.36亿立方米减少到2010年的1.05亿立方米。

服务于水利工程建设。积极配合当地政府组织的农田水利项目建设,编制小型农田水利建设的规划,末级渠道改造、人畜饮水工程、春秋两季农田水利建设,开展技术指导和质量监督。先后改造中低产田1.6万亩,辖区支、斗、农渠的砌护率达到20%,全镇农业基础设施得到极大的改善。

强化水利行业执法监督工作。全面开展水土保持监督和防汛抗旱检查、指导工作,认真履行水政监察员职责,及时化解水事纠纷,查处水事案件,营造良好的水利管理秩序,确保辖区内水利工程正常运行。积极开展水利多种经营。利用本站闲置土地对外租赁,发展木炭生产,每年收入1.4万元,缓解了职工工资缺口和办公经费不足的压力。

中卫市镇罗水利工作站

沙坡头区镇罗水利工作站是中卫市水务局下设的基层水利事业管理单位,负责镇罗镇农村水利的规划调查、工程建设、工程维护、防汛抗旱、管理服务等职能任务。核定财政供养编制4人,具有中级职称2人,管辖辖13个行政村、3万多人口,有3.2万亩农田1176条支斗农渠,352条支斗农沟,1801座水工建筑物。

一、加强自身建设,提高服务水平。制订了《水利工程建设管理制度》、《水费收缴管理制度》等制度,做到用制度管人、管事。加强业务技术培训,使职工的业务能力得到了提高。不失时机向群众宣传水法规及节水灌溉知识,不断扩大依法治水的影响力。加强协调联系,每年年初深入辖区各村,征求群众对水利工作的意见建议,并加强与镇罗镇党委、政府协调沟通,争取资金529万元对辖区1.8万亩农田实施综合配套治理,充分发挥了承上启下的“纽带”作用。

二、发挥职能作用,服务“三农”发展。积极协助镇农田水利基本建设指挥部制定农田水利基本建设实施方案,加强检查,严把质量。积极开展防汛抗旱,分片包干,强化措施,从工程的使用、管护、维修负责到底,有效提高了水利工程的完好率,确保了农田灌溉。深入农户、田间地头,向群众提供水稻控制灌溉、量测水、农村生活用水等实用、易懂的水利技术服务。

三、完善用水组织,夯实管理基础。通过选举成立了由15人组成的镇级农民用水协会,成立了由30人组成的6个村级农民用水协会,加强对协会的监管和考核,实行奖罚措施,解决了农田灌溉困难、农民用水不公等问题。近年来,在连续大旱的情况下,实现了“保灌、节水、降费”的目标。

因工作到位,职能作用发挥充分,镇罗镇水利工作取得了显著成效,水利站多次被市水务局及镇罗镇党委、政府评为“先进水利站”和 “先进单位”,3人被授予全市 “水利工作先进个人”、“水利系统优秀共产党员”等荣誉称号。

沙坡头区九塘农村饮水安全工程

九塘农村饮水安全工程于2009年3月1日开工建设,12月25日竣工。工程新建机井1眼,配套潜水泵、控制柜各1台(套),架设25KVA和50KVA变压器各1台,建水处理厂1处,曝气氧化池1座,二氧化氯发生器1套,变频加压供水控制设备1套,架设高低压线路0.96Km,铺设各级管道513.64Km,建400m³清水池1座,厂房和泵房及管理房306.86m²,建各类阀井602座,配套过渠(沟、路)等建筑物33座。工程建成后移交中卫市农村人畜饮水管理站九塘供水站管理,现有工作人员4名,其中站长1名,职工3名。管理站实行自负盈亏、滚动发展的企业管理模式。

在管理措施上,统一收费票据,采取一户一票,一户一《手册》,以村建台帐,以户设卡片,设立收费明白栏并及时公布。在配套设施上,采用分片、分级控制的办法考核;在管理责任区设置分片计量表,考核管理责任人的区域供水量;农户实行“集中装表,一户一表”,严格计量收费。在收费方式上,由过去的走家入户征收转变为预约式定点、定时由用户主动上缴。管理人员统一着装,佩戴上岗证,划分责任片区,从农户用水、管网管护维修、抄表收费,一人负责到底。在故障排除上,坚持做到小修4小时内完成,中修一个工作日内完成,大修两个工作日内完成;设立了“用户上访记录”“供水服务投诉记录”;开通了“供水维修服务电话”和“供水监督电话”;向用户下发了“告用水户的一封信”和《农村饮水服务手册》。

经市物价局核定工程供水水价2元/立方米,工程投入运行以来,总供水量达12.32万方,实际抄表水量11.21万方,对口率91%,商品率90%以上,已累计收缴水费23.19万元,收缴率达到99%以上。累计总支出21.33万元,其中工资10.36万元,社会保险3.77万元,办公费用2.26万元,电费2.34万元,维修费2.03万元,三化建设1.08万元。工程建成后,有效地解决了李嘴、镇西等10个行政村6067户24447人的饮水安全问题,改善了项目区群众的生活条件和生活质量,加快了受益区群众致富的步伐,经济效益和社会效益十分明显。

中卫市镇罗镇李嘴农民用水协会

李嘴农民用水协会成立于2005年,辖13个用水小组,受益人口2732人,用水户747户。负责2215亩农田灌溉,管理支、斗、农渠156条;支、斗、农沟52条;桥、闸等水工建筑物254处。协会经过组建、规范、发展、提高四个阶段后,健全了管理组织,理顺了用水秩序,提高了服务水平,基本实现了“支斗渠管理责任落实,管好“最后一公里”,农田用水保障,农民水费负担下降”的目标。

一、认真组建,明确职责。协会组建由村民大会推荐群众代表,经群众代表选举产生3名执委,执委选举会长。协会在民政部门注册登记后,依据章程开展工作。协会实行协会+农户+承包人的管理模式,采取包用水量、包水费收缴、包渠道工程管理的管理责任制。支渠承包人由群众推举,村委会、协会审定,竞争上岗,人员工资从支斗渠返还水费中支付,不足部分由协会经过“一事一议”按灌溉面积收取。

二、健全制度,规范管理。制定了《工程管理制度》、《灌溉管理制度》等制度,将灌溉面积、水费收缴、水费返还资金、劳动积累工等建立台账,专人管理,严禁村队劳务账与水账混记、折提,搭车收费。支出按照“村用、镇管、县监督”的财务管理办法审批使用,杜绝了乱收费和搭车收费现象。

三、核实面积,确保公平。逐户、逐田块进行面积核查,并登记造册,绘成图表,实行农户地亩动态化管理,实现了水费的公平、合理负担。

四、保障投入,改善设施。协会在村委会的配合下,通过“一事一议”按面积征收渠道清淤费,组织群众进行渠道清淤,确保了渠道输水畅通。6年来,协会累计投入资金18万元,使辖区支、斗、农渠设施条件得到了有效的改善。

五、狠抓服务,保障灌溉。协会人员加强渠道巡护和水量调配,及时和水管单位联系,推行“一把锹”淌水,解决灌溉中存在的问题,确保作物适时灌溉。

中卫市沙坡头区抗旱服务队

中卫市沙坡头区南部的环香山地区地处宁夏中部干旱带,年降水量不足200毫米,蒸发量却达2000毫米,共有6镇(乡),人口7.2万人,属全国最干旱的地区之一,抗旱任务十分繁重。

1997年6月,中卫县抗旱服务队成立,2004年因撤县设市,原中卫县抗旱服务队并入市防汛办,2007年3月,中卫市编制委员会对进行重新认定设置,将抗旱服务职能并入中卫市防汛抗旱指挥部办公室,核定人员编制5人,其中副高2人、工程师2人、工勤1人。主要承担沙坡头区的防汛抗旱减灾工作,同时指导海原县及中宁县开展防汛减灾和易旱地区抗旱自救工作。

目前有物资储备库5座,抗旱车辆4辆,推土机1辆,拖拉机2辆,摩托车1辆。现有台式电脑2台、笔记本电脑1台,打印机1台,数码相机1台,电视机1台,传真机1台;有抗旱车辆4辆,推土机1辆,拖拉机2辆,摩托车1辆,单柴油机2台,柴油机11台,混流泵10台,离心泵5台,发电机1台。

针对严峻的旱情,自治区、市政府每年安排专项资金,由抗旱服务队组织群众开展抗旱自救活动,解决易旱地区群众的生产生活用水。一是制定抗旱预案,每遇旱情市政府分级启动抗旱预案,救助措施;二是建设高效节水补灌工程,通过工程措施为40万亩硒砂瓜补水灌溉;三设立集中供水点,为受灾群众无偿提供拉水水源;四是免费送水到户,为农村学校、五保户、孤寡老人等困难群众解决饮水问题。确保了大灾之年56万亩硒砂瓜的丰收和社会稳定。

第三篇:调研点情况简介

调研点情况简介

【xx县岳阳镇水观村】xx镇水观村位于县城北5公里319国道旁,是全国文明村、省级新农村示范村,有村民小组16个,农户540户,总人口2310人,村党支部设党小组4个,现有党员54名。党的群众路线教育实践活动启动以来,村党支部立足基层实际,围绕反对“四风”和解决群众反映强烈的切身利益问题活动重点,创新设计载体、切实改进作风,确保教育实践活动出实招见实效。

将活动开展到田间地头。针对农村实际,坚持把实践活动平台搭建在田间地头,保证活动接地气。通过邀请联系领导专题辅导、先进典型专题报告、集中培训、送学上门等形式,依托村级广播、远程教育网络等平台,让党员一边干农活一边学习,使群众路线深深扎根于人心。采取入户走访、实地察看、民情恳谈、院坝交流等方式收集社情民意,了解群众疾苦,排查矛盾纠纷,问需问计于民。建好三本台账,对搜集到的意见建议,按民生诉求、困难群众和稳定工作三个类别,及时建账、定时晒账、限时结账,着力解决好群众反映强烈的切身利益问题。将重心落脚到发展增收。注重突出实践特色,以“五好干部怎么做”、“我为xx村建言献策”等为主题开展大讨论活动,进一步明晰发展定位,优化发展路径,创新发展举措。依托“魅力柠海”景区,着力打造生态农业、观光旅游示范区,大力发展“柠檬、蚕桑、旅游”三大产业,引进业主改良林木品种,新发展香椿、林下药材等特色产业,着力夯实群众增收致富的产业支撑。2013年,全村人均纯收入已达到10800元。将目标定位到群众

采取以企建园、产园合一的方式,初步构建起了分功能、分区域布局的以柠檬加工为主导的食品产业和医药、纺织、电子、机械、制鞋、物流“六大现代产业体系”。2013年,园区规模工业总产值实现218.6亿元,同比增长20%,占全县规模工业总产值69%;规模工业增加值达到56亿元,同比增长17%;实现利税35亿元,同比增长21%。“七项创新”推进健康发展。创新发展理念,科学规划引领发展,推动“工业一体化”向“产城一体化”转变;创新发展产业,优化结构联动发展,推动“单一工业”向“

二、三产业融合发展”转变;创新招商方式,招大引强领跑发展,推动“招商引资”向“招商选资、招大引强”转变;创新建园模式,产业成链配套发展,推动“政府建园”向“企业建园”转变;创新推进手法,拓宽空间跳跃发展,推动园区建设由“梯度式”推进向“框架式”拉开、“跳跃式”发展转变;创新安置模式,以人为本和谐发展,推动“划地自建”向“小区集中安置”转变;创新服务方式,优质高效助推发展,推动“一般化服务”向“主动化、全程式服务”转变。

【xx县xx镇】xx镇位于xx县城东部6公里,幅员面积48.6平方公里,全镇辖10 个行政村、3个社区,81个村(居)民小组,共有24个党支部、753名党员。2013年,全镇实现地区生产总值(GDP)实现4.8亿元,增长14.5%。党的群众路线教育实践活动启动以来,镇党委立足基层实际,顺应群众期盼,“三突出三确保”推进活动扎实有序开展。

突出动员部署,确保实践活动深入人心。按照“早动员、早部署”工作要求,迅速召开党委专题会议进行研究部署,成立了

均办件量近20万件,按时办结率、现场办结率、群众评价满意率均为100%。

强学习、勤问症,全面铺开教育实践活动。及时组织学xxx省委、市委精神和县委部署要求,研究确定了中心开展活动的意见方案。依托“基层问症、百姓听音”等活动平台,先后深入石羊、瑞云、龙台等乡镇便民服务中心,广泛听取服务对象的意见,为改进服务方式、提升服务水平奠定坚实基础。创新抓好“自选动作”,深入开展“三学三比三创三评”服务质量大比拼、“四进四促”等活动,进一步促进窗口工作作风的转变,确保活动取得实效。细举措、优服务,深化拓展便民惠民举措。秉承“只要企业定了干,一切手续我们办”的服务理念,不断优化审批流程、创新服务方式。积极推进制度流程上墙,清理规范行政审批和公共服务项目并进行公示,方便群众简便快捷知晓审批流程。大力推进“两集中、两到位”,开通绿色通道、实施并联审批,力促部门行政审批职能向行政审批股集中、行政审批股向政务服务中心集中、行政审批权向窗口授权到位、行政审批项目向政务服务中心进驻办理到位,应进项目入驻率为100%。重创新、求实效,提高服务群众能力水平。完善行政审批软件系统,开通电子政务服务网络,积极开展“网上咨询、网上申请、网上下载、网上受理、网上预审”服务。围绕“项目审批零停留、承诺时限零超限、服务群众零距离”目标,创新推出延时、预约、上门、代办及开通96196热线等特色服务,料不全指导办,积极开展延时、预约、上门、一次性告知等特色服务,受到办事群众广泛好评。

【xx县地方税务局】县地税局设有党支部13个、党小组33个,共有党员190名。群众路线教育实践活动开展以来,局机关党委紧扣活动主题,突出实践特色,坚持开门开放,强力推进活动扎实有序开展。

开门开放接地气。始终坚持群众导向,扭住开展纳税人满意度调查活动契机,创新开展“六查六看”调研活动,全局80余名机关党员干部深入全县近100户重点企业及基层群众中,采取入企入户走访、民情恳谈等方式,先后走访群众500余人次,召开座谈会28场次,共征集到各类意见建议35条,切实增强了与征纳对象的互动互通力度,拓宽了服务渠道。聚焦四风照镜子。始终坚持问题导向,突出领导示范引领,局机关领导班子和全体党员领导干部聚焦“四风”问题,带头深入基层一线与广大干部职工面对面交流、心贴心沟通,通过采取个别走访、集体座谈、问卷调查、组织评议等方式深入查找“四风”方面存在的突出问题,力求问题找得准,根源挖得深。活动中,共发放意见征集表300余份,梳理汇总“四风”问题意见建议34条。统筹推进重实效。坚持将教育实践活动与税务征收相结合,做到系统谋划、统筹推进。紧抓“两化互动、三化联动”战略部署,因势利导务实开展“七在七做”争创活动,引导全局党员干部攻坚克难、勇于担当,切实转变工作作风,努力以实实在在的活动成效助推地方经济又好又快发展。截至目前,全县已累计组

众办事更加便利,切身感受到公平正义,实现司法为民服务理念新转型、服务模式新跨越。以强化诉讼规范、优化服务流程为举措,制止“乱检查、乱收费、乱罚款”不正风。突出让群众“少跑一次路、少误一份工、少等一分钟”目标,严格执行统一的工作流程和服务规范,实行便民快速立案制度。坚持流程上墙,将收费标准、诉讼流程等上墙。坚持快速立案,当事人立案材料齐全,均在20分钟内办完所有立案手续。坚持上门服务,对行动不便的当事人,提供电话预约立案和上门立案,努力为人民群众提供热情、文明、高效的诉讼服务。以延伸诉讼服务、提高服务质量为载体,打造“温馨调解室、党员示范岗、巾帼示范岗、青年示范岗”示范点。突出保证群众“话有地方说、事有地方办、困难有人帮、问题有人管”宗旨,进一步加强建设服务型党组织力度。着力打造“温馨调解室”,使诉讼服务中心真正兼具人民调解、行政调解以及司法确认三大功能。设立“党员示范岗”、“巾帼示范岗”、“青年示范岗”,确保为当事人提供优质的诉讼服务。设置导诉台,配备专人加强对当事人的诉讼指导与帮助,强化诉讼权利义务、举证责任、诉讼风险等事项告知,引导当事人理性选择诉讼成本低、负面作用小的诉讼程序,全面提升司法服务的能力和水平。

【xx县中医医院】xx县中医院始建于1956年,是以中医药为特色的三级乙等综合性医院,现有职工589名,党员140名。在党的群众路线教育实践活动中,医院紧紧围绕“为民务实

图,开设免费公交车,开通网上预约挂号等有效措施,不断优化医院服务流程。实施优质工程,强化配套设施建设,投入3000万元新购16排螺旋CT、进口三维彩超等大型先进诊断治疗设备,建成全市最先进的重症监护室和洁净手术室,提升医疗服务质量。实施免费工程,组织老中医进社区免费为久病、重病的居民定期检查、门诊用药,打造“康复超市”,对贫困中风瘫痪病人、先天性脑瘫病儿全面实施免费康复,多渠道为百姓健康提供服务。

第四篇: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 class Stack { public: Stack();

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 Stack::Stack(){ count=0;}

template

bool Stack::empty()const { return count==0;}

template

bool Stack::full()const { return count==maxsize;}

template int Stack::size()const { return count;}

template void Stack::clear(){ count=0;}

template

Error_code Stack::top(T &item)const { if(empty())return underflow;item= entry[count-1];return success;}

template

Error_code Stack::pop(){ if(empty())return underflow;count--;return success;}

template

Error_code Stack::push(const T &item){ if(full())return overflow;entry[count++]=item;return success;}

Stack sign;Stack num;

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请输入要进行运算的表达式,包括” +,-,*,/,=,(,)“和数字,”<

<<“注意: 以数字开头,等号结尾,中间括号要匹配.”<>str;}

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,需要重新计算请输入你算出的结果,程序有漏洞,请合作。“<>out;cout<<”谢谢合作“<

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<

}

下载24点游戏简介[模版]word格式文档
下载24点游戏简介[模版].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    观摩点简介2011.8.20

    政协莎车县第十二届委员会第一次会议 委员观摩点简介(特色农业) 观摩点一 :吾达力克乡订单色素辣椒简介 该点位于吾达力克乡15村4组,连片面积1000亩,品种为甜椒。3月初起垄铺膜......

    沙盘游戏简介

    沙盘游戏疗法(sandspiel, sandplay therapy)又称箱庭疗法,是目前国际上具有重要影响的心理治疗技术之一,起源于欧洲,由张日昇教授于1998年将箱庭疗法引入中国,在国内开展了富有开......

    新联村观摩点简介

    新联村观摩点简介 尊敬的各位领导,早上好! 首先欢迎大家莅临我们铁厂镇检查指导工作。我们现在来的是黄龙铺中部新联村。新联村全村辖5个组404户1538人,新联的烤烟是从2010年开......

    各博士学位点博士生导师简介

    各博士学位点博士生导师简介 081701化学工程 计建炳(男)教授,博士。主要研究领域:超重力场工程、生物质能源工程、离子液体与分离过程。联系方式:0571-88320053,jjb@zjut.edu.cn......

    砂石装卸作业点简介

    南沙港水上砂石装卸作业点简介 一、装卸作业点建设的必要性 随着南沙港铁路项目启动,路基借土填方运输的问题已经凸显,南沙港铁路路基借土填方方量大,据工程数量清单统计达到21......

    乡镇植树造林观摩点简介

    横阵村植树造林观摩点简介 罗敷镇党委、政府始终坚持“绿水青山就是金山银山”的发展理念,紧跟“绿化秦东大地,建设美丽家园”步伐,坚持生态建设和产业发展并重,结合脱贫攻坚、......

    毛衫加工点简介

    姜宁毛衫加工点位于海阳所镇杜家岛村,是本村村民姜宁于2011年2月投资3万元成立的,占地60平方米,主要从事羊毛衫的缝合业务。现在加工点拥有毛衫缝合机8台,吸纳本村15名妇女到厂......

    浙工大学科学位点简介

    浙江工业大学学科、学位点简介 001化学工程与材料学院 070302 分析化学 本学位点以浙江省重中之重学科应用化学学科为支撑,以浙江省省属高校中唯一拥有50年以上分析化学本科......