一、问题分析和任务定义
1.题目:
纸牌游戏:
编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;。。。再依次5的倍数的牌翻一次,6的,7的直到 以52为基数的 翻过,输出:这时正面向上的牌有哪些?
2.要求和任务:
① 该题目的要求如下:
(1)将52张牌编号。
(2)从2开始,依次作为基数对基数的倍数的牌进行翻转,直到以52为基数的翻转。
(3)最后输出正面向上的牌。
② 基本任务为:
(1)按照要求翻转纸牌。
(1)按照要求翻转纸牌。
(2)输出最后正面向上的纸牌的编号。
3.原始数据的输入及输出格式:
原始数据要求输入纸牌的基础编号,编号的输入为整型。输出的是经过规律翻转后正面向上的纸牌的编号。
输入的数据信息如下:
纸牌:1、2、3……、51、52。
纸牌:1、2、3……、51、52。
问题直观分析表:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | …… | |
1 | |||||||||||||
2 | √ | √ | √ | √ | √ | √ | |||||||
3 | √ | √ | √ | √ | |||||||||
4 | √ | √ | √ | ||||||||||
5 | √ | √ | |||||||||||
6 | √ | √ | |||||||||||
7 | √ | ||||||||||||
8 | √ | ||||||||||||
9 | √ | ||||||||||||
10 | √ | ||||||||||||
11 | √ | ||||||||||||
12 | √ | ||||||||||||
…… | …… | ||||||||||||
简单的java游戏代码 |
(注:图中“√”表示翻转一次。)
二.数据结构的选择和概要设计
1.数据结构
按照题目要求,整个主体包括一个嵌套的循环,外循环控制从2开始每张纸牌都作为基数进行翻牌,内循环控制对所有纸牌进行判断,如果是当前循环中基数的倍数,则对其进行翻转操作。具体代码如下:
for(i=2;i<=52;i++)
{
for(j=1;j<=52;j++)
{
if(j%i==0)
data[j-1]=data[j-1]*Flag;
}
}
2.概要设计
按照题目的要求,首先,应对52张牌进行编号并且保存它们的编号信息,编号的类型为整型,而对于这样固定的数据,使用整型数组是最好的,因此,我们需要在程序的开始定义一共整型的数组,同时,为了方便对翻转过程的记录,在定义记录编号信息的同时,定义一个与之相对应的标记数组,数组类型为整型。该程序的核心为一个嵌套的循环,所以定义两个变量i,j作为循环条件。
接着开始对变量进行初始化,首先是编号信息数组,使用for循环对数组进行1到52的赋值,代表52张纸牌,然后对标记数组赋值,将数组内的所有的值初始化为零,方便在接下来的循环中统计每张牌的翻牌数。数据初始化结束后,开始按照要求对纸牌进行翻转,在嵌套循环中,定义了一个全局变量Flag,值为-1,负数定义为向下,正数定义为向上,这
样,翻转一次,即乘以Flag,同时,符合翻转条件时,标记数组相应的编号的纸牌翻牌次数+1。
循环结束后,编号数组中的数据已经更新,因此对数组进行扫描,大于零的即为正面向上的纸牌,输出其编号即可,同时,输出标记数组中的值,显示每张牌的翻牌记录,方便观察或者寻规律。到此,整个题目结束。
三.详细设计和编码
1.定义全局变量:
作为判断纸牌是否向上的依据,我们需要定义一个全局变量Flag=-1,在循环中对所有纸牌进行操作。
2.主要程序代码与分析如下:
static int Flag = -1(考虑到最后要判断哪些纸牌是正面向上的,所以必须要有一共判断条件,因此定义一个全局变量作为正反面的判断条件。)
public static void main(String[] args) {
int i,j,choice,num;//建立两个数组,一个存放52张牌的编号,另外一个存放相应编号的纸牌的翻牌记录。
int[] data = new int[52];
int[] flag = new int[52];
String n,m;
System.out.println("温馨提示:欢迎进入纸牌游戏程序!");
for(i=1;i<=52;i++)
{
data[i-1]=i;//录入52张牌的编号。
flag[i-1]=0;//将相应编号纸牌的翻牌数初始化为0。
}
for(i=2;i<=52;i++)//外循环,基数循环。
{
for(j=1;j<=52;j++)//内循环,基数倍数条件判断。
{
if(j%i==0)
{
data[j-1]=data[j-1]*Flag;//将翻转后的结果更新data中的数据。
flag[j-1]++;//翻牌一次,即记入flag数组中。
}
}
}
System.out.printf("\t最后所有正面向上的牌有:\n");
for(i=0;i<52;i++)
{
if(data[i]>0)//所有大于0的数即为正面向上的纸牌。
System.out.printf(" 第%d张牌 ",i+1);
}
System.out.printf("\n");以上为程序主要代码的分析。
在程序中,主要还包括功能界面,如下:
System.out.printf("\t-----------------------------------------------------\n");
System.out.printf("\t-----------------------------------------------------\n");
System.out.printf("\t------- 欢迎进入纸牌游戏 --------\n");
System.out.printf("\t------- 1.查看题目 --------\n");
System.out.printf("\t------- 2.查看所有纸牌的翻牌次数 --------\n");
System.out.printf("\t------- 3.查看指定编号纸牌翻牌记录 --------\n");
System.out.printf("\t------- 4.查看最终正面向上的纸牌编号 --------\n");
System.out.printf("\t------- 5.制作人信息 --------\n");
System.out.printf("\t------- 0.按0键结束 --------\n");
System.out.printf("\t-----------------------------------------------------\n");
System.out.printf("\t-----------------------------------------------------\n");同时,整个功能实现由do-while语句和switch语句组合而成,do-while语句可以保证界面最少运行一次,switch语句保证每个功能独立实现,通过choice的输入来进入不同的功能,同时在每个小的独立功能内,我都添加了独立判断是否回到主菜单的语句,如下:
System.out.printf("是否回到主菜单?(Y/N):");
n = sc.next();
if(n.equals("Y"))break;
else if(n.equals("N"))
choice=0;
else System.out.printf("******* (提示:输入错误,默认为继续。)******** \n")整个do-while语句的结束条件为:choice=0,所以如果用户输入为N,则直接将0赋值给choice,则符合循环结束的条件,则直接结束程序,如果输入为Y,则break,继续循环,输入错误,没有对choice任何的赋值操作,即不能满足结束条件,则无论输入什么都默认为继续,break后继续循环。由于程序默认的将回车操作通过getchar()赋值给n,导致不能正常的实现下面的判断,而直接显示为输入错误,所以加入两个n=getchar()语句,保证第二句能够正确的实现功能,让用户自行输入条件,进行下一步的操作。在整个程序中,存在着大量的输入判断条件,如下:
if(num<1&&num>52)
System.out.printf("\t输入错误!\n");
这两句代码就是对输入的num值进行判断,由于纸牌序号为1-52,所以不在这个范围的值都为错误值,需要有一个错误信息的反馈,所以需要对输入的信息进行判断,然后通过不同的值对数据进行相应的操作,这对于程序的正确运行,有着至关重要的作用。
四.上机调试过程:
该程序任务相对比较简单,思路较明确。
在一开始编写代码的时候,在嵌套循环中,外循环for的条件(i=2;i<=52;i++),写成(i=1;i<=52;i++),导致对每个纸牌的翻转都多判断了一次,按照一开始定义的大于零的编号数为正面向上的条件,最后输出的结果正好相反,经过修改调试后,问题解决。
在每个case中加入独立的判断是否回到主菜单的语句,一开始getchar()总是不能正确录入,没有输入就直接运行下一个语句,在加入控制语句后经过调试发现,程序把上一个输
入的回车直接默认赋值给getchar(),导致没有输入,直接进行下一个语句,后来使用了两个连续的getchar()语句,第一个getchar()语句默认为回车,但是后面一个getchar()语句可以正确的重新输入判断值,经过重新的调试,运行正常,问题解决,但是希望能到更完善的答案。在判断是否继续输入纸牌编码的功能中,同样遇到了这个问题,按照相同的解决办法解决。
整个程序由一个大的do-while语句和switch语句组合实现界面的不同功能,do-while语句通过choice=0作为结束的条件,在case 3中,有一个小的do-while语句实现纸牌编号的重复输入,在整个程序中有很多信息的输入,需要根据输入的信息正确与否来反馈信息,否则会导致程序出错,所以在调试的过程中加入了很多判断条件,可以解决信息输入错误的情况,但是仍然存在输入非整型值程序出错的问题,所以在输入条件中加入提示信息,以保证信息类型输入正确。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论