Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Problem... C++


Rekomendowane odpowiedzi

Opublikowano

Siemka, korzystam z Dev-Cpp (to chyba to powód błędu...) a oto kod, przekombinowany, po godzinie namysłu :)

void robplansze() {
 for(int x=0;x<=3;x++) {
		 for(int y=0;y<=3;y++) {
				 s=2;
				 while(s==2) {
				 znak=rand()%8+1;
				 if(niemaznaku(znak)==true) { s=1;}
				 }
				 plansza[y][x]=znak;
				 }
				 }
}

bool niemaznaku(int a)
{
int ile=0;
for(int x=0;x<=3;x++) {
    for(int y=0;y<=3;y++) {
    if(plansza[y][x]==a) { ile+=1; }  
    }
}
if(ile>=2) { return false; } else { return true; }
}

int plansza[3][3]; - żeby nie było, że czegoś nie dałem

 

Już objaśniam... Chciałem napisać gierkę, gdzie odsłaniamy pary, np. kart, ale w konsoli :P Problem w tym, że losuje po 3 jakieś liczby, a 1 zostaje bez pary... Funkcja nr 1, to ta, która losuje planszę, a niemaznaku(), sprawdza ile razy już wystąpił na planszy, jeśli więcej lub równe 2, to ma losować jeszcze raz... Z góry dzięki za odp ;)

  • Odpowiedzi 52
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

czyli, że ma jeszcze raz wygenerować ten znak od nowa gdy ile >= 2 i sprawdzać do puki ile < 2?

są jakieś błędy kompilatora czy po prostu, źle wychodzi podczas gry?

 

@ps, korzystaj z Code::blocks, albo czegoś innego, bo Dev jest beznadziejny i przestarzały.

Opublikowano

Chodzi o to, że chcę się popisać, że w Devie, to już 3 "poważny" projekt... Ostatnie 2 zakończyłem. Co do tematu, to chodzi o to, aby 2 cyfry się NIE POWTARZAŁY na planszy, czyli tak jak napisałeś, ma być 2 razy, minimalnie, oraz maksymalnie :) Źle to wychodzi podczas gry, normalnie wszystko dobrze... Tylko Dev oczywiście znowu pieprzy, i pod koniec jest źle... Schemat ten sam, są np. trzy jedynki, oraz jedna czwórka... Piszę słownie, bo trudno ogarnąć :P

Opublikowano

mam jeszcze taką koncepcję:

jeżeli są np numery od 1-8 (bo plansze masz widze 4x4, a mają być pary)

to robisz pętle for i dla każdego znaku losujesz 2 pola po kolei dla każdego robisz to:

jeżeli jest zapełnione to losuje następne, jeśli nie to przypisuje, możesz zrobić, że po iliuś tam nieudanych próbach (np 8) wylosowania wolnego pola daje do pierwszego pustego jakie znajdzie szukając po kolei*. Czyli zamiast szukać znaków dla pól robisz odwrotnie. Może coś z tego wyjdzie.

 

* możesz zrobić, aby szukał po kolei od wylosowanej pozycji, a gdy będzie koniec tablicy zacznie od samego jej początku jeszcze raz.

Opublikowano

Dzięki, skorzystam z 1 koncepcji... Dev, ty shicie, znowu muszę się męczyć ;P Jak snake'a robiłem, to się punkty w ścianie losowały, a algorytm był dobry... Ale po paru dniach znalazłem alternatywę :P Dzięki za pomoc, jutro zrobię i sprawdzę czy coś z tego będzie

//Edit:

Kiepsko trochę, a wolę starą metodę... Dałoby się skoregować? :/

Opublikowano

no właśnie tamten kod wygląda na poprany, wpatrywałem się w niego ponad pół godziny i nic nie wymyśliłem. Jakbyś mógł to wyślij mi cały kod na PW, posiedzę nad tym w wolnej chwili

Opublikowano

Według mnie to jest, a jak nie jest, to był przed kombinowaniem poprawny... to dev oczywiście... W snaku też tak było... Masz jakieś inne IDE? A kod już tu wrzucę:

 

 

#include <iostream>

#include <windows.h>

#include <conio.h>

#include <cstdio>

#include <cstdlib>

using namespace std;

int plansza[3][3];

string znaki[8]={"!", "@", "#", "$", "%", "^", "&", "*"};

int znak;

int s;

