[C++]Zufallszahlen : Problem

Hat auch nix gebracht :( , hab das alles schon versucht hab schon zig Sachen versucht aber es geht einfach nicht ...
Kann mir denn niemand helfen?
 
WAS soll daran nicht klappen? srand mit der aktuellen Zeit aufrufen (in main 1x), dann bekommst du "Zufalls"-Zahlen ...
 
Nein, es geht nicht, ich benutzte dann eben die von euch gegebenen Formeln aber ich bekomme dann imer Zahlen von 1-6 und nicht von 1-5 , ich weiß auch nicht warum, und wenn ich z.B das +1 weglasse, dann bekomme ich Zahlen von 0-6 ich dreh echt gleich durch , sitzt schon 2 Wochen daran ...
 
So. Letztes mal freundlich:
Bitte lese dir durch, was man dir schreibt und beachte auch weiterführende Links.

C++:
#include <cstdlib>

namespace random
{
    inline const int rand(const int min, const int max)
    { return min + static_cast<int>((max - min + 1) * std::rand() / (RAND_MAX + 1.0)); }

    void init(const unsigned seed)
    { static bool ready(false); if (ready == false) { std::srand(seed); ready = true; } }
}; // utility
Das rufst du dann einfach auf:

C++:
#include <iostream>
#include <ctime>
 
int main()
{
    random::init(static_cast<unsigned>(std::time(NULL)));
 
    for (unsigned char i(0); i < 50; ++i)
        std::cout << "X: " << random::rand(1, 5) << " Y: " << random::rand(1, 5) << "\n";

    return EXIT_SUCCESS;
}
... so . fertig.
 
Danke für deine Hilfe, wenn du mir aber nicht erklärst was du da machst dann nützt es mir auch nichts, ich will ja nicht , dass es einfach nur funktioniert, sondern ich will es auch verstehen ...
 
Hab jetzt erneut dein Programm benützt, es geht nicht, als 2.Koordinate wird immer 6 gewählt, obwohl ich als Intervall 1 bis 5 angegeben habe...
 
Ich erklär es dir nicht, weil du einfach den VERDAMMTEN Link lesen sollst statt hier 1000x das selbe zu fragen ohne dich mal ein Bisschen selbst zu bemühen. Das ist einfach nur dreist!
 
Das System selbst verstehe ich ja , auch dass du eine Sperre eingebaut hast und so find ich gut, aber ich verstehe nicht was das mit "inline" ist und so ...
Glaub mir, ich hab nicht nur einen Link angesehen, hab ziemlich viele Seiten angeschaut zum Thema ZUfallszahlen, habe schon alles Möglichkeiten durch, kann das nicht sein, dass das irgendwas damit zu tun hat , dass ich eine Klasse benutzte? Vielleicht benutzte ich sie ja falsch.
Fakt ist ich "programmiere" ein Spiel, und zwar Schiffe Versenken, bin kein Profi deshalb probiere ich mich an kleineren Projekten aus, ich poste hier nochmal den ganzen Code vielleicht kann ja einer von euch den Fehler erkennen...
Die Zufallszahlen brauche ich für die "künstliche Intelligenz" , damit der PC praktisch den echten Spieler beschießt...

Die für euch relevanten Funktionen sind Zufallszahl() und FeldBesetzten() in der mein Funktion ist dann die srand Funktion:

Code:
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

class Spieler {
      private:
              int Zufallszahl(int,int);
              char Feld[5][5];
      public:
             void ZeigeFeld(void);
             void Wasser(void);
             int schiffe;
             char typ; // p für pc // r  für real
             void TypErkennen(void);
             void FeldBesetzten(void);
      };

int main() {
    
    srand(static_cast<unsigned>(time(NULL)));
    
    Spieler spieler;
    spieler.schiffe=0;
    spieler.typ='r';
    
    Spieler pc;
    pc.schiffe=0;
    pc.typ='p';
    
    //Schiffsanzahl ausgeben
    cout << spieler.schiffe; 
    cout << pc.schiffe;
    
    
    /*spieler.Wasser();
    spieler.FeldBesetzten();
    spieler.ZeigeFeld();*/
    
    pc.Wasser();
    pc.FeldBesetzten();
    pc.ZeigeFeld();
    
    
    cout << endl << endl;
    system("pause");
    return 0;
    
}

void Spieler::TypErkennen(void) {
                   if (typ=='r') cout << "Realer Spieler";
                   if (typ=='p') cout << "Kuenstliche Intelligenz";
                   }
                   
void Spieler::Wasser() {
     for (int y=1;y<=5;y++) {
         for (int x=1;x<=5;x++) {
             Feld[x][y]=' ';
             }
         } 
     }
     
void Spieler::ZeigeFeld(void) {
     if (typ=='r') {
                   for (int y=1;y<=5;y++) {
                       cout << "\n";
                       for (int x=1;x<=5;x++) {
                       cout << "[" << Feld[x][y] << "]";
             }//Ende forschleife2
         } //Ende forscheleife1
                   }//ENDE IF
     
     if (typ=='p') {
                   //Computerfeldausgeben
                    for (int y=1;y<=5;y++) {
                       cout << "\n";
                       for (int x=1;x<=5;x++) {
                       cout << "[" << Feld[x][y] << "]";
                       }//Ende forschleife2
                    } //Ende forscheleife1
                   
                   }//Ende if
     }
     
void Spieler::FeldBesetzten(void) {
     if (typ=='r') {
                   for(int i=1;i<=5;i++) {
                   int x,y;
                   cout << "x:";cin >> x;
                   cout << "y:";cin >> y;
                   Feld[x][y]='S';
                   }//ende for schleife
                   }
                   
     if (typ=='p') {
                   int x,y;
                   
                   for(int a=1;a<=5;a++) {
                   x=Zufallszahl(1,5);
                   
                   x=Zufallszahl(1,5);
                   cout << x << y;
                   
                   if(Feld[x][y]==' ') Feld[x] [y]='S';
                   //else FeldBesetzten();
                                          
                   //} //Ende Forschleife
                   
                   }
                   }
                   
                   }
int Spieler::Zufallszahl(int min,int max) {
    
    return min + static_cast<int>((max - min + 1) * rand() / (RAND_MAX + 1.0));
    
    }
 
Also .... ich schreib dir das gleich mal noch um. Aber du hast da einen grundlegenden Fehler ... kann sein das es daran liegt.

Ein Array hat einen Index von 0 ... size - 1. array[size] ist nicht definiert!

D.h. müssen deine Schleifen lauten:
C++:
for (unsigned char x(0); x < 5; ++x)
...
 
C++:
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <string>


class Player
{
    static const std::size_t field_size;
    
public:
    enum type_t
    {
        ai = 0,
        real
    };

private:
    unsigned char m_field[field_size][field_size];
    unsigned int m_ships;
    std::string m_name;
    type_t m_type;

public:
    Player(std::string const& name, type_t const& type = real)
        : m_type(type), m_name(name), m_field(), m_ships(0)
    {}

    friend std::ostream& operator<<(std::ostream& out, Player const& data)
    { return out << "Spieler: " << data.m_name << "(" << data.show_type(out) << ")\n" << data.show_field(out); }

public:
    std::ostream& show_field(std::ostream& out) const
    {
        for (unsigned char x(0); x < Player::field_size; ++x)
        {
            for (unsigned char y(0); y < Player::field_size; ++y)
                out << "[" << m_field[x][y] << "]";
            out << "\n";
        }
        return out;
    }

    std::ostream& show_type(std::ostream& out) const
    { return out << (m_type == ai ? "PC" : "Person"); }
    
public:
    inline void reset_field()
    { std::memset(m_field, 0, sizeof(unsigned char) * Player::field_size * Player::field_size);    }
    
    void get_position()
    {
        std::size_t x(0);
        std::size_t y(0);

        if (m_type == real)
        {
            std::cout << "X-Koordinate: ";
            std::cin >> x;
            std::cout << "Y-Koordinate: ";
            std::cin >> y;
        }
        else // type == ai
        {
            x = random_position(0, Player::field_size - 1);
            y = random_position(0, Player::field_size - 1);
        }

        if (m_field[x][y] == ' ')
            m_field[x][y] = 'S';
        else
            get_position();
    }

private:
    inline const std::size_t random_position(const std::size_t min, const std::size_t max) 
    { return min + static_cast<int>((max - min + 1) * std::rand() / (RAND_MAX + 1.0)); }
};

const std::size_t Player::field_size = 5;
... das ist die Klasse ...

C++:
int main() 
{
    std::srand(static_cast<unsigned>(std::time(NULL)));
    
    std::vector<Player> players;
    players.push_back(Player("Detlev"));
    players.push_back(Player("Dieter", Player::ai));

    std::copy(players.begin(), players.end(), std::ostream_iterator<Player>(std::cout, "\n"));
   
    players[0].get_position();
    players[1].get_position();
    
    std::copy(players.begin(), players.end(), std::ostream_iterator<Player>(std::cout, "\n"));

    std::cin.ignore();    
}
so wird se benutzt ;)
 
Zurück