南京理工大学C课程设计—扑克游戏_第1页
南京理工大学C课程设计—扑克游戏_第2页
南京理工大学C课程设计—扑克游戏_第3页
南京理工大学C课程设计—扑克游戏_第4页
南京理工大学C课程设计—扑克游戏_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C+课程设计实验报告姓名 郑星鑫 学号 9 班级9131042103 任课教师 赵琦 时间 4月12日 选择题目 扑克牌游戏 难易级别 A级 实验报告成绩 一、 程序功能简介创建一副扑克牌,并完成洗牌等操作。二课程设计要求和目的1. 增加大王和小王。2. 删去一张指定的扑克后,余牌显示。3. 创建一副扑克,显示一副扑克,洗牌,依次发给四个人并显示。4. 需要对原程序做一些修改,保留生成牌和洗牌的部分,主要是修改main函数的结构,依次为:生成牌,洗牌,发牌,然后循环显示菜单,询问是否删除一张,删除一轮,面值排序,花色排序等,在main函数中定义所生成的那副牌,并将其作为参数(对象引用),所有新

2、增类的操作均以那副牌作为数据进行运算。三. 课程设计中要解决的问题分析和调试1.首先,去掉源程序的注释,以免修改程序时自己的注释与源文件注释混淆,便于找出修改程序时可能产生的错误。2.添加大小王:修改类Deck,将一副扑克牌对象内的扑克牌个数增加两张,对这两张牌的面值及花色分别赋值“S”1(小王),“B”2(大王)。3.游戏中四个人玩牌,要新建两个类:Per_Deck类表示某个人拿的牌,Play_Deck类表示四个人玩牌的过程。Perdeck是Deck和PlayDeck的友元类。class Per_Deck public:Playing_Card m_Card20; /最多有20张牌int n

