mboost-dp1

Web multiplayer spil


Gå til bund
Gravatar #1 - KC
9. apr. 2009 09:18
Jeg vil lave et turbaseret multiplayer spil som skal køre fra en browser.

Brugerene skal mødes i en chat på websiden. Fra en lobby skal den ene hoste og den eller de andre skal joine spillet.

Når host starter spillet skal der starte en gameServer instans på webserveren og gameClient instanser hos alle spillere. I lobbyen bliver der udvekslet et unikt gameId således at clients kan sende requests til serveren. (til at opdatere gameState og til at sende egne updates til gameState til server)


Hvad kan jeg bruge til at programmere dette? Jeg har tænkt på en java applet hos klienten og noget lignende på serveren, men jeg har også leget lidt med c#.net.
Jeg har dog stadig ikke kunne gennemskue hvordan jeg skal starte serveren og klienterne og få oprettet kontakten imellem dem.


Er der nogen der har nogle gode råd, eller har nogle links til kode eksempler eller bøger som beskriver dette?
Gravatar #2 - arne_v
9. apr. 2009 13:12
#1

Hvis du ikke har programmerings erfaring er det nok for stor en opgave.

Første beslutning er om det skal være en ren HTML løsning med noget JavaScript som poller eller med en lad os kalde embedded client app i en web side - fordelen ved det sidste er at det tillader push.

Java applet var absolut en mulighed. Du kan sikkert spare lidt kode ved at kode UI delen i JavaFX.

Alternativer inkluderer Flex og .NET Silverlight.

Husk at alle browsere ikke understøtter alle teknologier.

Husk også at et typisk web hotel kun kan hoste web apps - ikke en rigtig server daemon.
Gravatar #3 - KC
10. apr. 2009 00:01
tror godt jeg kan få programmeret det, men med min manglende erfaring kan jeg ikke lige gennemskue hvordan jeg skal få det sat op. Altså hvordan jeg sætter serveren op til at køre en java applet eller noget .net kode.

Jeg kigger lidt på det du har nævnt. Tak for svaret.
Gravatar #4 - KC
10. apr. 2009 00:32
Har kigget lidt på det.

Hvis jeg bruger en java applet skal jeg vel have gang i nogle sockets for at få information fra server til client og tilbage?

Hvorimod med c#.net bør det hele kunne klares i .cs kode-filerne?
Gravatar #5 - arne_v
10. apr. 2009 00:47
#4

Hvis du vil køre over internet så er du nødt til at bruge sockets uanset programmerings sprog. Det kan evt. pakkes lidt ind så du kun skal kode HTTP kald, men der erstadig en socket nedenunder.

C# bruger også sockets.
Gravatar #6 - KC
10. apr. 2009 01:03
Ja, men hvis jeg bruger c# kan jeg vel slippe afsted med at klienten poller webserveren, som holder styr på spillet gennem et unikt id?

Så bør jeg ikke skulle ud i at holde styr på sockets.
Gravatar #7 - arne_v
10. apr. 2009 01:32
#6

Hvis vil lade client side polle med HTTP request til en web side, så er det samme problem uanset om du bruger ASP.NET/C#, Java EE/Java, PHP eller ASP/VBScript server side.

Hvis du vil have noget kode client side som briger socket til en server daemon er samme problem uanset om du bruger Java/JavaFX applet, Flex eller Silverlight/C# client side og om du bruger C++, Java eller C# server side.

Både sockets og HTTP er det samme uanset sprog.

Så start med at ligge dig fast på hvilken type kommunikation du vil lave.

Og så vælger du hvad du skal bruge client side og hvad du skal bruge server side.

Hvis der er flere muligheder, så vælger det det du kender bedst.
Gravatar #8 - Nextnx
10. apr. 2009 10:15
Tur baseret har sandsynligvis nok ikke den store behov for push.
så HTTP request burde være tilstrækkeligt. imo.
Så er der også en del problemstillinger man kan skippe over der.

Men igen kommer an på hvad der skal ske i "spillets mekanik".
Gravatar #9 - KC
10. apr. 2009 10:36
Jeg sidder og prøver at lave et simpelt kryds og bolle spil, for at få forståelsen inden jeg går igang med mit egentlige projekt.

Mit største problem er at jeg endnu ikke kan gennemskue hvilke filer der er persistent på serveren og hvilke der bliver oprettet sammen med client connection.

Mit kryds og bolle spil skal have en lobby hvor spillere mødes og hvor de derfra starter et spil sammen, gameState skal holdes på serveren så der ikke mistes noget hvis den ene disconnecter.

Jeg tror at jeg skal bruge global.aspx til min server data og App_Code til client data, men det er stadig lidt uoverskueligt.

Hvis der sidder en kyndig c# haj derude og keder sig ville det hjælpe mig meget hvis jeg kunne se et eksempel på en implementering af et lille kryds og bolle spil i asp.net.
Gravatar #10 - Windcape
10. apr. 2009 11:50
KC (9) skrev:
Mit kryds og bolle spil skal have en lobby hvor spillere mødes og hvor de derfra starter et spil sammen, gameState skal holdes på serveren så der ikke mistes noget hvis den ene disconnecter.
For mange ting på en gang, du skal starte med noget mere simpelt.

Tag udgangs punkt i at du kun kan have et spil kørende, og at spillet starter når der er 2 brugerer tilsluttet.

Hvis du ikke vil benytte flash/silverlight, så kan du ligeså godt droppe ideen om sockets, og bare udvikle det fra et simpelt startpunkt.

Bruger A trykker på felt 1, serveren sætter et kryds i felt 1.
Et stykke "AJAX" javascript kode checker hvert sekund for ændringer, og opdaterer gui'et når der sker noget.

Sådan et "javascript" spil kan kodes på en times tid.
Gravatar #11 - Windcape
10. apr. 2009 11:51
Derudover er du alt for teknologi fikseret, og lader slet ikke til at forstå hvordan netværk fungerer overhovedet.

KC (9) skrev:
Jeg tror at jeg skal bruge global.aspx til min server data og App_Code til client data, men det er stadig lidt uoverskueligt.
Jeg tror du havner på http://thedailywtf.com/ hvis du selv mente overstående seriøst.

Anyway, kan lige kigge på et hurtigt eksempel efter frokost (uden at love noget).
Gravatar #12 - KC
10. apr. 2009 13:00
Windcape (11) skrev:
Derudover er du alt for teknologi fikseret, og lader slet ikke til at forstå hvordan netværk fungerer overhovedet.

Jeg tror du havner på http://thedailywtf.com/ hvis du selv mente overstående seriøst.

Anyway, kan lige kigge på et hurtigt eksempel efter frokost (uden at love noget).


Jeg mener at jeg har forstået netværk, men jeg har ikke forstået hvordan det håndteres i asp.net/C#

Det er præcis det du beskriver som jeg havde forestillet mig. Jeg kan bare som sagt ikke gennemskue i hvilke filer der ligger server metoder og hvor der ligger client metoder.
Gravatar #13 - Windcape
10. apr. 2009 14:53
App_Code og Global.asax har intet med det at gøre. (App_Code findes slet ikke i mine webapps.)

Du skal opstille din spil-protokol først:

Her et en simple en, ikke super i performance, men god til simple ting, som kryds of bolle:

Klient til Server:
- TilslutSpil()
- ForladSpil()
- SetKryds llerBolle (int feltID)

Server til Klient:
- PlayerConnected
- PlayerLeft
- GameStateChanged // spiller satte kryds eller bolle i et felt)
- PlayerWon
- PlayerLost
Gravatar #14 - Windcape
10. apr. 2009 14:55
Derudover skal du med overstående løsning jo netop have en server kørende hele tiden. Hvilket vil sige du skal ud og købe dedicated hosting, medmindre det er et skoleprojekt.

