Problem z napisaniem prostej gry - losowanie

dział ogólny

Problem z napisaniem prostej gry - losowanie

Nowy postprzez gregory » niedziela, 13 czerwca 2010, 10:24

Witam
Mam do napisania taką prostą grę, w której chodzi o to by klikając na przyciski znaleźć 2 takie same liczby. Po znalezieniu par przyciski znikają. Tak to ma wyglądać -> http://zapodaj.net/b6f882e75a56.png.html To taka jakby gra w zapamiętywanie. Mam utworzone dynamicznie 16 przycisków, którym trzeba losowo przypisać liczby z przedziału od 1-8, czyli jakiejś tam tablicy, choć w sumie chyba nie jest ona potrzebna. Chodzi o to by każda liczba wystąpiła 2 razy, na losowo wybranym przycisku, a ja właśnie nie wiem jak to zrobić. Póki co wymyśliłem coś takiego, ale to nie jest dobre rozwiązanie, bo ilość przycisków jest podzielona na pól, a liczby mają być przypisane na losowo wybranych przyciskach. Proszę o pomoc.
Kod: Zaznacz cały
int tab[8] = {1, 2, 3, 4, 5, 6, 7, 8};
         int i, j;
        String pomoc;

       for(i = 0; i < 8 ; i++)
       {
            pomoc = IntToStr(tab[rand()%8]);
            for(j = 0; j < 8; j++)
                if(guziki[j]->Caption == pomoc) pomoc="";
            if(pomoc != "")
                guziki[i]->Caption = pomoc;
            else i--;

        }
       
       for(i = 8; i < 16; i++)
       {
            pomoc = IntToStr(tab[rand()%8]);
            for(j = 8; j < 16; j++)
                if(guziki[j]->Caption == pomoc) pomoc="";
            if(pomoc != "")
                guziki[i]->Caption = pomoc;
            else i--;
        }
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez polymorphism » niedziela, 13 czerwca 2010, 11:31

Kod: Zaznacz cały
tab[rand()%8] 

A po co ten tab? Przecież możesz zrobić tak:
Kod: Zaznacz cały
(rand() % 8) + 1

i na jedno wyjdzie (no i z logiką będzie w zgodzie 8-) ). tab użyj do zliczania wystąpień danej liczby - liczba (index) -> ilość wystąpień (wartość). No i pętlę źle skonstruowałeś. Główna pętla powinna iterować po przyciskach, druga powinna być częścią kodu odpowiedzialnego za losowanie liczb - jeśli liczba wystąpiła dwukrotnie, losuj jeszcze raz, do skutku.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » niedziela, 13 czerwca 2010, 12:55

Szczerze mówiąc nie rozumiem. Każda liczba ma wystąpić 2 razy na losowym przycisku, czyli na losowym przycisku musi pojawić się 16 liczb? Piszesz w taki sposób, że jest to niezrozumiałe.

Masz 16 obiektów.
Masz liczby w zakresie od 1 do 8.
Każda liczba z zakresu musi być wylosowana dwukrotnie, trudno mówić jednak o losowaniu liczb skoro wszystkie liczby muszą wystąpić dwukrotnie.
Trzeba losować przyciski, jednak po każdym losowaniu liczba przycisków do losowania zmniejsza się o 2, przez co wylosowanie kolejnych liczb jest coraz trudniejsze ze względu na coraz mniejszy zakres.


Rozwiązaniem mogłoby być utworzenie tablicy i wypełnienie jej początkowo elementami od 1 do 16, potem wylosowanie liczby z zakresu i usunięcie jej z tablicy, potem znów losowanie i tak 8 razy, aż tablica pozostałaby pusta. Niestety nie wiem jak usuwać z tablicy wykorzystane elementy. Próbowałem z wektorami, ale póki co nic mi nie wychodzi. Może polymorphism będzie potrafił podpowiedzieć. Oto kawałek kodu, nad którym zacząłem pracować.


