【问题标题】:Blackjack Program二十一点计划
【发布时间】:2012-01-03 12:14:40
【问题描述】:

我必须创建一个包含 7 位玩家和一位庄家的 BlackJack 程序。我必须对西装类型使用 switch 或 if 语句,并且该语句只能使用一次。

我所知道的不起作用的是 Shuffle() 函数:

当我在没有调试的情况下运行时,它会给我并输出两次(黑桃A) 但我放了一个数组,这样它就不会复制一张卡片。

但是,当我调试它并进入每一行代码时,输​​出会给我两张不重复的卡片。

我在计算玩家总数时也遇到了问题,要求“编写一个函数以向每个玩家发两张牌。”,如何将两张牌添加到一个没有确定大小的数组中?

此网络相册包含我项目的全部要求:

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;
}

【问题讨论】:

  • How do I add the two cards to an array that has no definite size? 它可能不确定,但如果您不想使用可调整大小的容器(21/2),它有一个最大大小。维加斯/大西洋城在鞋内使用不止一层甲板。庄家一般不会超过 16。有些规则允许打软 17 (A+6)

标签: c++ blackjack


【解决方案1】:

您的洗牌代码没有记录已经发过的牌。每次调用它时,它都会重新初始化 dup 数组,从而可以多次处理同一张牌。

作为建议,创建两个子例程。每手牌洗牌一次。洗牌后的第二张牌。

【讨论】:

    【解决方案2】:

    您的 Shuffle() 循环执行以下操作:

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

    考虑当这个循环的迭代 x 生成卡片 x+n 时会发生什么。当你到达迭代 x+n 时,你会覆盖 dup[x+n]。

    第一行任意设置当前索引为0(假)。 Shuffle 函数的其余部分根据随机“卡片”索引 dup[] 数组。您正在将 dup[] 数组中的随机索引设置为“1”(真),然后可能会在以后的迭代中覆盖它,从而使 dup[] 数组不正确。

    从技术上讲,不必将数组项初始化为 0。应该自动发生。但是,由于各种原因,通常认为预先初始化整个数组是一种好习惯。所以,做一个快速循环:

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

    因此,快速的答案是删除 for 循环中的 dup[] = 0 行。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 2018-09-10
      • 2012-03-15
      • 2016-12-29
      • 2020-04-20
      • 1970-01-01
      • 2018-09-13
      • 2011-01-25
      • 2017-12-01
      相关资源
      最近更新 更多