int a,b,c,d;

int temp;

int tempx;

int tempy;

bool gra=false;

void rysujplansze();

void robplansze();

void gotoxy(int x, int y);

bool niemaznaku(int a);

int main(int argc, char *argv[])

{

srand(time(NULL));

cout<<"Prosta gra, wybieramy pary... Losowe plansze, symbole:\n";

cout<<"! @ # $ % ^ & *\n";

cout<<"Plansza 4x4\n";

cout<<"Nacisnij enter...\n";

getch();

gra=true;

rysujplansze();

while(gra) {

gotoxy(0,6);

cout<<"Wybierz pary(wspolrzedne):\n";

cout<<"Para nr 1 - x;y :\n";

cin>>a;

cin>>b;

gotoxy(a, B);

temp=plansza[a];

cout<<znaki[temp];

gotoxy(0,7);

cout<<"Para nr 2 - x;y :\n";

cin>>c;

cin>>d;

gotoxy(c,d);

temp=plansza[d][c];

cout<<znaki[temp];

}

getch();

system("PAUSE");

return EXIT_SUCCESS;

}

void robplansze() {

for(int x=0;x<=3;x++) {

for(int y=0;y<=3;y++) {

s=2;

while(s==2) {

znak=rand()%8+1;

if(niemaznaku(znak)==true) { s=1;}

}

plansza[y][x]=znak;

}

}

 

}

void rysujplansze()

{

system("cls");

if(!gra) {robplansze(); gra=true;}

for(int x=0;x<=3;x++) {

for(int y=0;y<=3;y++) {

gotoxy(x,y);

cout<<plansza[y][x];

Sleep(10);

}

}

}

bool niemaznaku(int a)

{

int ile=0;

for(int x=0;x<=3;x++) {

for(int y=0;y<=3;y++) {

if(plansza[y][x]==a) { ile+=1; }

}

}

if(ile>=2) { return false; } else { return true; }

}

void gotoxy(int x, int y) {

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

}

 

 

//jak coś to wybieranie pary... chwilowo ruszyłem dalej, ale stanąłem i próbuję naprawić ten błąd... Schemat błedu ten sam, przez całą planszę działa dobrze, tylko pod koniec wariuje, i mamy np. 3x 7 i 1x 2...

Opublikowano

Code::blocks, bardzo polecam.

Bądź czujny bo potem zedytuje tego posta, żeby nie spamować.

 

 

 

@edit, spróbuj tablice znaki i plansza deklarować jako string, i przy porównywaniu co jest w danej komórce tablicy plansza używać nie samych liczb ale znaków z tablicy znaki. Ja osobiście nie znalazłem żadnego rozwiązania, spróbuje napisać to po swojemu, może jeszcze dzisiaj zobacze co z tego wyjdzie.

Opublikowano

A ma on wbudowany jakiś kompiler? Bo z tego co widzę, muszę podać ścieżkę :/ Jak tak, to podrzuciłbyś? Ten mingw w devie jest jakiś lewy...

//Edit: Pobieram ten większy plik... Tam pewnie będzie ;p

//Nie ma...

//Jednak jest, znalazłem! :D

 

Dobra, za cholerę błędu nie widzę, a jednak nadal jest... Ale, zauważyłem pewną rzecz...

Otóż, przykładowe liczby...

1562

2638

8214

4357

Pierwsze dwie dwójki, ZAWSZE W TYM SAMYM MIEJSCU się powtarzają, nie muszą to być dwójki, ale WSZYSTKIE LICZBY, których jest ponad 2... Trzecia dwójka, jest zawsze albo w 3 albo w 4 rzędzie(raz zauważyłem w drugim rzędzie, więc nie bierz tego pod uwagę), nigdy na pierwszym miejscu(też nie do końca sprawdzone)

Opublikowano

Code::blocks ściągasz z kompilatorem (tą wersje zajmującą 70mb jest w downloadzie) z tego co wiem też używa mingw, ale edytor jest lepszy, lepiej podświetla składnię i jest bardziej czytelny. A co do kompilatora to nie narzekam

Opublikowano

Tyle to wiem :< Poczytaj moje edity... Ja w tym kodzie żadnego błędu nie widzę... :/

//Edit:

Co do twojego edita, to tablica znaki to string, a plansza to int... spróbuje string plansza[3][3]...