Kod: Zaznacz cały
#include <math.hpp>
#include <vector>
#include <algorithm>
#include <functional>

 int tabInt[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

 vector<int> numbers(tabInt, tabInt + 16);

 random_shuffle(numbers.begin(), numbers.end());

 int x = ???; // wylosowana liczba

 ListBox1->Items->Add((String)x); // tylko do sprawdzania wylosowanych liczb

 numbers.erase(remove_if( numbers.begin(), numbers.end(), x)); //usuwam z tablicy wylosowany element
  


Mam problem z wylosowaniem liczny z vektora oraz z usunięciem tej liczby z wektora, potem trzeba by jeszcze zmienić rozmiar tablicy.
To na razie kod roboczy.

Koncepcja jest taka. Tworzę tablicę zawierającą liczby od 1 do 16 reprezentujące obiekty typu TButton. W pętli wykonującej 8 obiegów losuję element z tablicy i przypisuję mu liczbę zgodną z obiegiem pętli, czyli po kolei od 1 do 8, a po jego wylosowaniu usuwam go z tej tablicy, więc przy każdym kolejnym losowaniu elementów z tablicy wylosowany raz element (tutaj Button) nie może być ponownie wylosowany. Jeszcze w tym samym obiegu losuję następną liczbę z tablicy (tutaj Button) i przypisuję mu tą samą wartość. I tak 8 razy, aż wylosowane zostanie wszystkich 16 Buttonów i wypełnione zostaną liczbami od 1 do 8. Koncepcja prosta tylko wykonanie trudniejsze. Z vektorami nie najlepiej sobie radzę, gdyż rzadko je stosuję. Gdyby dało się opróżnić zwykłą tablicę (nie vector) z wylosowanych elementów, sprawa byłaby banalnie prosta.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez polymorphism » niedziela, 13 czerwca 2010, 13:11

Baron, zrobiłeś ten sam "błąd", który zrobił gregory. Chodzi o tablicę tabInt, której wartości są równe indeksom, pod którymi się znajdują. Wcześniej zaproponowałem zrobienie tablicy, która będzie przechowywać ilość wystąpień danej liczby, coś jak tablica asocjacyjna. Czyli losowanie wyglądałoby tak:
Kod: Zaznacz cały
int tab[16] = { 0 };
int c;

/* w pętli */

do c = rand() % 16;
while(++
tab[c] > 2);
++
c; //<--- wartość wylosowana z przedziału <1,16>
 
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » niedziela, 13 czerwca 2010, 13:24

Co do tablicy to masz rację, ale Twój kod losuje wielokrotnie liczny z zakresu 1-16, a chodzi o to, żeby nie można było wylosować raz wylosowanej liczby, stąd mój pomysł z tablicą i wektorami:

Kod: Zaznacz cały

int tabInt
[16] = {0};

 vector<int> numbers(tabInt, tabInt + 16);

 random_shuffle(numbers.begin(), numbers.end());

 int x = ???; // wylosowana liczba

 ListBox1->Items->Add((String)x);

 numbers.erase(remove_if( numbers.begin(), numbers.end(), x)); //usuwam z tablicy wylosowany element
 


Mam dwa pytania:
Jak wylosować w vektora liczbę i zapisać ją do zmiennej typu int?
Ja usunąć z tablicy - vektora wylosowana liczbę?

Odpowiedzi na te dwa pytania rozwiązują problem.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez polymorphism » niedziela, 13 czerwca 2010, 13:56

ale Twój kod losuje wielokrotnie liczny z zakresu 1-16

Aj, dobrze, dobrze, źle zrozumiałem autora. Czyli może być tak:
Kod: Zaznacz cały
char tab[16] = { 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,}; 

random_shuffle
(tab,tab + 16);

/* tu przypisujemy wartości z tab 16 przyciskom */

 


Jak wylosować w vektora liczbę i zapisać ją do zmiennej typu int?
Ja usunąć z tablicy - vektora wylosowana liczbę?

Kod: Zaznacz cały
int i = rand() % v.size();
int x = v[i]; //(1)
v.erase(v.begin() + i); //(2)    


Odpowiedzi na te dwa pytania rozwiązują problem.

Tak, ale można to zrobić prościej, bez zbędnych relokacji pamięci i przesuwania elementów - patrz wyżej
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » niedziela, 13 czerwca 2010, 14:46

polymorphizm napisał(a):
Kod: Zaznacz cały
    int i = rand() % v.size();
    int x = v[i]; //(1)
    v.erase(v.begin() + i); //(2)   


Myślałem o tym, ale:

int i = rand() % v.size();

Nie losuje elementu z tablicy. Początkowo tablica ma rozmiar 16, ale losujemy z niej np. liczbę 5, usuwamy z tablicy pięć, rozmiar tablicy zmieni się z 16 na 15 i znów losujemy podanym wyżej sposobem, ale v.size() zawiera w sobie liczbę 5, więc ta liczba może być wylosowana. Podany sposób nie losuje liczby z tablicy, lecz w oparciu o rozmiar tablicy, a to wielka różnica.



polumorphizm napisał(a):
Kod: Zaznacz cały
char tab[16] = { 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8 };

random_shuffle(tab,tab + 16);


Tak, ale można to zrobić prościej, bez zbędnych relokacji pamięci i przesuwania elementów - patrz wyżej


Idąc tym tropem problem rozwiązałem, jednak trochę to zmodyfikowałem:

Kod: Zaznacz cały
#include <vector>
#include <algorithm>
#include <functional>

using namespace std;

ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;

//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
 int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

 random_shuffle(tab, tab + 16, p_myrandom);

 ListBox1->Items->Clear();
 for(int i = 1; i < 16; i++)
 {
  ListBox1->Items->Add((String)tab[i]); // dla celów testowych
 }
}
//---------------------------------------------------------------------------
 




