mboost-dp1
Web multiplayer spil
- Forside
- ⟨
- Forum
- ⟨
- Programmering
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?
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?
#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.
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.
#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.
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.
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".
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".
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.
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.
For mange ting på en gang, du skal starte med noget mere simpelt.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.
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.
Derudover er du alt for teknologi fikseret, og lader slet ikke til at forstå hvordan netværk fungerer overhovedet.
Anyway, kan lige kigge på et hurtigt eksempel efter frokost (uden at love noget).
Jeg tror du havner på http://thedailywtf.com/ hvis du selv mente overstående seriøst.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.
Anyway, kan lige kigge på et hurtigt eksempel efter frokost (uden at love noget).
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.
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
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
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.
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.
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
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
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.
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.
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.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.
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...
#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.
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.
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 :)
http://clausjoergensen.dk/content/code/TicTacToe.z...
Det er en 10 minutters omskrivning af min Chat Server :)
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.
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.
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?
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?
Du kan bare bruge et matrix, dvs. [3,3]. Og det er altså IKKE et array.
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:
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.
}
}
Og hvis du benytter WebForms, og dermed HtmlButton, skal du bare extended den, således:
Og så igen:
Som kan itereres ligesom før:
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.
}
}
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.
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 !
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.
?!?!?!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.
#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.
Hans "portal" (hvilket er lidt sekundær, i forhold til spillet) kan han så lave i ASP.NET, hvis han vil.
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.
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.
#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".
Hele hans projekt lyder jo umiddelbart som et studie-projekt. Der er derfor ikke nogen grund til at lave en "holdbar industri-løsning".
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 :)
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 :)
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å.
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.