Crash... Będę kombinował później, na dzisiaj chyba koniec :<

Opublikowano

Jeśli dobrze rozumiem...

 

Chcesz mieć planszę o wymiarach k * j | mod 2 = 0, zapełnioną k*j/2 parami elementów.

 

No więc;

 


std::vector<std::vector<int>> plansza;

// TO DO: zainicjalizuj plansze wartosciami -1

int znak = 0;
int x1, x2, y1, y2;

while ( znak < k*j/2 ) {

 do {
x1, x2 = rand() % k;
y1, y2 = rand() % j;

  if ( ! czy_te_wspolrzedne_wskazuja_na_to_samo(x1, x2, y1, y2) && czy_oba_te_pola_sa_puste(x1, x2, y1, y2) ) {
  plansza [ x1 ] [ y1 ] = znak;
  plansza [ x2 ] [ y2 ] = znak;
  break;
  }

 } until ( true );

 znak++;

}

 

Oczywiście zawartość pętli do until należy ulepszyć, jednak nie da się zrobić tego w czytelny sposób bez obiektowości.

Z OO zawartość tej pętli mogłaby wyglądać:

 


do {
  POLE* temp = new pole(RAND, RAND);
} until ( plansza[temp].empty() == true );

do  {
 POLE* temp2 = new pole(RAND, RAND)
} until ( temp2 != temp && plansza[temp2].empty() == true );

plansza.insert(temp);
plansza.insert(temp2);

break;

 

Pozostaje dorobić tylko klasy i metody.

Operator [&POLE] klasy plansza zwracałby obiekt POLE o współrzędnych takich, jak argument operatora.

 

 

* tak naprawdę klasa POLE powinna po prostu dziedziczyć z klasy POINT, i to POINT powinien być przekazywany w powyższym kodzie.

( point to standardowa klasa reprezentująca punkt w przestrzeni 2d ).

Ta sygnatura jest pusta.

Opublikowano
Opublikowano

Czyli, dopóki nie wylosuje wszystkich znaków, losuje po 2x współrzędne, jeśli te miejsca są puste oraz współrzędne są inne, to ustawia je na planszy... Wszystko fajnie, tylko wywala błędy przy Until(), nigdy z tego nie korzystałem...

//Po małej przebudowie, kompiluje się, ale plansza wygląda mniej więcej tak:

0000

0000

0000

0000

A oto kod po przebudowie:

 

 

#include <iostream>

#include <iostream>

#include <windows.h>

#include <conio.h>

#include <cstdio>

#include <cstdlib>

#include <time.h>

using namespace std;

int znak = 0;

int x1, x2, y1, y2;

int k=3,j=3;

int plansza[3][3];

bool poprawne=false;

bool czy_te_wspolrzedne_wskazuja_na_to_samo(int x1, int x2, int y1, int y2);

bool czy_oba_te_pola_sa_puste(int x1, int x2, int y1, int y2);

void rysujplansze();

void gotoxy(int x, int y);

int main()

{

while ( znak < k*j/2 ) {

poprawne=false;

while(!poprawne) {

x1 = rand() % k+1;

x2 = rand() % k+1;

y1 = rand() % j+1;

y2 = rand() % j+1;

 

if ( ! czy_te_wspolrzedne_wskazuja_na_to_samo(x1, x2, y1, y2) && czy_oba_te_pola_sa_puste(x1, x2, y1, y2) ) {

plansza [ x1 ] [ y1 ] = znak;

plansza [ x2 ] [ y2 ] = znak;

znak+=1;

poprawne=true;

}

}

 

}

rysujplansze();

getch();

return 0;

}

bool czy_te_wspolrzedne_wskazuja_na_to_samo(int x1, int x2, int y1, int y2)

{

if(x1!=x2 && y1!=y2) { return false; } else { return true; }

}

bool czy_oba_te_pola_sa_puste(int x1, int x2, int y1, int y2)

{

if(plansza[y1][x1]==0 && plansza[y2][x2]==0) { return true; } else { return false; }

}

void rysujplansze()

{

for(int x=0;x<=k;x++)

{

for(int y=0;y<=j;y++)

{

gotoxy(x,y);

cout<<plansza[x][y];

}

}

}

void gotoxy(int x, int y) {

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

}

 

 

//Nowy kod wkleiłem... Niestety teraz plansza wygląda mniej więcej tak (bardzo podobnie za każdym razem):

