首先介绍一种麻将,麻将是从一万到九万、一饼到九饼、一条到九条、东风、南风、西风、北风、红中、白板、发财。以上牌面各四张组成。
要想生成它们并且显示出来还有一定的数学规律的。
0 | 1 | 2 | |||||||
万 | 饼 | 条 | |||||||
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
‘ ’ | 一 | 二 | 三 | 四 | 五 | 六 | 七 | 八 | 九 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
‘ ’ | 东风 | 南风 | 西风 | 北风 | 红中 | 白板 | 发财 |
0-9 | /10 | 0 | %10 | 0-9 | 0 |
10-19 | /10 | 1 | %10 | 0-9 | 10 |
20-29 | /10 | 2 | %10 | 0-9 | 20 |
30-37 | /10 | 3 | %10 | 0-7 | 30 |
可以看到0、10、20、30这四个数对应的表是空的所以就要在随机生成数的时候用一些手段。
.h
#pragma once
#include <iostream>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MJNUM 136
class majiang
{
unsigned int m_allMJ[MJNUM];
public:
majiang();
void creatMJ();
void showMJ(int chuan);
unsigned int seeMJ(int i);
};
.cpp
#include "majiang.h"
majiang::majiang()
{
srand((size_t)time(NULL));
}
void majiang::creatMJ()
{
int tmp[MJNUM] = { 0 };
int i = 0;
for (i=0;i<MJNUM;++i)
{
tmp[i] = i;/* 一个临时数组用来给真正的麻将数组赋值 */
}
int j = 0;
for (j=0;j<MJNUM;++j)
{
i = rand() % MJNUM;
while (1)
{
if (tmp[i]>=0)
{
m_allMJ[j] = tmp[i] / 4 + 1;/* 除去数字区0不能用的问题 */
tmp[i] = -1;
if (m_allMJ[j]>=10)/* 除去10 20 30 不能用的情况*/
{
m_allMJ[j]++;
}
if (m_allMJ[j]>=20)
{
m_allMJ[j]++;
}
if (m_allMJ[j]>=30)
{
m_allMJ[j]++;
}
break;
}
else
{
++i;
if (i>=MJNUM)
{
i = 0;
}
}
}
}
}
void majiang::showMJ(int chuan)
{
const char * type[] = { "万", "饼", "条" };
const char * num[] = { "", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
const char * word[] = { "", "东风", "南风", "西风", "北风", "白板", "发财", "红中" };
#if 1
int i = 0,j=0;
for (i=0; i < chuan; ++i)
{
if (m_allMJ[i] / 10 < 3)
{
printf("%s%s \t", num[m_allMJ[i] % 10], type[m_allMJ[i] / 10]);
}
else
{
printf("%s \t", word[m_allMJ[i] % 10]);
}
++j;
/*if (j % (chuan / 4) == 0)
{
printf("\n\n");
}*/
}
printf("\n");
#else
int j = 0;
for (auto & i : m_allMJ)
{
/*if (i < 0)
{
printf(" ");
}*/
if (i / 10 < 3)
{
printf("%s%s ", num[i % 10], type[i / 10]);
}
else
{
printf("%s ", word[i % 10]);
}
j++;
if (j % (MJNUM / 4) == 0)
{
putchar('\n');
}
}
#endif
}
unsigned int majiang::seeMJ(int i)
{
return m_allMJ[i];
}