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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2010, 17:10   #1
yugik
Пользователь
 
Аватар для yugik
 
Регистрация: 04.01.2010
Сообщений: 23
По умолчанию blackjack на с++ ОШИБКА

Всем привет. Пишу консольную игрушку "очко" или "BlackJack" на С++, программа компилится без ошибок, вроде бы все нормально и связанно, но при запуске прога вылетает, происходит ошибка на уровне отладки. Помогите найти где нужно исправить ошибку.

Ошибка:
Код:
Необработанное исключение в "0x00241809" в "blackjack.exe": 0xC0000005: Нарушение прав доступа при чтении "0x336b2ab0".
Первый этап обработки исключения в "0x00241809" в "blackjack.exe": 0xC0000005: Нарушение прав доступа при чтении "0x336b2ab0".

Написать прогу мне нужно до завтра, огромная просьба помогите кто сталкивался с подобніми проблемами.
Заранее спасибо!
yugik вне форума Ответить с цитированием
Старый 17.07.2010, 17:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а где код в котором надо искать ошибку?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.07.2010, 17:31   #3
yugik
Пользователь
 
Аватар для yugik
 
Регистрация: 04.01.2010
Сообщений: 23
По умолчанию

Код зараза не влазит....в одно сообщение попробую впихнуть в два


Первая часть кода:

Код:
#include <iostream>
#include <ctime>

using namespace std;

class blackjack
{
private:
	int numCard; //to know what card you are on

	int totals[2]; // count totals for each hand (0 is users hand, 1 is computers hand)
	int scores[3]; // for scoring
	int deck[52]; // the deck

	int cards[2][5]; //cards in each hand(0 is users hand, 1 is computers hand)


public:
	blackjack ()
	{
		int numCard=0; 
		int totals[2]={0,0}; 
		int scores[3]={0,0,0}; 
	}
	void Intro();
	void Shuffle();
	void Deal();
	void UserHitStay();
	void CompHitStay();
	void DisplayYouCards();
	void DisplayCompCards(bool userDone);
	void CardValue(int card);
	void FindTotals();
	void FindWin();
	void NumWinLose();
	char PlayAgain();
	void set_numCard(int x)
	{
		numCard = x;
	}
	int get_numCard ()
	{
		return numCard;
	}
};

//-------------------------------------------------------------------

void blackjack::Intro()
// Displays the intro
{
	cout<<"#############################\n" 
		<<"##     Game: BlackJack     ##\n"
		<<"#############################\n\n";
}

//-------------------------------------------------------------------

void blackjack::Shuffle()
// Shuffle the cards
{
	bool picked[52];
	int card, a=0;

	srand(time(NULL));

	for (a; a<=51; a++)
	{
		deck[a]=-1;
		picked[a]=false;
	}

	for (int b=0; b<=51; b++)
	{
		do{
			card = rand()%52;
			if (picked[card]==false)
			{
				deck[b]=card;
				picked[card]=true;
			}
		}while (deck[b]==-1);
	}
}

//-------------------------------------------------------------------

void blackjack::Deal()
// Deals out the first cards
{
	int a=0;

	for (a;a<=1;a++)
	{
		cards[0][a]=(deck[numCard]);
		numCard++;
		cards[1][a]=(deck[numCard]);
		numCard++;
	}
}

//-------------------------------------------------------------------

void blackjack::UserHitStay()
// Find out if the user wants to hit, or stay
{
	char hs;

	for (int a=2; a<=4; a++)
	{
		FindTotals(); 
		if (totals[0]>=21)// if the total of their hands is >=21 then don't ask if they want to hit or stay
		{
			break;
		}

		cout<<"\nYou have "<<totals[0]<<" would you like to hit(h), or stay(s)?";
		cin>>hs;
		if ((hs=='h')||(hs=='H'))
		{
			cards[0][a]=deck[numCard];
			numCard++;
			DisplayYouCards();
		}
		else if ((hs=='s')||(hs=='S'))
		{
			DisplayYouCards();
			break;
		}
		else
		{
			a--;
			cout<<hs<<" is not acceptable, enter in either a 'h', or a 's'\n";
		}
	}

}

//-------------------------------------------------------------------

