2011-11-22 180 views
0

我必须创建一个与7名玩家和经销商一起玩的BlackJack程序。我必须使用开关或if语句作为套装类型,并且此语句只能使用一次。大酒杯计划

我所知道的是不工作是随机播放()函数:

当我运行没有调试它会给我和输出像(黑桃A)两次 ,但我把一个数组所以它不会复制一张卡。

但是,当我调试它并进入每行代码输出是会给我两个非重复卡。

我也有麻烦计算玩家总数的要求“写一个函数来处理两张牌给每个玩家。”,如何将两张牌添加到没有确定大小的数组?

此Web albulm包含我的项目的全部要求:

https://picasaweb.google.com/zaidalmas/November172011?authuser=0&authkey=Gv1sRgCNXrltTFwZnYNQ&feat=directlink

#include <iostream> 
#include <iomanip> 
#include <ctime> 
#include <windows.h> 
#include <stdio.h> 
using namespace std; 

void Header(); 
void Shuffle(int&, char&); 
void Dealer(); 
void Deal(); 
void Another_Card(); 
void Fin_Dealer(); 
void WLT(); 

void gotoxy(int h, int w) 
{ 
HANDLE hConsole = GetStdHandle (STD_OUTPUT_HANDLE); 

if (INVALID_HANDLE_VALUE != hConsole) 
    { 
    COORD pos = {h, w}; 
    SetConsoleCursorPosition (hConsole, pos); 
    } 
return; 
} 

int main() 
{ 
Header(); 
Dealer(); 
Deal(); 
WLT(); 
gotoxy(0,19); 
return 0; 
} 

void Header() 
{ 
cout <<"\t\t\tWelcome to BlackJack!\n\n"; 
gotoxy(3,3); 
cout <<"Dealer Player1 Player2 Player3 Player4 Player5 Player6 Player7 "<<endl; 
return; 
} 
void Shuffle(int& num, char& suit) 
{ 
int cards[52], dup[52]; 
int card; 
srand(time(NULL)); 

for(int i = 0; i <52; i++) 
    dup[i] = 0; 

    card = rand() % 52; 

    while(dup[card]) 
     card = rand() % 52; 

    dup[card] = 1; 
    suit = char(card/13 + 3); //display suit 
    num = card % 13; 

    switch(num) 
     { 
     case 0: cout<<setw(6)<<right<<" A"<<suit; 
      break; 
     case 1: 
     case 2: 
     case 3: 
     case 4: 
     case 5: 
     case 6: 
     case 7: 
     case 8: 
     case 9: cout<<setw(6)<<right<<" "<<num + 1<<suit; 
      break; 
     case 10: cout<<setw(6)<<right<<" J"<<suit; 
      break; 
     case 11:cout<<setw(6)<<right<<" Q"<<suit; 
      break; 
     case 12:cout<<setw(6)<<right<<" K"<<suit; 
      break; 
     default:cout<<setw(6)<<right<<"Error"; 
      break; 
     } 
return; 
} 
void Dealer() 
{ 
int i = 0; 
int num = 0; 
char suit; 
for(i = 4;i <6; i++) 
{ 
    gotoxy(0,i); 
    Shuffle(num, suit); 
} 
return; 
} 
void Deal() 
{ 
int i = 0; 
int num = 0; 
int row = 4; 
char suit; 

for(i = 1; i < 8; i++) 
{ 
    gotoxy(i*8, row); 
    Shuffle(num,suit); 
} 
if(playertotal <=20) 
{ 
    Another_Card() 
} 
return; 
} 
void Another_Card() 
{ 
return; 
} 
void Fin_Dealer() 
{ 
return; 
} 
void WLT() 
{ 
return; 
} 
+0

'如何将两张牌添加到没有确定大小的数组?'它可能不是明确的,但如果您不想使用可调整大小的容器(21/2),则它的大小最大。拉斯维加斯/大西洋城在鞋中使用多个甲板。经销商通常不会超过16点。一些规则允许在软17(A + 6) –

回答

1

你的洗牌代码不跟踪的是什么牌已经处理。每次调用它时,它都会重新初始化dup阵列,以便可以多次处理同一张卡片。

作为一个建议,创建两个子例程。每手洗牌一次。第二个交易从洗牌甲板。

0

你的随机()循环做这样的事情:

dup[i] = 0; 
... 
/* Generate card */ 
... 
dup[card] = 1; 

考虑当迭代X这个循环产生卡X + N会发生什么。当你迭代x + n时,你会覆盖dup [x + n]。

第一行任意将当前索引设置为0(false)。其余的Shuffle函数根据随机'卡'索引dup []数组。你在dup []数组中设置一个随机索引为'1'(真),然后在后面的迭代中覆盖它,使得dup []数组不正确。

从技术上讲,不应该将数组项初始化为0.即应该自动发生。但是,由于各种原因,无论如何,初始化整个阵列通常被认为是好的做法。因此,做一个快速循环:

for(int i = 0; 52 > i; ++i) 
    dup[i] = 0; 

所以,快速回答是删除for循环中的dup [] = 0行。