资源描述
《扑克牌问题》
程序设计基础课程设计报告
专 业: 信息管理与信息系统
班 级: 11级一班
姓 名: 白瑞锋
学 号: 2011508066
指导教师: 郑瑶
2012年 2 月 10 日
目 录
1 课程设计目的………………………………………………………2
2 课程设计题目描述和要求…………………………………………2
3试验报告…………………………………………………………2
4 源文件………………………………………………………………5
5 课程设计总结………………………………………………………8
6 参考书目……………………………………………………………8
1.课程设计目的
通过课程设计来查看自己半学期来的学习情况,不断完善和学习课程的学习经验,加强自己的动手实践能力,增加知识,强化学习,是自己获得进步。
2.课程设计题目描述和要求
一、课程设计题目
题目:扑克牌问题
二、课程设计的描述
编写一个模拟人工洗牌的程序,将洗好的牌分发给四个人。
三、规则及要求说明
使用结构card来描述一张牌,用户随机函数来模拟人工洗牌的过程,最后将洗好的52张牌顺序发给四个人,对每个人的牌要按桥牌的规则输出。即一个人的牌要先按花色(顺序为梅花,方块,红心,和黑桃)进行分类,同一类的牌再按A,K,Q,J,,,,,3,2牌的大小顺序排列。另发牌应按四个人的顺序依次发。
3试验报告
函数可以设置rand函数所用得到的随机数产生算法的种子值。任何大于1的种子值都将会将rand随机数产生函数所产生的虚拟随机数序列重新设置一个起始点。
int rand(void)此函数可以产生介于0到32767间的虚拟随机数,所谓虚拟随机数的意思就是因为当只设置相同的启动种子值,所产生的数值序列都是可预测的。要产生不可预测的数值序列,必须通过srand函数不断改变随机数的启动种子值,已产生最佳的随机数。
以下为程序所显示的运行结果图片
:
4.源程序
//功能:此函数可以产生介于0到32767间的虚拟随机数,所谓虚拟随机数的意思就是因为当只设置相同的启动种子值,所产生的数值序列都是可预测的。要产生不可预测的数值序列,必须通过srand函数不断改变随机数的启动种子值,已产生最佳的随机数。
#include <memory.h>
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;
const int NUM = 52;
const int DECK = 13;
enum SortType {SUIT, VALUE};
typedef struct CARD
{
int suit; // 取值0 - 3,分别表示梅花、方块、红心和黑桃
int value; // 取值2 - 10、J(11)、Q(12)、K(13)、A(14)
} Card;
void suffle(Card *cards)
{
int i, j, t;
Card c;
srand(time(NULL));
for (i = 0; i < NUM; ++i)
for (j = 0; j < NUM; ++j)
{
t = rand() % NUM;
if (j != t)
{
memcpy(&c, &cards[t], sizeof(Card));
memcpy(&cards[t], &cards[j], sizeof(Card));
memcpy(&cards[j], &c, sizeof(Card));
}
}
}
void sort(Card *cards, int size, SortType stype)
{
int i, j, k;
Card t;
for (i = 0; i < size-1; ++i)
{
k = i;
for (j = i + 1; j < size; ++j)
{
if ((stype == SUIT) && (cards[k].suit > cards[j].suit))
k = j;
else if ((stype == VALUE) && cards[k].value < cards[j].value)
k = j;
}
if (k != i)
{
memcpy(&t, &cards[i], sizeof(Card));
memcpy(&cards[i], &cards[k], sizeof(Card));
memcpy(&cards[k], &t, sizeof(Card));
}
}
}
void show(int suit, int value)
{
static char values[] = {'2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K', 'A'};
switch (suit)
{
case 0:
cout << "梅花 ";
break;
case 1:
cout << "方块 ";
break;
case 2:
cout << "红心 ";
break;
case 3:
cout << "黑桃 ";
break;
}
if (value == 10)
cout << "10";
else
cout << values[value-2];
cout << "\t\t";
}
void sortValue(Card *cards)
{
int p[4] = {0, 0, 0, 0};
int i, j;
for (i = 0; i < DECK; ++i)
++p[cards[i].suit];
j = 0;
for (i = 0; i < 4; ++i)
{
sort(cards + j, p[i], VALUE);
j += p[i];
}
}
void main(void)
{
Card cards[NUM];
Card A[DECK], B[DECK], C[DECK], D[DECK];
int i, j, s = 0, v = 2;
for (i = 0; i < NUM; ++i)
{
cards[i].suit = s;
cards[i].value = v;
++v;
if ((i+1) % 13 == 0)
{
++s;
v = 2;
}
}
suffle(cards);
j = 0;
for (i = 0; i < NUM; i += 4)
{
memcpy(&A[j], &cards[i], sizeof(Card));
memcpy(&B[j], &cards[i+1], sizeof(Card));
memcpy(&C[j], &cards[i+2], sizeof(Card));
memcpy(&D[j], &cards[i+3], sizeof(Card));
++j;
}
sort(A, DECK, SUIT);
sortValue(A);
sort(B, DECK, SUIT);
sortValue(B);
sort(C, DECK, SUIT);
sortValue(C);
sort(D, DECK, SUIT);
sortValue(D);
cout << "PLAYER 1" << "\t" << "PLAYER 2" << "\t";
cout << "PLAYER 3" << "\t" << "PLAYER 4" << endl;
for (i = 0; i < DECK; ++i)
{
show(A[i].suit, A[i].value);
show(B[i].suit, B[i].value);
show(C[i].suit, C[i].value);
show(D[i].suit, D[i].value);
cout << endl;
}
system("PAUSE");
}
5. 课程设计总结
这一次的程序设计不仅是一份作业更是我对于一学期来的学习C++课程的总结,从陌生到熟悉,这是一个艰难的过程,同样也是一个收获的过程,现在的我已经能够简单的设计一些小的程序,这次的设计经历对我的进步起了一个不小的推进作用,在这次设计中我遇到了不少的问题,同样也总结了不少东西,比如我认为在做设计之前要有一个清晰的思路,要细心的考虑每个细节,有的时候一个标点,一个字母,一个符号都可能导致程序不能运行,所以更要求我们认真对待,认真完成,再设计的过程中有可能需要新知识,这就要求我们在课外去寻找,去自学,只有这样才能把设计做的完美,不留遗憾。
6.参考书目:
[1] 谭浩强,《C++程序设计》,北京,清华大学出版社,2006年.
8
展开阅读全文