《面向对象》实训2------智力猜字游戏
(学号尾号为单数的完成)
游戏规则简介:
由计算机在0-9,这10个数字中,选取4个数字组成序列,数字不能重复。由玩家来猜测这四个数字所在的位置并输入,如果位置和数字都正确,则X+1,如果仅仅是数字正确,位置不正确,则Y+1。玩家根据X、Y的值进行分析,再次输入数字,系统根据玩家输入的数字再次给出XY的值。玩家再次根据XY的值进行猜测,直到把四个数字的位置和数字都猜对。即X=4,Y=0。游戏结束。
游戏运行演示界面如下:
系统功能分析
本系统由以下几个功能模块(方法)构成:
显示模块(方法):显示指定(已知)数组中的元素。
校验模块(方法):验证指定(已知)数组的合法性,数组中的数据是否有重复?是否有超出0-9范围的数据?
选号模块(方法):将输入的整数存入数组a1,并将a1作为本模块(方法)的结果。
随机数产生模块(方法):产生随机数存入数组b1,并将b1作为本模块(方法)的结果。
比对模块(方法):将选号模块得到的数组a1与随机数产生模块得到的数组b1进行比对,看有多少个数组元素是相同的,如果元素值相同且位置也相同,则X+1,否则Y+1
实验目的:掌握方法(函数)的定义、调用、嵌套、递归
实验要求:各个子功能模块(方法)独立实现,并能够独立测试。
主要知识点:方法的定义、调用。
数组的定义、使用,见下列红色内容,务必看完红色内容再开始实验,并在实验课后将下列红色部分内容抄至课堂练习本上。声明数组,然后创建数组对象的语法格式如下:
类型[]数组名;数组名=new类型[元素个数];//分三个步骤
或类型[]数组名=new类型[元素个数];数组名={初值表};//分两个步骤或类型[]数组名={初值表};//分一个步骤
例如:创建存放6个整数的整型数组a,并将1,2,3,4,5,6,几个整数放入数组a中。
int[]a;a=new[6];a={1,2,3,4,5,6};//分三个步骤
或int[]a=newint[6];a={1,2,3,4,5,6};//分两个步骤
或int[]a={1,2,3,4,5,6};//分一个步骤
数组长度为:数组名.length
例如已知数组int[]a={4,5,3,1,9,8};
则a.length为6,即数组有6个元素,数组的长度为6
模块1:显示模块(方法)
模块功能:
显示指定(已知)数组中的信息。定义一个方法display,该方法的功能是将指定(已知)的数组中所有元素,逐个输出。相关的知识点:方法的定义(见PPT或上课笔记)、数组的使用、for循环的使用分析:
方法头:方法的访问修饰符为static,该方法只是需要显示数组的元素,不需要任何结果,因此不需要返回值,即返回值类型为void,方法名称display,该方法需要显示的是指定(已知)的数组信息,即必须要知道显示的数组。因此方法参数为int[]a
方法体:
1.先使用console.writeline()语句,输出,号码为:
2.使用for循环,将已知数组a的各个元素取出,将其输出。
3.使用console.writeline()语句,换行
模块1(方法)的测试:
在完成了方法display的基础上,在main()函数中,定义一个数组int[]ceshi={9,8,7,6,5,4};
然后调用display方法,将数组ceshi的元素输出。
测试结果如图:
测试1,当ceshi={9,8,7,6,5,4}
时,输出
测试完成后,将mian()函数中的测试语句删除。
模块2,校验模块(方法)
模块功能:验证指定(已知)数组的合法性,数组中的数据是否有重复?是否有超出0-9范围的数据?如果数组合法,则返回true,否则返回false
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:已知数组a,inti=0;
Result=true;
i
是
i++取出数组中第i个元素否
是元素值是否合
法
否
Result=flase;
返回result值
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是数组是否合法,合法则返回true,不合法则返回false,那么返回值的类型应为???;方法名称check(也可以自拟方法名);该方法是验证指定(已知)数组的合法性,即必须要知道验证的数组。因此方法参数为???
方法体:
1.先定义一个bool类型的临时变量result=true;//默认为结果合法
2.使用双重嵌套for循环,第一层for循环用于取出已知数组a的某个元素a[i],第二层for循环用于取出数组的另一个元素a[j],比较两个元素,是否相同,如果相同,则证明数组中存在重复的数据,那么resule=false,说明该数组不合法。同时验证数组的数据范围是否在0-9范围内,若不在此范围内,则resule=false
For循环的参考代码如下:
3.在完成所有循环后,将result作为本方法的结果返回。
模块2(方法)的测试:
1.在完成了check方法的基础上,在main()函数中,定义一个数组int[]ceshi={9,0,7,6,5,4};
2.定义一个判断变量booldecide,并调用check方法验证数组ceshi的合法性,并将验证结果赋值给decide。即decide=check(ceshi);
3.使用if语句,如果decide为true,则使用console.writeline()语句,输出“合法”
如果decide为false,则使用console.writeline()语句,输出“不合法”
修改数组ceshi的值为{9,8,7,6,5,5};和{9,8,7,6,5,10},分别测试其合法性
测试结果如图:
测试1,当ceshi={9,8,7,6,5,4}时
,输出
测试2,当ceshi={9,8,7,6,5,5}或{9,8,7,6,5,10}
时,输出
测试完成后,将mian()函数中的测试语句删除。
模块3,选号模块(方法)
模块功能:将输入的整数存入数组a1,并将a1作为本模块的结果。
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:开始
4的数组a,
Int[]a=newint[4];i=0;
i
否
是
i++提示输入数据
数据存入数组中
否
调用check方法验
证数组是否合法
是
return数组ai=0;
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放整数的数组,那么返回值的类型应为???;方法名称select_number(也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为4的整型数组a。int[]a=newint[4];
2.使用while循环,如果输入数据不合法,即要求重复输入,如果合法,则return数组a(在循环语句中,return除了可以返回结果以外,还具有break的作用,即可用于跳出循环)
3.使用for循环,提示用户从键盘输入数据,并将输入的数据存放至数组a中。
4.调用模块2,校验模块(方法)check,校验数组a。如果校验结果为false,说明数组a中的元素不合法,那么要求用户重新输入。
5.重复步骤2,3,直至校验结果为true。将数组a作为本方法的结果,返回。
部分代码参考如下:
模块3(方法)的测试:
在完成了select_number方法的基础上,在main()函数中,定义一个数组int[]ceshi;
调用select_number方法,并将他的结果,赋值给数组ceshi;
调用display方法(模块1的方法),将数组ceshi的信息输出。
测试1:当输入1,2,3,4,时输出。
测试2,当输入0,1,1,5时输出
测试3,当输入1,7,6,11,时输出
测试完成后,将mian()
函数中的测试语句删除。
模块4,随机数产生模块(方法)
模块功能:产生随机数存入数组b1,并将b1作为本模块的结果。
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:开始
创建元素个数为4的数组a,
Int[]a=newint[4];i=0;
i
否
是
i++产生一个随机数
将随机数存入数组中
否
调用check方法验
证数组是否合法
是
return数组ai=0;
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放随机整数的数组,那么返回值的类型应为???;方法名称random_number(也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为4的整型数组a
2.创建一个随机种子备用。Randombb=newRandom();
3.使用while循环,如果产生的随机数不合法,即重复产生随机数,如果合法,则return数组a(在循环语句中,return除了可以返回结果以外,还具有break的作用,即可用于跳出循环)
4.使用for循环,使用随机种子bb的next(0,10)方法,产生的介于0-9之间的随机数逐个存放至数组a中。
5.调用模块2,校验模块(方法)check,校验数组a,如果校验结果为false,说明数组a中的元素不合法,那么重新产生随机数。
6.重复步骤2,3,直至校验结果为true。将数组a作为本方法的结果,返回。
步骤2至步骤6的代码参考如下:
模块4(方法)的测试:
在完成了random_number方法的基础上,在main()函数中,定义一个数组int[]ceshi;
调用random_number方法,并将他的结果,赋值给数组ceshi;
调用display方法(模块1的方法),将数组ceshi的信息输出。
测试界面1
:
测试界面2
:
注意:因为产生的是随机数数组,因此每次的测试结果是不一样的。
测试完成后,将mian()函数中的测试语句删除。
模块5,比对模块(方法)
模块功能:将选号模块得到的数组a1与随机数产生模块得到的数组b1进行比对,看有多少个数组元素是相同的,元素相同,再看他们的位置是否相同。
相关的知识点:方法的定义(见PPT或上课笔记)、switch多分支选择语句、for循环嵌套、数组基本用法分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是使用console.writeline()语句输出中奖信息,那么返回值的类型应为???;方法名称open_lottery(也可以自拟方法名);该方法内部产生数组,不需要参数。因此方法的参数应为???
方法体:
1.调用random_number方法,生成四个随机数并存在数组a1中
2.定义若干个整型变量x,y,num,并初始化,设置为0
3.使用while循环,当X!=4时,继续循环。当X==4时,结束循环
4.在每次循环开始时,将X,Y归零。调用select_number方法,要求玩家从键盘输入四个数字并存入数组b1中,使num++。
5.使用双层for循环嵌套。比较a1和b1中的元素,如果元素相同且位置也相同,则x++;如果只是数字相同,位置不同,则y++
6.输出xy的值。如果x==4,则提前跳出循环,并提示猜对了,游戏结束。
模块5(方法)的测试:
使用display方法,人为的显示出系统随机生成的四个数字,对着四个数字进行输入,看不同的输入下,输出的情况。
参考答案:
方法:staticvoiddisplay(int[]a){
Console.WriteLine("号码为:");for(inti=0;i
{
Console.Write("{0}",a[i]);Console.Write("");}
}staticboolcheck(int[]a)
{boolresult=true;for(inti=0;i
{for(intj=i+1;j
{
if(a[i]==a[j])
returnfalse;}
if(a[i]9)
returnfalse;
}
returntrue;
}
staticint[]selectnumber(){
int[]a=newint[4];
11j++)
while(true)
{Console.WriteLine("请输入四个数字,用空格分开:
");strings1=Console.ReadLine();string[]b=s1.Split('');for(inti=0;i
}
if(check(a))
returna;elseConsole.WriteLine("输入不合法,请重新输入!
");}}
staticint[]randomnumber(){
Randomr1=newRandom();
int[]a1=newint[4];
while(true)
12
{for(inti=0;i
a1[i]=r1.Next(0,10);
}
if(check(a1))
break;}
Console.WriteLine("随机数已经生成!returna1;voidopenlottery()
int[]a1;int[]a2;
a1=randomnumber();intx=0,y=0,num=0;display(a1);
while(x!=4)
{
a2=selectnumber();
13);"}static{
num++;x=0;y=0;for(inti=0;i
{for(intj=0;j
if(a1[i]==a2[j]){
if(i==j)x++;elsey++;}
if(x==4)break;
}}
Console.WriteLine("x={0},y={1}",
if(x==4)
14x,y);
{Console.WriteLine("恭喜你,猜对了!游戏结束!
猜了{0}次!",num);
break;}
if(num==10){
Console.WriteLine("猜了十次都不对,游戏结
束!");
break;}
}
}主函数调用:openlottery();
Console.ReadLine();
15
《面向对象》实训2------智力猜字游戏
(学号尾号为单数的完成)
游戏规则简介:
由计算机在0-9,这10个数字中,选取4个数字组成序列,数字不能重复。由玩家来猜测这四个数字所在的位置并输入,如果位置和数字都正确,则X+1,如果仅仅是数字正确,位置不正确,则Y+1。玩家根据X、Y的值进行分析,再次输入数字,系统根据玩家输入的数字再次给出XY的值。玩家再次根据XY的值进行猜测,直到把四个数字的位置和数字都猜对。即X=4,Y=0。游戏结束。
游戏运行演示界面如下:
系统功能分析
本系统由以下几个功能模块(方法)构成:
显示模块(方法):显示指定(已知)数组中的元素。
校验模块(方法):验证指定(已知)数组的合法性,数组中的数据是否有重复?是否有超出0-9范围的数据?
选号模块(方法):将输入的整数存入数组a1,并将a1作为本模块(方法)的结果。
随机数产生模块(方法):产生随机数存入数组b1,并将b1作为本模块(方法)的结果。
比对模块(方法):将选号模块得到的数组a1与随机数产生模块得到的数组b1进行比对,看有多少个数组元素是相同的,如果元素值相同且位置也相同,则X+1,否则Y+1
实验目的:掌握方法(函数)的定义、调用、嵌套、递归
实验要求:各个子功能模块(方法)独立实现,并能够独立测试。
主要知识点:方法的定义、调用。
数组的定义、使用,见下列红色内容,务必看完红色内容再开始实验,并在实验课后将下列红色部分内容抄至课堂练习本上。声明数组,然后创建数组对象的语法格式如下:
类型[]数组名;数组名=new类型[元素个数];//分三个步骤
或类型[]数组名=new类型[元素个数];数组名={初值表};//分两个步骤或类型[]数组名={初值表};//分一个步骤
例如:创建存放6个整数的整型数组a,并将1,2,3,4,5,6,几个整数放入数组a中。
int[]a;a=new[6];a={1,2,3,4,5,6};//分三个步骤
或int[]a=newint[6];a={1,2,3,4,5,6};//分两个步骤
或int[]a={1,2,3,4,5,6};//分一个步骤
数组长度为:数组名.length
例如已知数组int[]a={4,5,3,1,9,8};
则a.length为6,即数组有6个元素,数组的长度为6
模块1:显示模块(方法)
模块功能:
显示指定(已知)数组中的信息。定义一个方法display,该方法的功能是将指定(已知)的数组中所有元素,逐个输出。相关的知识点:方法的定义(见PPT或上课笔记)、数组的使用、for循环的使用分析:
方法头:方法的访问修饰符为static,该方法只是需要显示数组的元素,不需要任何结果,因此不需要返回值,即返回值类型为void,方法名称display,该方法需要显示的是指定(已知)的数组信息,即必须要知道显示的数组。因此方法参数为int[]a
方法体:
1.先使用console.writeline()语句,输出,号码为:
2.使用for循环,将已知数组a的各个元素取出,将其输出。
3.使用console.writeline()语句,换行
模块1(方法)的测试:
在完成了方法display的基础上,在main()函数中,定义一个数组int[]ceshi={9,8,7,6,5,4};
然后调用display方法,将数组ceshi的元素输出。
测试结果如图:
测试1,当ceshi={9,8,7,6,5,4}
时,输出
测试完成后,将mian()函数中的测试语句删除。
模块2,校验模块(方法)
模块功能:验证指定(已知)数组的合法性,数组中的数据是否有重复?是否有超出0-9范围的数据?如果数组合法,则返回true,否则返回false
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:已知数组a,inti=0;
Result=true;
i
是
i++取出数组中第i个元素否
是元素值是否合
法
否
Result=flase;
返回result值
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是数组是否合法,合法则返回true,不合法则返回false,那么返回值的类型应为???;方法名称check(也可以自拟方法名);该方法是验证指定(已知)数组的合法性,即必须要知道验证的数组。因此方法参数为???
方法体:
1.先定义一个bool类型的临时变量result=true;//默认为结果合法
2.使用双重嵌套for循环,第一层for循环用于取出已知数组a的某个元素a[i],第二层for循环用于取出数组的另一个元素a[j],比较两个元素,是否相同,如果相同,则证明数组中存在重复的数据,那么resule=false,说明该数组不合法。同时验证数组的数据范围是否在0-9范围内,若不在此范围内,则resule=false
For循环的参考代码如下:
3.在完成所有循环后,将result作为本方法的结果返回。
模块2(方法)的测试:
1.在完成了check方法的基础上,在main()函数中,定义一个数组int[]ceshi={9,0,7,6,5,4};
2.定义一个判断变量booldecide,并调用check方法验证数组ceshi的合法性,并将验证结果赋值给decide。即decide=check(ceshi);
3.使用if语句,如果decide为true,则使用console.writeline()语句,输出“合法”
如果decide为false,则使用console.writeline()语句,输出“不合法”
修改数组ceshi的值为{9,8,7,6,5,5};和{9,8,7,6,5,10},分别测试其合法性
测试结果如图:
测试1,当ceshi={9,8,7,6,5,4}时
,输出
测试2,当ceshi={9,8,7,6,5,5}或{9,8,7,6,5,10}
时,输出
测试完成后,将mian()函数中的测试语句删除。
模块3,选号模块(方法)
模块功能:将输入的整数存入数组a1,并将a1作为本模块的结果。
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:开始
4的数组a,
Int[]a=newint[4];i=0;
i
否
是
i++提示输入数据
数据存入数组中
否
调用check方法验
证数组是否合法
是
return数组ai=0;
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放整数的数组,那么返回值的类型应为???;方法名称select_number(也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为4的整型数组a。int[]a=newint[4];
2.使用while循环,如果输入数据不合法,即要求重复输入,如果合法,则return数组a(在循环语句中,return除了可以返回结果以外,还具有break的作用,即可用于跳出循环)
3.使用for循环,提示用户从键盘输入数据,并将输入的数据存放至数组a中。
4.调用模块2,校验模块(方法)check,校验数组a。如果校验结果为false,说明数组a中的元素不合法,那么要求用户重新输入。
5.重复步骤2,3,直至校验结果为true。将数组a作为本方法的结果,返回。
部分代码参考如下:
模块3(方法)的测试:
在完成了select_number方法的基础上,在main()函数中,定义一个数组int[]ceshi;
调用select_number方法,并将他的结果,赋值给数组ceshi;
调用display方法(模块1的方法),将数组ceshi的信息输出。
测试1:当输入1,2,3,4,时输出。
测试2,当输入0,1,1,5时输出
测试3,当输入1,7,6,11,时输出
测试完成后,将mian()
函数中的测试语句删除。
模块4,随机数产生模块(方法)
模块功能:产生随机数存入数组b1,并将b1作为本模块的结果。
相关的知识点:方法的定义(见PPT或上课笔记)
方法的大概流程如图:开始
创建元素个数为4的数组a,
Int[]a=newint[4];i=0;
i
否
是
i++产生一个随机数
将随机数存入数组中
否
调用check方法验
证数组是否合法
是
return数组ai=0;
分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是得到一个存放随机整数的数组,那么返回值的类型应为???;方法名称random_number(也可以自拟方法名);该方法用于创建一个数组,不需要已知条件,那么方法的参数应为???
方法体:
1.创建一个元素个数为4的整型数组a
2.创建一个随机种子备用。Randombb=newRandom();
3.使用while循环,如果产生的随机数不合法,即重复产生随机数,如果合法,则return数组a(在循环语句中,return除了可以返回结果以外,还具有break的作用,即可用于跳出循环)
4.使用for循环,使用随机种子bb的next(0,10)方法,产生的介于0-9之间的随机数逐个存放至数组a中。
5.调用模块2,校验模块(方法)check,校验数组a,如果校验结果为false,说明数组a中的元素不合法,那么重新产生随机数。
6.重复步骤2,3,直至校验结果为true。将数组a作为本方法的结果,返回。
步骤2至步骤6的代码参考如下:
模块4(方法)的测试:
在完成了random_number方法的基础上,在main()函数中,定义一个数组int[]ceshi;
调用random_number方法,并将他的结果,赋值给数组ceshi;
调用display方法(模块1的方法),将数组ceshi的信息输出。
测试界面1
:
测试界面2
:
注意:因为产生的是随机数数组,因此每次的测试结果是不一样的。
测试完成后,将mian()函数中的测试语句删除。
模块5,比对模块(方法)
模块功能:将选号模块得到的数组a1与随机数产生模块得到的数组b1进行比对,看有多少个数组元素是相同的,元素相同,再看他们的位置是否相同。
相关的知识点:方法的定义(见PPT或上课笔记)、switch多分支选择语句、for循环嵌套、数组基本用法分析:(???号部分的内容,留给大家自己思考)
方法头:访问修饰符应为???;该方法的结果是使用console.writeline()语句输出中奖信息,那么返回值的类型应为???;方法名称open_lottery(也可以自拟方法名);该方法内部产生数组,不需要参数。因此方法的参数应为???
方法体:
1.调用random_number方法,生成四个随机数并存在数组a1中
2.定义若干个整型变量x,y,num,并初始化,设置为0
3.使用while循环,当X!=4时,继续循环。当X==4时,结束循环
4.在每次循环开始时,将X,Y归零。调用select_number方法,要求玩家从键盘输入四个数字并存入数组b1中,使num++。
5.使用双层for循环嵌套。比较a1和b1中的元素,如果元素相同且位置也相同,则x++;如果只是数字相同,位置不同,则y++
6.输出xy的值。如果x==4,则提前跳出循环,并提示猜对了,游戏结束。
模块5(方法)的测试:
使用display方法,人为的显示出系统随机生成的四个数字,对着四个数字进行输入,看不同的输入下,输出的情况。
参考答案:
方法:staticvoiddisplay(int[]a){
Console.WriteLine("号码为:");for(inti=0;i
{
Console.Write("{0}",a[i]);Console.Write("");}
}staticboolcheck(int[]a)
{boolresult=true;for(inti=0;i
{for(intj=i+1;j
{
if(a[i]==a[j])
returnfalse;}
if(a[i]9)
returnfalse;
}
returntrue;
}
staticint[]selectnumber(){
int[]a=newint[4];
11j++)
while(true)
{Console.WriteLine("请输入四个数字,用空格分开:
");strings1=Console.ReadLine();string[]b=s1.Split('');for(inti=0;i
}
if(check(a))
returna;elseConsole.WriteLine("输入不合法,请重新输入!
");}}
staticint[]randomnumber(){
Randomr1=newRandom();
int[]a1=newint[4];
while(true)
12
{for(inti=0;i
a1[i]=r1.Next(0,10);
}
if(check(a1))
break;}
Console.WriteLine("随机数已经生成!returna1;voidopenlottery()
int[]a1;int[]a2;
a1=randomnumber();intx=0,y=0,num=0;display(a1);
while(x!=4)
{
a2=selectnumber();
13);"}static{
num++;x=0;y=0;for(inti=0;i
{for(intj=0;j
if(a1[i]==a2[j]){
if(i==j)x++;elsey++;}
if(x==4)break;
}}
Console.WriteLine("x={0},y={1}",
if(x==4)
14x,y);
{Console.WriteLine("恭喜你,猜对了!游戏结束!
猜了{0}次!",num);
break;}
if(num==10){
Console.WriteLine("猜了十次都不对,游戏结
束!");
break;}
}
}主函数调用:openlottery();
Console.ReadLine();
15