0001

0203

0100

0012

//Używałem spoilera, bo nie zajmuje tyle miejsca przed otworzeniem... Wiem, że until występuje w pascalu, skoro w temacie jest c++, to czemu dałeś? ;) Ale wielkie dzięki, kodzik działa, teraz tylko przeanalizować/pozmieniać/pododawać i gra gotowa :) Jeszcze raz dzięki

//Nie zdążyłem przeczytać z wklej... Ale mam też inną stronkę :)

http://3paste.com/ha...56d8d8d934f9029

 

//I ostatnia prośba, dałby ktoś stronkę (sprawdzoną) gdzie dowiedziałbym się więcej o wektorach? Gra już niby gotowa, ale chodzi o to, że np. plansza[x][y]==0 w if to murowany błąd...

Opublikowano

W C++ nie istnieje pętla do...until. Powinieneś to wiedzieć.

 

Wklejając kod używaj tagów CODE.

 

https://docs.google.com/document/d/10KDYi-zlH5etJd4fXOQAfooevVm8iSj9t6YjGNY5CE4/edit

 

 

@PS

Zna ktoś jakiś dobry darmowy hosting plików z kolorowaną składnią?

Bo najwyraźniej ktoś coś na MPC spieprzył i tabulatory nie są zachowane, nawet w tagach CODE, przez co kod jest całkowicie nieczytelny...

 

 

@EDIT

Nvm...

http://wklej.to/2JyTh

Ta sygnatura jest pusta.

Opublikowano

I ostatnia prośba, dałby ktoś stronkę (sprawdzoną) gdzie dowiedziałbym się więcej o wektorach? Gra już niby gotowa, ale chodzi o to, że np. plansza[x][y]==0 w if to murowany błąd...

 

//Chodzi o to, że kiedy chcę użyć tego wektora jako liczby, to program się crashuje, debugger wskazuje tylko na te miejsca...

Opublikowano

Wiem... Właśnie mnie to zdziwiło, mam 4 fragmenty kodu:

temp=plansza[a][b];
cout<<znaki[temp];
temp=plansza[c][d];
cout<<znaki[temp];
if(plansza[x][x]==?) // tu nie pamiętam co było, ale instrukcja warunkowa z wektorem plansza

Kompilator nie wywala błędów, ale te linijki crashują program... Debugger wskazuje na nie, jak wszystko zakomentarzowałem, to było ok, ale program tak dobrze nie działał... ab,c,d, oraz temp to zmienne typu int, znaki, to tablica string, ktora zawiera znaki, czyli wszystko powinno być ok...

//Edit:

if(plansza[a][b]==plansza[c][d]) - to ten IF
plansza[a][b]=9 - tu też...

Bez tego program się nie crashuje, ale nie działa jak powinien ;d

Opublikowano

jesteś pewien że umiesz korzystać z debbugera?

Cytat

 

Orientacja seksualna polega na tym, że jeden mężczyzna lubi blondynki, drugi szatynki, że jedna pani woli umięśnionych mężczyzn a inna chudych intelektualistów. Homoseksualizm nie jest orientacją jest chorobą za którą homoseksualiści nie ponoszą odpowiedzialności. Pewna grupa ludzi rodzi się upośledzona fizycznie, na przykład bez ręki ale czy to znaczy, że wszystkim zdrowym powinniśmy też obcinać ręce? Nie, powinniśmy zapewnić im protezy. Obowiązkiem państwa jest zapewnienie homoseksualistom, jak wszystkim upośledzonym fizycznie czy psychicznie profesjonalnej opieki medycznej.

Opublikowano

http://wklej.to/CxG2l

@2up

Tak, umiem, a co w tym trudnego? ^.- A nawet jeśli bym nie umiał to (CZYTAJĄC ZE ZROZUMIENIEM!), komentarzując te linijki, program chodził bez crashu! I wiem, słowo "kometarzować" nie jest poprawne, ale wiadomo o co chodzi... W kodzie już są w komentarzu te linijkii.

Opublikowano

Int i string to zupełnie nie to samo.

 

 

Jeśli chcesz w obiekcie plansza przechowywać stringi, musisz go zainicjalizować w następujący sposób:

 

vector<vector<string> > plansza;

 

Natomiast wtedy nie możesz operować na plansza[a] jak na int'ach.

Ta sygnatura jest pusta.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...