为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

纸牌游戏设计报告

2017-09-01 15页 doc 88KB 48阅读

用户头像

is_044822

暂无简介

举报
纸牌游戏设计报告纸牌游戏设计报告 题目:(纸牌游戏)编号为1~52张牌,正面向上,从第二张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后从第三张牌开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些? 1、 此程序需要完成如下要求:有已编号的1~52张牌且正面朝上,从第二张牌开始,以 2为基数,是2的倍数的牌翻一次,直到最后一张牌;直到以52为基数的牌翻过,要 求最后输出所有正面向上的牌的编号。 2、 任务定义:实现本程序需要解决以下几个问题: ? 如何存储52...
纸牌游戏设计报告
纸牌游戏报告 题目:(纸牌游戏)编号为1~52张牌,正面向上,从第二张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后从第三张牌开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些? 1、 此程序需要完成如下要求:有已编号的1~52张牌且正面朝上,从第二张牌开始,以 2为基数,是2的倍数的牌翻一次,直到最后一张牌;直到以52为基数的牌翻过,要 求最后输出所有正面向上的牌的编号。 2、 任务定义:实现本程序需要解决以下几个问题: ? 如何存储52张牌,所选择的存储结构要便于实现题给要求的操作。 ? 如何设计翻牌程序。 ? 一张牌可能一次未翻,也可能翻多次,在经过所有的翻牌以后,如何知道每一张 牌是否为正面向上。 ? 输出所有正面向上的牌的编号。 本问题的关键在于选择合适的数据结构存储52张牌,难点在于在所选的数据结 构下实现题给要求的翻牌操作。另一个难点在于所有的牌都进行了翻牌操作后,如 何知道每一张牌是否为正面向上。 首先我们可以从实际生活中的操作来探讨第二个难点的解决思路。编号为1的 牌没有进行翻牌,即翻牌的次数为0,仍然为正面朝上;编号为2的牌在整个过程中 只翻了一次,为反面朝上;编号为3的牌在整个过程中只翻了一次,为反面朝上; 编号为4的牌在整个过程中翻了两次,为正面朝上;编号为5的牌在整个过程中翻 了一次,为反面朝上;编号为6的牌在整个过程中翻了三次(由于6是2、3、6的 倍数),为反面朝上;以此类推直至编号为52的牌,从上述过程可以总结出这样的 规律:从编号为1的第一张牌到编号为52的最后一张牌,只要它翻过的次数为偶数 则是正面朝上,反之则为反面朝上。因此我们可以依据每张牌翻过的次数来确定它 最终是否为正面向上,从而输出实验所需要的结果:所有正面向上的牌的编号。 3、原始数据的输入、输出格式:由于本程序简单明了,不需要有任何的数据输入,只须用 户选择执行或不执行此程序,若执行此程序,在程序运行后便可直接在运行结果窗口中 看到所有正面朝上的牌的编号,这些编号数据均为整型;若不执行该程序则选择退出。 1、数据结构的选择 因为编号为1~52的52张牌没有要求在物理位置上相邻接,且在翻牌操作时要对编号 依次进行判断,很容易想到用指针来进行操作。为方便起见,我选用单链这种数据结构 来对52张牌进行链接存储。单链表是有限个具有相同类型的数据元素组成的链表,且该链 表中的每一个结点只有一个指针域。根据第一部分的问题可知该单链表中每个结点应 包括三个部分:存储该结点所对应的牌的编号信息data域、记录该结点所对应的牌的翻牌 次数count域、存储其直接后继的存储位置的next域(指针域),其结点结构图如下(其中 data、count为整型,next为指针类型): count 故可创建以单链表为存储结构的结构体,如下: data count next type struct node { int data ; //牌的编号 int count ; //记录翻牌的次数 struct node *next ; //指向下一个结点的指针 } LinkList; //该单链表为LinkList类型 2、概要设计 定义了单链表中结点的数据类型后,接下来就要创建单链表。我选用的是尾插法创建带 有头结点的单链表,运用malloc函数申请内存空间。然后设计翻牌程序,利用j%i=o的 思想,并记录每张牌翻过的次数。再编写输出结果程序,思想是:若翻牌的次数为偶数 时则为正面朝上,输出该牌的编号。最后编写主函数,主函数中调用子函数,并输出一 些提示信息。为了实现程序所需的功能,程序中用到三个子函数和一个主函数: 子函数1:创建带有头结点的链表的函数 LinkList *creat (int k) 子函数2:翻牌函数 LinkList *overcard (LinkList *head) 子函数3:输出结果函数 void result(LinkList *head) 主函数:void main ( ) 各函数模块间的调用关系如下: main creat overcard result 3、流程图 开始 初始化工作:char ch; Int k=52; LinkList *head,*p N Ch==‘Y’ Y 调用创建链表函数: Head=creat(k) 调用翻牌函数: p=overcard(head,k) 调用输出结果函数:result(p) 重新选择操作,输入ch值 结束 图1 主函数流程图 开始 定义LinkList类型变量p int i=2 N i<=k(k=52) Y p指向首元素结点 p=p,next Y i++ P==NULL N N (p,data)%i==0 Y p,count++ p=p,next++ 结束 图2 翻牌程序流程图 开始 定义 LinkList *q q指向首元素结点 q=head,next Y q==NULL N N (q,count)%2==0? Y 输出牌的编号:q,data q=q,next 结束 图3 输出正面朝上的牌的编号的程序流程图 1、定义单链表结点类型: type struct node { int data ; //牌的编号 int count ; //记录翻牌的次数 struct node *next ; //指向下一个结点的指针 } LinkList; //该单链表为LinkList类型 2、子函数1:尾插法创建带有头结点的单链表 LinkList *creat (int k) 说明:形参k表示单链表中结点的个数 建立的过程大致如下:一开始定义LinkList类型的三个指针变量 *head、*p、*q : LinkList *head,*p,*q; 定义并初始化记录结点个数的变量i:int i=0; 首先申请头结点空间:head=(LinkList *)malloc(sizeof(LinkList)); 指针p指向头结点head:p=head; 然后利用指针q再申请结点空间:q=(LinkList *)malloc(sizeof(LinkList)); 将结点链接成链表的核心操作如下: while(idata=i+1; //给每个结点的data赋值 q->count=0; //给每个结点的count赋值 p->next=q; //q链接到p之后 p=q; //将q作为新的p q=q->next; //q指针后移 q=(LinkList *)malloc(sizeof(LinkList)); i++;} p->next=NULL; //将最后一个结点的next域赋为空 return(head); } 3、 子函数2:翻牌函数 LinkList *overcard(LinkList *head,int k) 说明;形参分别指头指针、结点个数 {定义一个LinkList类型指针p:LinkList *p 因为翻牌时从基数2开始,可以使用for循环: for(int i=2;i<=k;i++) {p=head->next; //p指向首元素结点 while(p!=NULL) {if((p->data)%i==0) //若牌的编号能被基数i整除,则使p->count++ p->count++; p=p->next;} //p指针后移 } return(head); } 4、子函数3:输出正面朝上的牌的编号函数 void result(LinkList *head) {定义一个LinkList类型指针q:LinkList *q; q=head->next; //q指向首元素结点 printf("正面向上的牌编号为:"); while(q!=NULL) {if((q->count)%2==0) //若翻页的次数为偶数则正面朝上,输出 printf("%4d",q->data); q=q->next;} printf("\n");} } 4、 主函数:void main( ) {char ch; int k=52; //共有52张牌 LinkList *head,*p; printf("执行此程序(Y),不执行此程序(Q)\n"); scanf("%c",&ch); while(1) {if(ch=='Y') {head=creat(k); p=overcard(head,k); result(p);} else if(ch=='Q') {printf("退出程序!\n");break;} scanf("%c",&ch);} } 1、调试的时候遇到了几个问题: 本次题目在初次编写完成后出了一些语法和拼写上的小错误,导致运行结果不正确。例如翻 牌子程序中的用到了for循环:for(int i=2;i #include typedef struct node {int data; //牌的编号 int count; //记录翻牌的次数 struct node *next; //指向下一个结点的指针 }LinkList; LinkList *creat(int k) //创建链表函数 {LinkList *head,*p,*q; int i=0; head=(LinkList *)malloc(sizeof(LinkList));//申请头结点空间 p=head; //指针p指向头结点 q=(LinkList *)malloc(sizeof(LinkList)); //申请结点空间 while(idata=i+1; //给每个结点的data赋值 q->count=0; //给每个结点的count赋值 p->next=q; //q链接到p之后 p=q; //将q作为新的p q=q->next; //q指针后移 q=(LinkList *)malloc(sizeof(LinkList)); i++;} p->next=NULL; //将最后一个结点的next域赋为空 return(head); } LinkList *overcard(LinkList *head,int k) //翻牌函数 {LinkList *p; for(int i=2;i<=k;i++) {p=head->next; //p指向首元素结点 while(p!=NULL) {if((p->data)%i==0) //若牌的编号能被基数i整除,则使p->count++ p->count++; p=p->next;} //p指针后移 } return(head); } void result(LinkList *head) //输出结果函数 {LinkList *q; q=head->next; //q指向首元素结点 printf("正面向上的牌编号为:"); while(q!=NULL) {if((q->count)%2==0) //若翻过的次数为偶数则正面朝上,输出 printf("%4d",q->data); q=q->next;} printf("\n"); } void main() {char ch; int k=52; //共有52张牌 LinkList *head,*p; printf("执行此程序(Y),不执行此程序(Q)\n"); scanf("%c",&ch); while(1) {if(ch=='Y') {head=creat(k); p=overcard(head,k); result(p);} else if(ch=='Q') {printf("退出程序!\n");break;} scanf("%c",&ch);} }
/
本文档为【纸牌游戏设计报告】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索