Tutaj przedstawiam gotowe rozwiązanie problemu z przyciskami. Przyciski będą identyfikowane po nazwach dlatego nadajemy im nazwy z kolejnymi numerami. Ja posłużę się przyciskami typu TSpeedButton więc będą owe przyciski miały nazwy: SpeedButton1, SpeedButton2, ... SpeedButton16. Reszta jest już prosta:

Kod: Zaznacz cały
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <vector>
#include <algorithm>
#include <functional>


//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

using namespace std;

ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;}
ptrdiff_t (*p_myrandom)(ptrdiff_t) = myrandom;

TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonLosujClick(TObject *Sender)
{
 int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};

 randomize();
 random_shuffle(tab, tab + ARRAYSIZE(tab), p_myrandom);


 for(int i = 1; i <= ARRAYSIZE(tab); i++)
 {
  int x = i;
  if(> 8) x = i - 8;
  dynamic_cast<TSpeedButton *>(FindComponent("SpeedButton" + (String)tab[-1]))->Caption
                                                   
= (String)x;

 }
}
//---------------------------------------------------------------------------
 


Funkcja random_shuffle nie losuje liczb, lecz w losowy sposób ustawia liczby w tablicy, przez co po każdorazowym losowaniu porządek liczb w tablicy jest inny, co daje duży stopień przypadkowości, by go zwiększyć dodałem funkcję p_myrandom.


Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez polymorphism » niedziela, 13 czerwca 2010, 15:26

Podany sposób nie losuje liczby z tablicy, lecz w oparciu o rozmiar tablicy, a to wielka różnica.

Losuje indeks, spod którego mam odczytać wylosowaną liczbę. Jeśli to miałoby losować tę właściwą liczbę, to po co w ogóle wektor? A tak, losuję z puli liczb, która z każdym losowaniem zmniejsza się, stąd to modulo.

(...) by go zwiększyć dodałem funkcję p_myrandom.

Funkcja, którą podałeś niewiele różni się od tej domyślnej, która na 99% bazuje na rand.
Ostatnio edytowano poniedziałek, 14 czerwca 2010, 13:43 przez polymorphism, łącznie edytowano 1 raz
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
gregory
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » niedziela, 13 czerwca 2010, 15:47

losuję z puli liczb, która z każdym losowaniem zmniejsza się, stąd to modulo.


