C/C++ - BlackJack

Аватара пользователя
SAU-trade

C/C++ - BlackJack

Сообщение SAU-trade »

Здравствуйте! Пытаюсь реализовать игру Блэк Джэк. Создаю колоду, тусую. Вопрос вот в чем как организовать выдачу карт с извлечением их из колоды(тобишь чтобы они были на руках но в калоде не числились)))...





Код:

Код: Выделить всё

//Card.h
#include <iostream>
#include <string.h>
using namespace std;
enum Suit {clubs, diamonds, hearts, spades};
class Card{
private:
	Suit suit;
	int face;
public:
	Card();
	void setCard(int, Suit);
	void PrintCard();
	void setScore();
};



Код:

Код: Выделить всё

//Card.cpp
#include <iostream>
#include "Card.h"
using namespace std;
Card::Card(){
	this->face = 0;
	this->suit = (Suit)0;
}
void Card::setCard(int f, Suit s){
	this->face = f;
	this->suit = s;
}
void Card::PrintCard(){
	if (face >= 2 && face <= 10)
		cout << face;
	else{
		switch (face){
			case 11: cout << 'J'; break;
			case 12: cout << 'Q'; break;
			case 13: cout << 'K'; break;
			case 14: cout << 'A'; break;
		}
	}
	switch (suit)
	{
	   case clubs: cout << static_cast<char>(5); break;
	   case diamonds: cout << static_cast<char>(4); break;
	   case hearts: cout << static_cast<char>(3); break;
	   case spades: cout << static_cast<char>(6); break;
	}
}



Код:

Код: Выделить всё

//CardBatch.h
#include <iostream>
#include "Card.h"
class Card_Batch{
	Card* cards;
public:
	Card_Batch();
	void setCard_Batch();
	void Shuffle();
	void display();
	void getcard(); // Тест... для извлечения карты в этом классе временно
};



Код:

Код: Выделить всё

//CardBatch.cpp
#include <iostream>
#include "CardBatch.h"
#include <ctime>
using namespace std;
Card_Batch::Card_Batch(){
	const int size = 52;
//	this->score = 0;
	cards = new Card[size];
}
//Создание колоды карт
void Card_Batch::setCard_Batch(){
	for(int i = 0; i < 52; i++){
		int f = (i%13) + 2;
		Suit s = Suit(i/13);
		cards[i].setCard(f, s);
	}
}
//Тусуется колода карт
void Card_Batch::Shuffle(){
	srand (unsigned(time(NULL)));
	for(int i = 0; i < 52; i++){
		int k = rand()%52;		//выбираем случайную карту
		Card temp = cards[i];	//и меняем ее с текущей
		cards[i] = cards[k];
		cards[k] = temp;
	}
}
void Card_Batch::display(){
	for (int i = 0; i < 52; i++ ){
		cards[i].PrintCard();
		if(!((i+1)%13))			// начинаем новую строку после каждой 13-й карты
		  cout << endl;
    }
	cout << "\n\n\n";
}
void Card_Batch::getcard(){
	for(int i = 0; i < 2; i++)
		cards[i].PrintCard();
}



Код:

Код: Выделить всё

//main
//Тестовый режим
#include <iostream>
#include "CardBatch.h"
using namespace std;
int main(){
	setlocale(LC_ALL,"russian");
	Card_Batch A;
	A.setCard_Batch();
	A.display();
	A.Shuffle();
	A.display();
	A.getcard();
	cout << endl;
	A.getcard();

П.С. Если я неправильно организовываю классы буду внимателен к вашим замечаниям.. Заранее спс.
Аватара пользователя
lxa85

Re: C/C++ - BlackJack

Сообщение lxa85 »

SAU-trade, можно тебя попросить прикрепить проект?


Цитата SAU-trade:



Вопрос вот в чем как организовать выдачу карт с извлечением их из колоды(тобишь чтобы они были на руках но в калоде не числились)
C/C++ - BlackJack




Извернуться, организовать списки карт.

Ну хорошо, не списки, массивы.

Организовать дополнительное поле в массиве колоды карт с номером игрока(1-10), выбывшей картой(99),не разыгранной картой(0).
Аватара пользователя
SAU-trade

Re: C/C++ - BlackJack

Сообщение SAU-trade »

Цитата SAU-trade:



Создаю колоду, тусую.
C/C++ - BlackJack




Если я правильно понял, то создание колоды и ее перетасовка реализованы? То есть, имеется массив, содержащий карты в случайном порядке?


Цитата SAU-trade:



как организовать выдачу карт с извлечением их из колоды(тобишь чтобы они были на руках но в калоде не числились)))...
C/C++ - BlackJack




