Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 18:15   #1
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию ошибка с++

Решил попробывать написать покер.))))
Всё работает вроде нормально кроме функции по выдаче карт игроку(newcards). Работает через раз. 3 варианта работы программы:
1. Раздаёт нормально и выводит на эран.
2. Работает но не выводит карты игрока(послеследующие функции работают)
3 Вылетает.
Можете помочь разобраться в чём дело, предпологаю что проблема где-то здесь:
card pack::getcard()
player::newcards(pack& a)

Код:
#include <iostream>
#include <conio.h>
#include <time.h>
using namespace std;

class card{
	char suit;
	char rank;
	int id;
public:
	card(int c=-1);
	void delcard()
	{
		id=-1;
		suit='0';
		rank='0';
	}
void	showcard();
};

card::card(int c){
	id=c;
	if (id==-1)
	{
		suit='0';
		rank='0';
		return;
	}
	suit= char((id-1)/13);
	rank=char(id%13);
	switch (suit){
	case 0: suit=3;break;
	case 1: suit=4;break;
	case 2: suit=5;break;
	case 3: suit=6;break;
	}
	switch (rank){
	case 1: rank='2';break;
	case 2: rank='3';break;
	case 3: rank='4';break;
	case 4: rank='5';break;
	case 5: rank='6';break;
	case 6: rank='7';break;
	case 7: rank='8';break;
	case 8: rank='9';break;
	case 9: rank='T';break;
 	case 10: rank='J';break;
	case 11: rank='Q';break;
	case 12: rank='K';break;
	case 0: rank='A';break;
	}

	
}
void card::showcard(){
	cout<<suit<<rank<<" ";
	}

class pack{
	static const int maxcards=52;
	card cards[maxcards];
	int pos;
	
public:
	void showpack();
		pack();
	void shuffle();
	card getcard();
};

card pack::getcard()
{
	pos--;
	return cards[pos];
}
pack::pack(){
	pos=52;
for(int i=0; i<maxcards;i++)
	cards[i]=i+1;
}
void pack::shuffle(){
	card c;
	srand(time(NULL));
	for(int i=0;i<maxcards;i++)
	{int r;
		r=rand() % 52+1;
		c=cards[i];
		cards[i]=r;
		cards[r]=c;
	}
}
void pack::showpack(){
for(int i=0;i<52;i++)
{if (i%13==0) cout<<"\n";
	cards[i].showcard();
}
cout<<"\n";
}


class player{
	static int count;
	card pocket[2];
	int besthand;
	int money;
public:
	player();
	void newcards(pack& a);
	void spcards();
	void showcount()
	{cout<<count;}
};

player::player()
{
	count++;
	besthand=0;
	money=0;
	pocket[1].delcard();
}
void player::newcards(pack& a) //выдать карты игроку
{	
	pocket[0]=a.getcard();
	pocket[1]=a.getcard();
}
void player::spcards()  //показать карты игрока
{
	pocket[0].showcard();
	pocket[1].showcard();
	cout<<"\n";
}

int player::count;
int main()
{player n;
	pack a;
	a.showpack();	//вывод колоды на экран
	a.shuffle();	// тасуем колоду
	cout<<"\n";
	a.showpack();	//вывод
	n.newcards(a); //выдача карт игроку
	n.spcards();	//вывод карт игрока
	n.showcount();	//вывод кол-ва игроков
	getch();
}

