2011-11-22 3 views
0

7 명의 플레이어와 딜러와 함께하는 블랙 잭 프로그램을 만들어야합니다. 소송 유형에 대해 switch 또는 if 문을 사용해야하며이 명령문은 한 번만 사용할 수 있습니다.블랙 잭 프로그램

내가 작동하지 않습니다 알고하면 셔플() 함수입니다 :

나는 두 번 (스페이드 A)처럼 저와 출력을 줄 것이다 디버깅없이 실행 만이 중복되지 것이다 그래서 나는 배열을 넣을 때 카드.

그러나 디버깅을 수행 할 때 모든 코드 행에 출력 할 때 중복되지 않는 카드가 2 개 있습니다.

플레이어 합계를 계산하는 데 문제가 있습니다. "각 플레이어에게 두 장의 카드를 제공하는 함수를 작성하십시오.", 명확한 크기가없는 배열에 두 장의 카드를 추가하려면 어떻게합니까?

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)를 사용하고 싶지 않을 경우 최대 크기를 갖습니다. Vegas/Atlantic City는 신발에 2 개 이상의 데크를 사용합니다. 딜러는 일반적으로 16을 넘지 않습니다. 일부 규칙은 소프트 17 (A + 6) –

답변

1

귀하의 셔플 코드는 카드가 이미 처리 된 무엇을 추적되지 않습니다

이 웹 albulm 내 프로젝트의 전체 요구 사항을 포함하고 있습니다. 호출 할 때마다 dup 배열을 다시 초기화하여 동일한 카드를 여러 번 처리 할 수 ​​있습니다.

제안 사항으로 두 가지 서브 루틴을 작성하십시오. 한 손에 한 장씩 카드를 섞습니다. 그 뒤섞인 갑판에서 두 번째 거래.

0

귀하의 셔플() 루프는 다음과 같이 수행합니다

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

이 루프의 X 반복이 카드 X + N를 생성 할 때 어떤 일이 발생하는지 생각 해보자. 반복 x + n에 도달하면 dup [x + n]을 덮어 씁니다.

첫 번째 행은 현재 색인을 임의로 0 (거짓)으로 설정합니다. 나머지 Shuffle 함수는 임의의 '카드'를 기반으로 dup [] 배열을 인덱싱합니다. dup [] 배열의 임의의 인덱스를 '1'(true)로 설정 한 다음 나중에 반복하여 덮어 쓰면 dup [] 배열이 올바르지 않게됩니다.

기술적으로 배열 항목을 0으로 초기화하면 안됩니다. 이 자동으로 발생해야합니다. 그러나 여러 가지 이유 때문에 어쨌든 어레이 전체를 초기화하는 것이 일반적으로 좋은 방법으로 간주됩니다. 따라서 빠른 루프를 수행하십시오 :

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

따라서 빠른 응답은 for 루프에서 dup [] = 0 행을 제거하는 것입니다.

관련 문제