Rozproszenie gry c++

Rozproszenie gry c++
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

Witam, napisałem prosty zarys gry piłkarzyki w c++, w której jest dwóch graczy i jeden przemieszcza piłkarzykami WASD a drugi strzałkami i na jednym kompie to działa. Mam pytanie, jakich użyć tchnologii, żeby rozproszyć to na dwa komputery, tzn jeden operator na swoim drugi na swoim i żeby grali między sobą? Tak jakąś najprostszą techniką, nie musi być najbardziej efektywna. Ktoś może ma jakiś pomysł?

M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

Musisz stworzyć serwer. Przez, który dane będą przesyłane. Powinieneś zainteresować się TCP. I wtedy, każdy ruch musisz przesłać do serwera, a ten przekazuje to wszystkich, którzy są połączeni z danym serwerem.

@Ps. Przykładowe dane : Piłkarz1 -> pozycja(122,333)

edytowany 1x, ostatnio: maniek1310
ShookTea
A ja wiem, czy serwer taki konieczny? Czemu nie przesyłać danych bezpośrednio?
ŁF
@ShookTea: Wystarczy, że jeden gracz będzie za NAT i już masz problem, a jeśli obaj będą schowani w sieciach lokalnych, to nie pograją w ogóle.
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Zależy gdzie chcesz mieć tą "prostotę". Możesz to zrobić socketami co jest niskopoziomowe i przez to "proste", a możesz przez CORBA i wtedy prostota będzie w samej implemenatacji gry ale technologia prosta nie będzie.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

@ShookTea Jeżeli przysłanie danych będzie bezpośrednie to przeważnie da się grać tylko po sieci LAN, gdyż większość dostawców internetowych blokuje porty i trudno bd wtedy wysłać dane.

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

Prostota, to chodzi o to żeby było łatwo napisać lub jakiś wzór żebym znalazł. W zasadzie zależy mi na czasie, jak najszybciej to ogarnąć więc pomijam detale wydajności, efektywności czy zabezpieczeń.
Moze być bezpośrednio lub nie, obojętne, ważne żebym jak miał dwa kompa swoje to żeby taka gierka działała mi. Dlatego zastanawiam się jakby mi to było najłatwiej rozwiązać, pisząc pod c++. Lapki podłączone do jednej sieci przez wifi wystarczą czy musze kabelkiem jakoś?

M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

Może być przez wifi jak i przez kabel, jest to obojętne. Nie napisałeś o jakie biblioteki się opierasz. Bo najprościej według mnie byś miał korzystając z framework-a Qt i bibliotekę QTcpSocket.

Ps. Znalazłem poradnik, jak ktoś to robi w tym framework-u.
http://blog.matthew.org.pl/2010/03/13/kurs-qt-czesc-7-tcp/

edytowany 2x, ostatnio: maniek1310
spartanPAGE
A co, jeśli jest podłączony kablem? :O
M1
To jest bez różnicy czy są podłączone kablem czy bezprzewodowe, bo przecież i tak będą mieli ten sam numer IP (w tej samej sieci).
spartanPAGE
"Może być przez wifi"
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

Miałem dwie opcje zrobić to jakoś przez WinSock lub użyć MPI, jednak poczytam o tym Qt. Bo w sumie musze wysylać tylko pozycje z macierzy (nowe pozycje) do drugiego uzytkownika zeby mu sie zaktualizowało boisko na ekranie.

M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
1

Możesz też zrobić to prościej np. poprzez bazę SQL :) Tworzysz sobie serwer MySQL np. programem WampServer i potem w programie przesyłasz do bazy wszystkie potrzebne dane a druga osoba odczytuje i nawzajem.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
6
maniek1310 napisał(a):

Możesz też zrobić to prościej np. poprzez bazę SQL :) Tworzysz sobie serwer MySQL np. programem WampServer i potem w programie przesyłasz do bazy wszystkie potrzebne dane a druga osoba odczytuje i nawzajem.