To mi się akurat nie zgadza: rand() % v.size() - rand() losuje, v.size() zwraca rozmiar tablicy, więc losowany jest nie element tablicy, tylko zakres tablicy, a co jeżeli mamy np. tablicę o wymiarze 5 ale zawartości: 10, 20, 30, 40, 60. Czy wylosowana zostanie jakaś liczba z tablicy, czy też liczba określona przez rozmiar tablicy, czyli z zakresu 1-5?



Funkcja, którą podałeś niewiele różni się od tej domyślnej, która na 99% bazuje na rand.


Nie rozumiem o czym piszesz. Podałem wiele funkcji, więc która funkcja i na której bazuje? Bo jeżeli chodzi o tą funkcję ptrdiff_t myrandom (ptrdiff_t i) { return rand()%i;} to generuje ona dodatkową losowość. Pewnie chodzi tobie o to, że random_shuffle bazuje na rand. To się zgadza, ale ta funkcja może mieć trzy argumenty i podałem trzeci generujący dodatkowe losowanie, co powinno zwiększyć przypadkowość. Przyszło mi jeszcze do głowy, że generator randomize() dobrze byłoby uruchomić na początku programu, a nie wewnątrz funkcji. Opieram to na założeniu, że generator po uruchomieniu pracuje cały czas, więc im wcześniej zacznie generować liczby tym lepiej.

By zwiększyć losowość można by utworzyć drugą tablicę zawierającą liczby w zakresie od 0-8 tak jak Ty to podałeś i je też mieszać, wtedy powtarzalność byłaby naprawdę niska.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
gregory
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez polymorphism » niedziela, 13 czerwca 2010, 16:15

a co jeżeli mamy np. tablicę o wymiarze 5 ale zawartości: 10, 20, 30, 40, 60. Czy wylosowana zostanie jakaś liczba z tablicy, czy też liczba określona przez rozmiar tablicy, czyli z zakresu 1-5?

Przecież każdej wylosowanej liczbie (indeksowi) przyporządkowana jest liczba z puli (asocjacja). Tak więc losując indeks, losuję wartość spod tego indeksu. Kod może rozjaśni nieco sprawę:
Kod: Zaznacz cały
int x = v[rand() % v.size()]; 

W zasadzie to to samo co wcześniej, tyle że nie zapisuje nigdzie indeksu, bo nie jest tu do niczego potrzebny.

(...) podałem trzeci generujący dodatkowe losowanie, co powinno zwiększyć przypadkowość.

Szczerze mówiąc wątpię w to. Trzeci parametr jest po to, żebyś mógł dać inną funkcję/generator liczb losowych, o innym rozkładzie. Zresztą wychodzisz z błędnego założenia, że te funkcję działają na raz, a tak nie jest. Jeśli definiujesz własny generator liczb losowych, to ten domyślny (rand) jest pomijany.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
gregory
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » niedziela, 13 czerwca 2010, 16:27

Więc można pominąć tą funkcje generującą dodatkowe losowanie. Co do kodu który podałeś, to teraz jest czytelny.

Tak czy inaczej problem uważam za rozwiązany.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
gregory
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez gregory » poniedziałek, 14 czerwca 2010, 13:44

OK. Wielkie dzięki za pomoc. Mam teraz pytanie trochę z innej beczki. Na Formie mam nałożony komponent TGroupBox, a na nim komponent TPanel. Mam utworzone 6 kółek i mają one pojawić się na Panelu. Niestety tworzą się one na pod panelem, na gropubox co sprawia że są niewidoczne. Próbowałem pisać kulki[i]->Parent = Panel1, ale to też nic nie dało. Co zrobić by były one na panelu, bo póki co są one przez niego zasłonięte? Napisałem to tak i nie wiem jak to rozwiązać.
Kod: Zaznacz cały
    kulki = new TShape *[6];
    int left = 65;
    for(int i = 0; i < 6; i++)
    {
        kulki[i] = new TShape(this);
        kulki[i]->Parent = GroupBox1;
        kulki[i]->Shape = stEllipse;
        kulki[i]->Width = 58;
        kulki[i]->Height = 58;
        kulki[i]->Left = left;
        kulki[i]->Top = 137;
        left += 85;
    }
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Firefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 czerwca 2010, 14:58