Du kan også som tidligere nævnt lave en version i Javascript, Flex, Flash, Java eller Silverlight.

Hvis du skal have specific hjælp skal du vælge teknologi først.

Det giver ikke meget mening at skrive et eksempel, hvis du ikke har forstået konceptet i Sockets og Protokoller endnu.
Gravatar #15 - KC
10. apr. 2009 17:39
Det er ikke et skoleprojekt, bare noget jeg synes kunne være sjovt at lave. Jeg har et domæne og webhotel.

Jeg nævner App_Code og Global.asax fordi det er dem jeg har set blive brugt i andre eksempler jeg har fundet.

Jeg vil formodentlig bruge asp.net/C# fordi jeg tror, at jeg på den måde kan holde det simplest. Jeg tror jeg har styr på protokollen, men jeg kan ikke se hvor skællet ligger mellem serverside kode som er persistent og så den kode som hver klient henter og bruger.

Jeg har fået en masse ud af de svar der er kommet i tråden, så jeg nærmer mig forståelse for det. Bliv endelig ved :D
Gravatar #16 - Dreadnought
10. apr. 2009 18:09
Jeg kender ikke noget til sådan noget programmel som dette her, men jeg vil da tro, at jo mere der er muligt at læsse over på spillerens PC jo bedre. For jo mere serveren aflastes jo bedre, men dog ikke mere end at de informationer som klienten sender tilbage kan verificeres.

En anden ting når du er godt i gang med projektet bør du kryptere de data som klienten sender tilbage. Ikke noget heftigt. Jeg ser ofte browserspil, hvor highscoren tydeligvis er pillet ved.
Gravatar #17 - Windcape
11. apr. 2009 07:45
KC (15) skrev:
Jeg har et domæne og webhotel.
Vi gør det lige klart een gang til:

DU KAN IKKE KØRER EGEN SERVER PÅ ET WEBHOTEL.
Gravatar #18 - Windcape
11. apr. 2009 07:47
KC (15) skrev:
Jeg tror jeg har styr på protokollen, men jeg kan ikke se hvor skællet ligger mellem serverside kode som er persistent og så den kode som hver klient henter og bruger.
Klienterne henter intet kode, de modtager og sender input (Det var det med en protokol!) Og serveren har en kopi af det nuværende game-state hele tiden.

Du bliver altså nød til at læse noget mere op på hvordan netværk fungerer, fordi du lyder altså til ikke at have forstået noget som helst.

Her er et par links, happy reading:

http://en.wikipedia.org/wiki/Client-server
http://en.wikipedia.org/wiki/Protocol_(computing)
http://en.wikipedia.org/wiki/Internet_Protocol_Sui...
Gravatar #19 - Windcape
11. apr. 2009 07:50
#16

Jeg tror vi skal lade ham finde ud af hvordan han overhovedet benytter sockets før vi begynder at snakke om fejltolerante protokoller, input validering, synkronisering og kryptering.

Det er alt sammen relativt nemt at implementere når man først har lavet det grundlæggende, ie. sin protokol.
Gravatar #20 - Windcape
11. apr. 2009 08:32
Hurtigt eksempel på hvordan man kan lave en Server til formålet (som du stadigvæk IKKE kan køre fra et webhotel).

http://clausjoergensen.dk/content/code/TicTacToe.z...

Det er en 10 minutters omskrivning af min Chat Server :)
Gravatar #21 - KC
11. apr. 2009 10:03
Tak for eksemplet.

Det du har sendt er ren c# ikk? Hvis jeg nu laver det i asp.net/C# i de der "codebehind" filer kan jeg så ikke køre det fra en webserver?

