JAVA课程设计纸牌游戏
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(图 10) (注:纸牌游戏程序结束画面。 )
附录: 程序源代码: package Cartgame; import ja百度文库a.util.Scanner; public class Main { private static Scanner sc = new Scanner(System.in); 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 数组中。 }
(图 2) (注:纸牌游戏程序的主功能界面。 )
(图 3) (注:纸牌游戏程序功能 1:查看题目。 )
(图 4) (注:纸牌游戏程序功能 2:查看所有纸牌的翻牌次数。 )
(图 4 续 1)
(图 5) (注:纸牌游戏程序功能 3:查看指定编号纸牌翻牌记录。 )
(图 8) (注:纸牌游戏程序功能 4:查看最终正面向上的纸牌编号。 )
一、问题分析和任务定义 1.题目: 纸牌游戏: 编 号 为 1-52 张 牌 , 正 面 向 上 , 从 第 2 张 开 始 , 以 2 为 基 数 , 是 2 的 倍 数 的 牌 翻 一 次 ,直 到 最 后 一 张 牌 ;然 后 ,从 第 3 张 开 始 ,以 3 为 基 数 ,是 3 的 倍 数 的 牌 翻 一 次 ,直 到 最 后 一 张 牌 ;然 后 … 从 第 4 张 开 始 ,以 4 为 基 数 ,是 4 的 倍 数 的 牌 翻 一 次 , 直 到 最 后 一 张 牌 ;。。。再 依 次 5 的 倍 数 的 牌 翻 一 次 , 6 的 , 7 的 直 到 以 52 为 基 数 的 翻 过 , 输 出 : 这 时 正 面 向 上 的 牌 有 哪 些 ? 2.要求和任务: ① 该题目的要求如下: (1)将 52 张牌编号。 (2)从 2 开始,依次作为基数对基数的倍数的牌进行翻转,直到以 52 为基数的翻转。 (3)最后输出正面向上的牌。 ② 基本任务为: (1)按照要求翻转纸牌。 (2)输出最后正面向上的纸牌的编号。 3.原始数据的输入及输出格式: 原始数据要求输入纸牌的基础编号, 编号的输入为整型。输出的是经过规律翻转后正面向上 的纸牌的编号。 输入的数据信息如下: 纸牌:1、2、3……、51、52。 问题直观分析表: 1 1 2 3 4 5 6 7 8 9 10 11 12 …… (注:图中“√”表示翻转一次。 ) √ √ √ √ √ √ √ √ √ √ √ …… √ √ √ √ √ √ √ √ √ √ √ √ 2 3 4 5 6 7 8 9 10 11 12 ……
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 语句实现纸牌编 号的重复输入,在整个程序中有很多信息的输入,需要根据输入的信息正确与否来反馈信 息,否则会导致程序出错,所以在调试的过程中加入了很多判断条件,可以解决信息输入 错误的情况,但是仍然存在输入非整型值程序出错的问题,所以在输入条件中加入提示信 息,以保证信息类型输入正确。 五.测试结果及其分析 1.测试结果如下图 1-12; 2 结果分析以注释的形式写在图的下方;
二.数据结构的选择和概要设计 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("温馨提示:欢迎进入纸牌游戏程序!");