Я на самом деле пытаюсь создать блеф карточную игру на с ++. Когда я вызываю функцию showAllCards, карта у колоды (Ace of Hearts) не отображается на выходе, единственный способ показать это — добавить обе структуры колоды в основной корпус. И когда программа запускается (без верхней карты), dev также генерирует некоторые предупреждения. Что я делаю неправильно?
Также можете ли вы сослаться на некоторые улучшения / изменения в программе.
Вот код:
#include <iostream>
#include<Strings.h>
#include<cstdlib>
using namespace std;
struct link{
int data;
link *link;
};
struct deck
{
string suit[32];
string value[32];
}card;
struct cardsDeck{
string nxt[20];
string suitlist[4] = {"hearts","spades","clubs","diamonds"};
string vals[8] = {"ace","two","three","four","five","jack","queen","king"};
}cdeck;
class Game
{
private:
link *first;
public:
Game();
void check();
void mask();
void pass();
void enterCard();
void showAllCards();
void shuffle();
void rearrangeCards();
};
Game::Game(){
first=NULL;
}
void Game::rearrangeCards(){
short int x = 0, y = 0, z = 0;
while(x < 32)
{
card.suit[x] = cdeck.suitlist[y];
card.value[x] = cdeck.vals[z];
++x;
++z;
if(x % 8 == 0)
{
++y;
}
if(z % 8 == 0)
{
z = 0;
}
}
}
void Game::showAllCards(){
int x;
while(x < 32)
{
if(card.suit[x]!=card.suit[x-1]){
cout<<"\n";
}
cout << card.value[x] << " of " << card.suit[x] << "\n";
++x;
}
}
int main(){
Game game;
int op;
game.rearrangeCards();
cout<<"Welcome to Bluff Mashter 20/12/15::6:46\nEnter the Operation please:\n\n";
cin>>op;
while(op!=0){
switch(op){
case 1:
game.showAllCards();
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
}
return 1;
}
и вот предупреждения
20 63 E:\Projjects\mainbluuf.cpp [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11
21 78 E:\Projjects\mainbluuf.cpp [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11
20 63 E:\Projjects\mainbluuf.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
21 78 E:\Projjects\mainbluuf.cpp [Warning] extended initializer lists only available with -std=c++11 or -std=gnu++11
при условии, что ваш метод таков:
void Game::showAllCards(){
int x = 0;
while(x < 32)
{
if(card.suit[x]!=card.suit[x-1]){
cout<<"\n";
}
cout << card.value[x] << " of " << card.suit[x] << "\n";
++x;
}
}
в вашей первой итерации вы делаете это: card.suit[0]!=card.suit[-1]
что неправильно.
void Game::showAllCards(){
int x = 1;
while(x < 32)
{
if(card.suit[x]!=card.suit[x-1]){
cout<<"\n";
}
cout << card.value[x] << " of " << card.suit[x] << "\n";
++x;
}
}
Я не проверял код, хотя, но я думаю, что это решает проблему.
Примечание: я установил x
в 1
это единственное изменение. Так как вы новичок в C ++ по умолчанию uninitialized
переменные могут содержать любые непредсказуемые значения, которые хранятся в этом адресе памяти, поэтому рекомендуется всегда инициализируйте ваши переменные.
Обновить:
Попробуй это:
void Game::showAllCards(){
for(x = 0; x < 32; ++x)
{
cout << card.value[x] << " of " << card.suit[x] << "\n";
}
}
Обновление 2:
int main(){
Game game;
int op;
game.rearrangeCards();
cout<<"Welcome to Bluff Mashter 20/12/15::6:46\nEnter the Operation please:\n\n";
cin >> op;
while(op!=0){
switch(op){
case 1:
game.showAllCards();
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
}
cin >> op;
}
return 0;
}
Обновление 3:
void Game::showAllCards(){
string lastSuit = "";
for(x = 0; x < 32; ++x)
{
if(lastSuit != card.suit[x])
cout << "\n";
cout << card.value[x] << " of " << card.suit[x] << "\n";
lastSuit = card.suit[x];
}
}
После некоторых логических пыток и советов от Бойнукса я разобрался в обеих проблемах.
for(int j=0;j<32;j++){
cout<<card.value[j] << " of " << card.suit[j]<<"\n";
if(j==7 || j==15 || j==23 || j==31)
{
cout<<"\n";
}
}