24点游戏文献综述

第一篇:24点游戏文献综述

       二十四点游戏的设计与开发

       前言:

       随着软件技术以及互联网技术的不断发展,游戏产业发展迅速已经成为经济增民的一个亮点。实践是软件开发的核心,对代码要求精益求精,在开发的过程中,简单设计,用测试驱动,通过重构和迭代代码实现现设计[11]。

       本文简要的介绍了游戏的发展,开发现状,以及游戏开发中存在的问题和未来的前景。另外还简单地介绍了众多游戏开发软件中的一种——即VC ,其中主要地介绍了VC 6.0,以及VC 的编程环境。同时通过一个小游戏简单介绍了利用VC 开发游戏的处理过程。在本文中主要介绍了24点纸牌游戏的开发,包括界面的设计和相应的界面设计原则,还介绍了其开发环境。

       一 游戏的历史发展

       游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不穷,经典游戏比比皆是。

       真正的电子游戏机产生于20世纪70年代。1971年,麻省理工学院的学生Nolan Bushnell设计了世界上的第一个业务用游戏机(俗名街机),叫做《电脑空间》。这台游戏机用一台黑白电视机作为显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。但是最后他在电子游戏的发展上取得了非凡的成就。

       上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到1972年,一个叫Crowther的工程师用当时最流行的主机――DEC公司的PDP-10编写一段简单的FORTRAN程序。在这个程序里,Crowther设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。这个程序被公认为是最早的电脑游戏程序。

       1989年,BroderBund公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说《一千零一夜》在Apple平台上制作了一部动作冒险相结合的电脑游戏――波斯王子。这个游戏获得了第一作,它代表了当时电脑技术的最高水平。

       1986年,任天堂公司发售了一款真正的游戏巨作――超级马里奥。20世纪80年代IBM PC兼容机的出现打破了Apple公司的垄断地位。到了20世纪90年代,游戏业才真正成熟起来,成为了一种产业。由于PC机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。游戏产业也逐渐发展成熟。

       二 现状评述

       现在有很多软件都可以编写小型游戏,在学校现已开设的课程有C语言、VB、C 和Jave,就我目前了解,可用Jave,VB和C 编写N24D、拼图的等等各种小游戏。

       下面介绍一下各种方法的优越性:

       1:VB是完全中文化的环境使用,语句生成器和快速提示帮助使用户不必记忆成千上万的属性和方法,在较短的时间内就能开发出功能强大的应用程序。Internet应用程序的开发功能更加强大和容易,支持动态HTML技术的应用程序。种类繁多,功能强大的多媒体控件,能帮助用户在较短的时间内用较少的语句编写出图文声像并茂的多媒体程序。能对多种数据库进行读写操作。它所提供的可视化数据管理器能帮助用户构造多种类型的数据库。用户自定义类型可以作为参数或作为公共属性和方法的返回值,函数可以返回数组变量,动态数组可以赋值,文件系统对象,按名调用,增强创建对象函数和StrConv函数。应用程序安装向导能帮助用户自动生成具有一定功能的应用程序,加快了程序的开发速度。

       2: C 是对C语言的扩充,扩充的绝大部分来自著名语言中的最佳特性:从SIMULA 67中吸取了类,从ALGOL 68中吸取了运算符一名多用、引用和在分程序中任何地方说明变量,综合了Ada的类属和Clu的模块特点,从BCPL中吸取异常处理,从BCPL中吸取了用//表示解释。

       C 保持了C的紧凑、灵活、高效和易移植强的优点,它对数据抽象的支持主要在于类概念和机制,对面向对象风范的支持主要通过虚拟函数。C 既有数据抽象和面向对象能力,语言运行性能高多,加上C语言的普及,而从C至C 的过渡较为平滑,以及C 与C的兼容程度可使数据巨大的C程序能方便地在C 环境中重用。

       尽管C 当初的设计本意是帮助管理大型程序,但其用途并不仅限于此。C 的面向对象的特性可有效地用于实际的程序设计工作。C 常常用于设计编辑器、数据库、个人文件系统以及通讯程序等。而且,由于C 共享C的效率,所以用C 可以构成很多高性能的系统软件。

       3:Java是定义位于网络计算的计算机语言,它几乎所有的特点也是围绕着这一中心展开的并为之服务的,这些特点使得Java语言特别适全于用来开发网络上的应用程序;另外,作为一种面世较晚的语言,Java也集中体现和充分利用了若于当代软件技术新成果,如面向对象、多线程等,这些也都在它的特点中有所反映。

       三 发展前景

       随着电子产品的快速发展,实现人工智能是人类梦寐以求的,人工智能是计算机发展后的必然产物,也是人类发展必然出现的,人工智能并不一定结合特定硬件产生,人工智能完全可以由数字程序组成,他就像人类的大脑思维套成的算法,理论很简单,但是比较难做到,它的出现很可能会给人类带来危险,其实这种担心是多余的,因为他的思维判断基于程序数据,特别是计算机,他会严格的按照特定程序执行的,即使出错也不会造成伤害,只要人类正确的应用,他是不会造成危险的,当然他还是像一个双刃剑,如果编程时,程序含有像病毒一样的消极破坏程式,那对人类来说绝对是毁灭性的灾难。应该建立一个对其程序开发的危险度控制机制。

       由于计算机的计算速度快、逻辑性好、低错误,理性化思维,相比人的情感思维更有优势。如果他真的有了思考能力,那么他绝会比人类聪明几千倍,如果同样一项任务,仅仅从理论上计算,计算机会在7秒内赶上人类5000年文明的,当然只是理论上讲,实际上目前是不可能的,因为包括试验,采集,考察等,是计算机短时间内无法做到的。这个不能说明别的,智能说明人工智能的出现,人类正确的使用人工智能(机器人)将会推动人类的发展速度,给人类带来无比的好处,将是人类历史发展速度的增速器。

       [1] 虞万荣,王玉峰,赵 亮《JAVA编程语言》(第三版),中国电力出版社,2022年12月。[2] 张家耀,何雪芳,宋梅《JAVA ME嵌入式程序设计》,电子工业出版社,2022年1月。

       [3] Y.Daniel liang《JAVA语言程序设计.基础篇》(原书第八版),机械工业出版社,2022年6月。[4] 陈悦,张蕾,李绍华《C 程序设计》,清华大学出版社,2022年1月。[5] 蒙祖强《C 程序设计教程》,清华大学出版社,2022年10月。

       [6] 郑莉、傅仕星、张瑞丰《C 语言程序设计》(第三版)清华出版社,2022年6月。[7] 沈祥玖《VB程序设计实训教程》,高等教育出版社,2022年。

       [8] 柳青《程序设计语言VB及开发应用》,高等教育出版社,2022年8月。[9] 张清华《人工智能技术及应用》,中国石化出版社有限公司。2022年1月。[10] 曹少中、涂序彦《人工智能与人工生命》,电子工业出版社,2022年12月。[11] 李燕《儿童与游戏发展》,浙江教育出版社,2022年3月。

       [12] Colin Moock.Essential ActionScript 3.0[M].Adobe Dev Library,2022 [13] Keith Peters.Foundation Ationscript3.0 Animaton[M].freinds of ED,2022

第二篇: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<

       }

第三篇: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

第四篇:游戏配乐文献综述

       游戏配乐文献综述

       摘要:当今社会,已跻身为“第九艺术”的游戏正逐渐充斥着人们的日常娱乐生活,并以势不可挡的速度迅猛发展,逐渐形成了自己的庞大产业。游戏的产业化制作,必然带来更加细化的分工,以往被忽略的游戏配乐,理所当然的开始受到各界的关注,本文就是对已有相关成果做出归纳和整理。

       关键词:游戏;配乐;游戏音乐

       本文收录游戏配乐相关主题文献16篇,参考文献均来自于中国知网和万方网站,并根据文献的研究对象和分析内容进行如下分类:

       一、以游戏配乐发展史为研究对象进行的研究

       这部分的文献属于对游戏配乐发展史的整体概述:

       黄硕在《视频游戏音乐发展的阶段性探析》中阐述了视频游戏音乐发展的过程、走向、特点及其高速发展的原因,认为视频游戏音乐发展的动因包括了声效科技的发展以及游戏受众的心理变化。王春明的《杰弗瑞?斯托莱特交互电子音乐作品研究》提出,现代音乐的创演的热点依托科技变成了高新科技,文章通过交互电子音乐作品的分析,总结出其理论体系,并与中国作曲家作品进行了比较。蒋河在《谈网络游戏中新民乐的传播特征及发展趋势》一文里提到了新民乐在网络游戏中的运用。这3篇文章都是“史料拾存”的性质,各自所收录的史料存在互补关系。相关的文献还有许志成的《游戏音频应用技术探索》和蒋河的《电子游戏音乐的传播研究》,王明升的《电子游戏和电子游戏音乐的发展》和全伟华的《网络游戏与背景音乐的融合》。

       二、以个案来研究的游戏配乐

       此类文献主要以某一类游戏为对象进行专题研究:姚涛的《基于延伸的计划行为理论的网络游戏持续使用研究》是通过对相关文献的统计分析,得出影响网络游戏持续使用的原因,给游戏厂商提供数据参考。梁雅?G的《游戏“潜规则”――以供应方个案为例探究游戏音乐高端市场良性发展的环境》提出国内游戏行业产值虽然在飞速发展,但游戏配乐却仍处于相对落后的境地。此部分的文献数量极少,在相关资料缺乏的同时也给了我们继续发展的空间。

       三、从创作方面来谈游戏配乐

       在现代网游中,音乐已经不仅仅作为游戏的附加而存在,但目前为止,从创作方面来剖析游戏音乐制作的方面仍有待开发:

       吴澄的《浅谈游戏配乐与声效的特点》是从多方面总结了游戏听觉艺术的特点。薛晓乐的《游戏背景音乐的程式化创作》分析了常见场景的背景音乐的作曲技法、制作方式上的分析,总结了游戏背景音乐的发展历程及其特征。张久林和高雪梅的《电子游戏背景音乐的唤醒度和愉悦度对生理唤醒和攻击性行为的影响》运用了少见的使用的实验研究法,把背景音乐和电子游戏的类型当作两个独立的变量来分别考察其在对生理唤醒和攻击性影响中的作用。刘早香的《JeremySoule:游戏配乐界的奇才》一文是一篇以人为主题的论文,介绍了JeremySoule的游戏配乐作品。相关文章还有邱月烨的《游戏也是大片》和卢小旭的两篇《游戏配乐制作谈:民族风格》。

       纵观游戏配乐的相关研究成果我们不难发现,对于“游戏配乐”这一主题的研究,不但整体研究成果数量较少,且研究方向略显单一,论文多集中于游戏配乐的历史梳理,对个案研究或者其他角度的研究十分稀少这部分的音乐研究,从数量和质量以及研究角度上都有极大的空间等待着我们的探寻。

       参考文献:

       [1]黄硕.视频游戏音乐发展的阶段性探析[D].江西财经大学,2022.[2]王春明.杰弗瑞?斯托莱特交互电子音乐作品研究[D].上海音乐学院,2022.[3]蒋河.谈网络游戏中新民乐的传播特征及发展趋势[J].衡水学院学报,2022(1):126-128.[4]王明升.电子游戏和电子游戏音乐的发展[J].大舞台,2022(3):83-84.[5]许志成.游戏音频应用技术探索[J].辽宁经济职业技术学院?辽宁经济管理干部学院学报,2022(2):57-58.[6]蒋河.电子游戏音乐的传播研究[J].文化艺术研究,2022(2):25-30.[7]姚涛.基于延伸的计划行为理论的网络游戏持续使用研究[D].浙江大学,2022.[8]梁雅?G.游戏“潜规则”[D].上海音?费г海? 2022.[9]邱月烨.游戏也是大片[J].21世纪商业评论,2022(5):74-74.[10]吴澄.浅谈游戏配乐与声效的特点[J].大众文艺:理论,2022(11):30-31.[11]薛晓乐.游戏背景音乐的程式化创作[D].南京艺术学院,2022.[12]张久林,高雪梅.电子游戏背景音乐的唤醒度和愉悦度对生理唤醒和攻击性行为的影响[C]// 中国心理学会心理学教学工作委员会与人格心理学分会2022年学术年会.2022.[13]刘早香.JeremySoule:游戏配乐界的奇才[J].校园歌声,2022(3):76-76.[14]全伟华.网络游戏与背景音乐的融合[J].民营科技,2022(11):232-232.[15]卢小旭.游戏配乐制作谈:民族风格

       (一)[J].程序员:游戏创造,2022(9):82-83.[16]卢小旭.游戏配乐制作谈:民族风格

       (二)[J].程序员:游戏创造,2022(10):86-88.

第五篇:课程游戏化文献综述

       关于幼儿园课程游戏化的文献综述

       良

       陈鹤琴先生指出:“游戏是儿童生来喜欢的,儿童的生活可以说就是游戏。”诚然,游戏是最适合学前儿童的一种活动形式,是孩子们喜欢的活动。《指南》明确指出:幼儿园“以游戏为基本活动”,即提倡幼儿园课程游戏化。杜威指出:“游戏性是一种精神态度,游戏是这种态度的外部表现形式。”游戏性是指“幼儿在游戏中所表现出来的以主动性、独立性和创造性为特征的主体性素质(包括动机、情感、能力与态度等)。“《幼儿园教育指导纲要(试行)》(以下简称《纲要》)指出,“教育活动的组织应充分考虑到幼儿的学习特点和认识规律”,要“注重活动的综合性、趣味性、活动性,寓教育于生活、游戏之中”。因此,注重幼儿园课程的生活化和游戏化是全面贯彻《纲要》的需要。教育部2022 年12 月颁布实施的(以下简称《指南》)强调教育要自然地融入幼儿的生活,强调要以幼儿为本,让幼儿自由、自主、快乐地参与活动。也正如《指南》“说明”所述,“幼儿的学习是以直接经验为基础,在游戏和日常生活中进行的。”将教育自然地融入幼儿的生活,需要我们树立“以幼儿为本”的理念,在保证幼儿快乐生活的同时进行积极而适宜的教育引导,让幼儿在真实的生活体验中主动参与并创造生活,发展幼儿的自主性、主动性创造性以及解决问题的能力。

       围绕幼儿园课程游戏化的研究热点,我查阅了相关文章及杂志,并通过网络检索了相关文章,对他们的文章进行了梳理,将以前的文章归纳为以下几个方面:

       一、幼儿园课程游戏化的内涵

       《指南》中指出“以游戏为基本活动“,在朱海琳的《《纲要》与幼儿园课程生活化、游戏化研讨会纪要》中虞永平老师对课程游戏化做出了详尽的阐述,他说”幼儿园课程的生活化意味着生活不但是幼儿园课程的重要资源,还是幼儿园课程实施的重要途径。幼儿园课程的游戏化意味着游戏不只是教学的手段,还是课程的重要组成部分。游戏不只为教学服务,游戏有它自身存在的价值,教学也应为游戏服务。生活和游戏是幼儿园课程综合的重要途径。在王豫荣的《幼儿园课程生活化、游戏化的初步探索》中写道”游戏化幼儿园课程并不是要幼儿园课程都以游戏的方式表现出来,而是强调游戏精神在课程中的体现。”幼儿园游戏既是活动的内容,又是活动的途径”。吴蕾的《实现幼儿园课程游戏化的策略分析》中认为幼儿园课程游戏化的内涵是“促使幼儿园课程变得更生动,更具体,更具有吸引力,从而激发学习兴趣。”在虞永平老师的《课程课程游戏的意义和实施路径》中提出“课程化不是把幼儿园所有活动都改为游戏活动.而是在自由游戏保证的情况下.让游戏精神落实到一日生活的各个环节中去。”总而言之,在这几篇文章中认为幼儿园课程游戏化是教学的途径,又是课程的组成部分,对教学有积极的意义。

       二、幼儿园课程游戏化的在幼儿园的实施策略

       许多的文章都对这个方面进行了阐述,在王豫荣的《幼儿园课程生活化、游戏化的初步探索》中提出了“

       1、生活化的活动设计

       2、游戏化的幼儿园课程

       3、教师充分发挥自身感染力

       4、关注游戏对幼儿的发展价值”。在彭佩丹的《幼儿园课程游戏化的探析与实践》这篇文章中指出了探析途径“

       1、树立正确的课程游戏化观念

       2、准确定位教师角色

       3、注重幼儿的游戏性体验

       4、完善课程游戏的教学评价”。袁亚琴的《学前教育课程游戏化研究》中着重强调了教师应该如何做:“

       1、确定本园课程游戏化实践的计划方案

       2、落实课程游戏化研究中的教师的角色定位

       3、将教研活动与游戏化研究紧密结合4、体现课程游戏化与培养目标相结合5、定期交流总结游戏化研究的成果”并说出了实施中的注意点“博采众长,因地制宜,家校联动”。吴瑞传则提出了不一样的观点,从“游戏精神”入手,阐述了幼儿园课程游戏化变为可能的看法。虞永平老师的《课程课程游戏的意义和实施路径》说出幼儿园实现什么样的课程文化需要四点“

       1、幼儿园要鼓励游戏

       2、要服务游戏

       3、学会观察游戏

       4、合理指导游戏”在虞永平老师的这篇文章中特别强调了游戏化对于教师专业化的要求,这是其他文章中所没有的,指出“课程游戏化的关键在于教师,焦点在于幼儿”。还着重指出幼儿园要关注周围的资源,突出幼儿的主体作用,改变组织形式,钱小菊的文章中也有涉及这方面的内容。同时,吴瑞传认为,在幼儿园里,幼儿应该有专门的时间进行创造性游戏,教师要为其提供时间、空间、材料和帮助。还要利用游戏因素,注重幼儿的游戏性体验,使非游戏化的活动游戏化。总之,实施课程游戏化是幼儿园、教师、社会、儿童共同努力的结果,但是有些文章提出的要点过于宽泛,实践上有些困难。

       为了便宜幼儿园实施课程游戏化,还制定了实施课程游戏化的六个支架。

       三、幼儿园课程游戏化的意义

       钱小菊的《对幼儿园课程生活化、游戏化的思考》中写出了游戏化的影响:“

       1、生活化、游戏化的教程提高幼儿的认知能力

       2、生活化、游戏化的课程全面调动学生的感官,促进学生的全面发展

       3、激发学生的学习热情”。彭佩丹从大的方面阐述了游戏化的价值“

       1、符合幼儿课程价值转变的需求

       2、课程与游戏融合,两者相得益彰”。袁亚琴也说出了这个研究的积极意义:“

       1、适应了学前阶段幼儿的身心特点

       2、有利于打造更具趣味性的课程

       3、可以打造教育的特色品牌”。课程游戏化的意义对于幼儿的价值是很大的。也有利于教师提升自身的素养,对于学前教育这个大范围的意义特使极大的。

       经过整理,思考,课程化的内涵以及意义方面已将有了比较完全的阐述,但在实施途径中,方法还是过于大,不够细化,而且在实施过程中没有考虑到家长作为幼儿的第一教育者对课程游戏化有着什么样的看法,所以这方面还是值得研究的。参考文献:

       【1】《幼儿园教育指导纲要(试行)》 【2】《3——6岁儿童学习与发展指南》

       【3】《《纲要》与幼儿园课程生活化、游戏化研讨会纪要》——朱海琳 【4】《幼儿园课程生活化、游戏化的初步探索》——王豫荣 【5】《实现幼儿园课程游戏化的策略分析》——吴蕾 【6】《课程课程游戏的意义和实施路径》——虞永平【7】《幼儿园课程游戏化的探析与实践》——彭佩丹 【8】《学前教育课程游戏化研究》——袁亚琴

       【9】《对幼儿园课程生活化、游戏化的思考》——钱小菊 【10】倡导游戏精神 促使幼儿园课程游戏化——吴瑞传