#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
#define CARD_RAND_SEED 2
#define GARA_RAND_SEED 5
#define CARD_COL_NUM 5
#define CARD_ROW_NUM 5
#define MAX_RAND_NUM 100
int* generateRand(int seed, int num);
void swapValue(int *ppCard, int *pRandNum);
void showCard(int *pCard);
void drawLots(int *pCard, int value);
int checkBingo(int *pCard);
int main(void)
{
int i,j;
int myBingoCard[CARD_ROW_NUM][CARD_COL_NUM] = {0};
int *pCreateCardRandArray = generateRand(CARD_RAND_SEED, MAX_RAND_NUM); // ヒープ領域に確保
int *pGaraGaraRandArray = generateRand(GARA_RAND_SEED, MAX_RAND_NUM); // ヒープ領域に確保
printf("Rundum number:\n");
for(i=0; i<MAX_RAND_NUM; ++i)
{
printf("%3d ", pCreateCardRandArray[i]);
if(((i+1)%20 == 0))
{
printf("\n");
}
}
swapValue((int*)myBingoCard, pCreateCardRandArray);
printf("\nMy Card:\n");
showCard((int*)myBingoCard);
printf("\n");
for(i=0; i<MAX_RAND_NUM; ++i)
{
printf("No.%3d - [Draw:%d]\n", i, pGaraGaraRandArray[i]);
// 抽選
drawLots((int*)myBingoCard, pGaraGaraRandArray[i]);
// 結果を表示
showCard((int*)myBingoCard);
// Bingoしたか調べる
if(checkBingo((int*)myBingoCard) == TRUE)
{
printf("Bingo!!\n");
break;
}
printf("\n");
}
free(pCreateCardRandArray);
free(pGaraGaraRandArray);
return 0;
}
void swapValue(int *ppCard, int *pRandNum)
{
int i,j;
int maxNum = CARD_COL_NUM * CARD_ROW_NUM;
for(i=0; i<maxNum; ++i)
{
*(ppCard+i) = *(pRandNum+i);
}
}
int* generateRand(int seed, int num)
{
int i;
int currentIndex = 0;
int genNum = 0;
int *pArray = (int*)malloc(num*sizeof(int));
memset(pArray, 0, num*sizeof(int));
srand(seed);
do
{
genNum = (rand() % MAX_RAND_NUM) + 1;
for(i=0; i<currentIndex; ++i)
{
if(genNum == pArray[i])
{
genNum = (rand() % MAX_RAND_NUM) + 1;
i = 0;
}
}
pArray[currentIndex++] = genNum;
}while(currentIndex < num);
return pArray;
}
void showCard(int *pCard)
{
int i;
int maxNum = CARD_COL_NUM * CARD_ROW_NUM;
for(i=0; i<maxNum; ++i)
{
if(*(pCard+i) != 0) {
printf("%3d ", *(pCard+i));
}else{
printf(" ● ");
}
if(((i+1)%CARD_COL_NUM) == 0)
{
printf("\n");
}
}
}
void drawLots(int *pCard, int value)
{
int i;
int maxNum = CARD_COL_NUM * CARD_ROW_NUM;
for(i=0; i<maxNum; ++i)
{
if(*(pCard+i) == value)
{
*(pCard+i) = 0;
break;
}
}
}
int checkBingo(int *pCard)
{
// 横が揃ったか調べる
if(((pCard[ 0] + pCard[ 1] + pCard[ 2] + pCard[ 3] + pCard[ 4]) == 0) ||
((pCard[ 5] + pCard[ 6] + pCard[ 7] + pCard[ 8] + pCard[ 9]) == 0) ||
((pCard[10] + pCard[11] + pCard[12] + pCard[13] + pCard[14]) == 0) ||
((pCard[15] + pCard[16] + pCard[17] + pCard[18] + pCard[19]) == 0) ||
((pCard[20] + pCard[21] + pCard[22] + pCard[23] + pCard[24]) == 0))
{
return TRUE;
}
// 縦が揃ったか調べる
if(((pCard[ 0] + pCard[ 5] + pCard[10] + pCard[15] + pCard[20]) == 0) ||
((pCard[ 1] + pCard[ 6] + pCard[11] + pCard[16] + pCard[21]) == 0) ||
((pCard[ 2] + pCard[ 7] + pCard[12] + pCard[17] + pCard[22]) == 0) ||
((pCard[ 3] + pCard[ 8] + pCard[13] + pCard[18] + pCard[23]) == 0) ||
((pCard[ 4] + pCard[ 9] + pCard[14] + pCard[19] + pCard[24]) == 0))
{
return TRUE;
}
// 斜めが揃ったか調べる
if(((pCard[ 0] + pCard[ 6] + pCard[12] + pCard[18] + pCard[24]) == 0) ||
((pCard[ 4] + pCard[ 8] + pCard[12] + pCard[16] + pCard[20]) == 0))
{
return TRUE;
}
return FALSE;
}