Zróbmy plebiscyt: kto wymyśli gorszy i bardziej niedorzeczny sposób komunikacji pomiędzy dwoma klientami gry toczącej się w czasie rzeczywistym... Takie rozwiązanie to nawet dla turowej gry byłoby mega słabe.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 28 komentarzy
gośćabc
wiesz co to znaczy "otrzymanie pełnej wiadomości" a "brak gwarancji na otrzymanie pełnej wiadomości"? czy to znaczy, że wiadomość w ogóle nie przyjdzie? to nie to zdanie tylko Ty i Twoje rozumowanie to jedna wielka bzdura; a i ja w przeciwieństwie do Ciebie lubię poszperać i popytać i już wiem, że są możliwości kiedy TCP nie dostarczy wiadomości, ale to nie jest wiedza przeznaczona dla haterów takich jak Ty, sam sobie poszukaj
n0name_l
A wiesz co napisales, czy wciaz nie bardzo? + Gratuluje nabycia tajemnej wiedzy klasztornej, dostepnej na wikipedii. Sam fakt, ze musiales tego szukac swiadczy tylko o tym, ze nie masz pojecia jak rzeczy dzialaja, o ktorych mowisz...
gośćabc
@Shalom możesz to ukrócić, ten gostek już zaczyna nudzić, to nie jest już dyskusja o cpp tylko wymyślanie czegoś czego nie było; ja nie będę odbijał piłeczek, nie ten poziom
Shalom
Przykro mi, nie da się zablokować komentarzy ;]
n0name_l
Podsumowujac: 1. TCP nie gwarantuje otrzymania pelnej wiadomosci. 2. Baza gwarantuje otrzymanie pelnej wiadomosci. 3. Baza przesyla wiadomosci po TCP. I to niby ja cos wymyslam, eh..
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
1
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

A jeżeli chciałbym rozproszyć prosto, tzn klient - serwer, gdzie klient przesyła swój ruch (lewo, prawo, przod, tył) i w zaleznosci co dostanie serwer wykonuje swoj ruch, tzn tak jakby gra jednego gracza z komputerem, to przy c++ i zrobieniu osobnego wątku dla gracza (wymagane) najlepiej będzie mi zastosować biblioteke WinSock?

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

Mam takie pytanie, zacząłem robić na socketach więc ok, tylko jak chce połączyć np. serwer na jednym kompie a klienta na drugim, żeby działało na więcej kompach i musze podać adres IP serwera a nie localhost, to jak go wydobyć, żeby się łączyło?

_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:19 dni
0

Albo wstukać ręcznie jak w niektórych grach siczowych.
Albo zrobić UDP latarnie.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

Ip serwera to będzie takie jakie masz przypisane do tego komputera gdzie masz postawiony serwer.

Dla topornych :)
https://www.youtube.com/watch?v=OeHC73GJsO8

C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

Ok już wiem, działa. Mam jeszcze pytanko, działa mi serwer dla jednego klienta, jednak chciałbym zrobić dla przynajmniej dwóch, żeby dwóch sie mogło połączyć lub więcej. (celem i tak będzie żeby klient1 wysyłał coś na serwer i zostało to przekazywane do klienta2 i pozniej klient2 cos wysyła do 1 i takie ruchy w petli).

Jednak jak zrobić z połączeniem dla wielu klientów?
Mam coś takiego:

Kopiuj
 SOCKET mainSocket = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); // tworzenie gniazda socket
if( mainSocket == INVALID_SOCKET )
{
    printf( "Error creating socket: %ld\n", WSAGetLastError() );
    WSACleanup();
    return 1;
}

sockaddr_in service;
memset( & service, 0, sizeof( service ) );
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr( "192.168.1.173" ); // zdefiniowanie adresu ip
service.sin_port = htons( 27015 ); // zdefiniowanie portu

if( bind( mainSocket,( SOCKADDR * ) & service, sizeof( service ) ) == SOCKET_ERROR ) // przypisanie do gniazda portu i adresu
{
    printf( "bind() failed.\n" );
    closesocket( mainSocket );
    return 1;
}

if( listen( mainSocket, 1 ) == SOCKET_ERROR ) // nasluchiwanie przez serwer
     printf( "Error listening on socket.\n" );

SOCKET acceptSocket = SOCKET_ERROR;
printf( "Waiting for a client to connect...\n" );

if( acceptSocket == SOCKET_ERROR )
{
    acceptSocket = accept( mainSocket, NULL, NULL );
}
printf( "Client connected.\n" );
mainSocket = acceptSocket;
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:19 dni
0

Osobne wątki dla każdego klienta.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
C6
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 21 godzin
  • Postów:197
0

Czyli na przykład na serwerze stworzyć dla klienta - wątek, przyjmę że max dwóch klientów to mi i to utworzyć dwa wątki za pomocą process.h i beignthread tylko jak to później sklecić, żeby oczekiwał na połaczenie dwóch klientów(wątków) i jeśli jest są połączenie to jakas tam wymiana danych?

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:2412
0

Uzyj jakiejs biblioteki sensownej jak czlowiek, a nie API systemowego. No chyba, ze tak bardzo kochasz miliony problemow...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.