纸牌游戏—数据结构实训代码
纸牌游戏—数据结构实训代码
纸牌游戏——数据结构实训代码实训要求:基本要求:一副没有花牌(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; "<<"最先出完的人获胜。
数据结构课程设计报告—纸牌游戏
课题设计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、需求分析:设计一个算法,每一次上货后始终保持生产日期越近的商品越靠近栈底。
纸牌游戏实验报告
纸牌游戏实验报告篇一:纸牌游戏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)//玩家操作;两个函数分别用来计算与进行牌的操作。
纸牌记忆小游戏C语言源代码
纸牌记忆小游戏C语言源代码#include#include#includeintoutputacard(inta,int b) //输出一张扑克{if(b==11){printf("[%c",a); //Jprintf("%c]",b+63);}else if(b==12){printf("[%c",a); //Qprintf("%c]",b+69);}else if(b==13){printf("[%c",a); //Kprintf("%c]",b+62);}else if(b==1){printf("[%c",a); //Aprintf("%c]",b+64);}else if(b==88)printf("[%c%c]",a,b); //XXelse{printf("[%c",a); //随机输出8张扑克printf("%d]",b);}}int main(){int puke[8][2];inti,j,k;srand((unsigned int)time(NULL));printf("记住下面牌的顺序\n准备好了按<回车>,我会提问你的^-^\n");for(i=0; i<8; i++)for(j=0; j<2; j++){if(j==0)puke[i][j]=3+rand()%3; /*红心是003 方块004 梅花005 黑桃006*/elsepuke[i][j]=1+rand()%12; //A……K}for(k=0; k<8; k++)outputacard(puke[k][0],puke[k][1]); //随机输出8张扑克printf("\n");int puke2[8][2];int puke0[2];intt,rh;for(t=0; t<8; t++){puke2[t][0]=puke[t][0];puke2[t][1]=puke[t][1];}for(t=0; t<8; t++) /*把上面的8张扑克打乱顺序存入另一个数组*/{rh=rand()%7;if(rh!=t){puke0[0]=puke2[t][0];puke0[1]=puke2[t][1];puke2[t][0]=puke2[rh][0];puke2[t][1]=puke2[rh][1];puke2[rh][0]=puke0[0];puke2[rh][1]=puke0[1];}}for(k=0; k<8; k++)outputacard(puke2[k][0],puke2[k][1]); /*打乱顺序后重新输出8张扑克*/ printf("\n");int puke3[8][2],puke4[8][2];for(i=0; i<8; i++) /*为把上面代表两组扑克的数组puke,puke2复制到另外*/for(j=0; j<2; j++) /*两个数组puke3、puke4中,以方便后面输出*/for(j=0; j<2; j++){puke3[i][j]=88;puke4[i][j]=88;}system("pause");system("CLS");inta,b,num=0;int alp1[8]= {0,0,0,0,0,0,0,0},alp2[8]= {0,0,0,0,0,0,0,0}; /* 记录各个位置的牌是否翻开*/while(alp1[0]==0||alp1[1]==0||alp1[2]==0||alp1[3]==0||alp1 [4]==0||alp1[5]==0||alp1[6]==0||alp1[7]==0){printf("依次输入第一行、第二行两张相同的牌的位置\n");for(k=0; k<8; k++)outputacard(puke3[k][0],puke3[k][1]);printf("\n");for(k=0; k<8; k++)outputacard(puke4[k][0],puke4[k][1]);printf("\n");scanf("%d%d",&a,&b);num++;system("CLS");if(puke[a-1][0]==puke2[b-1][0]&&puke[a-1][1]==puke2[b-1][1]&&alp1[a-1]!=1&&alp2 [b-1]!=1&&a>=1&&a<=8&&b>=1&&b<=8){/*如果两张牌相同且没有被翻开过且输入的数字大于0小于8复制puke,puke2中这两个元素的数据到puke3,puke4中,并输出puke3,puke4*/puke3[a-1][0]=puke[a-1][0];puke3[a-1][1]=puke[a-1][1];alp1[a-1]++;puke4[b-1][0]=puke2[b-1][0];puke4[b-1][1]=puke2[b-1][1];alp2[b-1]++;printf("猜对了,厉害!\n");for(k=0; k<8; k++)outputacard(puke3[k][0],puke3[k][1]);printf("\n");for(k=0; k<8; k++)outputacard(puke4[k][0],puke4[k][1]);printf("\n");system("pause");system("CLS");}else if(alp1[a-1]!=1&&alp2[b-1]!=1&&a>=1&&a<=8&&b>=1&&b<=8){/*如果两张牌不相同但没有被翻开过且输入的数字大于0小于9输出原puke3,puke4并显示该位置正确的牌*/printf("你好像记错了,再想想,我相信你!\n");for(i=0; i<8; i++){if(i==a-1)outputacard(puke[i][0],puke[i][1]);elseoutputacard(puke3[i][0],puke3[i][1]);}printf("\n");for(k=0; k<8; k++){if(k==b-1){outputacard(puke2[k][0],puke2[k][1]);}elseoutputacard(puke4[k][0],puke4[k][1]);}printf("\n");system("pause");system("CLS");}else if(a>=1&&a<=8&&b>=1&&b<=8) /*如果这两张牌中任意一张已经被翻开,输出如下*/{printf("这两张牌中的某一张好像已经被你翻开了哦\n");for(k=0; k<8; k++)outputacard(puke3[k][0],puke3[k][1]);printf("\n");for(k=0; k<8; k++)outputacard(puke4[k][0],puke4[k][1]);printf("\n");system("pause");system("CLS");}else{printf("每行只有8张牌呦,请输入正确的位置,么么哒\n");for(k=0; k<8; k++)outputacard(puke3[k][0],puke3[k][1]);printf("\n");for(k=0; k<8; k++)outputacard(puke4[k][0],puke4[k][1]);printf("\n");system("pause");system("CLS");}}printf("你一共猜了%d次\n",num);if(num==8)printf("完美\n");else if(num>8&&num<=10)printf("非常棒!\n");else if(num>10&&num<=16)printf("你的记忆力挺不错的!\n");elseprintf("你的记忆力一般般啦,再练练吧!\n"); system("pause"); return 0;}。
Java实训报告纸牌游戏黑杰克
《Java实训》设计报告纸牌游戏黑杰克专业:软件技术班级:09-23班学号:*********姓名:***石家庄科技信息职业学院信息工程系2011年10月15日项目简介纸牌游戏黑杰克一、项目需求黑杰克简称为21点,1700年左右法国赌场就有这种21点的纸牌游戏。
该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过21 点且尽量大。
有着悠久的历史。
发牌:一开始给每个玩家发一张牌,这张牌是底牌,只有玩家自己知道是什么,然后只发给要牌的玩家。
如果所有玩家都不再要牌,则开牌计分。
计分:2到10都是按牌面计算点数,直接累加。
J、Q、K按10点计算,A一般记作11点累加,此时如果点数大于21点则将A记作1点。
爆分:21点为最大点数值,如果玩家手中的牌点数大于21点,则属于爆分,玩家手中点数将归0,判定为输。
要牌:玩家在底牌之后可以继续要牌,知道点数满意或爆分为止。
下注:玩家在每局开局前可下注,定当前局输赢的钱数。
输赢:21点位最大点数,哪个玩家点数大,就哪个玩家赢。
二、项目设计下面是5个Java源文件的总体设计。
(1)BlackJack.java(主类)BlackJack 类负责创建主窗口,该类含有main方法,游戏从该类开始执行。
BlackJack类有5种类型的对象,分别是:Dealer,Scanner,Player,Computer,Card,对象。
(2)Card.java对于一张扑克牌来说,主要有牌面值及花色,Card类用faces数组及suits数组分别存储所有牌面值及花色,并提供了getFace()方法及getSuit()方法获取一张扑克的面值及花色信息。
(3)CardsInHand.java玩家手上的牌。
(4)Dealer.java荷官的抽象只是实现了两个较核心的能力,一个是发牌,一个是洗牌。
发牌涉及到一个随机算法的问题,是比较重要的运算处理。
(5)Player.java玩家类的抽象是非常明显的,完全模拟了现实中一个玩家的属性及行为,属性有:赢次数、输次数、拥有现金数、手上的牌。
24点纸牌游戏源代码
#include <stdio.h>#include <windows.h>#pragma comment ( lib, "Winmm.lib")// 0,1,2,3分别代表+,-,*,/float OperVisual(float num1,float num2,int oper);//双目运算int Show(float num1,float num2,float num3,float num4,int i);//交换率运算并显示void main(){int i1,i2,i3,i4,i=0;unsigned int s1,s2;float num[4];//分别代表输入的4个数puts("Please enter the number 4:");scanf("%f%f%f%f",&num[0],&num[1],&num[2],&num[3]);s1=timeGetTime();for(i1=0;i1<4;i1++){for(i2=0;i2<4;i2++){for(i3=0;i3<4;i3++){for(i4=0;i4<4;i4++){if(i1!=i2&&i1!=i3&&i1!=i4&&i2!=i3&&i2!=i4&&i3!=i4)i=Show(num[i1],num[i2],num[i3],num[i4],i);}}}}if(!i) printf("No answer !");s2=timeGetTime();printf("\ntime consuming:%dms\n",s2-s1);getchar();getchar();}int Show(float num1,float num2,float num3,float num4,int i){int oper1,oper2,oper3;//分别代表3个操作符char OperShow[4]={'+','-','*','/'};//0,1,2,3float end1,end2,end3;for(oper1=0;oper1<4;oper1++){//第一个运算符end1=OperVisual(num1,num2,oper1);//将第一个数进行4次运算for(oper2=0;oper2<4;oper2++){//第二个运算符end2=OperVisual(end1,num3,oper2);//将前两个数的结果和第三个数进行4次运算for (oper3=0;oper3<4;oper3++){//第三个运算符end3=OperVisual(end2,num4,oper3);//将前三个数的结果和第三个数进行4次运算if(end3==24){if(oper1<=1&&oper2>=2)//如果第一个运算符为+或-第二个运算符为*或/printf("(%.f%c%.f)%c%.f%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],nu m3,OperShow[oper3],num4),i++;else if(oper1<=1&&oper2<=1&&oper3>=2)printf("(%.f%c%.f%c%.f)%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],nu m3,OperShow[oper3],num4),i++;else if(oper1>=2&&oper2<=1&&oper3>=2)printf("(%.f%c%.f%c%.f)%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],nu m3,OperShow[oper3],num4),i++;elseprintf("%.f%c%.f%c%.f%c%.f=24\n",num1,OperShow[oper1],num2,OperShow[oper2],num3,Op erShow[oper3],num4),i++;}}}}return i;}float OperVisual(float num1,float num2,int oper){float result;switch(oper){case 0:result=num1+num2;break;case 1:result=num1-num2;break;case 2:result=num1*num2;break;case 3:result=num1/num2;break;}return result;}。
扑克24点游戏JAVA源代码
扑克24点游戏JAVA源代码1.游戏规则简介拿出一副扑克,随机发出四张扑克,要求游戏者随意组合使用+、-、×、÷四种算数方法,寻找能计算出结果为24的方案。
2.源码说明本源码由本人单独完成,使用JAVA作为编码语言,其中使用泛型、枚举,JDK版本你懂的。
下列部分截图:1.类的内部结构图:2.部分方法截图:3.测试方法截图4.结果展示:99478方片7+方片6*方片3-方片1=24.099479方片7+方片5+方片4*方片3=24.099480方片7+方片5*方片4-方片3=24.099481方片7+方片5*方片3+方片2=24.099482方片7*方片4-方片3-方片1=24.099483方片7*方片3+方片2+方片1=24.099484方片6+方片5*方片4-方片2=24.099485方片6*方片5-方片4-方片2=24.099486方片5*方片4+方片3+方片1=24.099487方片4*方片3*方片2*方片1=24.099488方片4*方片3*方片2/方片1=24.013420594276533.源码Puke24Test.java附带正文:package com.test.puke;/**** @author GuanChi* BUG说明:* 1.应该优先计算乘法(10+7/4*8)或(7/4*8+10)两种情况 * 2.组合重复情况是否需要过滤,如上面*/public class Puke24Test{public static void serviceExce(){int count = 0;Puke24Test puke24 = new Puke24Test();PokerContainer PokerContainer = puke24.new PokerContainer();java.util.TreeSet<Poker> sPokers = PokerContainer.getPokers();java.util.TreeMap<String, Poker> mPokers =puke24.getTreeMapPokersByTreeSet(sPokers);Poker[] Pokers4 = new Poker[4];for (int i = 1; i <= mPokers.size(); i++){Pokers4[0] = mPokers.get(""+i);for (int j = i+1; j <= mPokers.size(); j++){Pokers4[1] = mPokers.get(""+j);for (int k = j+1; k <= mPokers.size(); k++){Pokers4[2] = mPokers.get(""+k);for (int l = k+1; l <= mPokers.size(); l++){Pokers4[3] = mPokers.get(""+l);Expression24[] exps = calcBy4Pokers(Pokers4);for (int m = 0; m < exps.length; m++){if (null != exps[m] && 24 == exps[m].getResult()){System.out.println(""+ ++count+exps[m]);}}}}}}// 按次序获取四张牌,轮询所有组合方式,轮询所有计算方式,获取结果为24的}public static Expression24[] calcBy4Pokers(Poker[] pokers4){Expression24[] exps = new Expression24[4*4*4*4*4*4*4];int n=0;// 第一个计算符号for (byte i = 1; i <= 4; i++){// 第二个计算符号for (byte j = 1; j <= 4; j++){// 第三个计算符号for (byte k = 1; k <= 4; k++){// 第一个计算扑克牌for (int a = 1; a <= 4; a++){// 第二个计算扑克牌for (int b = a+1; b <= 4; b++){// 第二张拍的脚码不能大于4,并且不能和前面牌重复if (b>4){b=-4;}// 第三个计算扑克牌for (int c = b+1; c <= 4; c++){// 第三张拍的脚码不能大于4,并且不能和前面牌重复if (c>4){c=-4;}// 第四个计算扑克牌for (int d = c+1; d <= 4; d++){// 第四张拍的脚码不能大于4,并且不能和前面牌重复if (d>4){d=-4;}// 计算单个算式的值exps[n++] = calcByExp(pokers4[a-1],Math.convertByteType2CS(i),pokers4[b-1],Math.convertByteType2CS(j),pokers4[c-1],Math.convertByteType2CS(k),pokers4[d-1]);}}}}}}}return exps;}/*** 给定三个计算符号的顺序,把四张牌轮流各个位置,计算出结果* @param poker 第一张扑克* @param j 第一个计算符号* @param poker2 第二张扑克* @param k 第二个计算符号* @param poker3 第三张扑克* @param l 第三个计算符号* @param poker4 第四张扑克* @return 表达式* @attention ?代表未知符号在该方法注释里面*/private static Expression24 calcByExp(Poker poker, Math.CountSymbol j, Poker poker2,Math.CountSymbol k, Poker poker3, Math.CountSymbol l, Poker poker4) {double d = 0;// 当第一个计算符号为乘号或者除号的时候,先计算乘除法(如,1*2?3?4)if (j==Math.CountSymbol.MUL || j==Math.CountSymbol.DIV){d = Math.calc(poker.getNumber(),j,poker2.getNumber());//当第二个符号也为乘除法的时候,用第一次计算的值和第三个数相乘除,然后直接和第四个数字计算(如,1*2*3?4)if (k==Math.CountSymbol.MUL || k==Math.CountSymbol.DIV){d = Math.calc(d,k,poker3.getNumber());d = Math.calc(d,l,poker4.getNumber());}// 当第二个符号不为乘除法,第三个符号为乘除法的时候,先计算第三、第四个数,然后把第一次计算和这次计算结果相运算(如,1*2-3*4)else if (l==Math.CountSymbol.MUL || l==Math.CountSymbol.DIV){double d2 = Math.calc(d,l,poker4.getNumber());d = Math.calc(d,l,d2);}// 当第二个符号不为乘除法,第三个符号也不为乘除法的时候,一口气计算完毕(如,1*2+3-4)else{d = Math.calc(d,k,poker3.getNumber());d = Math.calc(d,l,poker4.getNumber());}}// 第一个符号不为乘除法的时候,第二个符号为乘除法的时候(如,1+2*3?4) else if (k==Math.CountSymbol.MUL || k==Math.CountSymbol.DIV){d = Math.calc(poker2.getNumber(),k,poker3.getNumber());d = Math.calc(d,l,poker4.getNumber());d = Math.calc(poker.getNumber(),j,d);}// 第一个符号不为乘除法的时候,第二个符号不为乘除法的时候,第三个符号为乘除法的时候(如,1+2-3*4)else if (l==Math.CountSymbol.MUL || l==Math.CountSymbol.DIV){d = Math.calc(poker3.getNumber(),l,poker4.getNumber());double d2 = Math.calc(poker.getNumber(),j,poker2.getNumber());d = Math.calc(d,k,d2);}// 第一个符号不为乘除法的时候,第二个符号不为乘除法的时候,第三个符号不为乘除法的时候(如,1+2-3+4)else{d = Math.calc(poker.getNumber(),j,poker2.getNumber());d = Math.calc(d,k,poker3.getNumber());d = Math.calc(d,l,poker4.getNumber());}Expression24 exp24 = newExpression24(poker,j,poker2,k,poker3,l,poker4);exp24.setResult(d);return 24 == d ? exp24: null;// TODO Auto-generated method stub}/*** 加减乘除24的表达式* @author GuanChi* 包含4张扑克以及中间的三个运算符号,还有计算结果*/static class Expression24{/** 第一张扑克 **/private Poker poker1;/** 第一个运算符号 **/private Math.CountSymbol countSymbols1;/** 第二张扑克 **/private Poker poker2;/** 第二个运算符号 **/private Math.CountSymbol countSymbols2;/** 第三张扑克 **/private Poker poker3;/** 第三个运算符号 **/private Math.CountSymbol countSymbols3;/** 第四张扑克 **/private Poker poker4;/** 结果 **/private double result;/*** 构造方法,初始化时必须提供4张扑克和三个运算符号* @param poker1 第一张扑克* @param countSymbols1 第一个运算符号* @param poker2 第二张扑克* @param countSymbols2 第二个运算符号* @param poker3 第三个张扑克* @param countSymbols3 第三个运算符号* @param poker4 第四个张扑克*/public Expression24(Poker poker1, Math.CountSymbol countSymbols1, Poker poker2,Math.CountSymbol countSymbols2, Poker poker3, Math.CountSymbol countSymbols3, Poker poker4){super();this.poker1 = poker1;this.countSymbols1 = countSymbols1;this.poker2 = poker2;this.countSymbols2 = countSymbols2;this.poker3 = poker3;this.countSymbols3 = countSymbols3;this.poker4 = poker4;}public void setResult(double result){this.result = result;}public double getResult(){return result;}public Poker getPoker1(){return poker1;}public void setPoker1(Poker poker1){this.poker1 = poker1;}public Math.CountSymbol getCountSymbols1(){return countSymbols1;}public void setCountSymbols1(Math.CountSymbol countSymbols1) {this.countSymbols1 = countSymbols1;}public Poker getPoker2(){return poker2;}public void setPoker2(Poker poker2){this.poker2 = poker2;}public Math.CountSymbol getCountSymbols2()return countSymbols2;}public void setCountSymbols2(Math.CountSymbol countSymbols2){this.countSymbols2 = countSymbols2;}public Poker getPoker3(){return poker3;}public void setPoker3(Poker poker3){this.poker3 = poker3;}public Math.CountSymbol getCountSymbols3(){return countSymbols3;}public void setCountSymbols3(Math.CountSymbol countSymbols3){this.countSymbols3 = countSymbols3;}public Poker getPoker4(){return poker4;}public void setPoker4(Poker poker4){this.poker4 = poker4;}/*** 打印时候需要把字符拼接成一般能看懂的格式,包含+、-、*、/的格式*/public String toString(){return new StringBuilder().append(null==this.poker1?null:""+this.poker1.getColor()+this.poker1.ge tNumber()).append(""+(this.countSymbols1==Math.CountSymbol.ADD?"+":(this.countSym bols1==Math.CountSymbol.SUB?"-":(this.countSymbols1==Math.CountSymbol.MUL?".append(null==this.poker2?null:""+this.poker2.getColor()+this.poker2.ge tNumber()).append(""+(this.countSymbols2==Math.CountSymbol.ADD?"+":(this.countSym bols2==Math.CountSymbol.SUB?"-":(this.countSymbols2==Math.CountSymbol.MUL?" *":"/")))).append(null==this.poker3?null:""+this.poker3.getColor()+this.poker3.ge tNumber()).append(""+(this.countSymbols3==Math.CountSymbol.ADD?"+":(this.countSym bols3==Math.CountSymbol.SUB?"-":(this.countSymbols3==Math.CountSymbol.MUL?" *":"/")))).append(null==this.poker4?null:""+this.poker4.getColor()+this.poker4.ge tNumber()).append("="+this.result).toString();}}/*** 从TreeSet里面获取TreeMap* @param sPokers 扑克牌TreeSet容器* @return 排列好的扑克牌TreeMap容器*/public java.util.TreeMap<String, Poker>getTreeMapPokersByTreeSet(java.util.TreeSet<Poker> sPokers){java.util.Iterator<Poker> iPokers = sPokers.iterator();java.util.TreeMap<String, Poker> mPokers = newjava.util.TreeMap<String, Poker>();int i = 0;while (iPokers.hasNext()){Poker poker = iPokers.next();// System.out.println(""+Poker.getColor()+Poker.getNumber());// 按顺序把扑克塞进map容器里面,方便拿取mPokers.put(""+ ++i, poker);}return mPokers;}/*** 扑克牌容器-牌盒子* @author GuanChi* 成员变量Pokers里面放置了一副扑克,共52张,会在第一次实例化时初始化 */class PokerContainer{/** 扑克牌容器 **/private java.util.TreeSet<Poker> tpokers = newjava.util.TreeSet<Poker>();/*** 构造方法,第一次实例化时候初始化扑克牌容器*/public PokerContainer(){super();if (0 == this.tpokers.size()){init();}}/*** 初始化扑克牌容器,把52张扑克放入牌盒子*/private void init(){// 选择1~13,分别对应扑克牌里面的A23~JQK.for (int i = 1;i <= 13; i++){// 选择四种不同的花色for (int j = 1;j <= 4; j++){Poker.Color color = null;switch (j){case 1:color = Poker.Color.黑桃;break;case 2:color = Poker.Color.红桃;break;case 3:color = Poker.Color.梅花;break;case 4:color = Poker.Color.方片;break;default:System.err.println("Error Occur!!");break;}// 给容器里面添加一张扑克牌this.tpokers.add(new Poker(color,i));}}}public java.util.TreeSet<Poker> getPokers(){return tpokers;}}/*** 扑克牌类型* @author GuanChi* 该类型包含两个成员变量:花色color和数字number**/static class Poker implements parable<Poker> {/*** 枚举类型-花色* @author GuanChi* 包含黑红梅方四种类型*/static enum Color{/** 黑桃 **/黑桃,/** 红桃 **/红桃,/** 梅花 **/梅花,/** 方片 **/方片}/** 扑克牌的大小点数 **/private int number;/** 扑克牌的花色 **/private Color color = null;/*** 初始化一张扑克牌,包含颜色和点数* @param color 颜色* @param number 点数*/public Poker(Color color, int number) {super();this.color = color;this.number = number;}public int getNumber(){return number;}public void setNumber(int number) {this.number = number;}public Color getColor(){return color;}public void setColor(Color color) {this.color = color;}public boolean equals(Object obj) {Poker Poker = (Poker)obj;return (Poker.getColor().equals(this.color)) && (Poker.getNumber() == this.number);}public int compareTo(Poker Poker){return Poker.number - this.number + Poker.color.hashCode() - this.color.hashCode();}}/*** 数学运算类型* @author GuanChi* 该类型提供基本的加减乘除运算静态方法*/static class Math{static enum CountSymbol{/** 加法 **/ADD,/** 减法 **/SUB,/** 乘法 **/MUL,/** 除法 **/DIV,/** 错误类型 **/ERROR,}static byte convertCSType2Byte(CountSymbol cs){// 初始化结果byte b = 0;// 根据符号来用Math中不同的方法switch (cs){// 加法case ADD:b = 1;break;// 减法case SUB:b = 2;break;// 乘法case MUL:b = 3;break;// 除法case DIV:b = 4;break;default:b = 0;}return b;}static CountSymbol convertByteType2CS(byte b) {// 初始化结果CountSymbol cs;// 根据符号来用Math中不同的方法switch (b){// 加法case 1:cs = Math.CountSymbol.ADD;break;// 减法case 2:cs = Math.CountSymbol.SUB;break;// 乘法case 3:cs = Math.CountSymbol.MUL;break;// 除法case 4:cs = Math.CountSymbol.DIV;break;default:return cs = CountSymbol.ERROR;}return cs;}static double calc(double d1,CountSymbol cs,double d2) {// 初始化结果double d = 0;// 根据符号来用Math中不同的方法switch (cs){// 加法case ADD:d = Math.add(d1, d2);break;// 减法case SUB:d = Math.sub(d1, d2);break;// 乘法case MUL:d = Math.mul(d1, d2);break;// 除法case DIV:d = Math.div(d1, d2);break;default:d = 0;}return d;}static double calc(int d1,CountSymbol cs,int d2){// 初始化结果double d = 0;// 根据符号来用Math中不同的方法switch (cs){// 加法case ADD:d = Math.add(d1, d2);break;// 减法case SUB:d = Math.sub(d1, d2);break;// 乘法case MUL:d = Math.mul(d1, d2);break;// 除法case DIV:d = Math.div(d1, d2);break;default:d = 0;}return d;}static double calc(double d1,CountSymbol cs,int d2) {// 初始化结果double d = 0;// 根据符号来用Math中不同的方法switch (cs){// 加法case ADD:d = Math.add(d1, d2);break;// 减法case SUB:d = Math.sub(d1, d2);break;// 乘法case MUL:d = Math.mul(d1, d2);break;// 除法case DIV:d = Math.div(d1, d2);break;default:d = 0;}return d;}static double calc(int d1,CountSymbol cs,double d2) {// 初始化结果double d = 0;// 根据符号来用Math中不同的方法switch (cs){// 加法case ADD:d = Math.add(d1, d2);break;// 减法case SUB:d = Math.sub(d1, d2);break;// 乘法case MUL:d = Math.mul(d1, d2);break;// 除法case DIV:d = Math.div(d1, d2);break;default:d = 0;}return d;}/*** 加法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 加法运算结果*/static double add(double number1, double number2) {}/*** 加法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 加法运算结果*/static int add(int number1, int number2){return number1 + number2;}/*** 加法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 加法运算结果*/static double add(int number1, double number2) {return number1 + number2;}/*** 加法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 加法运算结果*/static double add(double number1, int number2) {return number1 + number2;}/*** 减法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 减法运算结果*/static double sub(double number1, double number2) {}/*** 减法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 减法运算结果*/static int sub(int number1, int number2){return number1 - number2;}/*** 减法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 减法运算结果*/static double sub(int number1, double number2) {return number1 - number2;}/*** 减法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 减法运算结果*/static double sub(double number1, int number2) {return number1 - number2;}/*** 乘法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 乘法运算结果*/static double mul(double number1, double number2) {return number1 * number2;}/*** 乘法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 乘法运算结果*/static int mul(int number1, int number2){return number1 * number2;}/*** 乘法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 乘法运算结果*/static double mul(int number1, double number2) {return number1 * number2;}/*** 乘法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 乘法运算结果*/static double mul(double number1, int number2) {return number1 * number2;}/*** 除法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 除法运算结果*/static double div(double number1, double number2) {double d = 1;return 0 == number2 ? 0 : d * number1/ number2;}/*** 除法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 除法运算结果*/static double div(int number1, int number2){double d = 1;return 0 == number2 ? 0 : d * number1/ number2;}/*** 除法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 除法运算结果*/static double div(double number1, int number2){double d = 1;return 0 == number2 ? 0 : d * number1/ number2;}/*** 除法* @param number1 第一个运算数字* @param number2 第二个运算数字* @return 除法运算结果*/static double div(int number1, double number2){double d = 1;return 0 == number2 ? 0 : d * number1/ number2;}}/*** 卡片工厂* @author GuanChi* 提供一个工厂实例创建卡片*/// static class PokerFactory// {// private static PokerFactory instance = null;// public synchronized static PokerFactory getInstance()// {// if (null == instance)// {// instance = new PokerFactory();// }// return instance;// }//// public Poker createPoker(Color color, int number)// {// return new Poker(color, number);// }// }public static void testAdd24(){int no = 1;final byte[] PUKE_NUMBERS = {1,2,3,4,5,6,7,8,9,10,11,12,13};for (int i = 0;i < 13; i++){for (int j = i;j < 13; j++){for (int k = j;k < 13; k++){for (int l = k;l < 13; l++){int result = PUKE_NUMBERS[i] + PUKE_NUMBERS[j]+ PUKE_NUMBERS[k]+ PUKE_NUMBERS[l];if (result == 24){System.out.println(""+no+"→1:"+PUKE_NUMBERS[i] + "; 2:" + PUKE_NUMBERS[j] + "; 3:" + PUKE_NUMBERS[k] + "; 4:" + PUKE_NUMBERS[l]);no++;}}}}}}public static void testPoker52(){PokerContainer c = new Puke24Test().new PokerContainer();java.util.TreeSet<Poker> s = c.getPokers();System.out.println(s.size());}public static void testEqualsPoker(){System.out.println(new Poker(Poker.Color.方片,1).equals(new Poker(Poker.Color.黑桃,1)));}public static void testDiv(){System.out.println(Math.div(5, 3));}public static void main(String[] args){System.out.println(System.currentTimeMillis());// Puke24Test.testAdd24();// Puke24Test.testPoker52();// Puke24Test.testEqualsPoker();// Puke24Test.testDiv();Puke24Test.serviceExce();System.out.println(System.currentTimeMillis());}}。
C++扑克牌游戏---抽王八_代码
….H头文件,.cpp执行文件//Card.hclass Player;void gotoxy(int x,int y);class Card{private:int amount;char color; //3 red 4 square 5 plum 6 blackCard * pcard;public:Card():amount(14),color(3){}void set(int ,char);void show(int x=0,int y=0); //横着输// void print(int =0,int y=0); // 背面show 正面print 背面stand 竖的line 封底// void showstand(int x=0,int y=0); //竖着输出// void printstand(int x=0,int y=0); //背面// void showstandline(int x=0,int y=0);// void printstandline(int x=0,int y=0);// void printline(int x=0,int y=0);void showline(int x=0,int y=0); //作为封底用的void setpcard(Card *);void exact(int no); //精确输出JQKACard * backpcard();int backamount();friend void Giveout(Player *,int);friend void showplayer(Player *player,int n);};//Player.hclass Card;class Player{private:int number;int Flag;Card * phead;public:Player():number(0),phead(0){}Card* & backph(); //外部接口int & backflag();int & backno();void showcard(int,int); //需要player的位置坐标void setpp(Card *);friend void change(Player &player);friend void Giveout(Player * ,int);friend void showplayer(Player *player,int n);};//Game.h#include"Card.h"#include"Player.h"void cancel(Card *pc,Card * &ph);void canceldouble(Player *player,int n) ;void Giveout(Player * player,int a);void showplayer(Player *player,int n);void vircancel(Card *pc,Player & player) ;void comparecard(Player & player,Card * pc);Card *find(Card * ph,int n) ;void index(Card * &ph,Card *pc,int n);int playgame(Player * player,int n) ;void introduction();void end();//Card的实现#include<iostream>#include"Card.h"#include<stdlib.h>using namespace std;//enum Color {red,black,square,plum};//gotoxy()函数#include <windows.h> //void gotoxy(int y,int x)// vc下没有,要自定义!{COORD To = {x,y};SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),To); }void Card::exact(int no){if(no<11)cout<<no;else{switch(no){case 11:cout<<'J';break;case 12:cout<<'Q';break;case 13:cout<<'K';break;case 14:cout<<'A';break;case 15:cout<<"王";break;}}}void Card::show(int x,int y) //可以定位的{int i=0;gotoxy(x,y); //使用gotoxy语句代替回车换行,可以具体定位cout<<"/"<< "--------";gotoxy(x+1,y);cout<<"| " ;exact(amount);gotoxy(x+2,y);cout<<"| "<<color;for(i=0;i<3;i++){gotoxy(x+3+i,y);cout<<"|";}gotoxy(x+3+i,y);cout<<'\\';cout<<"--------";}void Card::showline(int x,int y){int i=0;cout<<"--";cout<<'\\';for(i=0;i<3;i++){gotoxy(x+i+1,y+2);cout<<"|";}gotoxy(x+1+i,y );cout<<color;cout<<" |";gotoxy(x+2+i,y );exact(amount);if(amount==10 || amount==15)cout<<"|";elsecout<<" |" ;gotoxy(x+3+i,y );cout<<"--/";}/*void Card:: print(int x,int y){int i=0;gotoxy(x,y); //使用gotoxy语句代替回车换行,可以具体定位cout<<"/"<< "--------";gotoxy(x+1,y);cout<<"| " ;gotoxy(x+2,y);cout<<"| " ;for(i=0;i<3;i++){gotoxy(x+3+i,y);cout<<"|";}gotoxy(x+3+i,y);cout<<'\\';cout<<"--------";}void Card::printline(int x,int y){int i=0;cout<<"--";cout<<'\\';for(i=0;i<3;i++){gotoxy(x+i+1,y+2);cout<<"|";}gotoxy(x+1+i,y );cout<< " |";gotoxy(x+2+i,y );cout <<" |" ;gotoxy(x+3+i,y );cout<<"--/";} //做好一个先吧,恩,好的,哈哈!void Card::showstand(int x ,int y){gotoxy(x,y);cout<<"/--------\\";gotoxy(x+1,y);cout<<"| ";exact(amount);cout<<" |";gotoxy(x+2,y);cout<<"| "<<color<<" |";for(int i=0;i<2;i++){gotoxy(x+3+i,y);cout<<"| |";}}void Card::showstandline(int x,int y){x=x+5;gotoxy(x,y);cout<<"| "<<color<<" |";gotoxy(x+1,y);cout<<"| ";exact(amount);cout<<" |";gotoxy(x+2,y);cout<<"\\--------/";}void Card::printstand(int x,int y) {gotoxy(x,y);cout<<"/--------\\";gotoxy(x+1,y);cout<<"| |";gotoxy(x+2,y);cout<<"| |";for(int i=0;i<2;i++){gotoxy(x+3+i,y);cout<<"| |";}}void Card:: printstandline(int x,int y) {x=x+5;gotoxy(x,y);cout<<"| |";gotoxy(x+1,y);cout<<"| |";gotoxy(x+2,y);cout<<"\\--------/";}*/void Card::set(int a,char b){amount=a;color=b;pcard=0;}void Card::setpcard(Card *pc){pcard=pc;}Card* Card::backpcard(){return pcard;}int Card::backamount(){}PLayer的实现#include<iostream>#include"Player.h"#include"Card.h"//#include<stdlib.h>//#include<time.h>using namespace std;void Player::setpp(Card *pc){phead=pc;}Card * & Player::backph(){return phead;}int & Player::backflag(){return Flag;}int& Player::backno(){//int &b=number;return number;}void Player::showcard(int x=0,int y=0) //显示一个player中的牌{int count=0;Card *ph=phead;if(ph){while(ph->backpcard()) //挑出最后一个{if(count==13){ph->show(x,y);ph->showline(x,y+6);x=x+8;y=0;gotoxy(x,y);ph=ph->backpcard();}ph->show(x,y);ph=ph->backpcard();count++;y+=5;//gotoxy(y,1);}ph->show(x,y);ph->showline(x,y+6);}}//Game#include"Game.h"#include<stdlib.h>#include<time.h>#include<iostream>using namespace std;void cancel(Card *pc,Card * &ph){Card * q=ph;if(pc==ph) //头指针时{ph=ph->backpcard(); //转移pheaddelete pc;}else{while((q!=0) && (q->backpcard()!=pc)){q=q->backpcard();}q->setpcard(pc->backpcard()); //前一个接后一个delete pc;}}void canceldouble(Player *player,int n){for(int i=0;i<n;i++){Card * & ph=player[i].backph();Card *ph2=0,*ph1=0,*ph3=ph; //玩家牌的头指针int & num=player[i].backno(); //玩家牌数ph1=ph3;ph2=ph1->backpcard();for(int j=0;j<num-1 && ph1->backpcard()!=0 && ph3 !=0 ;j++)//张数次数//判别double{int flag=1;for(int k=j+1;k<num && ph2!=0;k++) //判断并删除重复的牌{if(ph1->backamount()==ph2->backamount()) //注意大王{if(ph1->backpcard()==ph2)ph3=ph2->backpcard();elseph3=ph1->backpcard(); //接下一个对象cancel(ph1,ph);cancel(ph2,ph);num-=2;flag=0;j-=1;break;}ph2=ph2->backpcard();}if(flag)ph3=ph1->backpcard(); //外层循环ph1=ph3;if(ph1!=0)ph2=ph1->backpcard();}}}void Giveout(Player * player,int a) //发牌4份{srand(time(0)); //每一局牌都不一样int random[52]={0},count=0,judge=0;for(int i=0;i<a;i++) //产生N个player{Card *phead=0,*pnew=0,*ptail=0;int & no=player[i].backno();do{int number1,number2;int flag=1;pnew=new Card;number1=rand()%52+8; //8--59for(int j=0;j<count;j++) //判断随机产生的数是否会重复,避免重复的!{if(random[j]==number1)flag=0;}if(flag) //不重复时新建card{random[count]=number1;count++; //number2=number1/4; //2--14 点数number1=number1%4+3; //3--6 花色if(random[count-1]==35)pnew->set(15,0);elsepnew->set(number2,number1);if(!phead)phead=ptail=pnew;else{ptail->setpcard(pnew); //连接下一个的地址ptail=pnew; //新生成的变为tail}no++; //记录player中的牌数}if(i<52%a)judge=52/a+1;else //每个player的定牌数judge=52/a;}while(no<judge && count<52);player[i].setpp(phead);}}void showplayer(Player *player,int n){int j=0,x=0;for(j=0;j<n;j++){int y=0;cout<<"the card of player "<<j+1<<" :"<<player[j].backno()<<"张";player[j].showcard(x+1,y);x=x+8*(player[j].backno()/14+1); //具体的距离由玩家的牌数确定!!cout<<endl;}}/*void printplayer(Player *player,int n){int j=0,i=0;for(j=0;j<n;j++){cout<<"player "<<j+1<<" :"<<player[j].backno()<<"张";player[j].printcard( );// x=x+8*(player[j].backno()/14+1); //具体的距离由玩家的牌数确定!!cout<<endl;}}*/int playgame(Player * player,int n) //输出玩家号{int no=0,count=0; //记录没牌的玩家数//判定玩家是否有牌,几个人有牌并标记int max=player[0].backno(),b=0;for(int a=1;a<n;a++){if(max<player[a].backno()){max=player[a].backno();b=a;}}cout<<"Begin from the player " <<1+b<<" who has the most cards "<<endl<<endl; for(int i=b;i<n;i++){count=0;for(int j=0;j<n;j++){cout<<"the number of "<<j+1 <<" player's cards:";cout<<player[j].backno()<<endl;int &x=player[j].backflag();if(player[j].backno()==0){cout<<"00"<<endl;count++;x=0;}else{cout<<"!!"<<endl;x=1;}}if(count<n-1){while(player[i].backflag()==0 ) //确保被抽取的有牌{i++;if(i==n)i=0;}cout<<"玩家"<<i+1<<" 抽取";int reserve=i;if(i==n-1)i=-1;while(player[i+1].backflag()==0 )i++;if(i==n-1)i=-1;}cout<<"玩家"<<i+2<<"的第N张牌:输入N(>0):";do{cin>>no;if(no<=0)cout<<"reinput!";}while(no<=0);getchar();while( no<0 || no>player[i+1].backno()){cout<<"数据无效,重输:";cin>>no; //有效性}Card *ph=find(player[i+1].backph(),no); //抽到牌的地址而后就在i+2中假删除vircancel(ph,player[i+1]);//架空comparecard(player[reserve],ph); //较牌}elsebreak;}int k=0;for( k=0;k<n;k++){if(player[k].backflag())break;}return k;}void vircancel(Card *pc,Player & player) //架空{Card *&ph=player.backph();Card * q=ph;if(pc==ph) //头指针时ph=ph->backpcard(); //转移pheadelse{while((q!=0) && (q->backpcard()!=pc)){q=q->backpcard();}q->setpcard(pc->backpcard()); //前一个接后一个}player.backno()-=1;}Card *find(Card * ph,int n) //返回找到的地址{int count=1;if(n==0)return 0;else{for(;count!=n;) //n==0时,会无限循环,到ph==0时,空指向会报错的{ph=ph->backpcard();count++;}return ph;}}void comparecard(Player & player,Card * pc){int flag=1;// char ch;Card *phead=player.backph();while(phead!=0){if(pc->backamount()==phead->backamount()) //相同{cout<<"\n有相同的牌^_^ ";cout<<" 输出相同的牌";system("pause");system("cls");pc->show(1,0); //showpc->showline(1,6); //缺位置坐标phead->show(1,10);phead->showline(1,16); //删除cout<<endl;cancel(phead,player.backph());delete pc;player.backno()-=1;flag=0;break;}phead=phead->backpcard();}//不同if(flag){cout<<"\n没有找到相同的牌! ";system("pause");/*do{ch=getchar();}while(ch!=10);*/system("cls");int x=0; //插入位置srand(time (0));x=rand()%(player.backno()+1);index(player.backph(),pc,x);player.backno()+=1;}}void index(Card *& ph,Card *pc,int n){Card * pn=find(ph,n); //注意n的取值可能为零的if(n==0){pc->setpcard(ph);ph=pc;}else{pc->setpcard(pn->backpcard());pn->setpcard(pc);}}void change(Player &player){Card * &pc=player.backph(),*px;Card * pt=pc->backpcard();px=pc;if(pc->backamount()< pt->backamount()){pc->setpcard(0);pc=pt;pc->setpcard(px);}}void introduction(){cout<<endl<<endl<<"\t\t\t欢迎进入本游戏!"<<endl;cout<<"\n\t\t本游戏起源于四小鬼争夺霸王称号的传说!"<<endl<<"\n\t他们通过玩了一局扑克牌游戏,定出谁是获得者.最后一小鬼胜出赢得此称号.";cout<<"\n\n\t可是其他三小鬼不服气,就暗暗商议,决定大唱反调,称他为王霸."<<"\n\n\t 三小鬼笑翻了天,引来其他小鬼.";cout<<"\n\n \t 其他小鬼觉得有意思,就争相玩了起来,并更改为(王8).\n\n\t以此来和扑克映衬,小乐以借此消磨那些没乐趣的时光!"<<endl;cout<<"\n\n\t\ Now 小鬼们,来试试吧,看看谁是传说中的……!"<<" 啊……哈哈哈"<<endl;}void end(){cout<<endl<<endl<<"\t\t谢谢! 祝你下次游戏愉快!\n";}//主函数#include"Game.h"#include<iostream>#include<stdlib.h>using namespace std;void main(){char choice;do{int n=0,flag=0;/* Card pc;pc.set(8,4);pc.show(0,0);pc.showline(0,9);cout<<endl;*/introduction();system("pause");//引入语cout<<"\t Input the number of player:"; //要N个玩家cin>>n;getchar();Player *player=new Player[n];cout<<"随机给玩家发牌: " ;system("pause");system("cls");Giveout(player,n); //给玩家发牌showplayer(player,n);cout<<"输出除对后玩家的的牌";system("pause");system("cls"); //清屏canceldouble(player,n); //删除重复的牌showplayer(player,n); //显示玩家的牌cout<<" 正式开始游戏: ";system("pause");system("cls"); //清屏flag=playgame(player,n);cout<<"\n\nloser is player "<<flag+1<<endl;gotoxy(13,0);cout<<"\nNow we know who is the …… \n ";system("pause");change(player[flag]);player[flag].showcard(12,35);system("pause");gotoxy(23,0);cout<<" hah ,let's yell out loudly ……\n\n";cout<<"\t hah. 啊哈哈哈\n";system("pause");cout<<"\n\n\tWell done \n\n";system("pause");end();cout<<"任意键继续, N 结束游戏!"<<endl;cin>>choice;}while(!(choice=='n'||choice=='N'));}。
C#代码实现扑克牌排序的几种方式
C#代码实现扑克牌排序的⼏种⽅式扑克牌游戏,总是能⽤到很多的⼿牌排序,总结了⼏种⽅式供参考,顺便记录⼀下⽅便以后使⽤。
我做的这个是由(1-13:⿊桃A-K || 14 - 26:红桃 || 27 - 39:梅花 || 39 - 52 : ⽅⽚ || 53.54:⼩王.⼤王)表⽰的⼀副扑克牌,这样对数组除以13等于扑克花⾊(如:25/13 = 2 是红桃),对数组值取模等于扑克点数(如:25%13 = 12 是Q),这样25就表⽰了红桃Q的扑克牌。
当处理特殊规则的时候单独写⼀个List,在组拼就可以了。
⽐如说:赖⼦⽃地主的时候,当选出赖⼦牌之后,就需要对⼿牌再次排序,那么new List来存⼀下赖⼦牌,选定赖⼦牌之后,存到list中,再次调⽤排序,组拼就可以实现,你想要的⼿牌排序的数组,那么在通过某种形式让他显⽰出来就可以了。
上代码://参数:要排序的牌值数组 & 数组长度public int[] PaiXu(int[] card, int number = 0){//Debug.Log(" ... 对⼿牌进⾏牌值花⾊的排序 ... ... ");if (number == 0){ number = card.Length; }if (card.Length == 0){ return card; }// ========== 根据牌值进⾏排序 ===============int temp = 0;for (int i = 0; i < card.Length; i++) //冒泡排序... 从⼤到⼩{for (int j = 0; j < card.Length - 1 - i; j++){if (card[j] < card[j + 1]){temp = card[j];card[j] = card[j + 1];card[j + 1] = temp;}}}List<int> hei = new List<int>();List<int> hong = new List<int>();List<int> mei = new List<int>();List<int> fang = new List<int>();List<int> wang = new List<int>();for (int i = 0; i < card.Length; i++){#region ======= 根据花⾊分组 ..⼤⼩王单独⼀组 ...后续对花⾊中的 A 单独处理 =========switch (sendFlower(card[i])){case 3: //⿊桃hei.Add(card[i]);break;case 2: //红桃hong.Add(card[i]);break;case 1: //梅花mei.Add(card[i]);break;case 0: //⽅⽚fang.Add(card[i]);break;case 4: //⼩王case 5: //⼤王wang.Add(card[i]);break;}#endregion}QuA(hei); // 对A 的单独处理QuA(hong);QuA(mei);QuA(fang);#region ========== 合并排序后的牌组========List<int> cardlist = new List<int>();for (int i = 0; i < wang.Count; i++) //王{cardlist.Add(wang[i]);}// ==========合并组拼 ============List<int> cardtemp = new List<int>();cardtemp = PaiXuZuPin(hei, hong, mei, fang);for (int i = 0; i < cardtemp.Count; i++){cardlist.Add(cardtemp[i]);}int[] cards = new int[cardlist.Count];for (int i = 0; i < cardlist.Count; i++){cards[i] = cardlist[i];}#endregionreturn cards;}/// <summary>/// 取A -- 把每个花⾊牌中的A,放到前⾯(A.K.Q.J...)/// </summary>/// <param name="hei">花⾊牌</param>void QuA(List<int> hei){if (hei.Count == 0) return;List<int> cardlist = new List<int>();for (int i = 0; i < hei.Count; i++) // 将牌添加到新列表{cardlist.Add(hei[i]);}if (hei.Count > 2){if (hei[hei.Count - 2] % 13 == 1) //如果有两个A (对两幅牌的处理){cardlist.Insert(0, hei[hei.Count - 2]);cardlist.Insert(0, hei[hei.Count - 1]);for (int i = 0; i < hei.Count; i++){hei[i] = cardlist[i];}return;}}if (hei[hei.Count - 1] % 13 == 1) //如果有⼀个A{cardlist.Insert(0, hei[hei.Count - 1]);}for (int i = 0; i < hei.Count; i++){hei[i] = cardlist[i];}}/// <summary>/// 根据传⼊牌组的顺序进⾏组拼/// </summary>public List<int> PaiXuZuPin(List<int> one, List<int> two, List<int> three, List<int> four) {List<int> cardlist = new List<int>();for (int i = 0; i < one.Count; i++){cardlist.Add(one[i]);}for (int i = 0; i < two.Count; i++){cardlist.Add(two[i]);}for (int i = 0; i < three.Count; i++){cardlist.Add(three[i]);}for (int i = 0; i < four.Count; i++){cardlist.Add(four[i]);}return cardlist;}/// <summary>/// 根据牌值取花⾊ 5:⼤王 | 4:⼩王 | 3:⿊桃 | 2:红桃 | 1:梅花 | 0:⽅⽚/// </summary>/// <param name="card"></param>public int sendFlower(int card){if (card >= 1 && card <= 13){return 3;}else if (card >= 14 && card <= 26){return 2;}else if (card >= 27 && card <= 39){return 1;}else if (card >= 40 && card <= 52){return 0;}else if (card == 53){return 4;}return 5;}PS:代码仅供参考,优化⾃⾏处理总结以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
纸牌游戏——数据结构实训代码实训要求:题目十三、纸牌游戏基本要求:⏹一副没有花牌(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<<" "<<"每次只能出一张并且要比别人出的大,"<<endl;cout<<" "<<"如:用户出3,计算机则要出比3大的牌,没有则选择不出;"<<endl; cout<<" "<<"最先出完的人获胜。
"<<endl;}void PlayingCards::fp(){int l,e;//临时储存随机牌数int f;for(int i = 0;i < 5;i++){l = rand()%9 + 2;//玩家得到牌的点数cout<<"发到的牌"<<l<<" ";f = rand()%4+3;while(card1[l-1][f-3] == 1){l = rand()%9 + 2;f= rand()%4+3;}card1[l-1][f-3] = 1;//标记哪些牌被发出b[i] = l ;bhuase[i] = f;e = rand()%9 + 2;//电脑得到牌的点数f = rand()%4+3;while(card1[e-1][f-3] == 1){e = rand()%9 + 2;f = rand()%4+3;}card1[e-1][f-3] = 1;//标记哪些牌被发出c[i] = e;chuase[i] = f;}}void PlayingCards::cp(){ int e = 0; int f = 0;int n1 = 0;int n2 = 0;//记录牌打出几张for(int m = 0;m < 5;m++){for(int i = 0;i < 5;i++){for(int j = 0;j < 5;j++){if(b[j] > f&&card2[j][0] == 0)//有牌且比电脑的大{cout<<"玩家出牌"<<bhuase[j]<<b[j]<<endl;card2[j][0] = 1; //标记b(玩家)的第i张牌已经打出e = b[j]; Sleep(800);break;}}n1 = 0;n2 = 0;for(int i = 0;i < 5; i++){n1 = n1 + card2[i][0];//玩家出牌总数n2 = n2 + card2[i][1];//电脑出牌总数}if(n1 == 5){cout<<"玩家赢了";break;}for( j = 0;j < 5;j++){if(c[j] > e && card2[j][1] == 0){cout<<"电脑出牌"<<chuase[j]<<c[j]<<endl;card2[j][1] = 1;f = c[j]; Sleep(800);//把密码转换成ANSCII码break;}}n1 = 0;n2 = 0;for( i = 0;i < 5; i++){n1 = n1 + card2[i][0];//玩家出牌总数n2 = n2 + card2[i][1];//电脑出牌总数}if(n2 == 5){cout<<"电脑赢了";break;}}n1 = 0;n2 = 0;for( i = 0;i < 5; i++){n1 = n1 + card2[i][0];n2 = n2 + card2[i][1];}if(n1 == 5 || n2 == 5)break;if(f > e){e = 0;}if(e > f){f = 0;}//有一方没牌可出了,由牌点数大的那一方继续出牌}}void PlayingCards::xswj(){cout<<"玩家: "<<endl;int i = 0;cout<<" "<<bhuase[0]<<setw(2)<<b[0]<<" "<<" "<<bhuase[1]<<setw(2)<<b[1]<<" "<<" "<<bhuase[2]<<setw(2)<<b[2]<<" "<<""<<bhuase[3]<<setw(2)<<b[3]<<" "<<" "<<bhuase[4]<<setw(2)<<b[4]<<" "<<endl;}void PlayingCards::xsdn(){cout<<"电脑"<<endl;cout<<" "<<chuase[0]<<setw(2)<<c[0]<<" "<<" "<<chuase[1]<<setw(2)<<c[1]<<" "<<" "<<chuase[2]<<setw(2)<<c[2]<<" "<<" "<<chuase[3]<<setw(2)<<c[3]<<" "<<" "<<chuase[4]<<setw(2)<<c[4]<<" "<<endl;}void PlayingCards::qk(){for(int i = 0;i < 5;i++)for(int j = 0;j < 2;j++){card2[i][j] = 0;}for( i = 0;i < 10;i++)for(int j = 0;j < 4;j++){card1[i][j] = 0;//标记发牌}}void tree::chushihua(node *t){t = NULL;}node * tree::charu(node *t , int key)if(t == NULL){node * p;p = (node *)malloc(sizeof(node));//其中(Node *)为强制转换,把返回类型void *转换为Node *,sizeof(Node)为获取Node类型占据空间的大小p->data = key;p->LChild = NULL;p->RChild = NULL;t = p;}else{if(key < t->data)t->LChild = charu(LChild, key);elset->RChild = charu(t->RChild, key);}return t; //important!}node * tree::jianlib(node *t)//建立玩家的树{int i,key;for(i = 0; i < 5; i++){key = a.b[i];t = charu(t, key);}return t;}node * tree::jianlic(node *t)//建立电脑的数{int i,key;for(i = 0; i < 5; i++){key = a.c[i];t = charu(t, key);}return t;void tree::paixu1(node * t) //中序遍历输出{if(t != NULL){paixu1(t->LChild);cout<< t->data<<" ";paixu1(t->RChild);}}void tree::paixu2(node * t,int *p){if( t == NULL)return;else{paixu2(t->LChild,p);a.b[(*p)++] = t->data;paixu2(t->RChild,p);}}void tree::paixu3(node * t,int *p){if( t == NULL)return;else{paixu3(t->LChild,p);a.c[(*p)++] = t->data;paixu3(t->RChild,p);}}int main(){int k =0;srand((unsigned)time(NULL));//调用系统时间为随机函数赋初值int n = 0;while(k != -1){cout<<endl<<endl<<endl;cout<<"\t\t\t"<<" **************纸牌游戏****************"<<endl;cout<<" ******************************************"<<endl;cout<<"\t\t\t"<<" *************1.游戏说明******** "<<endl;cout<<"\t\t\t"<<" *************2.开始游戏********* "<<endl;cout<<"\t\t\t"<<" *************3.开始出牌************* "<<endl;cout<<"\t\t\t"<<" *************4.游戏结束********** "<<endl;cout<<" *************************************"<<endl;cout<<"\t\t\t"<<" 请输入(1、2、3、4) :"<<endl;cin>>k;switch(k){case 1: a.yxsm(); break;case 2:{a.qk();a.fp();node * t1 = NULL; t1 = tr.jianlib(t1);tr.paixu1(t1);//中序遍历输出node * t2 = NULL; t2 = tr.jianlic(t2);n = 0;//初始化tr.paixu2(t1,&n);n = 0;tr.paixu3(t2,&n);cout<<endl;a.xswj();a.xsdn();break;}case 3: {a.cp(); a.qk(); break;}case 4: k = -1; break;}}return 0;}。