C++ losowanie obiektów

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?

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.

1

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

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;
}
 
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

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 ;))

1

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

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!

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();
}
 
 
 
0

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

0

Takie funkcje jak np. std::random_shuffle możesz używać nie tylko z iteratorami, ale także z wskaźnikami (szablony mają duck typing na etapie kompilacji). Czyli jak chcesz użyć tablicy to po prostu zrób std::random_shuffle(table, table + length).

Ogólnie to radzą używać vectora, cena wydajnościowa jest w 99 % przypadków pomijalna, a użwa się go zdecydowanie prościej.

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