Planen er at det skal køre fra en webserver direkte i browseren så brugeren ikke skal hente andet end den side.
Gravatar #22 - Windcape
11. apr. 2009 13:01
Det er det jeg siger, du har overhovedet ikke forstået noget som helst omkring det at kører en server endnu.

Indtil du kan svare på dit eget spørgsmål i #21, er det ikke muligt at hjælpe dig videre.

Men du kan få 2 tips:

1) HTTP er stateless.
2) ASP.NET tillader ikke threading.
Gravatar #23 - KC
11. apr. 2009 13:14
ok, så er jeg kommet videre :) - jeg er startet med mit kryds og bolle spil. Nu har jeg et konkret spørgsmål.

Hvis jeg har 9 buttons, named btn11, btn12 .. btn33 er der så en måde at tilgå dem i et for loop?

Jeg har to iteratorer fra 1 til 3 og vil bruge dem. Jeg har forsøgt at concatenere strengen direkte btn+i+j men det er den utilfreds med, så prøvede jeg at smide alle mine btn ind i et [3,3] array, men det har den forkerte type ser det ud til.

Jeg har sat mine 9 buttons op 3x3 og vil bruge dem som mit spillebræt. Er der en måde at tilgå deres ID i et loop eller skal jeg ind og manuelt skrive btn11 til btn33 hvis jeg vil checke dem alle?
Gravatar #24 - Windcape
11. apr. 2009 13:21
Du kan bare bruge et matrix, dvs. [3,3]. Og det er altså IKKE et array.


enum TicTacToeField
{
Clicked, UnClicked
}

TicTacToeField[,] fields = new TicTacToeField[3,3]


Hvorfor du snakker om iterators og buttons ved jeg ikke, det er jo irrelevant implementations specifikt, og slet ikke relateret til dit problem :p

For at løbe igennem er det så bare:


for(int c=0;c<3;c++)
for(int r=0;r<3;r++)
{
TicTacToeField field = fields[c,r];

if(field == TicTacToeField.Clicked)
{
// felt er allerede udfyldt.
}
}
Gravatar #25 - Windcape
11. apr. 2009 13:26
Og hvis du benytter WebForms, og dermed HtmlButton, skal du bare extended den, således:


using System.Web.UI.HtmlControls;

public class TicTacToeButton : HtmlButton
{
public bool Used { get; set; }

public TicTacToeButton() : base()
{
}
}


Og så igen:


TicTacToeButton[,] buttons = new TicTacToeButton[3,3];


Som kan itereres ligesom før:


for(int c=0;c<3;c++)
for(int r=0;r<3;r++)
{
TicTacToeButton btn = buttons[c,r];

if(btn.Used)
{
// felt er allerede udfyldt.
}
}
Gravatar #26 - arne_v
11. apr. 2009 16:42
KC (9) skrev:
Jeg tror at jeg skal bruge global.aspx til min server data og App_Code til client data, men det er stadig lidt uoverskueligt.


Første trin må vist være at læse lidt op omkring ASP.NET - ovenstående er totalt forkert.
Gravatar #27 - arne_v
11. apr. 2009 16:44
KC (12) skrev:
Det er præcis det du beskriver som jeg havde forestillet mig. Jeg kan bare som sagt ikke gennemskue i hvilke filer der ligger server metoder og hvor der ligger client metoder.


Det afhænger bl.a. af hvilken client side teknologi og hvilken server side teknologi du har valgt.
Gravatar #28 - arne_v
11. apr. 2009 16:47
KC (15) skrev:

Jeg vil formodentlig bruge asp.net/C# fordi jeg tror, at jeg på den måde kan holde det simplest.


Det er ikke nødvendigvis simplest. Men det er ihvertfald en mulighed hvis du vil bruge HTTP som transport.

KC (15) skrev:

Jeg tror jeg har styr på protokollen, men jeg kan ikke se hvor skællet ligger mellem serverside kode som er persistent og så den kode som hver klient henter og bruger.


