Potrzebuje pomocy przy pisaniu programu.

0

Witam douczyłem się troszke c++ i oto fragment mojego programu.

Ostatnie pytania i potem zamykam temat.

Oto fragment mojego kod.

#include <cstdlib>
#include <iostream>
#include <string>
#include <windows.h>
#include <fstream>
using namespace std;

const char * num_str[] =
{
	"",
    "Dziesiatka",
    "Dwojka",
    "Trojka",
    "Czworka",
    "Piatka",
    "Szostka",
    "Siodemka",
    "Osemka",
    "Dziewiatka",
    "Walet",
    "Dama",
    "Krol",
    "As",
};

void col_str( char col ) {
    if( col == 'K' ) cout << "Kier";
    else if( col == 'P' ) cout << "Pik";
    else if( col == 'K' ) cout << "Kier";
    else if( col == 'T' ) cout << "Trefl";
    else if( col == 'A' ) cout << "Karo";
    else cout << "ERROR";
    
}
int karta( string s ) {
    int n;
    char c;
    if( isdigit( s[ 0 ] ) )
    {
        n=s[0]-'0';
    }
    else
    {
        switch( s[ 0 ] )
        {	
		case '1': n = 10; break;
		case 'W': n = 11; break;
        case 'D': n = 12; break;
        case 'K': n = 13; break;
        case 'A': n = 14; break;
        default: n = 0;
        };
        c = s[ 1 ];
    }

	 
    if( n>0) cout << "karta " << num_str[ n ];
	else cout << "ERROR ";
 
    cout << " kolor ";
    col_str( c );
    cout << endl;
    return n;
}
  

Opis działania programu jest prosty.
2 pliki tekstowe z których program odczytuje karty.
Pierwsza litera bądz cyfra to rodzaj karty np 1 to - dziesięć a K to król a druga to kolor.
Mam problem bo mimo że program działa to karta dziesiątka jest dopiero po wpisaniu 10 w polu karta w pliku tekstowym (10K - dziesiątka kier) a ma to być 1K. Nie był by to problem wystarczy dać opis dziesiątka w innym miejscu lecz wtedy ta karta ma wartość 1.
Jak to zrobić by wyświetlała sie 10 po wpisaniu 1 i dawała wartość 10?

I 2 proźba chciałbym dodać możliwość czytania układów pokerowych.
W jaki sposób to zapisać by np jeśli zmienna c (kolor) =c=c=c=c dawałą mi opis kolor a np n+(n+1)+(n+2 ) ... dawała strita.
Liczę że zrozumiecie i pomożecie.
Pozdrawiam

0

Zamiast char* proponuję std::vector std::string, na pewno będzie łatwiej tą tablicę kontrolować, w funkcji która wybiera kolor dwa razy sprawdzasz 'K', no i najważniejsze nie pokazałeś jak to wywołujesz... patrząc na to co jest tutaj to powinnien pokazać waleta jak jest '1'...

0
 #include <cstdlib>
#include <iostream>
#include <string>
#include <windows.h>
#include <fstream>
using namespace std;

const char * num_str[] =
{
	"ERROR",
	"ERROR",
	"Dwojka",
    "Trojka",
    "Czworka",
    "Piatka",
    "Szostka",
    "Siodemka",
    "Osemka",
    "Dziewiatka",
    "Dziesiatka",
	"Walet",
    "Dama",
    "Krol",
    "As",
};

void col_str( char col ) {
    if( col == 'K' ) cout << "Kier";
    else if( col == 'P' ) cout << "Pik";
    else if( col == 'K' ) cout << "Kier";
    else if( col == 'T' ) cout << "Trefl";
    else if( col == 'A' ) cout << "Karo";
    else cout << "ERROR";
    
}
int karta( string s ) {
    int n;
    char c;
    if( isdigit( s[ 0 ] ) )
    {
        if( sscanf( s.c_str(), "%i%c", & n, & c ) != 2 );
    }
    else
    {
        switch( s[ 0 ] )
        {	
		case '1': n = 10; 
		case 'W': n = 11; break;
        case 'D': n = 12; break;
        case 'K': n = 13; break;
        case 'A': n = 14; break;
        default: n = 0;
        };
        c = s[ 1 ];
    }

   
	 
    if( n<=14 ) cout << "karta " << num_str[ n ];
	else cout << "ERROR ";
 
    cout << " kolor ";
    col_str( c );
    cout << endl;
    return n;
}

int main() {


       system( "pause" );
	   system( "cls" );
    
    cout << "Karty Gracza 1 : " << endl;
    ifstream in2( "Gracz 1.txt" );
   
    if( !in2 ) {
        cout << "ERROR.\n";
        return 1;
    }
    
    char str[ 255 ];
    int suma1 = 0;
    while( in2 ) {
        in2.getline( str, 255 );
        if( in2 ) {
            suma1 += karta( str );
        }
    }
    cout << "Suma punktow gracza nr 1: " << suma1 << endl << endl;
    in2.close();
    
    
    system( "pause" );
    system( "cls" );
    
    
    cout << "Karty Gracza 2 : " << endl;
    ifstream in( "Gracz 2.txt" );
    
    if( !in ) {
        cout << "ERROR.\n";
        return 1;
    }
    
    int suma2 = 0;
    while( in ) {
        in.getline( str, 255 );
        if( in ) {
            suma2 += karta( str );
        }
    }
    cout << "Suma punktow gracza nr 2: " << suma2 << endl << endl;
    in.close();
    
    system( "pause" );
    system( "cls" );
    
    if( suma1 > suma2 ) cout << "Wygral Gracz 1\n";
    if( suma1 < suma2 ) cout << "Wygral Gracz 2\n";
    if( suma1 == suma2 ) cout <<"Remis\n";

cout <<"==============================================================================\n";
cout << "Jezeli chcesz przeliczyc inny uklad kart zmodyfikuj pliki\n"; 
cout <<"Gracz 1 i Gracz 2 znajdujace sie w Folderze Poker i uruchom ponownie program\n";

system( "pause" );
} 

Oto cały program.
Karty znajdują sie 2 plikach tekstowych każda karta w osobnym wierszu np.
AA
KA
9P.

Prosił bym o pomoc lub jakieś poprawki na aktualnym kodzie bo ja już sam dostaje nerwicy.
Pozdrawiam :)

0
  1. Brakuje break w switchu (o tym pisał @Revel)
  2. W funkcji int karta( string s ) po co jest drugi if?
  3. Przypatrz się swojemu kodowi w funkcji int karta( string s ) i przeanalizuj linia po linii do której części ifa wejdziesz, gdy argument s ma wartość 1K (o to pytasz)
  4. W funkcji void col_str( char col ) masz dwa razy warunek na kier
  5. Dalej nie chce mi się sprawdzać...
  6. To na pewno Twój kod?
0

Pomijając wszystkie inne rzeczy które wydają się dziwne w tym kodzie...
Najpierw sprawdzasz czy znak z pliku jest cyfrą isdigit() a potem w case masz warunek case '1': bez breake ale to bez znaczenia póki co bo program nigdy do tego warunku nie wejdzie.
Jeśli już musisz tym isdigit() sprawdzać - tak jakby nie mogło być wszystko w switchu to dodaj warunek np:

)

    if( isdigit( s[ 0 ] ) &&(s[0] != '1') ){
      
           if( sscanf( s.c_str(), "%i%c", & n, & c ) != 2 );
    }else
    {
        switch( s[ 0 ] )
        {     

i powinno zadziałać
EDIT: oczywiście jak dodasz ten warunek to musisz też dodać w switch break przy case '1':

0

kod jest mój. Tylko pomysł na tablice dał mi znajomy. Spróbuje poprawić te błędy i dam znać jak poszło

1 użytkowników online, w tym zalogowanych: 0, gości: 1