版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
紫金学院C++课程设计2017级PAGEPAGE1紫金学院C++课程设计南京理工大学紫金学院C++课程设计报告课程:C++课程设计学院:计算机学院班级:计算机大类四班学号:姓名:选题名称:扑克牌游戏起止时间:指导教师:
1问题描述在提供的源程序基础上,写一个程序,可以进行洗牌等操作.2基本要求增加大小王.删去一张指定扑克牌后,进行余牌显示.创建一副扑克牌,显示一副扑克牌,洗牌,依次分发给四人并显示.3需求分析 输入形式与范围是按照提示语句输入相应的数字或是(Y)否(N)的英文字母 输出形式即为提示语句所说明的内容该程序基本任务是完成扑克洗牌,显示玩家手牌,按花色或牌面整理手牌(排序) 测试数据为54张扑克牌面值以及花色,无需手动设置 正确的输入将使得程序按说明运行,错误输入默认直接退出程序4概要设计分为8个部分,也是八个文件 头文件两个: all.h包含主程序所需的所有头文件. class.h包含所有的类,并卷入all.h 其余cpp文件,共6个,说明如下: main函数主调函数 deck包含deck类的函数 perdeck包含perdeck类的函数 playdeck包含playdeck类的函数 playingcard 包含playingcard类的函数 main函数调用的函数顾名思义5详细设计All.h #pragmaonce#include<iostream>#include<string.h>//编译器是VS2021#include<time.h>#include<stdlib.h>#include<stdio.h>#include<conio.h>Class.h#pragmaonce#include"all.h"usingnamespacestd;classPerDeck;classPlayingCard{private: intnValue;//扑克牌实际面值 charachFace[3];//扑克牌字符串A,2,10,J,Q,K charchSuit;//扑克牌花色public: friendclassPerDeck; PlayingCard();//将对象清零 voidShowCard();//显示面值花色 voidCardMake(int);//给一张扑克牌赋值(面值,花色)};classDeck{private: PlayingCardm_cardarray[54]; intnLastDelt;public: friendclassPerDeck; Deck(); voidMakeDeck();//将52张牌清零(没有大,小王) voidDealOne();//删除开头一张牌 voidShowDeck();//依次逐张显示这副牌 voidDeckShuff(int);//用于洗牌,参数是洗牌次数 voidRemoveCard();//清零删除掉的那张牌};classPerDeck{private: PlayingCardmyCard[20]; intnNum;public: PerDeck(){} voidMakePerDeck(Deck&,int); voidShow(); voidSortFace(); voidSortSuit(); intDelete(intn);};classPlayDeck{private: PerDeckmyDeck[4];public: PlayDeck(){} voidPlayCard(Deck&); voidShow(); intDeleteOne(introw,intcolumn); intDeleteAll(int,int,int,int); voidSortDeckFace(int); voidSortDeckSuit(int); voids(int);};voidProgramInit();//初始化,并输出信息voidCenterText(charShellText[80]);//居中显示intGetNumber();//键入整数型charGetKey();//键入字符串型voidDeckMakeDiver();//主要算法(生成扑克牌,洗牌,删除等)intGetRandInt(intmin,intmax);//在min到max间选随机值voidProgClose();//暂停,供用户查看中间运行结果main函数.cpp#include"class.h"usingnamespacestd;intmain(void){ srand((unsigned)time(NULL)); intnCardNum=0; ProgramInit(); DeckMakeDiver(); ProgClose(); return1;}Playdeck.cpp #include"class.h"#include<iostream>usingnamespacestd;voidPlayDeck::PlayCard(Deck&k){ inta,b,c,d; charg[29]={"依次输入四位玩家手里的牌数:"}; CenterText(g); cout<<endl; cin>>a>>b>>c>>d; if(a+b+c+d>54) { charg[]={"超过牌的张数,退出游戏。"}; CenterText(g); exit(0); } myDeck[0].MakePerDeck(k,a); myDeck[1].MakePerDeck(k,b); myDeck[2].MakePerDeck(k,c); myDeck[3].MakePerDeck(k,d);}voidPlayDeck::Show(){ chara[6]={"玩家1"}; charb[6]={"玩家2"}; charc[6]={"玩家3"}; chard[6]={"玩家4"}; CenterText(a); cout<<endl; myDeck[0].Show(); CenterText(b); cout<<endl; myDeck[1].Show(); CenterText(c); cout<<endl; myDeck[2].Show(); CenterText(d); cout<<endl; myDeck[3].Show();}intPlayDeck::DeleteOne(introw,intcolumn){ myDeck[row-1].Delete(column); return1;}intPlayDeck::DeleteAll(inta,intb,intc,intd){ myDeck[0].Delete(a); myDeck[1].Delete(b); myDeck[2].Delete(c); myDeck[3].Delete(d); return1;}voidPlayDeck::SortDeckFace(intb){ myDeck[b-1].SortFace();}voidPlayDeck::SortDeckSuit(intb){ myDeck[b-1].SortSuit();}voidPlayDeck::s(inta){ myDeck[a-1].Show();}Deck.cpp#include"class.h"#include<iostream>usingstd::ostream;usingnamespacestd;voidDeck::MakeDeck()//对生成的52张牌逐个赋值{ nLastDelt=53;//51 while(nLastDelt>-1) { m_cardarray[nLastDelt].CardMake(nLastDelt); nLastDelt--; }}voidDeck::ShowDeck()//显示一副扑克牌{ chara[13]={"完整的一副牌"}; intnIndex=nLastDelt+1; intnNewLine=0; CenterText(a); cout<<endl; while(nIndex<=53)//51 { if(nNewLine%11==0)cout<<endl; m_cardarray[nIndex].ShowCard(); nNewLine++; nIndex++; }}voidDeck::DeckShuff(inttimes)//洗牌算法{ chara[11]={"洗牌"}; intx,nSplit; CenterText(a); cout<<endl; for(x=0;x<=times;x++) { nSplit=GetRandInt(20,35); DeckTopDeck; DeckBottomDeck; inti; intnBottomNum=1; intnTopNum=1; for(i=0;i<=nSplit-1;) { TopDeck.m_cardarray[nTopNum]=this->m_cardarray[i]; nTopNum++; i++; } for(i=(nSplit);i<54;)//52 { BottomDeck.m_cardarray[nBottomNum]=this->m_cardarray[i]; nBottomNum++; i++; } intnOutNum=0; intnNumToTop; intnNumToBottom; intj; inth=0; nBottomNum=54-nSplit;//52 nTopNum=nSplit; while(nOutNum<53)//51 { nNumToTop=GetRandInt(2,7); nNumToBottom=GetRandInt(2,7); for(j=0;j<=nNumToBottom;j++) { if(nBottomNum>0) { this->m_cardarray[nOutNum]=BottomDeck.m_cardarray[nBottomNum]; nOutNum++; nBottomNum--; } for(h=0;h<=nNumToTop;h++) { if((nTopNum>0)&&(nOutNum<=54))//52 { this->m_cardarray[nOutNum]=TopDeck.m_cardarray[nTopNum]; nOutNum++; nTopNum--; } } } } } this->nLastDelt=-1;}voidDeck::RemoveCard()//将删除的那张牌清零{ m_cardarray[nLastDelt]=PlayingCard();//清零}voidDeck::DealOne()//从一副扑克牌中删除一张牌{ if(nLastDelt!=53)//51 { nLastDelt++; cout.width(5); cout<<endl; cout<<"删除牌:"; m_cardarray[nLastDelt].ShowCard(); RemoveCard(); } else { cout<<"这副牌全部删除完了"; ProgClose(); }}Deck::Deck()//初始化一副扑克牌,将52张扑克牌均清零{ intlastdelt=0; for(inti=0;i<=53;i++)//51 { m_cardarray[i]=PlayingCard(); }}Main调用的函数.cpp#include"class.h"#include<iostream>usingnamespacestd;voidProgramInit()//程序一开始的提示信息{ chara[11]={"扑克牌游戏"}; charb[25]={"单击<Return>键开始"}; CenterText(a); cout<<endl<<'\n'; CenterText(b); cin.get();}charGetKey()//从键盘接收一个字符,将其作为函数返回值{ charx; x=cin.get(); cout<<endl; returnx;}voidCenterText(charShellText[80])//居中算法{ intnCenter; intnLength; nLength=strlen(ShellText); nCenter=(80-nLength)/2; for(;nCenter!=0;nCenter--) { cout<<""; } cout<<ShellText;}intGetNumber()//从键盘接收一个整数值,作为函数返回值{ chara[40]={"请输入一个在0到51之间的整数,输入52退出."}; intnInputInteger=0; CenterText(a); cout<<endl; cin>>nInputInteger; returnnInputInteger;}voidProgClose()//程序暂停,按任意键继续{ cout<<endl<<endl; cout<<"单击<Return>键继续"<<endl; cout<<endl<<endl; GetKey(); cin.get();}voidDeckMakeDiver()//主要程序操作部分,调用多个函数,包含完整生成一副牌,洗牌,显示,删除等操作{ Deckdeck_1; deck_1.MakeDeck(); deck_1.ShowDeck(); GetKey(); deck_1.DeckShuff(250); deck_1.ShowDeck(); cout<<endl<<endl<<endl; chary; PlayDeckF; F.PlayCard(deck_1); cout<<endl<<endl<<endl; F.Show(); intg=0; do { chara[9]={"游戏规则"}; charb[23]={"删除一位玩家的牌输入1"}; charc[23]={"删除四位玩家的牌输入2"}; chard[23]={"按牌的面值排序输入3"}; chare[23]={"按牌的花色排序输入4"}; charf[23]={"显示四位玩家手牌输入5"}; charq[23]={"按N(n)退出游戏"}; CenterText(a); cout<<endl; CenterText(b); cout<<endl; CenterText(c); cout<<endl; CenterText(d); cout<<endl; CenterText(e); cout<<endl; CenterText(f); cout<<endl; CenterText(q); cout<<endl; cin>>g; if(g==1) { intj,k; charh; cout<<"请输入删除玩家的编号和牌号(从左往右数的第N张)"<<endl; cin>>j>>k; F.DeleteOne(j,k); cout<<endl<<"是(Y)否(N)显示删除后的手牌?"<<endl; cin>>h; h=toupper(h); if(h=='Y')F.s(j); cout<<endl; } if(g==2) { intw,x,h,z; chary; cout<<"请依次输入欲删除各玩家牌的序号。"<<endl; cin>>w>>x>>h>>z; F.DeleteAll(w,x,h,z); cout<<endl<<"是(Y)否(N)显示删除后玩家的牌?"<<endl; cin>>y; y=toupper(y); if(y=='Y')F.Show(); cout<<endl; } if(g==3) { inth; chary; cout<<"请输入需要排序的玩家"<<endl; cin>>h; F.SortDeckFace(h); cout<<"是(Y)否(N)显示排序后的牌?"<<endl; cin>>y; y=toupper(y); if(y=='Y')F.s(h); } if(g==4) { intx; chary; cout<<"请输入需要排序玩家的序号"<<endl; cin>>x; F.SortDeckSuit(x); cout<<"是(Y)否(N)显示排序后的牌?"<<endl; cin>>y; y=toupper(y); if(y=='Y')F.s(x); } if(g==5) { F.Show(); } if(g==78||g==110) { gotoloop; } cout<<"是(Y)否(N)回到游戏规则菜单?"<<endl; cout<<endl; cin>>y; y=toupper(y); }while(y=='Y');loop:;}intGetRandInt(intnMin,intnMax)//返回min至max之间的任意一值(实际上是“洗牌算法”s的一部分){ intnNumToReturn; nNumToReturn=rand(); nNumToReturn=nNumToReturn%(nMax-nMin+1)+nMin; returnnNumToReturn;}Playingcard.cpp#include"class.h"#include<iostream>usingnamespacestd;PlayingCard::PlayingCard()//扑克牌对象的构造函数{ for(inti=1;i<=3;) { achFace[i]=''; i++; } chSuit=''; nValue=0;}voidPlayingCard::ShowCard()//在屏幕上显示一张扑克牌的面值及花色{ cout<<""; cout<<achFace; cout.width(1); cout<<chSuit; cout<<"";}voidPlayingCard::CardMake(intnNum)//根据参数nNum生成一张扑克牌,nNum不同,生成的面值或花色不同{ inti=0; charj; intnFaceNum=nNum%13; if(nNum==52) { strcpy(achFace,"S"); gotoloop; } if(nNum==53) { strcpy(achFace,"B"); gotoloop; } switch(nFaceNum) { case0:strcpy(achFace,"A");break; case9:strcpy(achFace,"10");break; case10:strcpy(achFace,"J");break; case11:strcpy(achFace,"Q");break; case12:strcpy(achFace,"K");break; default: j=char(nFaceNum+49); if(i<3) { achFace[i]='';i++; achFace[i]=j;i++; achFace[i]=NULL; break; } }loop:; if(nNum<=12)chSuit=6;//红桃 if(nNum>12&&nNum<=25)chSuit=3;//黑桃 if(nNum>25&&nNum<=38)chSuit=5;//梅花 if(nNum>38&&nNum<=51)chSuit=4;//方块 if(nFaceNum<=9)nValue=nFaceNum+1; if(nFaceNum>=10)nValue=10; if(nNum==52) { nValue=11; chSuit=49; } if(nNum==53) { nValue=12; chSuit=50; }}Perdeck.cpp#include<iostream>#include"class.h"usingnamespacestd;voidPerDeck::MakePerDeck(Deck&d,inta){ nNum=a; inti=0; while(i<a&&d.nLastDelt!=53) { myCard[i++]=d.m_cardarray[++d.nLastDelt]; }}voidPerDeck::Show(){ chara[12]={"该玩家的牌:"}; intnNewLine=0; CenterText(a); cout<<endl; while(nNewLine<nNum) { if(nNewLine%5==0) cout<<endl; myCard[nNewLine++].ShowCard(); } cout<<endl;}voidPerDeck::SortFace()//冒泡{ PlayingCardk; for(inti=0;i<nNum;i++) for(intj=0;j+i<nNum-1;j++) if(myCard[j].nValue>myCard[j+1].nValue) { k=myCard[j]; myCard[j]=myCard[j+1]; myCard[j+1]=k; }}voidPerDeck::SortSuit(){ PlayingCardk; for(inti=0;i<nNum;i++) for(intj=0;j+i<nNum-1;j++) if(myCard[j].chSuit>myCard[j+1].chSuit) { k=myCard[j]; myCard[j]=myCard[j+1]; myCard[j+1]=k; }}intPerDeck::Delete(intn){ if(n>nNum) { cout<<"超出总牌数!"<<endl; returnnNum; } else { cout.widen(5); cout<<"删除牌:"; myCard[n-1].ShowCard(); while(n<nNum+1) { myCard[n-1]=myCard[n++]; } return--nNum; }}6调试分析学校的VS2021提示“未使用调试信息生成二进制文件”自己电脑的Vs2021没有提示这个过,所以百度了一下 解决:1.项目属性配置属性链接器调试生成调试信息:是(/DEBUG) 2.项目属性配置属性C/C++调试信息格式(/Zi) 3.项目属性配置属性C/C++优化优化:禁用(/Od)7用户使用说明1两次回车洗牌 2依次输入四个玩家手牌个数 3进入”游戏规则”菜单页,按提示输入一到五的阿拉伯数字 4按N退回菜单页8测试结果9课程设计总结C++课程设计使得我们学以致用,更加熟悉代码以及其工作的机理.在这次课程设计中,我受益匪浅.10参考文献C++PrimerPlus人民邮电出版社中国工信出版社C++Primer人民邮电出版社中国工信出版社算法笔记机械工业出版社
论大学生写作能力写作能力是对自己所积累的信息进行选择、提取、加工、改造并将之形成为书面文字的能力。积累是写作的基础,积累越厚实,写作就越有基础,文章就能根深叶茂开奇葩。没有积累,胸无点墨,怎么也不会写出作文来的。写作能力是每个大学生必须具备的能力。从目前高校整体情况上看,大学生的写作能力较为欠缺。一、大学生应用文写作能力的定义那么,大学生的写作能力究竟是指什么呢?叶圣陶先生曾经说过,“大学毕业生不一定能写小说诗歌,但是一定要写工作和生活中实用的文章,而且非写得既通顺又扎实不可。”对于大学生的写作能力应包含什么,可能有多种理解,但从叶圣陶先生的谈话中,我认为:大学生写作能力应包括应用写作能力和文学写作能力,而前者是必须的,后者是“不一定”要具备,能具备则更好。众所周知,对于大学生来说,是要写毕业论文的,我认为写作论文的能力可以包含在应用写作能力之中。大学生写作能力的体现,也往往是在撰写毕业论文中集中体现出来的。本科毕业论文无论是对于学生个人还是对于院系和学校来说,都是十分重要的。如何提高本科毕业论文的质量和水平,就成为教育行政部门和高校都很重视的一个重要课题。如何提高大学生的写作能力的问题必须得到社会的广泛关注,并且提出对策去实施解决。二、造成大学生应用文写作困境的原因:(一)大学写作课开设结构不合理。就目前中国多数高校的学科设置来看,除了中文专业会系统开设写作的系列课程外,其他专业的学生都只开设了普及性的《大学语文》课。学生写作能力的提高是一项艰巨复杂的任务,而我们的课程设置仅把这一任务交给了大学语文教师,可大学语文教师既要在有限课时时间内普及相关经典名著知识,又要适度提高学生的鉴赏能力,且要教会学生写作规律并提高写作能力,任务之重实难完成。(二)对实用写作的普遍性不重视。“大学语文”教育已经被严重地“边缘化”。目前对中国语文的态度淡漠,而是呈现出全民学英语的大好势头。中小学如此,大学更是如此。对我们的母语中国语文,在大学反而被漠视,没有相关的课程的设置,没有系统的学习实践训练。这其实是国人的一种偏见。应用写作有它自身的规律和方法。一个人学问很大,会写小说、诗歌、戏剧等,但如果不晓得应用文写作的特点和方法,他就写不好应用文。(三)部分大学生学习态度不端正。很多非中文专业的大学生对写作的学习和训练都只是集中在《大学语文》这一门课上,大部分学生只愿意被动地接受大学语文老师所讲授的文学经典故事,而对于需要学生动手动脑去写的作文,却是尽可能应付差事,这样势必不能让大学生的写作水平有所提高。(四)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年咽喉科常见疾病诊断试题及答案解析
- 2026年天津艺术职业学院单招综合素质考试题库附答案详细解析
- 2026年长春东方职业学院单招综合素质考试题库附答案详细解析
- 2026年太原幼儿师范高等专科学校单招职业适应性测试题库附答案详细解析
- 2026年朝阳师范高等专科学校单招职业适应性测试题库及答案详细解析
- 2026年河南地矿职业学院单招职业适应性测试题库附答案详细解析
- 工作岗位安全责任制度标准及落实手册
- 企业内部审计与内部控制制度实施实务
- 骨折患者心理护理与康复
- 广东省阳江二中学2026届全国中考预测试题含解析
- 中医治疗“乳癖”医案41例
- 阵列信号处理基础教程
- GB/T 16553-2003珠宝玉石鉴定
- 国际贸易 第三章 国际分工2017
- 2023年吉林大学自考生物制药专业招生简章
- 公路工程质量与安全管理课件
- 架桥机安装使用验收表
- 第一课冬休みの予定 单词课件-高中日语华东理工版新编日语教程2
- 中石油设备及管道定点测厚指导意见
- 无跨越架封网装置计算程序(直接求解)
- 动物微生物细菌病的实验室诊断方法培训课件
评论
0/150
提交评论