Если сказанное мной выше верно, то почему бы тупо не пройти этот массив в цикле for?



Если я что то неправильно понял, то выкладывайте файлы проекта и правила игры.
Аватара пользователя
torauma

Re: C/C++ - BlackJack

Сообщение torauma »

SAU-trade, я не стал сильно вникать в код. Когда-то давно я писал что-то подобное. И для карт я сделал класс объектов (или структуру) поля которого содержали следующее:

- масть

- вес (2-10, J, Q, K, A, Joker)

- местонахождение карты (колода, стол, игрок 1, игрок 2 и т.д.)



Создавал в цикле колоду карт (а именно массив объектов вышестоящего класса), перемешивал её (но алгоритм я тогда какой-то жудко мудрёный придумал со сторонним генератором случайных чисел). Создавал игроков. Раздавал карты в нужной последовательности. Исходя из своих карт и карт на столе просчитывал вероятности выпадения той или иной комбинации (пара, тройка,флеш и т.д.). По идее ещё нужно было просчитывать возможные комбинации у партнёров по игре и следить за ставками, но до этого руки так и не дошли.
Аватара пользователя
Tonny_Bennet

Re: C/C++ - BlackJack

Сообщение Tonny_Bennet »

SAU-trade, я не стал сильно вникать в код. Когда-то давно я писал что-то подобное. И для карт я сделал класс объектов (или структуру) поля которого содержали следующее:

- масть

- вес (2-10, J, Q, K, A, Joker)

- местонахождение карты (колода, стол, игрок 1, игрок 2 и т.д.)



Создавал в цикле колоду карт (а именно массив объектов вышестоящего класса), перемешивал её (но алгоритм я тогда какой-то жудко мудрёный придумал со сторонним генератором случайных чисел). Создавал игроков. Раздавал карты в нужной последовательности. Исходя из своих карт и карт на столе просчитывал вероятности выпадения той или иной комбинации (пара, тройка,флеш и т.д.). По идее ещё нужно было просчитывать возможные комбинации у партнёров по игре и следить за ставками, но до этого руки так и не дошли.
Аватара пользователя
SAU-trade

Re: C/C++ - BlackJack

Сообщение SAU-trade »

Да реализация колоды и ее перемешивания реализованы.. Я пробЫвал циклом for вытаскивать две карты - вытаскивает, ток я не знаю как сделать чтобы они из колоды выходили... Так как получается что следующие две карты выходят те же))



Правила просты: каждому игроку вначале выдается по две карты... Идет проверка выпало ли кому 21 очко.. Если нет - первый игрок решает добрать карту или нет... Если да опять проверка больше/меньше 21? и т.д. Если выбор не добирать -- компьютер выбирает добрать карту или стоять... Если стоять, тогда сравниваются очки у двух игроков и выигрывает у кого больше)
Вложения
BlackJack.rar
(112.32 КБ) 0 скачиваний
BlackJack.rar
(112.32 КБ) 0 скачиваний
Аватара пользователя
SAU-trade

Re: C/C++ - BlackJack

Сообщение SAU-trade »

Цитата SAU-trade:



Я пробЫвал циклом for вытаскивать две карты - вытаскивает, ток я не знаю как сделать чтобы они из колоды выходили
C/C++ - BlackJack




Опять же я не стану вникать в код и пока буду просто говорить о "высоком"...



Что вы понимаете под фразой вытаскивать? К примеру у вас есть массив колоды, и если вы "вытаскиваете" карту, то есть несколько вариантов: или ввести поле указывающее на расположение этой карты (колода, игрок1, игрок2 и т.д.), или просто перенести этотот объект (карту) в другой массив - массив набора карт игрока (состоящий из 2-х элементов). Соответственно у вас будет массив колоды с пустыми элементами, потом его можно переопределить, чтобы убрать эти пустые элементы.




Цитата SAU-trade:



Правила просты: каждому игроку вначале выдается по две карты... Идет проверка выпало ли кому 21 очко.. Если нет - первый игрок решает добрать карту или нет... Если да опять проверка больше/меньше 21? и т.д. Если выбор не добирать -- компьютер выбирает добрать карту или стоять... Если стоять, тогда сравниваются очки у двух игроков и выигрывает у кого больше)
C/C++ - BlackJack




Правила понятны, но не понятно кто с кем играет. Один человек играет против "искусственного интеллекта" или игроков больше? Если игрок один и он играет с компьютером то компьютер нужно наделить какими-то знаниями и тактикой? По какому принципу компьютер будет добирать себе карту? Только если у него недобор? А если у него 20 очков... я бы на его месте остановился что б потом перебора небыло Изображение
Вложения

[Расширение png было запрещено, вложение больше недоступно.]

Аватара пользователя
Tonny_Bennet

Re: C/C++ - BlackJack

Сообщение Tonny_Bennet »

Цитата Tonny_Bennet:



Правила понятны, но не понятно кто с кем играет.
C/C++ - BlackJack




игрок с компом))




Цитата Tonny_Bennet:



Что вы понимаете под фразой вытаскивать? К примеру у вас есть массив колоды, и если вы "вытаскиваете" карту, то есть несколько вариантов: или ввести поле указывающее на расположение этой карты (колода, игрок1, игрок2 и т.д.), или просто перенести этотот объект (карту) в другой массив - массив набора карт игрока (состоящий из 2-х элементов). Соответственно у вас будет массив колоды с пустыми элементами, потом его можно переопределить, чтобы убрать эти пустые элементы.
C/C++ - BlackJack




Логику я организую и учту все варианты.... Сейчас у меня проблема с расдачей карт...

Хочу перенести карты которые вытаскиваются из колоды в масив набора карт игрока.

Вы писали что можно определить карте место положения - очень хороший совет спс...
Аватара пользователя
SAU-trade

Re: C/C++ - BlackJack

Сообщение SAU-trade »

Цитата SAU-trade:



Так как получается что следующие две карты выходят те же
C/C++ - BlackJack






Код:

Код: Выделить всё

 
void Card_Batch::getcard(){
	for(int i = 0; i < 2; i++)
		cards[i].PrintCard();
}

А как они по вашему станут другими? Вы же при каждом вызове этого метода обращаетесь к 2 первым элементам массива. Можно, конечно, и так, но тогда нужно произвести сдвиг массива влево.

Но зачем все это, если можно просто взять следующие элеметы. Всего лишь введите в свойства класса номер верхней карты в колоде и используйте в качестве первого элемента индекса.



Код:

Код: Выделить всё

class Card_Batch{
private:
	Card* cards;
	int nTopCard;
public:
	Card_Batch();
	void setCard_Batch();
	void Shuffle();
	void display();
	void getcard();
};



Код:

Код: Выделить всё

 
Card_Batch::Card_Batch(){
	const int size = 52;
//	this->score = 0;
	nTopCard = 0;
	cards = new Card[size];
}



Код:

Код: Выделить всё

 
void Card_Batch::getcard(){
	for(int i = nTopCard; i < nTopCard + 2; i++)
		cards[i].PrintCard();
	nTopCard += 2;
}
Аватара пользователя
torauma

Re: C/C++ - BlackJack

Сообщение torauma »

Огромное спс)) Когда доделаю выложу все сюда))
Ответить

Вернуться в «Программирование и базы данных»