?? fanpai.txt
字號:
/*************************************
Copyright(C) 2004-2005 vision,math,NJU.
File Name: guess_card.cpp
Author: vision Version: 1.0 Data: 23-2-2004
Description: 給你9張牌,然后讓你在心中記住那張牌,然后電腦分組讓你猜你記住的牌在第幾組,
然后猜出你記住的那張牌.
Other: 出自兒童時的一個小魔術
History:修改歷史
**************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <assert.h>
#define CARDSIZE 52 /*牌的總張數(shù)*/
#define SUITSIZE 13 /*一色牌的張數(shù)*/
/*撲克牌結構*/
typedef struct Card
{
char val;/*撲克牌面上的大小*/
int kind :4; /*撲克牌的花色*/
}Card;
/*************************************************
Function: // riffle
Description: // 洗牌,然后隨機的得到9張牌,要求九張牌不能有重復.
Calls: //
Called By: // main()
Table Accessed: //被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Table Updated: // 被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Input: //Card card[] 牌結構, int size 結構數(shù)組的大小
Output: //
Return: // void
Others: // 此函數(shù)修改card[]的值,希望得到九張隨機牌
Bug: //此函數(shù)有bug,有時會產(chǎn)生兩個相同的牌,有待修訂
*************************************************/
void riffle(Card *cards, int size);
/*************************************************
Function: // show
Description: // 顯示數(shù)組的內(nèi)容
Calls: //
Called By: // main()
Table Accessed: //被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Table Updated: // 被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Input: //Card *card 牌結構指針, int size 結構數(shù)組的大小
Output: //
Return: // void
Others: //
*************************************************/
void show(const Card *cards, int size);
/*************************************************
Function: // grouping
Description: //把9張牌分別放到3個數(shù)組中,每組3張,a.e分組
Calls: //
Called By: // main()
Table Accessed: //被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Table Updated: // 被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Input: //Card *card 牌結構指針, int size 結構數(shù)組的大小
Output: //
Return: // void
Others: // 此函數(shù)修改 *carr1,*carr2,* carr3的值
*************************************************/
void grouping(const Card *cards, Card *carr1, Card *carr2, Card *carr3);
/*************************************************
Function: // result_process
Description: //用遞歸計算,所選的牌
Calls: // rshift
Called By: // main()
Table Accessed: //被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Table Updated: // 被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Input: //Card *carr1, Card *carr2, Card *carr3
Output: //
Return: // void
Others: // 此函數(shù)修改 *carr1,*carr2,* carr3的值
*************************************************/
Card* result_process(Card *carr1, Card *carr2, Card *carr3, int counter);
/*************************************************
Function: // rshift
Description: //右移操作
Calls: //
Called By: // result_process
Table Accessed: //被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Table Updated: // 被修改的表(此項僅對于牽扯到數(shù)據(jù)庫操作的程序)
Input: //Card *carr1, Card *carr2, Card *carr3 ,int counter
Output: //
Return: // Card*
Others: // 此函數(shù)修改 *carr1,*carr2,* carr3的值
*************************************************/
void rshift(Card *carr1, Card *carr2, Card *carr3, int counter);
void main()
{
Card cards[9]; /*存放九張牌*/
Card carr1[3]; /*第一組牌,cards array 1*/
Card carr2[3]; /*第二組牌,cards array 2*/
Card carr3[3]; /*第三組牌,cards array 3*/
int select = 0; /*玩家的選擇*/
Card *selected_card;/*存放玩家所記住(選)的牌*/
int counter = 0;
riffle(cards, 9); /*洗牌,得到九張牌*/
puts("請記住一張牌千萬別告訴我!最多經(jīng)過下面三次我與你的對話,我就會知道你所記的那張牌!");
puts("如果想繼續(xù)玩,請準確的回答我問你的問題,根據(jù)提示回答!");
puts("請放心,我不會問你你選了哪張牌的!");
grouping(cards, carr1, carr2, carr3); /*把9張牌分別放到3個數(shù)組中,每組3張,a.e分組*/
show(carr1, 3);
show(carr2, 3);
show(carr3, 3);
puts("請告訴我你記住的那張牌所在行數(shù)");
select = getchar();
switch(select)/*分支猜你玩家記住的牌*/
{
case '1':
selected_card = result_process(carr1, carr2, carr3, counter);
break;
case '2':
selected_card = result_process(carr2, carr3, carr1, counter);
break;
case '3':
selected_card = result_process(carr3, carr1, carr2, counter);
break;
default:
puts("你亂說!你選的牌不存在!");
fflush(stdin);
getchar();
exit(0);
}
if( selected_card ==NULL)
{
fflush(stdin);
getchar();
exit(0);
}
puts("你猜的牌為:");
show(selected_card, 1);
puts("我猜的對吧!哈哈,不信,您仔細瞧瞧!~~~~");
fflush(stdin);
getchar();
}
/*riffle的原代碼*/
void riffle(Card *cards, int size)
{
char deck[CARDSIZE];/*臨時數(shù)組,用于存儲牌*/
unsigned int seed;/*最為產(chǎn)生隨機數(shù)的種的*/
int deckp = 0; /*在牌的產(chǎn)生中起著指示作用*/
seed = (unsigned int)time(NULL);
srand(seed);
/*洗牌*/
while (deckp < CARDSIZE)
{
char num = rand() % CARDSIZE;
if ((memchr(deck, num, deckp)) == 0)
{
assert(!memchr(deck,num,deckp));
deck[deckp] = num;
deckp++;
}
}
/*找9張牌給card*/
for (deckp = 0; deckp < size; deckp++)
{
div_t card = div(deck[deckp], SUITSIZE);
cards[deckp].val = "A23456789TJQK"[card.rem]; /*把余數(shù)給card.val*/
cards[deckp].kind = "3456"[card.quot]; /*把商給card.kind*/
}
}
/*show的原代碼,將會自動換行*/
void show(const Card *cards, int size)
{
for(int i = 0; i < size; i++)
{
printf("%c%c ",cards[i].kind,cards[i].val);
if( (i !=0) && (((i+1 ) % 3) == 0))
puts("");
}
puts(""); /*自動換行*/
}
/*grouping 的原代碼*/
void grouping(const Card *cards, Card *carr1, Card *carr2, Card *carr3)
{
int i = 0;/*循環(huán)參數(shù)*/
/*分給carr1三個數(shù)*/
while (i < 3)
{
carr1[i].val = cards[i].val;
carr1[i].kind = cards[i].kind;
i++;
}
/*分給carr2接下來的三個數(shù)*/
while (i < 6)
{
carr2[i-3].val = cards[i].val;
carr2[i-3].kind = cards[i].kind;
i++;
}
/*分給carr3接下來的三個數(shù)*/
while (i < 9)
{
carr3[i-6].val = cards[i].val;
carr3[i-6].kind = cards[i].kind;
i++;
}
}
/*rshift的實現(xiàn)*/
void rshift(Card *carr1, Card *carr2, Card *carr3, int counter)
{
Card temp2;/*用于存放carr2[counter]*/
Card temp3;/*用于存放carr3[counter]*/
/*temp = carr2*/
temp2.val = carr2[counter].val;
temp2.kind = carr2[counter].kind;
/*carr2 = carr1*/
carr2[counter].val = carr1[counter].val;
carr2[counter].kind = carr1[counter].kind;
/*temp3 = carr3*/
temp3.val = carr3[counter].val;
temp3.kind = carr3[counter].kind;
/*carr3 = carr2*/
carr3[counter].val = temp2.val;
carr3[counter].kind = temp2.kind;
/*carr1 = carr3*/
carr1[counter].val = temp3.val;
carr1[counter].kind = temp3.kind;
}
Card* result_process(Card *carr1, Card *carr2, Card *carr3, int counter)
{
rshift(carr1, carr2, carr3, counter); /* 把數(shù)組的第一個元素依次右移*/
if(counter == 2)
{
return(&carr2[2]);
}
show(carr1, 3);
show(carr2, 3);
show(carr3, 3);
puts("請給出你記住的牌所在行數(shù):");
fflush(stdin);
int input = 1;
input = getchar(); /*獲取你選的組*/
switch(input)
{
case '1':
return(result_process(carr1, carr2, carr3, ++counter));
break;
case '2':
return(&carr2[counter]);
break;
default:
puts("你在撒謊!不和你玩了!");
return NULL;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -