Hra Battleship online – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hra Battleship online – .NET – Fórum – Programujte.comHra Battleship online – .NET – Fórum – Programujte.com

 

Mutagen0
Super člen
18. 11. 2012   #1
-
0
-

Zdravím, dneska sem udělal základní GUI a jádro hry battleship (Bitevní lodě) a pak mě zarazilo, že jsem zapomněl že na 1 počítači to hrát je asi nesmysl. Takže sem se rozhodl to udělat přes net jako online hru. Ale vubec mě nenapadá jak udělat komunikaci mezi "server-client" samozřejmě sem už zkoušel server a client udělat ale měl jsem problem s příjmem a náledným odesláním dat. Jako tím myslím že prostě sem se snažil udělat synchronní s tím, že to bude normálně příjmat data aniž bych na něco klikal prostě automatickej příjem. Ale to se mi nepovedlo tak nevím jak na tohle. Moje gui vypadá takhle (je to jen začátek dneska jsme s tím začal)

jedná se o bitmapu a přes třídu graphic vymalování lodí vody a střel. Jenom jak to pak zakomponentovat. Napadlo mě že bych to udělal následovně, po umístění vše lodí po poli bych poslal List s Loděma k soupeřovi jemu by se to tam nahrálo do pole ale samozřejmě jako voda a pokud by se trefil tak by se mu to updatlo a poslalo k protihráči pozici jakou trefil a pozice by se vymalovala i u něj, tam jde jen o otázku, jak to udělat aby to samo čekalo až druhý hráč něco pošle? Poradíte mi prosím?

PS jak jsem psal snažil jsem se udělat server client ale bez uspěchu, teda šlo mě to posílat jen z clientu na server ale client musel pokaždým poslaní dat ukončit relaci a pak zase připojit.

Nahlásit jako SPAM
IP: 89.190.90.–
liborb
~ Redaktor
+18
Guru
19. 11. 2012   #2
-
0
-

TCP/IP klient/server je plný net i .Net :). Už jenom na MSDN je příklad. Možná by stálo za to udělat si posílátko dřív než to začneš mastit do GUI.

Nahlásit jako SPAM
IP: 188.75.135.–
Mutagen
~ Anonymní uživatel
549 příspěvků
19. 11. 2012   #3
-
0
-

#2 liborb
Jako jo umím z clienta na server poslat údaje umím, ale prostě neumím to poslat ze serveru zpět a udržet spojení max poslat to jednou client -> server a server -> client ale jakmile to pošlu jakoby znova client -> server tak mi server nic nepřijme i když přitom naslouchá takže právě nevím kde je chyba, mě jde o to udržet spojení a čekat než protihráč pošle packet s informacema. A to právě nevím jak udělat.

Nahlásit jako SPAM
IP: 82.202.104.–
eximik0
Newbie
19. 11. 2012   #4
-
0
-

Mušíš vytvořit nový vlákno v C# je tu tuším novej process, tak bych to alespon řešil já, že komunikaci bych dělal paraelně v jinym vlákně

Nahlásit jako SPAM
IP: 93.99.138.–
Vaizo0
Stálý člen
19. 11. 2012   #5
-
0
-
Nahlásit jako SPAM
IP: 85.93.127.–
eximik0
Newbie
19. 11. 2012   #6
-
0
-

Vaizo: Proč? Vždycky tu komunikaci může přehodit nachvíli do sleepu

Nahlásit jako SPAM
IP: 93.99.138.–
Vaizo0
Stálý člen
19. 11. 2012   #7
-
0
-

#6 eximik
Moje zkušenosti    Navíc data jsou extrémně malá, takže si myslím, že ani opakované volání by nemělo nic zpomalit.

Postup, který navrhuji já je tento:

  1. Hráč A odehraje a řekne serveru svůj tah.
  2. Server kontaktuje hráče B a předá mu tah protiháče.
  3. Situace se obrací

Postup s otevřeným připojením vypadá takto:

  1. Hráč A i B na začátku hry vytvoří připojení (nejspíše spravované v extra vláknu).
  2. Server pro každé vzniklé připojení vytvoří nové naslouchací vlákno.
  3. Hráč A odehraje, vlákno s připojením čeká na odpověď.
  4. Server předá data hráči B. Vlákno hráče A na serveru se uspává a kontroluje, zda-li už se někde v paměti neobjevila data, která by šla vrátit.
  5. Server vlákno hráče B, zjistí, že došla nějaká data, vrátí je klientovi B.
  6. Situace se obrací.

Tady je taky zajímavý odkaz: http://www.codeproject.com/Articles/461682/Client-Server-Event-Subscription-Techniques-in-Csh

Nahlásit jako SPAM
IP: 85.93.127.–
Vaizo0
Stálý člen
19. 11. 2012   #8
-
0
-
Nahlásit jako SPAM
IP: 85.93.127.–
liborb
~ Redaktor
+18
Guru
19. 11. 2012   #9
-
0
-

Pokud se nepletu, tak podle normy TCP by měl každý držet spojení i několik minut po rozpadu spojení. A z toho jasně vyplývá, že spojení se má držet dokud je předpoklad komunikace. Otevírat nové spojení kvůli každé relaci je cesta do pekel (možná dlážděná těmi pověstnými dobrými úmysly). Hranice je tam myslím nějakých 10 minut. Třeba u těchto lodí chodí data sice málo, ale chodí. Hráč si může rozmýšlet tah třeba minutu, takže na nějaké prodlevě v doručení nesejde.

A dále soket je obousměrný. Jestli umíš udělat write v klientovi a read na serveru, tak přece není nic těžkého udělat write na serveru a read v klientovi. Jak se jednou utvoří spojení, tak dokud žije, musí všechno fungovat, to je princip TCP.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.209.–
Vaizo0
Stálý člen
19. 11. 2012   #10
-
0
-

#9 liborb
Zdravím,

já vím, že TCP připojení může být otevřené téměř neomezeně (pokud vím závisí na nastavení OS). Já jsem chtěl spíš říct, že si z programátorského hlediska myslím, že by to bylo jednodušší a za chvilku naprogramované. A vzhledem k povaze úlohy by se komunikace klidně mohla vykonat i na aplikační vrstvě.

Nahlásit jako SPAM
IP: 94.113.35.–
liborb
~ Redaktor
+18
Guru
19. 11. 2012   #11
-
0
-

Pro plnohodnotné TCP je potřeba poměrně dost paměti. Na moderním PC to nikoho netrápí, ale jsou i zařízení, která umí třeba jen 5 spojení najednou a když je vycmrndá, tak je v loji. Metodou otevřu spojení, zapíšu, přečtu, zavřu spojení a za pár vteřin znovu, neuvěřitelným způsobem plýtvám systémovými prostředky. Je sice možné, že je to na oko jednodušší, ale to nic nemění na tom, že je to cesta do pekel ;).

Pokud bychom se bavili o UDP, tak to je na takovéto srandičky jako dělané, ale u TCP otevřít a používat dokud spojení žije. Zavírat jen pokud už není opravdu potřeba.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.209.–
Mutagen
~ Anonymní uživatel
549 příspěvků
20. 11. 2012   #12
-
0
-

No tak to jsem uplně v koncích, co si teda vybrat por tuhle jednoduchou hru? kde se bude posílat max 4byte + nastavení lodí? Jen podotýkam že jsem narazil na server a client ale client musel vždy kliknout aby zjistil zda hráč udělal tah nebo ne. ale já chci aby to prostě jakmile hráč odehraje aby se to tomu druhýmu hned zobrazilo a naopak když odehraje druhej hrač tak aby se to prvnímu hned ukázalo ... Vlastně každej program/hra bude obsahovat jak Založení serveru tak připojení k serveru takže vlastně jeden hráč bude jakoby server a druhej client. Takže prosím o radu jak nejlíp, nejuspornějc a hlavně nenáročně naprogramovat. 

Nahlásit jako SPAM
IP: 82.202.104.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

Podobná vlákna

Online hra — založil koldis

Online hra — založil PatriCZek

Online hra - boje — založil pecan987

Online hra + server — založil milanmichal

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý