C++ losowanie obiektów

2012-07-28 17:52
0

Witam!

Chciałbym się dowiedzieć, czy jest możliwość (w c++) losowania stworzonych już obiektów.
Dla zobrazowania sytuacji, powiem może w jaki sposób chciałbym to wykorzystać.

Otóż postanowiłem zabrać się za napisanie gry karcianej (konsola na chwilę obecną oczywiście) - typu poker. Owo losowanie, miałoby za zadanie w sposób niezależny od użytkownika, dobrać gracza, do konkretnego miejsca przy stole. Chciałem rozwiązać to w sposób następujący:

  • 5 obiektów, typu np. player
  • tablica (która odgrywa rolę stołu) -> 5-io elementowa - każdy element czeka na obiekt typu
    np. "player". - i w tym miejscu, miałoby uruchomić się losowanie, które dobrałoby jeden ze
    stworzonych elementów "player" do pierwszego miejsca, po czym ograiczyć w funkcji losującej
    ilość pozostałych graczy do 4 (usunąć jednego - już dopisanego), i dopisać kolejnego, do
    następnego miejsca przy stole.

Widziałem już funkcje losujące liczby - z wykorzystaniem modulo - ale jak się to ma do losowania innych typów danych, takich jak np. typy definiowane przez użytkownika, albo obiekty string?


"When I get sad, I stop being sad and be awesome instead... True story."

Pozostało 580 znaków

2012-07-28 18:02
1

Losować można tylko liczby. Ale to umożliwia wszystko. :-) Przecież możesz losować indeks tablicy z Twoimi obiektami i w ten sposób uzyskać losowy obiekt.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2012-07-28 18:04
1

permutacje.
wrzucasz graczy do tablicy jak leci i korzystasz z jakiegoś algorytmu robiącego shuffle tablicy.


#define if(x) if(rand()%6 && (x)) u mad? !user image

Pozostało 580 znaków

2012-07-28 18:04
1

a może być coś takiego?

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

int main()
{
  srand(time(NULL));
  string tablica_obiektow[] = {"pierwszy", "drugi", "trzeci", "czwarty", "piaty"};
  for(int i = 0 ; i < 10 ; i++)
    cout << tablica_obiektow[rand() % 5] << "\n";

  return 0;
}

Pozostało 580 znaków

2012-07-28 18:16
0

@Endrju
Otóż to ;) Człowiek szuka, kombinuje, a nigdy nie weźmie pod uwagę najprostszej możliwości ;/

@fasadin
Nie rozumiem dlaczego w warunku jest i<10


"When I get sad, I stop being sad and be awesome instead... True story."
a ja nie rozumiem, co Ty w tym chcesz zrozumieć.. - kopernik 2012-07-28 19:40

Pozostało 580 znaków

2012-07-28 18:20
0

ponieważ pętla ma się wykonać 10 razy i 10 razy wyświetlić losowy obiekt na ekranie (uruchom sobie program to zobaczysz jak działa ;))

Pozostało 580 znaków

2012-07-28 18:22
sd
1

Ale to jest złe bo będzie losowało dwa takie same indeksy...
http://ideone.com/iUnh5

po prostu chciałem jak najprościej pokazać, że obiekty także można losować, tylko trzeba je upchać w jakąś strukturę. - fasadin 2012-07-28 18:24

Pozostało 580 znaków

2012-07-28 18:24
0

@fasadin
prawie o to mi chodziło. Zależało mi tylko na tym, żeby każdej liczby wśród tych 10-iu użył tylko raz, a po użyciu ją eliminował. Ponieważ każdy wspomniany wyżej hipotetyczny obiekt typu player, będzie miał swoje dane - takie jak np. imię, pozycja przy stole, i ilość gotówki. Nie chciałbym, aby 3 miejsca na 5, były zasiadane przez jednego gracza ;)

Aczkolwiek dzięki za podsunięcie kodu, z pewnością się przyda.

@sd
Właśnie o tym mówiłem :)

Dziękuję wszystkim za poświęcony czas. POZDRAWIAM!


"When I get sad, I stop being sad and be awesome instead... True story."
edytowany 2x, ostatnio: cukier_puder, 2012-07-28 18:27

Pozostało 580 znaków

2012-07-28 19:05
1

Masz to: http://www.cplusplus.com/reference/algorithm/random_shuffle/

Pozostało 580 znaków

2012-07-28 19:29
2

Nawiązując do winerfresha:

#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>

class player 
{
public:
    player(int s) {skladnik = s;}
    player(){}
    int skladnik;
};

int main(void)
{
    srand(time(NULL));
    int liczba;

    std::vector<player> stol(5);

    //tutaj wstępnie wsadzamy graczy w nielosowe miejsca na stole
    for(std::vector<player>::iterator it = stol.begin(); it != stol.end(); it++)
    {
        liczba = (rand() % 1000)+1; //będzie potrzebne do rozróżnienia graczy
        *it = player(liczba);
    }

    std::cout <<"Teraz gracze są ustawieni w takiej kolejności w tablicy jaką podawaliśmy\n";

    for(int i = 0; i < stol.size(); i++)
    {
        std::cout <<"player: (skladnik): "<<stol[i].skladnik <<std::endl;
    }

    std::random_shuffle(stol.begin(), stol.end()); //od teraz każdy gracz będzie się znajdował w losowym stole

    std::cout <<"\nPo przemieszaniu całej tablicy: \n";
    for(int i = 0; i < stol.size(); i++)
    {
        std::cout <<"player: (skladnik): "<<stol[i].skladnik <<std::endl;
    }

    std::cin.get();
}

Nie odpowiadam na PW z prośbą o pomoc programistyczną.
edytowany 1x, ostatnio: robcio, 2012-07-28 19:39

Pozostało 580 znaków

2012-07-29 17:03
0

Akurat do klasy vector jeszcze nie doszedłem, ale mimo wszystko dzięki za kod ;)


"When I get sad, I stop being sad and be awesome instead... True story."

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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