Міністерство освіти і науки, молоді та спорту України
Тернопільський національний економічний університет
Факультет Комп’ютерних Інформаційних Технологій
Комплексне Практичне Індивідуальне Завдання
з дисципліни
«Алгоритмізація та програмування»
Гра «Black Jack» мовою С++
Завдання: комп’ютерна гра black jack, суть гри полягає в тому щоб набрати 21 очко
БЛОК-СХЕМА
Main
/
Лістинг програми
// Black Jack;).cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <ctime>
using namespace std;
void Shuffle(bool baCardsDealt[]);
void PrintCard(int iCard);
void PrintHand(int iaHand[], const int kiCardCount);
int GetNextCard(bool baCardsDealt[]);
int ScoreHand(int iaHand[], const int kiCardCount);
void PrintScoresAndHands(int iaHouseHand[], const int kiHouseCardCount, int iaPlayerHand[], const int kiPlayerCardCount);
int main() {
// Seed the random number generator
time_t qTime;
time(&qTime);
srand(qTime);
bool baCardsDealt[52];
int iHouseCardCount = 0;
int iaHouseHand[12];
int iPlayerCardCount = 0;
int iaPlayerHand[12];
// Loop once for each hand
while (true) {
// "Shuffle" the cards; set them all to undealt
Shuffle(baCardsDealt);
// Deal the hands. Get two cards for each
iaPlayerHand[0] = GetNextCard(baCardsDealt);
iaHouseHand[0] = GetNextCard(baCardsDealt);
iaPlayerHand[1] = GetNextCard(baCardsDealt);
iaHouseHand[1] = GetNextCard(baCardsDealt);
iHouseCardCount = 2;
iPlayerCardCount = 2;
// Signal a new hand.
cout << "--------------------------------------------------------" << endl;
cout << "-----------------------New Hand-------------------------" << endl;
cout << "--------------------------------------------------------" << endl;
char cPlayerChoice;
bool bPlayerHits = true;
int iPlayerScore = ScoreHand(iaPlayerHand, iPlayerCardCount);
// Get Player's hits. Calculate the score and redisplay after each hit.
do {
// Print the dealt cards, but only the House's second card.
cout << "House's Hand" << endl;
cout << "** ";
PrintCard(iaHouseHand[1]);
cout << endl;
cout << "Player's Hand: Score = " << ScoreHand(iaPlayerHand, iPlayerCardCount) << endl;
PrintHand(iaPlayerHand, iPlayerCardCount);
// Ask the Player whether he wants a hit or to stay
cout << "Hit(h) or stay(s): ";
cin >> cPlayerChoice;
if (cPlayerChoice == 'h') {
iaPlayerHand[iPlayerCardCount] = GetNextCard(baCardsDealt);
++iPlayerCardCount;
} else if (cPlayerChoice == 's') {
bPlayerHits = false;
} else {
cout << "Error: Try Again!" << endl;
}
cout << endl;
// Get the Player's current score to update and check for bust.
iPlayerScore = ScoreHand(iaPlayerHand, iPlayerCardCount);
} while (bPlayerHits && iPlayerScore < 22);
// Once the player is done taking hits, check whether he busted
if (iPlayerScore > 21) {
// The Player busted. The House wins.
cout << "**** The House Wins!!! ****" << endl;
PrintScoresAndHands(iaHouseHand, iHouseCardCount, iaPlayerHand, iPlayerCardCount);
} else {
// If the player didn't bust, then the house takes hits below 17
int iHouseScore = ScoreHand(iaHouseHand, iHouseCardCount);
while (iHouseScore < 17) {
iaHouseHand[iHouseCardCount] = GetNextCard(baCardsDealt);
++iHouseCardCount;
iHouseScore = ScoreHand(iaHouseHand, iHouseCardCount);
}
bool bHouseBusts = (iHouseScore > 21);
if (bHouseBusts) {
// The House busted. Player wins
cout << "**** The Player Wins!!! ****" << endl;
PrintScoresAndHands(iaHouseHand, iHouseCardCount, iaPlayerHand, iPlayerCardCount);
} else {
// Compare scores and determine the winner
if (iPlayerScore == iHouseScore) {
// Tie. This is called a "push."
cout << "**** Tie!!! ****" << endl;
PrintScoresAndHands(iaHouseHand, iHouseCardCount, iaPlayerHand, iPlayerCardCount);
} else if (iPlayerScore > iHouseScore) {
// The Player wins
cout << "**** The Player Wins!!! ****" << endl;
PrintScoresAndHands(iaHouseHand, iHouseCardCount, iaPlayerHand, iPlayerCardCount);
} else {
// The House wins
cout << "**** The House Wins!!! ****" << endl;
PrintScoresAndHands(iaHouseHand, iHouseCardCount, iaPlayerHand, iPlayerCardCount);
}
}
}
}
return EXIT_SUCCESS;
}
void Shuffle(bool baCardsDealt[]) {
for (int iIndex = 0; iIndex < 52; ++iIndex) {
baCardsDealt[iIndex] = false;
}
}
void PrintCard(int iCard) {
// Print Rank
const int kiRank = (iCard % 13);
if (kiRank == 0) {
cout << 'A';
} else if (kiRank < 9) {
cout << (kiRank + 1);
} else if (kiRank == 9) {
cout << 'T';
} else if (kiRank == 10) {
cout << 'J';
} else if (kiRank == 11) {
cout << 'Q';
} else {
cout << 'K';
}
// Print Suit
const int kiSuit = (iCard/13);
if (kiSuit == 0) {
cout << 'C';
} else if (kiSuit == 1) {
cout << 'D';
} else if (kiSuit == 2) {
cout << 'H';
} else {
cout << 'S';
}
}
void PrintHand(int iaHand[], const int kiCardCount) {
for (int iCardIndex = 0; iCardIndex < kiCardCount; ++iCardIndex) {
const int kiNextCard = iaHand[iCardIndex];
PrintCard(kiNextCard);
cout << " ";
}
cout << endl;
}
int GetNextCard(bool baCardsDealt[]) {
bool bCardDealt = true;
int iNewCard = -1;
do {
iNewCard = (rand() % 52);
if (!baCardsDealt[iNewCard]) {
bCardDealt = false;
}
} while (bCardDealt);
return iNewCard;
}
int ScoreHand(int iaHand[], const int kiCardCount) {
int iAceCount = 0;
int iScore = 0;
for (int iCardIndex = 0; iCardIndex < kiCardCount; ++iCardIndex) {
const int kiNextCard = iaHand[iCardIndex];
const int kiRank = (kiNextCard % 13);
if (kiRank == 0) {
++iAceCount;
++iScore;
} else if (kiRank < 9) {
iScore = iScore + (kiRank + 1);
} else {
iScore = iScore + 10;
}
}
while (iAceCount > 0 && iScore < 12) {
--iAceCount;
iScore = iScore + 10;
}
return iScore;
}
void PrintScoresAndHands(int iaHouseHand[], const int kiHouseCardCount, int iaPlayerHand[], const int kiPlayerCardCount) {
cout << "House's Hand: Score = " << ScoreHand(iaHouseHand, kiHouseCardCount) << endl;
PrintHand(iaHouseHand, kiHouseCardCount);
cout << "Player's Hand: Score = " << ScoreHand(iaPlayerHand, kiPlayerCardCount) << endl;
PrintHand(iaPlayerHand, kiPlayerCardCount);
cout << endl;
}
Прінт скрін
Висновок:
Дана програма рахує кількість карт і виводить на екран рандомні значення які сумує і вираховує хто виграв користувач чи компютер.