Последний раз редактировалось tolikprankster; 05.03.2013 в 18:20.
tolikprankster вне форума Ответить с цитированием
Старый 05.03.2013, 18:27   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Что говорит отладчик? Как вариант, что говорит отладочная печать, выводящая pos на каждом getcard()?
2) Воля Ваша, но shuffle() странен. r принимает значения от 1 до 52, а индекс cards может меняться от 0 до 51... гм...
3) Ужас из switch в конструкторе card можно заменить на:
Код:
const char suits[] = {3, 4, 5, 6};
if(id<-1 || id>=52) exit(EXIT_FAILURE); 
suit = suits[(id-1)/13];
rank = "A23456789TJQK"[id%13]; //Ага, можно и так
suit
Abstraction вне форума Ответить с цитированием
Старый 05.03.2013, 18:51   #3
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
1) Что говорит отладчик? Как вариант, что говорит отладочная печать, выводящая pos на каждом getcard()?
2) Воля Ваша, но shuffle() странен. r принимает значения от 1 до 52, а индекс cards может меняться от 0 до 51... гм...
3) Ужас из switch в конструкторе card можно заменить на:
Код:
const char suits[] = {3, 4, 5, 6};
if(id<-1 || id>=52) exit(EXIT_FAILURE); 
suit = suits[(id-1)/13];
rank = "A23456789TJQK"[id%13]; //Ага, можно и так
suit
Спасибо за замечания и полезные советы. Проблема действительно была в shuffle(),
switch заменю)
tolikprankster вне форума Ответить с цитированием
Старый 06.03.2013, 00:11   #4
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Возник ещё один вопрос по динамическому выделению памяти. Суть в следующем.
В начале функции game() создается массив игроков(player), в конце он удаляется. В конструкторе и деструкторе данного класса переменная cplayer соответственно инкреминтируется и декриментируется. Однако с каждым запуском функции game(), cplayer уменьшается на 1. Тоесть если count=5, то конструктор вызывается 5 раз, а деструктор 6.


class player{
public:
static int cplayer;
};
void game(int count)
{
player* n=new player[count];
cout<<player::cplayer<<"\n";
createpack();
showpack();
shuffle();
desk* d = new desk;
deal(n,count);
for(int i=0;i<count;i++)
n[i].spcards();
d->flop();
d->showcom();
besthand(n[2],d);
delete d;
delete [count]n;
getch();
}
tolikprankster вне форума Ответить с цитированием
Старый 06.03.2013, 01:08   #5
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Проблема была в besthand(n[2],d);
создал конструктор копии, но всё равно здесь "besthand(n[2],d);" вызывается обычный конструктор. Почему?

Код:
player:: player(const player& a)
{	
	bhand=a.bhand;
	money=a.money;
	pocket[0]=a.pocket[0];
	pocket[1]=a.pocket[1];
}
player:: player()
{	
	cplayer++;
	bhand=0;
	money=0;
	pocket[0].clearcard();
	pocket[1].clearcard();
}
tolikprankster вне форума Ответить с цитированием
Старый 06.03.2013, 01:09   #6
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

1) Почему переменная player::cplayer public?
2) Почему она не инициализируется при объявлении?
3) " delete [count]n;" Вероятно, имелось в виду delete[] n;
4) Я вижу только один вывод "cout<<player::cplayer<<"\n";". Расставьте их в разных точках функции для более точной диагностики.
Abstraction вне форума Ответить с цитированием
Старый 06.03.2013, 01:11   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
создал конструктор копии, но всё равно здесь "besthand(n[2],d);" вызывается обычный конструктор. Почему?
Судя по Вашему описанию, проблема ровно обратная: при создании копии Вы не увеличиваете cplayer, а деструктор-то для неё тоже будет вызван...
Abstraction вне форума Ответить с цитированием
Старый 06.03.2013, 01:18   #8
tolikprankster
Пользователь
 
Регистрация: 09.02.2013
Сообщений: 60
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Судя по Вашему описанию, проблема ровно обратная: при создании копии Вы не увеличиваете cplayer, а деструктор-то для неё тоже будет вызван...
ой протупил. Спасибо. Всё работает!)
tolikprankster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Где ошибка в этом исходном коде на языке Си? Или ошибка в Excel? ArchiCurtis Помощь студентам 2 07.04.2012 14:16
Ошибка run-time Error 1004 общая ошибка ODBC kaval88 Microsoft Office Excel 0 27.02.2011 20:20
Ошибка в коде, ошибка в css или это проблема с совместимостью с браузерами? ankris HTML и CSS 5 23.11.2010 16:58
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44