void blackjack::CompHitStay()
// Find out if the computer should hit, or stay
{
	FindTotals();

	if ((totals[0]<=21)&&(cards[0][4]==-1))
	{
		if ((totals[1]==21)&&(cards[1][2]==-1))
		{
		}
		else
		{
			for (int a=2; a<=4; a++)
			{
				FindTotals();

				if (totals[1]<=16)
				{
					cards[1][a]=deck[numCard];
					numCard++;
				}
				//				else if (compTot==17) //needs work yet
				//				{
				//					if (((compCard[0]/4)==0)||((compCard[1]/4)==0)||((compCard[2]/4)==0)||((compCard[3]/4)==0))
				//					{
				//						compCard[a]=deck[numCard];
				//						numCard++;
				//					}
				//				}
				else
				{
					break;
				}
			}
		}
	}
	DisplayCompCards(true);
}

//-------------------------------------------------------------------
yugik вне форума Ответить с цитированием
Старый 17.07.2010, 17:31   #4
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
а где код в котором надо искать ошибку?
:D :D :D :D :D (смешная ситуация получилась)
coNsept вне форума Ответить с цитированием
Старый 17.07.2010, 17:33   #5
yugik
Пользователь
 
Аватар для yugik
 
Регистрация: 04.01.2010
Сообщений: 23
По умолчанию

Вторая часть:

Код:
void blackjack::DisplayYouCards()
// Displays the User's cards
{	
	cout<<"Your Cards:"<<endl;
	for (int a=0; a<=4; a++)
	{
		if (cards[0][a]>=0)
		{
			CardValue(cards[0][a]);
		}
	}
}

void blackjack::DisplayCompCards(bool userDone)
// Displays the Computer's cards
{
	if (userDone==true)
	{
		cout<<endl<<"Computers Cards:"<<endl;
		for (int a=0; a<=4; a++)
		{
			if (cards[1][a]>=0)
			{
				CardValue(cards[1][a]);
			}
		}
	}
	else
	{
		cout<<endl<<"Computers Cards:"<<endl;
		CardValue(cards[1][0]);
	}
}

void blackjack::CardValue(int card)
// Displays what each card really means
{
	switch (card/4)
	{
	case 0:
		cout<<"Ace";
		break;
	case 10:
		cout<<"Jack";
		break;
	case 11:
		cout<<"Queen";
		break;
	case 12:
		cout<<"King";
		break;
	default:
		cout<<(card/4+1);
	}

	cout<<" of ";

	switch (card%4)
	{
	case 0:
		cout<<"Clubs\n";
		break;
	case 1:
		cout<<"Spades\n";
		break;
	case 2:
		cout<<"Hearts\n";
		break;
	case 3:
		cout<<"Diamonds\n";
		break;
	}
}

void blackjack::FindTotals()
// Finds the totals
{
	totals[0]=0;
	totals[1]=0;

	for (int a=0; a<=4; a++) // Find the user's, and comp's total
	{
		// User's total section
		if ((cards[0][a]/4)>=10)
		{
			totals[0]+=10;
		}
		else if (cards[0][a]!=-1)
		{
			totals[0]+=((cards[0][a]/4)+1);
		}

		// Comp's total section
		if ((cards[1][a]/4)>=10)
		{
			totals[1]+=10;
		}
		else if (cards[1][a]!=-1)
		{
			totals[1]+=((cards[1][a]/4)+1);
		}
	}
	for (int b=0; b<=4; b++)
	{
		if ((cards[0][b]==0)||(cards[0][b]==1)||(cards[0][b]==2)||(cards[0][b]==3))
		{
			if (totals[0]<12)
			{
				totals[0]+=10;
			}
		}
		if ((cards[1][b]==0)||(cards[1][b]==1)||(cards[1][b]==2)||(cards[1][b]==3))
		{
			if (totals[1]<12)
			{
				totals[1]+=10;
			}
		}
	}
}