3、Num; /实际张数Per_Deck(); /构造函数void MakePerDeck(Deck &,int,int); /对象初始化void Show(); /显示void SortFace(); /按面值排序void SortSuit(); /按花色排序int Delete(int n); /删除牌号为n的那张;/*四个人玩牌的过程*class Play_Deck public:Per_Deck m_deck4; /一共是四个人玩牌Play_Deck(); /构造函数void PlayCard(Deck &); /用指定的那副牌对四个人分别赋值void Show(); /显

4、示int DeleteOne(int row,int column); /删除参数为第row个人的第column张牌void SortDeckFace(); /对整副牌面值排序void SortDeckSuit(); /对整副牌花色排序 int s(int a); /用于调用私有数据来显示排序后的牌;4. 添加人性化界面,初始运行程序时加了一个友好的界面,用p,u,k,e这四个字母拼成了中文的”扑克”二字,增加游戏的趣味性,并附带输出了自己的姓名和学号。5.在主函数中调用DeckMakeDriver()函数,通过DeckMakeDriver()中的一个do循环控制主菜单的循环出现,并对可能出现

5、的玩家输入问题进行分析修改。5.进入四个不同功能的游戏界面时,操作后询问是否显示被操作后的牌,再询问是否返回主菜单,否的话退出游戏。6.在对玩家的牌的面值以及花色排序时,在类PlayDeck()中增加int s()函数,用于调用私有数据来显示排序完后的牌。四、 源程序结构流程框图与说明 开始生成一副新牌输入洗牌次数进行洗牌依次输入给四位玩家的牌并显示主菜单1删除某位玩家一张牌是否显示牌显示被操作后的牌是否回主菜单是是2删除各位玩家一张牌是否显示牌显示被操作的牌是否回主菜单是是4按玩家牌的花色排序是否显示牌显示操作后的牌是是否回主菜单是按玩家牌的面值排序是否显示牌显示操作后的牌是否回主菜单是结束

6、5显示各位玩家的牌 五.源程序代码 以及草稿原件#include <iostream.h>#include <string.h>#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <time.h>void Program_Init();int main();void Center_Text(char );int get_number();char Get_Key();void DeckMakeDriver();int getRandInt(int

7、min, int max); void prog_close();class PerDeck; /增加class Playing_Card private:int m_Value;char m_Face3; char m_Suit ; public:Playing_Card();void showcard();void Card_Make(int);friend class PerDeck; /增加; class Deckprivate:Playing_Card m_cardarray54; /int m_lastdelt;public:Deck();void MakeDeck();void

8、Deal_One();void ShowDeck();void DeckShuff(int);void Remove_Card();friend class PerDeck; /增加;class PerDeck /增加PerDeckPlaying_Card mCard20;int nNum;public:PerDeck()void MakePerDeck(Deck& ,int);void Show();void SortFace();void SortSuit();int Delete(int n); /endclass PlayDeck /增加PlayDeckPerDeck mDec

9、k4;public:PlayDeck()void PlayCard(Deck&);void Show();int DeleteOne(int row,int column);int DeleteAll(int, int, int, int);void SortDeckFace(int);void SortDeckSuit(int);void s(int); /endvoid PerDeck:MakePerDeck(Deck & d,int a) /PerDeck成员的函数nNum=a;int i=0;while(i<a&&d.m_lastdelt!=53)

10、mCardi+=d.m_cardarray+d.m_lastdelt;void PerDeck:Show()int nNewLine=0;Center_Text("此玩家的牌:");cout<<endl;while(nNewLine<nNum)if(nNewLine%5=0)cout<<endl;mCardnNewLine+.showcard();cout<<endl;void PerDeck:SortFace()Playing_Card k;for(int i=0;i<nNum;i+)for(int j=0;j<nNu

11、m-i-1;j+)if(mCardj.m_Value>mCardj+1.m_Value)k=mCardj; mCardj=mCardj+1;mCardj+1=k;void PerDeck:SortSuit()Playing_Card k;for(int i=0;i<nNum;i+)for(int j=0;j<nNum-i-1;j+)if(mCardj.m_Suit>mCardj+1.m_Suit)k=mCardj;mCardj=mCardj+1;mCardj+1=k;int PerDeck:Delete(int n)if(n>nNum)cout<<&q

12、uot;超出这副牌张数"<<endl;return nNum;elsecout.width(5);cout<<" 删除牌:"mCardn-1.showcard();while(n-1<nNum)mCardn-1=mCardn+;return -nNum; /endvoid PlayDeck:PlayCard(Deck & k) /PlayDeck的成员函数int a,b,c,d;Center_Text("请依次输入给四位玩家的牌数(总张数小于等于54)。");cout<<endl;cin>

13、>a>>b>>c>>d;if(a+b+c+d>54)Center_Text("张数超过牌的张数,退出游戏。");exit(0);mDeck0.MakePerDeck(k,a);mDeck1.MakePerDeck(k,b);mDeck2.MakePerDeck(k,c);mDeck3.MakePerDeck(k,d);void PlayDeck:Show()Center_Text("玩家1");cout<<endl;mDeck0.Show();Center_Text("玩家2"

14、;);cout<<endl;mDeck1.Show();Center_Text("玩家3");cout<<endl;mDeck2.Show();Center_Text("玩家4");cout<<endl;mDeck3.Show();int PlayDeck:DeleteOne(int row,int column)mDeckrow-1.Delete(column);return 1;int PlayDeck:DeleteAll(int a,int b,int c,int d)mDeck0.Delete(a);mDeck

15、1.Delete(b);mDeck2.Delete(c);mDeck3.Delete(d);return 1; void PlayDeck:SortDeckFace(int b)mDeckb-1.SortFace();void PlayDeck:SortDeckSuit(int b)mDeckb-1.SortSuit();void PlayDeck:s(int a)mDecka-1.Show(); /endlint main() srand( (unsigned)time( NULL ) ); int Card_Number = 0;Program_Init(); DeckMakeDriver

16、();prog_close();return 1;Playing_Card:Playing_Card() int i;for(i=1;i<=3;)m_Facei = ' 'i+;m_Suit = ' 'm_Value = 0;void Program_Init()Center_Text("扑克牌游戏");cout << endl <<"n" ; Center_Text("by YoriFish");Center_Text("单击 <Return> 继续

17、");cin.get();char Get_Key()char x;x = cin.get();cout << endl;return x;void Playing_Card:showcard()cout << " "cout << m_Face ;cout.width(1);cout << m_Suit;cout << " "void Center_Text(char ShellText80)int length;int center;length= strlen(ShellText

18、);center = (80 - length)/2;for(;center!=0;center-)cputs(" ");cputs(ShellText);cout<<endl; /增加 int get_number()int Input_Integer = 0;Center_Text("Please enter an integer between 0 and 53. 54 to quit."); /cout << endl;cin >> Input_Integer;return Input_Integer;void

19、 Playing_Card:Card_Make(int num)int i = 0;char j;int face_num = num % 13;if(num/13=4) /增加switch(face_num)case 0: strcpy(m_Face," S");break;case 1: strcpy(m_Face," B");break; else /增加switch(face_num)case 0: strcpy(m_Face," A");break;case 9: strcpy(m_Face,"10");

20、break;case 10: strcpy(m_Face," J");break;case 11: strcpy(m_Face," Q");break;case 12: strcpy(m_Face," K");break;default:j = char(face_num + 49);if(i<3)m_Facei = ' ' i+;m_Facei = j;i+;m_Facei = NULL; break; if(num <= 12)m_Suit = 6;if(num >12 && nu

21、m <= 25)m_Suit = 3;if(num >25 && num <= 38)m_Suit = 5;if(num >38 && num <= 51)m_Suit = 4;if(num=52)m_Suit = 1; /增加if(num=53)m_Suit = 2; /增加if(num>51)m_Value=14;elsem_Value = face_num + 1;void DeckMakeDriver() Deck deck_1;deck_1.MakeDeck();deck_1.ShowDeck();Get_Key()

22、;int b; /增加Center_Text("请输入洗牌次数。");cin>>b; /enddeck_1.DeckShuff(b);deck_1.ShowDeck();cout << endl <<endl << endl;char y;PlayDeck four; /增加four.PlayCard(deck_1);cout<<endl<<endl;four.Show();int a=0;doCenter_Text("*");Center_Text("主菜单")

23、;Center_Text("删除某位玩家一张牌请输入1");Center_Text("删除各位玩家一张牌请输入2.");Center_Text("按玩家的牌面值排序请输入3.");Center_Text("按玩家的牌花色排序请输入4.");Center_Text("显示各位玩家的牌面请输入5.");Center_Text("*");cin>>a;if(a=1)int b,c;char y;cout<<"请输入要删除第几位玩家的第几张牌。&qu

24、ot;<<endl;cin>>b>>c;four.DeleteOne(b,c);cout<<endl<<"是(Y)否(N)显示删除后玩家的牌?"<<endl;cin >> y;y = toupper(y);if(y='Y')four.s(b);cout<<endl;if(a=2)int b,c,d,e;char y;cout<<"请依次输入欲删除各玩家牌的序号。"<<endl;cin>>b>>c&

25、gt;>d>>e;four.DeleteAll(b,c,d,e);cout<<endl<<"是(Y)否(N)显示删除后玩家的牌?"<<endl;cin>>y;y = toupper(y);if(y='Y')four.Show();cout<<endl;if(a=3)int b;char y;cout<<"请输入要对那位玩家排序"<<endl;cin>>b;four.SortDeckFace(b);cout<<&qu

26、ot;是(Y)否(N)显示排序后的牌?"<<endl;cin >> y;y = toupper(y);if(y='Y')four.s(b);if(a=4)int b;char y;cout<<"请输入要对那位玩家排序"<<endl;cin>>b;four.SortDeckSuit(b);cout<<"是(Y)否(N)显示排序后的牌?"<<endl;cin >> y;y = toupper(y);if(y='Y')fou

27、r.s(b);if(a=5)four.Show();cout<<"是(Y)否(N)回到菜单?"<<endl;cin>>y;y = toupper(y);while(y='Y'); /endvoid Deck:MakeDeck()m_lastdelt = 53; /while(m_lastdelt >-1)m_cardarraym_lastdelt.Card_Make(m_lastdelt); m_lastdelt-; void Deck:ShowDeck()int index = m_lastdelt + 1;int

28、 newline = 0;Center_Text("新的一副牌");cout << endl;while(index<=53) /if(newline % 11 = 0) cout << endl;m_cardarrayindex.showcard(); newline+;index+;int getRandInt(int min, int max)int numToReturn;numToReturn = rand();numToReturn = numToReturn % (max - min + 1) + min; return numT

29、oReturn;void Deck:DeckShuff( int times)int x, split; Center_Text("洗牌");cout << endl;for(x=0;x<=times;x+)split = getRandInt(20,35);Deck topdeck;Deck bottomdeck;int i;int bottomdeckindex = 1;int topdeckindex = 1;for(i=0;i<=split - 1;)topdeck.m_cardarraytopdeckindex = this->m_c

30、ardarrayi;topdeckindex+;i+;for(i=(split);i< 54;) /bottomdeck.m_cardarraybottomdeckindex = this->m_cardarrayi;bottomdeckindex+;i+;int deckoutindex = 0;int numcardstomovetop;int numcardstomovebottom;int j;int h = 0;bottomdeckindex = 54 - split; /topdeckindex =split;while(deckoutindex <= 53) /numcardstomovetop = getRandInt(2,7); numcardstomovebottom = getRandInt(2,7

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论