简单有趣的算法——随机发牌

天天对着电脑编程,呃,有时候挺枯燥的,所以还是找点乐子吧。捡到一本好书,里面是一些各种各样有趣的小算法的书。COPY下,顺便练练手,活动活动大脑。

代码挺简单的,就是调用随机函数生成扑克牌的随机序列,然后输出。

虽然这段代码挺简单的,但是还是加点说明吧。我也理一下思路,顺便减少大家理解代码的时间。

wSuit[4]这个数组里储存的是扑克牌的花色,wFace[13]存的是扑克牌的值。wDeck[4][13]用来存放随机生成的扑克牌序列。

shuffle这个函数的作用:让card这个值从1循环到52,在每一次循环中,随机生成与前面生成不同的行和列,然后wDeck[列][行]=card的当前值。

deal这个函数用来输出,还是让card从1循环到52,找到对应的值为card的wDeck[列][行],然后输出行和列,当然不是直接输出行和列的值,而是将其转化为wSuit[4]和wFace[13]的值。

输出函数看上去可能不是那么好理解,它是先找到特定的card值,然后再去找行和列,这样来输出的。

1 / poker.cpp : Defines the entry point for the console application.
2   //
3
4 #include " stdafx.h "
5
6 #include < stdlib.h >
7 #include < time.h >
8
9 void shuffle( int wDeck[ 4 ][ 13 ]);
10 void deal( int wDeck[ 4 ][ 13 ], char * wFace[ 13 ], char * wSuit[ 4 ]);
11
12 void main()
13 {
14 char * wSuit[ 4 ] = { " Hearts " , " Diamonds " , " Clubs " , " Spades " };
15 char * wFace[ 13 ] = { " Ace " , " Deuce " , " Three " , " Four " , " Five " , " Six " , " Seven " , " Eight " ,
16 " Nine " , " Ten " , " Jack " , " Queen " , " King " };
17 int wDeck[ 4 ][ 13 ] = { 0 };
18
19 srand(time(NULL));
20
21 shuffle(wDeck);
22 deal(wDeck, wFace, wSuit);
23
24 system( " PAUSE " );
25 }
26
27 void shuffle( int wDeck[ 4 ][ 13 ])
28 {
29 int r;
30 int card, row, column;
31
32 for (card = 1 ; card <= 52 ; card ++ )
33 {
34 r = rand();
35 row = r % 4 ;
36 r = rand();
37 column = r % 13 ;
38
39 while (wDeck[row][column] != 0 )
40 {
41 r = rand();
42 row = r % 4 ;
43 r = rand();
44 column = r % 13 ;
45 }
46
47 wDeck[row][column] = card;
48 }
49 }
50
51 void deal( int wDeck[ 4 ][ 13 ], char * wFace[ 13 ], char * wSuit[ 4 ])
52 {
53 char c;
54 int card, row, column;
55
56 for (card = 1 ; card <= 52 ; card ++ )
57 {
58 for (row = 0 ; row <= 3 ; row ++ )
59 {
60 for (column = 0 ; column <= 12 ; column ++ )
61 {
62 if (wDeck[row][column] == card)
63 {
64 if (card % 3 == 0 )
65 {
66 c = ' \n ' ;
67 }
68 else
69 {
70 c = ' \t ' ;
71 }
72 printf( " %5s of %-8s%c " , wFace[column], wSuit[row], c);
73 }
74 }
75 }
76 }
77 }

 

输出结果:(每次输出都会不同)

转载于:https://www.cnblogs.com/unsigned/archive/2010/06/11/1756630.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值