当前位置:文档之家› 算24点小游戏

算24点小游戏

研究生课程论文课程名称C++面向对象程序设计授课学期2013 学年至2014 学年第一学期学院电子工程学院专业电子与通信学号姓名任课教师专题算24点小游戏交稿日期2014年01月10日成绩阅读教师签名日期广西师范大学研究生学院目录1 引言 (2)1.1 设计任务与要求 (2)1.2 设计目的 (2)1.3 C++面向对象语言简介 (2)2 C++课程设计原理及方案选择 (3)2.1 概述 (3)2.1.1 方案设计与论证 (3)2.2 二十四点游戏的原理 (4)2.2.1 主函数设计 (4)2.2.2 子函数的设计 (4)2.2.3 类体的设计 (5)3 程序流程及演示 (6)3.1 程序流程图,程序清单与调用关系 (6)3.2 程序 (7)3.3 运行结果 (9)4 结论 (10)1引言随着网络技术的发展,小游戏在网络发展如火如荼。

二十四点小游戏是一个不仅能放松认得神经而且益智的趣味小游戏。

对于21世纪的今天,作为一个社会工作者来说,面对日益剧烈的竞争,工作压力都是很大的,为了释放压力就需要一个很好的减压平台,那么网络上的小游戏首当其冲,24点小游戏受到了欢迎。

1.1设计任务与要求题目要求在输入4个数后,程序对这个4个数进行运算,若能计算出结果等于24,即输出运算过程。

目标是在输入四个数之后,先进行全排列,然后进行全运算,从而最终得到结果以输出。

1.2设计目的本次设计的目的就是在掌握c++编程语言和visual c++编译软件的基础上。

完成一个算24的小游戏程序设计,在系统提示下输入4个数后,程序对这4个数进行运算,若能计算出结果等于24,即输出运算过程。

程序设计目标很明确,在输入4个数之后,先进行全排列,然后进行全运算,重而得到最终结果输出。

1.3C++面向对象语言简介C++是一种使用非常广泛的计算机编程语言。

C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言。

它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。

其编译器比目前其他计算机语言的编译技术更复杂。

类是C++中十分重要的概念,它是实现面向对象程序设计的基础。

类是所有面向对象的语言的共同特征,所有面向对象的语言都提供了这种类型。

一个有一定规模的C++程序是由许多类所构成的。

C++支持面向过程的程序设计,也支持基于对象的程序设计,又支持面向对象的程序设计。

以后我们将介绍基于对象的程序设计。

包括类和对象的概念、类的机制和声明、类对象的定义与使用等。

这是面向对象的程序设计的基础。

基于对象就是基于类。

与面向过程的程序不同,基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的。

在此基础上利用了继承机制和多态性,就成为面向对象的程序设计(有时不细分基于对象程序设计和面向对象程序设计,而把二者合称为面向对象的程序设计)。

基于对象程序设计所面对的是一个个对象。

所有的数据分别属于不同的对象。

在面向过程的结构化程序设计中,人们常使用这样的公式来表述程序:程序=算法+数据结构算法和数据结构两者是互相独立、分开设计的,面向过程的程序设计是以算法为主体的。

在实践中人们逐渐认识到算法和数据结构是互相紧密联系不可分的,应当以一个算法对应一组数据结构,而不宜提倡一个算法对应多组数据结构,以及一组数据结构对应多个算法。

基于对象和面向对象程序设计就是把一个算法和一组数据结构封装在一个对象中。

因此,就形成了新的观念:对象=算法+数据结构程序= (对象+对象+对象+…) + 消息或:程序= 对象s + 消息“对象s”表示多个对象。

消息的作用就是对对象的控制。

程序设计的关键是设计好每一个对象,及确定向这些对象发出的命令,使各对象完成相应操作。

2 C++课程设计原理及方案选择2.1概述给定4个整数,其中每个数字只能使用一次;任意使用+ - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24点的游戏。

这方面的程序很多,一般都是穷举求解。

本文介绍一种算24点的程序算法,并给出两个具体的算24点的程序。

2.1.1方案设计与论证关于这个计算24游戏的设计,首先我将题目看成两部分,一部分为运算数,一部分为运算符。

首先由于有四个数,则只有三个运算符,由于涉及了括号,个人认为用穷举法才能全面地进行说有的运算,我们可以将运算符和括号这部分归为主运算部分,在这部分中,运算数的位置固定,但是运算符和括号的位置会改变,而且程序主要就是在这部分运算,直接将数值引入,然后计算判断是否等于24,若等于24,则输出数值和这些运算符、括号的位置构成的运算式;然而,这是不够全面的,因为还要考虑运算数的排列位置,于是有了第二部分,运算数的位置全排列,同样是采用穷举法,将运算数全排列,在每个排列后面调用主运算的方法,从而达到全面不遗漏地计算。

在MAIN函数中,我们仅需要记录输入的4个数字,然后将数值用在全排列函数中即可。

整个程序的设计看起来很繁琐,但在运用上很简单,能简明扼要地表现出来。