Nowy problem - nowy wątek. Trzymaj się tej zasady, ale ten niech już pozostanie.



Co do problemu, to po co umieszczasz obiekt Panel na Groupbox, skoro GroupBox to też swego rodzaju Panel i na nim można umieszczać obiekty?! Tak czy inaczej, tablicę obiektów deklaruje się i definiuje nieco inaczej. Nie wiem skąd masz te przyzwyczajenia, może to z Delphi, w zasadzie powinieneś to zrobić tak:

plik nagłówkowy, np. Unit1.h
Kod: Zaznacz cały
private: // lub public:
TShape *kulki[6];
 

plik źródłowy, np. Unit1.cpp
Kod: Zaznacz cały

  int left 
= 65;
  for(int i = 0; i < 6; i++)
  {
        kulki[i] = new TShape(this);
        kulki[i]->Parent = Panel1; // tutaj ustawiasz rodzica
        kulki[i]->Shape = stEllipse;
        kulki[i]->Width = 58;
        kulki[i]->Height = 58;
        kulki[i]->Left = left;
        kulki[i]->Top = 137;
        left += 85;
  }
 

I to wszystko. U mnie obiekty kulki zostają umieszczone na obiekcie Panel1.



Kod: Zaznacz cały
    kulki = new TShape *[6];


Jakim cudem udało ci się skompilować program z takim kodem?! U mnie od razu wyrzuca błąd.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez gregory » poniedziałek, 14 czerwca 2010, 15:31

Cyfrowy Baron napisał(a):Co do problemu, to po co umieszczasz obiekt Panel na Groupbox, skoro GroupBox to też swego rodzaju Panel i na nim można umieszczać obiekty?!

Tak jest w zadaniu, więc muszę się tego trzymać. Dla samego panelu to działa, ale dla panelu położonego na GroupBoxie już nie. A okno programu ma być podzielone na 2 części dlatego to jest na groupboxie.
Cyfrowy Baron napisał(a):Jakim cudem udało ci się skompilować program z takim kodem?! U mnie od razu wyrzuca błąd.

W sekcji private zadeklarowałem wskaźnik tak -> TShape **kulki;
Avatar użytkownika
gregory
Bladawiec
Bladawiec
 
Posty: 26
Dołączył(a): środa, 17 lutego 2010, 17:36
Podziękował : 8
Otrzymał podziękowań: 0
System operacyjny: Windows 7
Kompilator: C++ Builder
Gadu Gadu: 0
    Windows 7Chrome

Re: Problem z napisaniem prostej gry - losowanie

Nowy postprzez Cyfrowy Baron » poniedziałek, 14 czerwca 2010, 15:42

Nie wiem więc, co źle robisz. Ale ja umieściłem na formularzu obiekt GroupBox1, potem na GroupBox1 umieszczam Panel1, potem kod który podałem wcześniej i wszystko jest prawidłowo. Nie może być inaczej, skoro obiektom kulki[x] przypisujesz jako rodzica Panel1.

Błąd prawdopodobnie tkwi w czymś o czym tutaj nie piszesz!

W jakim zdarzeniu definiujesz obiekty kulki[x]? Pytam trochę z ciekawości, gdyż nie powinno to mieć żadnego znaczenia.
Czy obiekty GroupBox1 i Panel1 są obiektami statycznymi czy tworzonymi dynamicznie? Jeżeli dynamicznie, to jak jak je tworzysz?

gregory napisał(a):A okno programu ma być podzielone na 2 części dlatego to jest na groupboxie.


Co podział okna ma do obiektu typu TGroupBox? Czy przypadkiem nie mylisz klasy TGroupBox z jakąś inną!?



Uzupełnij profil, gdyż nie wiadomo jakiego środowiska używasz.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości