数据结构设计报告纸牌游戏
- 格式:doc
- 大小:39.00 KB
- 文档页数:4
纸牌游戏——数据结构实训代码实训要求:基本要求:一副没有花牌(J、Q、K、A、大小王)的扑克牌,两个人进行纸牌游戏,其中一个人为用户,另一个人为计算机;每轮每人各发 5 张牌,各自以这 5 张牌建立二叉排序树;由用户先出,轮流出牌,每次只能出一张并且要比别人出的大,如:用户出3,计算机则要出比 3 大的牌,没有则选择不出;最先出完的人获胜。
#include <iostream>#include<stdlib.h> // 产生随机数#include<time.h>#include <Windows.h>#include <iomanip>using namespace std;class PlayingCards{private:int card1[10][4];//标记发牌int card2[5][2];//标记出牌public:int b[5];char bhuase[5];int c[5];char chuase[5];PlayingCards(){};void yxsm(); //游戏说明void fp();//随机发牌void cp();//按顺序出牌,并显示void xswj();//显示获得的牌void xsdn();//显示获得的牌void qk();//清空标记数组的记录};PlayingCards a;typedef struct node{int data;struct node * LChild;struct node * RChild;}node;class tree{private:int data;struct node * LChild;struct node * RChild;public:void chushihua(node *t);node * charu(node *t , int key);node * jianlib(node *t);node * jianlic(node *t);void paixu1(node * t);void paixu2(node * t,int *p);void paixu3(node * t,int *p);};tree tr;void PlayingCards::yxsm(){cout<<" "<<"每轮每人各发5 张牌,各自以五张牌建立二叉树,由用户先出,轮流出牌,"<<endl;cout<<" cout<<" cout<<" } "<<"每次只能出一张并且要比别人出的大,"<<endl;"<<"如:用户出3,计算机则要出比3 大的牌,没有则选择不出;"<<endl; "<<"最先出完的人获胜。
纸牌游戏实验报告篇一:纸牌游戏Go Fish实验报告纸片游戏Go Fish课程设计一目的通过对GO FISH的课程设计,明白数据结构设计理念,理解并掌握链表的操作,进一步的了解数据结构的含义。
二需求分析决定玩家的数量,先简单化,建立两个玩家,完成设计;1、确定数据结构模版;2、建立数据结构类型;3、完成数据操作;4、确立算法设计。
三概要设计1、数据结构设计该课程设计采用链表和类相结合模式,建立牌堆和牌操作的链表结构:class Card{public:};牌堆类:采用整型数组建立牌堆,并用随机数打乱牌序。
class Node{public:Node(); Node(int value,Node *next);//初始化节点构造函数 int ListLength(Node* L); //链表的计数 int Search(Node* L , int num); //链表的查找Node* head_Insert(Node* head , int num);//从表头插入节点Node* Delete(Node* head , int num); //删除节点 void Print(Node *head);//链表输出 int card_num; char clore; Node *Link; void NewCard();//新建牌 void Shuffle();//洗牌int Licensing(int n);//发牌int CARD_A[52]; private: private:采用链表结构方式,来构造玩家手牌。
用链式结构进行操作进行删除和插入。
2、算法函数int Scoring(NodePtr &player,int score)//计分;int Players_operations(NodePtr &player1,NodePtr &player2,int Choose,int i,Card CardBign)//玩家操作;两个函数分别用来计算与进行牌的操作。
题目:纸牌游戏目录一、需求分析 (3)二、概要设计 (3)三、详细设计 (4)四、调试分析和测试结果 (7)五、总结 (8)六、参考文献 (8)七、致谢 (8)八、附录 (9)一、需求分析按以下规则进行翻牌:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,最后输出正面向上的牌有哪些?用函数obv1 、obv2按照题目要求的规则,用for循环来实现.二、概要设计1.当从第二个编号开始的每张牌每次遇到是其倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,而结果只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几张。
比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。
如果它在多次的翻牌后,正面还向上了,那么它就是要输出的结果之一。
2.建立代表52张牌的线性表——调用翻牌算法按照规则翻牌——输出翻牌算法的结果最为主要的翻牌算法的实现:void obv2 (SqList L,int n) {for (int i=2;i<=n;i++)for (int j=i;j<=L.length;j++)if (j%i==0){if (L.data[j]==1)L.data[j]=0;else if (L.data[j]==0)L.data[j]=1;}}以上是通过for循环对是当前基数倍数的牌进行翻牌3、根据算法思想,流程图如下:1、预处理#include<iostream.h>#include<stdlib.h>#define SIZE 100 //线性表存储空间的初始分配量2、数据类型定义定义一个结构体类型SqList,结构体中数组指针elem指示线性表的基地址,length指示线性表的当前长度。
目录备注: (2)一、游戏简介 (2)二、设计要求 (2)2.1 问题描述 (2)2.2 要求分析 (2)三、程序功能 (3)3.1 程序的主要功能描述 (3)3.2序流程图 (3)3.3主界面 (4)3.4功能测试 (4)四、源程序 (6)五、课设心得 (14)备注:由于这次课设开始时以为可以做其他题目,知道周四才知道不行。
但我的21点一几个基本成型,因此没有继续改动,希望老师能够理解。
一、游戏简介又名黑杰克,起源于法国,现已流传到世界各地。
现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代,比如菲律宾的博彩公司就有该游戏。
该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。
有着悠久的历史。
1700年左右法国赌场就有这种21点的纸牌游戏。
1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部,15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏。
二、设计要求编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现一对一的人机大战。
要求游戏过程中任意一方牌的点数之和超过 21 点,则自动出局;在不超过 21 点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
2.1 问题描述本次C++课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,有电脑和玩家一起玩这个游戏,玩家设法使自己的牌达到总分21并要比电脑开的点数大而且不超过这个数值。
扑克牌的分值取它们的面值。
J,Q,K分别是11, 12和13分。
2.2 要求分析编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现1对1的人机大战。
要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
课题设计2:扑克牌游戏1、问题描述编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些?存储结构:源程序:#include <stdio.h>void main(){int i,j,a[52];for(i=2;i<=52;i++)for(j=i-1;j<52;j+=i)a[j]=!a[j];printf("正面向上的牌有:");for(i=0;i<52;i++)if(a[i])printf("%4d",i+1);}测试结果:正面向上的牌有:1 4 9 16 25 36 49算法的时间复杂度:T(n)=O(n2)课题设计3:joseph环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
首先创建一个空链表,初始化链表,构造出一个只有头结点的空链表,建立好一个约瑟夫环。
1. 输入的形式和输入值的范围本程序中,输入报数上限值m和人数上限l,密码,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。
2. 输出的形式从屏幕显示出列顺序。
3. 程序功能提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。
二、概要设计以单向循环链表实现该结构。
1. 抽象数据类型的定义为:ADT LNode{数据对象:D={ai | ai∈CharSet,i= 1,2,…,n,n≥0}数据关系:R1={< ai-1 ,ai > | ai ∈D,I=2,…,n} 三.源程序:#include<stdio.h>#include<stdlib.h>typedef struct Node{int key;//每个人持有的密码int num;//这个人的编号struct Node *next;//指向下一个节点}Node,*Link;void InitList(Link &L) //创建一个空的链表{L=(Node *)malloc(sizeof(Node));if(!L) exit(1);L->key=0;L->num=0;L->next=L;}void Creater(int n,Link &L) //初始化链表{Link p,q;q=L;for(int i=1;i<=n;i++){p=(Node *)malloc(sizeof(Node));if(!p) exit(1);printf("the key_%d is:",i);scanf("%d",&p->key);p->num=i;L->next=p;L=p;}L->next=q->next;free(q);}void main(){Link L,p,q;int n,x;L=NULL;InitList(L);//构造出一个只有头结点的空链表printf("please input the totle number of people:"); scanf("%d",&n);//总共的人数nprintf("the start key is:");scanf("%d",&x);//初始密码为xCreater(n,L);//建立好一个约瑟夫环p=L;for(int i=1;i<=n;i++){for(int j=1;j<x;j++)p=p->next;q=p->next;x=q->key;printf("%d ",q->num);p->next=q->next;free(q);}}四、测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4输出:6 7 4 1 5 3 2课题设计4:商品货架管理1、需求分析:设计一个算法,每一次上货后始终保持生产日期越近的商品越靠近栈底。
/纸牌游戏一.需求分析1.编号为1-52张牌,正面向上2. 从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过3. 输出:这时正面向上的牌;4.测试数据52张牌二.概要设计-1.数组抽象数据类型定义:ADT SqList{数据对象:ji=0,…,bi-1,i=1,2,…,n,D= {aj1j2…jn|n(>0)称为数组的维数,bi是数组第i维的长度, ji是数组第i 维的下标, aj1j2…jn∈ElemSet}数据关系:R={R1,R2,…,Rn}Ri={<aj1…ji…jn,aj1,…ji+1,…jn>|0≤jk≤bk-1,1≤k≤n且k≠I, 0≤ji≤bk-2, aj1…ji…jn,aj1,…ji+1,…jn∈D,i=2,…,n}基本操作:faceringt(L):~操作结果:对纸牌进行翻转} ADT SqList2.本程序包含两个模块:(1)主程序模块void main(){定义一个二叉树;for(i=1;i<=52;i++){ [i].num=i;—[i].visit=0;{for(i=2;i<=52;i++) um%i==0) isit==0) isit=1;else[j].visit=0;}}?for(i=1;i<=52;i++) isit==0)cout<<[i].num<<" ";}cout<<endl;}3. 主函数void main(){¥for(i=1;i<=52;i++){[i].num=i;[i].visit=0;函数的调用关系反映了演示程序的层次结构主程序faceringt)四. 调试分析1.用一个数组来存储52张牌2. 定义数组时由于每张牌要记录两个东西,就让每个数据包括两个数据项----纸牌号和记录纸牌正反面五.测试结果六. 附录(源代码)#include<iostream>#include<string>】using namespace std;#define MAXSIZE 100um%i==0) isit==0) isit=1; else[j].visit=0;}}for(i=1;i<=52;i++) isit==0)cout<<[i].num<<" ";。
纸牌游戏—数据结构实训报告纸牌游戏—数据结构实训报告1. 项目背景和介绍1.1 项目背景在现代社会中,人们经常通过玩各种纸牌游戏来娱乐和消遣。
纸牌游戏可以帮助人们放松身心、提高思维能力和判断力。
为了更好地理解纸牌游戏的规则和操作方法,并掌握数据结构的应用,我们决定开展这个纸牌游戏的数据结构实训项目。
1.2 项目目标本项目的目标是设计并实现一个纸牌游戏系统,包括纸牌的洗牌、发牌和玩家的操作等。
通过这个项目,我们将学习和提高对数据结构的应用能力,同时也能够提高我们团队合作和项目管理的能力。
2. 需求分析2.1 功能需求2.1.1 纸牌洗牌功能实现纸牌的洗牌功能,确保每次发牌的牌都是随机的,避免出现重复或排序的情况。
2.1.2 纸牌发牌功能实现纸牌的发牌功能,能够按照规则将纸牌发给玩家,并保持每位玩家手中的牌都是不同的。
2.1.3 玩家操作功能实现玩家在游戏中的各种操作,如出牌、抽牌、跳过等,并能够根据规则进行相应的判断和处理。
2.1.4 游戏结束功能实现游戏的结束判断功能,当有玩家出完所有手牌时,游戏结束。
2.2 性能需求2.2.1 系统响应速度系统应能够在合理的时间内响应用户的操作,确保用户能够顺畅地进行游戏。
2.2.2 系统可扩展性系统应具备良好的可扩展性,方便后续的功能迭代和升级。
3. 系统设计3.1 数据结构设计3.1.1 纸牌数据结构设计设计一种合适的数据结构来表示一副纸牌,包括牌的花色、点数等信息,并能够支持洗牌、发牌和玩家操作等功能。
3.1.2 玩家数据结构设计设计一种合适的数据结构来表示玩家的手牌、出牌等信息,并能够支持玩家操作功能。
3.2 算法设计3.2.1 洗牌算法设计设计一种高效的洗牌算法,确保洗牌后每张牌的位置都是随机的。
3.2.2 发牌算法设计设计一种合理的发牌算法,保证每位玩家获得的牌都是不同的。
3.2.3 玩家操作算法设计设计一种算法来判断玩家的操作是否合法,并根据规则进行相应的处理。
课程设计报告课程设计名称:数据结构课程设计课程设计题目:扑克牌的排序目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (2)2.2.1 功能模块图 (2)2.2.2 流程图分析 (3)3 数据结构分析 (6)3.1存储结构 (6)3.2算法描述 (6)4 调试与分析 (12)4.1调试过程 (12)4.2程序执行过程 (12)参考文献 (15)附录(关键部分程序清单) (16)1 课程设计介绍1.1 课程设计内容编写算法能够用基数排序算法对扑克牌进行排序。
应能够选择按花色优先或按面值优先,初始扑克牌牌序要求能自动生成(随机生成)。
1.2课程设计要求1.花色的符号可自定,输出要求给出初始牌序和结果牌序。
2.参考相应资料,独立完成课程设计任务。
3.交规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。
此三个模块相互独立,没有嵌套调用的情况,以下是三个模块的大体分析:1.建立一个结构体数组存放整副扑克。
2.根据要求的扑克数及生成的随机数建立一个结构体数组存放需要排序的扑克。
3.用基数排序的方法对随机生成的扑克进行相应要求的排序2.2 原理图介绍2.2.1 功能模块图图2. 1 功能模块图2.2.2 流程图分析1图2.2生成随机扑克的流程图利用一个for循环及随机函数rand(),利用每次循环生成的随机数对应的数值num建立初始的无序扑克,同时将huase、value分别赋给关键字key[0]、key[1]以对其进行排序2. 对扑克进行花色优先排序的函数流程图,如图2.3所示:图2.3对扑克进行花色优先排序的流程图对长为n的数组R,利用next域建立为静态链表,进行关键字先key[1](面值)后key[0](花色)的基数排序,排序后的数组按关键字key[0](花色)优先的顺序存放,利用静态链表依次将其输出。
数据结构课程设计纸牌游戏一、课程目标知识目标:1. 学生能理解数据结构中栈和队列的基本概念及其在实际问题中的应用。
2. 学生能运用所学知识,设计并实现一个基于栈和队列的纸牌游戏。
3. 学生掌握栈和队列的操作原理,如入栈、出栈、入队、出队等基本操作。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,提高编程技能。
2. 培养学生团队协作能力,通过小组合作完成纸牌游戏的设计与实现。
情感态度价值观目标:1. 学生能积极主动参与课程学习,培养对数据结构的兴趣和热情。
2. 学生在合作过程中,学会相互尊重、沟通与协作,培养良好的团队精神。
3. 学生通过解决实际问题,体会数据结构在实际应用中的价值,提高对计算机科学的认识。
课程性质:本课程为信息技术课程,以实践操作为主,结合理论讲解,帮助学生掌握数据结构的基本知识。
学生特点:学生为高中生,具备一定的编程基础和逻辑思维能力,对实际操作有较高的兴趣。
教学要求:教师需引导学生将所学知识应用于实际问题的解决,注重培养学生的动手能力和团队协作能力,使学生在实践中掌握数据结构的应用。
通过本课程的学习,学生应能够达到上述课程目标,实现具体的学习成果。
二、教学内容本课程教学内容主要包括以下几部分:1. 栈和队列的基本概念与性质- 栈的定义、特点及应用场景- 队列的定义、特点及应用场景- 栈与队列的异同点分析2. 栈和队列的操作原理- 栈的入栈、出栈操作- 队列的入队、出队操作- 栈与队列在实际问题中的应用案例分析3. 纸牌游戏设计与实现- 纸牌游戏规则设计- 使用栈和队列实现纸牌游戏的核心功能- 游戏界面设计及交互操作4. 编程实践- 使用教材指定的编程语言(如C++、Java等)进行编程实践- 学生分组合作,完成纸牌游戏的设计与实现- 教师指导与反馈,帮助学生优化代码和解决问题教学内容根据课程目标制定,注重科学性和系统性。
教学进度安排如下:1. 第1课时:栈和队列的基本概念与性质2. 第2课时:栈和队列的操作原理3. 第3课时:纸牌游戏规则设计4. 第4-6课时:编程实践,分组完成纸牌游戏设计与实现5. 第7课时:成果展示与评价,教师反馈与总结教学内容与教材关联紧密,旨在帮助学生将所学知识应用于实际问题解决,提高编程实践能力。
纸牌游戏
一.需求分析
1.编号为1-52张牌,正面向上
2. 从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过
3. 输出:这时正面向上的牌;
4.测试数据
52张牌
二.概要设计
1.数组抽象数据类型定义:
ADT SqList{
数据对象:ji=0,…,bi-1,i=1,2,…,n,
D= {aj1j2…jn|n(>0)称为数组的维数,bi是数组第i维的长度, ji是数组第i 维的下标, aj1j2…jn∈ElemSet}
数据关系:R={R1,R2,…,Rn}
Ri={<aj1…ji…jn,aj1,…ji+1,…jn>|0≤jk≤bk-1,1≤k≤n且k≠I, 0≤ji≤bk-2, aj1…ji…jn,aj1,…ji+1,…jn∈D,i=2,…,n}
基本操作:
faceringt(L):
操作结果:对纸牌进行翻转
}ADT SqList
2.本程序包含两个模块:
(1)主程序模块
void main()
{定义一个二叉树;
for(i=1;i<=52;i++)
{ L.r[i].num=i;
L.r[i].visit=0;//用0来记正面
}
}
(2)纸牌翻转模块——翻转纸牌
各模块之间的调用关系如下:
主程序模块
纸牌翻转模块
三.详细设计
1.根据题目要求的数组存储结构
#define MAXSIZE 100//给数组定义一个空间
typedef struct
{
int num; //牌号
int visit; //牌的正反面
}RedType; //纸牌的信息
typedef struct
{
RedType r[MAXSIZE+1]; //纸牌数组
int length;
}SqList;
2.对纸牌进行翻转
void faceringt(SqList L)
{
for(i=2;i<=52;i++) //从第二张开始往后
{
for(j=i;j<=52;j++)
if(L.r[j].num%i==0) //当是i的倍数时翻转
{
if(L.r[j].visit==0) //正面翻反面
L.r[j].visit=1;
else
L.r[j].visit=0;
}
}
for(i=1;i<=52;i++) //显示正面号
{
if(L.r[i].visit==0)
cout<<L.r[i].num<<" ";
}
cout<<endl;
}
3. 主函数
void main()
{
for(i=1;i<=52;i++)
{
L.r[i].num=i;
L.r[i].visit=0;//用0来记正面
}
cout<<"这时是正面的编号为:"<<endl;
faceringt(L);
}
4. 函数的调用关系反映了演示程序的层次结构
主程序
faceringt
四. 调试分析
1.用一个数组来存储52张牌
2. 定义数组时由于每张牌要记录两个东西,就让每个数据包括两个数据项----纸牌号和记录纸牌正反面
五.测试结果
六. 附录(源代码)
#include<iostream>
#include<string>
using namespace std;
#define MAXSIZE 100//给数组定义一个空间
typedef struct
{
int num; //牌号
int visit; //牌的正反面
}RedType; //纸牌的信息
typedef struct
{
RedType r[MAXSIZE+1]; //纸牌数组
int length;
}SqList;
//对纸牌进行翻转
void faceringt(SqList L)
{int i,j;
for(i=2;i<=52;i++) //从第二张开始往后{for(j=i;j<=52;j++)
if(L.r[j].num%i==0) //当是i的倍数时翻转{if(L.r[j].visit==0) //正面翻反面
L.r[j].visit=1;
else
L.r[j].visit=0;
}
}
for(i=1;i<=52;i++) //显示正面号
{if(L.r[i].visit==0)
cout<<L.r[i].num<<" ";
}
cout<<endl;
}
void main()
{int i;
SqList L;
for(i=1;i<=52;i++)
{L.r[i].num=i;
L.r[i].visit=0;//用0来记正面
}
cout<<"这时是正面的编号为:"<<endl; faceringt(L);
}
七. 心得体会。