void blackjack::FindWin()
// Find out the total and find out who wins
{
	//int totals[2];

	FindTotals();

	cout<<endl;

	if ((totals[0]==21)&&(cards[0][2]==-1))
	{
		if ((totals[1]==21)&&(cards[1][2]==-1))
		{
			cout<<"We both have BlackJack!"<<endl;
			scores[2]++;
		}
		else
		{
			cout<<"You have Blackjack!"<<endl;
			scores[0]++;
		}
	}
	else if ((totals[1]==21)&&(cards[1][2]==-1))
	{
		cout<<"I have Blackjack!"<<endl;
		scores[1]++;
	}
	else
	{
		if (totals[0]>21)
		{
			cout<<"You busted("<<totals[0]<<"), so you lose!";
			scores[1]++;
		}
		else if (totals[1]>21)
		{
			cout<<"I busted("<<totals[1]<<"), so you win!";
			scores[0]++;
		}
		else if ((cards[0][4]!=-1)&&(totals[0]<22))
		{
			cout<<"You have 5 cards that add up to less than 22, so you win!";
			scores[0]++;
		}
		else if ((cards[1][4]!=-1)&&(totals[1]<22))
		{
			cout<<"I have 5 cards that add up to less than 22, so you lose!";
			scores[1]++;
		}
		else
		{
			cout<<endl<<"You have "<<totals[0]<<" and I have "<<totals[1]<<" so ";
			if (totals[0]>totals[1])
			{
				cout<<"you win!";
				scores[0]++;
			}
			else if (totals[1]>totals[0])
			{
				cout<<"you lose!";
				scores[1]++;
			}
			else
			{
				cout<<"we pushed!";
				scores[2]++;
			}
		}
	}

}

void blackjack::NumWinLose()
// Display how many times they have won/lost
{
	cout<<endl<<"-------------------------"<<endl;
	cout<<"You have won "<<scores[0]<<" times."<<endl;
	cout<<"The computer has won "<<scores[1]<<" times."<<endl;
	cout<<"We have tied "<<scores[2]<<" times."<<endl;
	cout<<"-------------------------"<<endl;
}

char blackjack::PlayAgain()
// Ask if they would like to play again, or see the scores
{
	char again='n';

	do{
		cout<<endl<<"Would you like to play again (y or n), or see the score(s)?";
		cin>>again;

		if ((again=='s')||(again=='S')) //to see the scores
		{
			NumWinLose();
		}
		else if ((again!='n')&&(again!='N')&&(again!='y')&&(again!='Y'))
		{
			cout<<again<<" is not acceptable, enter in either a 'n', 'y', or a 's'"<<endl;
		}
	}while ((again!='n')&&(again!='N')&&(again!='y')&&(again!='Y'));

	return(again);
}

void main ()
{
		char runAgain; //used to know if the user wants to play again
	blackjack game;
	
	game.Intro();

	game.Shuffle();

	do{
		if (game.get_numCard()>40)
		{
			game.Shuffle();
			game.set_numCard(0);
		}

		game.Deal();

		game.DisplayYouCards();

		game.DisplayCompCards(false);

		game.UserHitStay();

		game.CompHitStay();

		game.FindWin();

		runAgain=(game.PlayAgain());
		if((runAgain=='y')||(runAgain=='Y')) //to play again
		{
			cout<<endl;
			cout<<"--------------------------------------------------"<<endl;
		}
		else if ((runAgain=='n')||(runAgain=='N')) //to quit
		{
			cout<<endl;
			break;
		}
	}
while ((runAgain!='n')&&(runAgain!='N'));
}
Вот.
yugik вне форума Ответить с цитированием
Старый 18.07.2010, 14:13   #6
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

поставте галочку в Debug -> Exceptions -> Win32 Exceptions
там в списке код этой ошибки, галочку напротив C0000005 Access Violation
Тогда дебагер остановиться на строке в которой происходит эта ошибка. Она значит, что вы обращаетесь по адрессу, которого не существует. Чаще из за переполнения буфера выскакивает, или при общанию к указателям для которых не выделена память.
подпись
liljon вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Nero - ошибка драйвера DMA. ошибка CRC NecRoMat Софт 5 09.05.2012 01:29
Это ошибка Delphi или моя ошибка??? bloodeagle Общие вопросы Delphi 3 12.11.2009 15:26
Ошибка в статье = ошибка в рограмме. Alex Cones Общие вопросы Delphi 14 29.07.2009 18:17
Ошибка в Аfor i:=1 to SI do. Пишит что ошибка в SI Алексей_xXx Помощь студентам 2 29.05.2009 00:09
...Ошибка 101 (net::ERR_CONNECTION_RESET): Неизвестная ошибка... infrared Помощь студентам 0 16.04.2009 17:44