Så skulle du måske fortælle os hvilken protokol du vil bruge !
Gravatar #29 - KC
13. apr. 2009 00:57
Så fik jeg styr på det, tak for det gode input.

Jeg skriver igen hvis jeg har flere konkrete spørgsmål :)
Gravatar #30 - illishar
24. apr. 2009 08:18
Måske du skulle starte med noget generelt programmering? Det lyder derudover som om, at .NET-koncepterne forvirrer dig lidt. Overvej at læse/købe denne Javabog. Den har umiddelbart præcis det du skal bruge. Og Java er ikke så kompliceret som ASP.NET, der er blandet sammen af kompilet serverside, pasivt html og klient-afviklet javascript.
Gravatar #31 - Windcape
24. apr. 2009 08:51
illishar (30) skrev:
Og Java er ikke så kompliceret som ASP.NET, der er blandet sammen af kompilet serverside, pasivt html og klient-afviklet javascript.
?!?!?!

Måske skulle du forstå forskellen på Java, C#, ASP.NET og JSP før du foreslår ham at købe en grundbog til det meste elendige sprog til webudvikling på markedet.
Gravatar #32 - illishar
24. apr. 2009 09:03
#31 Java er ikke webudvikling. Det vil dog sætte ham i stand til at implementere et kryds-og-bolle-netværks-spil, uden brug af en "tyk server". Javabogen gennemgår så vidt jeg husker, alt det GUI- og netværks-programmering, som han har brug for.
Hans "portal" (hvilket er lidt sekundær, i forhold til spillet) kan han så lave i ASP.NET, hvis han vil.
Gravatar #33 - Windcape
24. apr. 2009 09:06
Det kan han også i C#.

Det er faktisk nemmere i C#, da visual rendering ikke er det frygtelige mareridt Swing er.

Men vi diskutterede faktisk 3 løsninger i tråden. En ren web løsning (javascript), flash/silverlight, og client-server.

Client-Server er klart den bedste løsning i min mening.

Og java har meget at lære i forhold til C# til at arbejde med Netværk. TcpClient, handy using() statements, ordenlig exception håndterering, nemmere threading, closures (delegates) osv.

Der er ingen grund til at bede ham lære en forældet teknologi.
Gravatar #34 - illishar
24. apr. 2009 09:31
#33 Enig. Men det virker som om, at han famler lidt efter nogle grundkoncepter og jeg kender ikke umiddelbart nogen C#-bog, der er lige så behagelig, at lære den her slags fra, som Javabogen.
Hele hans projekt lyder jo umiddelbart som et studie-projekt. Der er derfor ikke nogen grund til at lave en "holdbar industri-løsning".
Gravatar #35 - KC
24. apr. 2009 11:56
Det er udelukkende til egen sjov og ballade.

Jeg skal bruge en client-server løsning fordi jeg vil lave et større spil når jeg har fået styr på koncepterne i asp.net med mit kryds og bolle spil.

Det bliver programmeret i asp.net c# så det giver ikke så meget mening at diskutere de mange mulige sprog der er.

Men jeg er glad for jeres feedback :)
Gravatar #36 - arne_v
26. apr. 2009 18:49
illishar (34) skrev:
Men det virker som om, at han famler lidt efter nogle grundkoncepter og jeg kender ikke umiddelbart nogen C#-bog, der er lige så behagelig, at lære den her slags fra, som Javabogen.


De forsøgte at lave en her:
http://dotnetforum.dk/wikis/dotnetbogen/default.as...

Men projektet gik vist i stå.
Gravatar #37 - arne_v
26. apr. 2009 18:51
Windcape (31) skrev:
det meste elendige sprog til webudvikling på markedet


Windcape (33) skrev:
ikke er det frygtelige mareridt Swing er


Windcape (33) skrev:
lære en forældet teknologi


Hvordan kan det være at jeg får en opfattelse af at du ikke kan lide Java?

:-)
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login