2.2二十四点游戏的原理程序设计主要有三个部分设计,主函数,子函数,以及类的设计。

2.2.1主函数设计在上面课题分析与方案设计中简单阐述了主函数的设计与功能,用来实现数据的输入和输入数据的全排列,实现输入数据用c++输入函数cin来实现,即:cin>>a>>b>>c>>d;输入已经定义的四个数a,b,c,d。

主函数的第二个作用实现输入数据的全排列,分析4个数据的组合可以发现,a,b,c,d四个数每左移一位,当左移4次时回到原位a,b,c,d即实现了全排列,移位过程如下:a b c d —b c d a —c d a b —d a b c —a b c d然后对每种排列调用子函数,在子函数中实现每种排列的运算。

2.2.2子函数的设计本程序中子函数主要实现的功能是每种排列的全运算,因为四个数需要计算三次,即:a_b_c_d,每一个下划线都有加减乘除四种运算符,即有4*4*4总运算形式。

子函数中需要解决的就是实现4*4*4全运算的算法。

定义三个运算子f,g,h。

分析可以发现计算过程f,g,h都包含加减乘除四种运算,当f中取加减乘除中任意一个运算符时,g中都要依次执行加减乘除,g中每一次运行时,h中都要执行加减乘除,这就是4*4*4的计算过程,很明显这个可以用类似于定义多维数组的方法来解决,即用三个for循环的嵌套来实现。

子函数执行全运算时,把能算出24的运算式输出,并返回一个值告诉主函数,运行结果。

2.2.3类体的设计在类体中主要实现的就是三个运算子以及运算符的处理,定义一个类体定义一个字符型共有数据才存储运算符,还有构造函数用来实现对共有数据的初始化,以及用operator函数对()符的重载,来简化后面程序的计算。

3 程序流程及演示3.1 程序流程图,程序清单与调用关系开始输入4个数赋值进行排列方法在排列方法中运算判断运算是否等于24 YES结束输出运算式并返回“1”给主函数主函数Return 0返回“0”给主函数并输出“can not get 24!”NO3.2程序#include<stdio.h>#include<iostream>using namespace std;int number(int a,int b,int c,int d );char m[]={'+','-','*','/'};//运算符int main(){// int a,b,c,d,e,i,n;//定义变量,n没有初始化,应定义为0改为如下int a,b,c,d,e,i,n=0;//定义变量,n初始化为0cout<<"please input 4 numbers(1~9):"<<endl;//输出提示信息。

cin>>a>>b>>c>>d;//输入四个数for(i=0;i<4;i++){//轮换四次,所有可能的运算都包括在内了。

if(i==0)//第一次{//不交换数值。

if(number(a,b,c,d))n++;//成功计数加1}else //否则交换数值{ e=a;a=b;b=c;c=d;d=e;if(number(a,b,c,d))n++;}}if(!n)//没有一次成功printf("can not get 24!\n");//显示不能构成24点return 0;}//运算子类class sum{public:sum():c('+'){};double operator() (double x,double y);char c;//运算符};//////////////////////////////////////////////////计算函数的实现// C++的函数运算符operator()可以带任意多个参数,这里带两个参数。

double sum::operator() (double x,double y){switch(c){case '+':return x+y;case '-':return x-y;case '*':return x*y;case '/':if(y==0) return 0xFFFFFFFF;return x/y;default:return 0;}}sum f,g,h;//定义三个算子,四个数用完,只要计算三次。

int number(int a,int b,int c,int d ){(double)a;(double)b;(double)c;(double)d;int t; t=0;for(int i=0;i<4;i++){f.c=m[i]; //算子f遍历+-*/:for(int j=0;j<4;j++){g.c=m[j];//算子f遍历+-*/:for(int k=0;k<4;k++){h.c=m[k];//算子f遍历+-*/:if ((int)h(g(f(a,b),c),d)==24) // ((a,b),c),d计算顺序,成功t加1{ cout<<"(("<<a<<f.c<<b<<")"<<g.c<<c<<")"<<h.c<<d<<"=24"<<endl;++t;} if ((int)g(f(a,b),h(c,d))==24) // ((a,b) (c,d))计算顺序,成功t加1{ cout<<"("<<a<<f.c<<b<<")"<<g.c<<"("<<c<<h.c<<d<<")=24"<<endl;++t;} if ((int)h(f(a,g(b,c)),d)==24) // ((a,(b,c)),d 计算顺序,成功t加1{ cout<<"("<<a<<f.c<<"("<<b<<g.c<<c<<"))"<<h.c<<d<<"=24"<<endl;++t;} if ((int)f(a,h(g(b,c),d))==24) // a,((b,c),d)计算顺序,成功t加1{ cout<<a<<f.c<<"(("<<b<<g.c<<c<<")"<<h.c<<d<<")=24"<<endl;++t;}}}} if(t)return 1;//t!=0即t>0 至少成功一次elsereturn 0;;//t==0即一次也没有成功。

相关主题