- .NET 9 er installeret.
- Visual Studio: Inkluderet i version >=17.12.
- VS Code: Se ovenstående link
- Jetbrains Rider: Skal være version >= 2024.3 (måske skal .NET 9 installeres manuelt).
- Node.js (^18.19.1 || ^20.11.1 || ^22.0.0 hvis du vil lave frontend i Angular).
- Azure CLI (hvis du skal deploye med Git, f.eks. hvis du ikke bruger Visual Studio (Code)).
- Azure Tools (VS Code extension) (hvis du skal deploye med VS Code).
Frontenden skal bruge en SignalR klient til at kommunikere med backenden. Der er eksempler på dette i repoet.
-
Rå TS/HTML/CSS
- Stå i
Frontend/TypeScriptFrontendog kørnpm ci. - Brug den
fileServerOptionsiBackend/src/WebApi/Program.csmed stien tilwwwroot/ts_frontendog udkommenter den anden (default). - I
Frontend/TypeScriptFrontend/srcliggerindex.tsogindex.htmlsom er entrypoints. Itsmappen liggergame.tsogsignal-r-client.ts, der lige nu bruges afindex.ts. - Når du kører
npm run build, mens du står iFrontend/TypeScriptFrontend, placeres JS, HTML og CSS iBackend/src/WebApi/wwwroot/ts_frontendsom serves når du starter backenden (httpslaunch profile). Kommandoen brugerwebpack --watch, så ændringer bliver reflekteret uden at man skal bygge igen.
- Stå i
-
Angular
- Stå i
Frontend/AngularFrontendog kørnpm ci. - Brug den
fileServerOptionsiBackend/src/WebApi/Program.csmed stien tilwwwroot/angular_frontendog udkommenter den anden. - Under udvikling kan man starte frontenden ved at køre
ng servemens man står iFrontend/AngularFrontendog åbnehttp://localhost:4200. Husk også at starte backenden (httpslaunch profile). - Når der skal deployes, skal man køre
ng build, hvilket lægger filerne iBackend/src/WebApi/wwwroot/angular_frontend/browser. Herefter kan ASP.NET Core appen udgives.
- Stå i
-
Andet
- Sørg for at HTML/JS/CSS blivier placeret et sted i
Backend/src/WebApi/wwwrootog atfileServerOptionsiProgram.csmatcher stien tilindex.html. Der er også et JavaScript eksempel iBackend/src/WebApi/wwwroot/js_frontend.
- Sørg for at HTML/JS/CSS blivier placeret et sted i
- Backenden er en ASP.NET Core app og bruge SignalR. Der et eksempel på en SignalR hub i
Backend/src/WebApi/Hubs/SampleSignalRHub.cs. - Hvis du ikke skal deploye med Git (med med Visual Studio, VS Code, zip deploy el. lign hvor der bygges lokalt), kan du opgradere til .NET 9 og C# 13 ved at slette
Backend/global.json, slette hele<PropertyGroup></PropertyGroup>fraBackend/src/WebApi/WebApi.csprojog ændreBackend/Directory.Build.propstil .NET 9 og C# 13.- Grunden til at jeg har sat det til .NET 8/C# 12 er, at MSBuild på Azure serveren er for gammel til at kunne bygge .NET 9.
- Den eksisterende kode er udelukkende et oplæg. I kan vælge at fortsætte med den eksisterende struktur, eller lave helt om på filerne og koden. De er der blot for at vise eksempler på henholdsvis at tegne på et canvas og hvordan SignalR virker.
- Hvis det bliver nødvendigt at kigge på netværkstrafikken mellem frontend og backend, er det nemmest at aktivere
WS(WebSocket) filtret i netværksmonitoren i browseren og vælge den entry med navnet på hubben (f.eks. "sample" som i eksempelkoden). Herefter vil sendte og modtagne beskeder vises under "Messages" (i Chrome).
- Microsoft Learn - Overview of ASP.NET Core SignalR.
- Microsoft Learn - Tutorial: Get started with ASP.NET Core SignalR [JavaScript].
- Microsoft Learn - Tutorial: Get started with ASP.NET Core SignalR [TypeScript].
- Microsoft Learn - Dependency injection i hubs.
- Vælg en af de to opgaver.
- Jeg har forsøgt at dele funktionerne op i to kategorier; påkrævede og valgfri. De påkrævedede laves som udgangspunkt først, og når de er løst, burde det være muligt at teste spillet i en eller anden form.
- De påkrævede er opstillet i den rækkefølge, jeg tænker, det vil være mest naturligt at lave dem, men det står folk frit for. Nogle afhænger f.eks. af tidligere funktioner. Nogle af funktionerne hænger også meget sammen med andre, så kig lige på, om du kan lave flere på en gang, når du starter på en ny.
- De valgfri funktioner et mit bud på de mest åbenlyse forbedringer, der kan laves. Man kan vælge at lave disse og eller finde på sine egne forbedringer.
- Nogle funktioner (både påkrævede og valgfri) kræver udvikling i både frontend og backend, mens andre kun kræver én af delene.
I denne opgave vil du skulle lave lidt mere arbejde i backenden end i frontenden.
- Gør det muligt at tegne med musen på canvas'et med én farve i én størrelse (hardcodede værdier).
- For nu behøver det ikke at være muligt at fortsætte med at tegne, hvis musen forlader canvas'et og kommer tilbage.
- Hints:
- canvas.addEventListener("mousedown"|"mouseup"|"mousemove").
context.lineCapoglineJoinkan med fordel ændres tilroundfor pænere linjer.- Del funktionaliteten op, så man kan genbruge f.eks. tegnekoden til at tegne andre spilleres streger og kan sende de tegnede streger til backenden.
- Lav "clear" funktionalitet til canvas'et der sletter alt det tegnede. Funktionen tages ikke i brug endnu.
- Send det der tegnes på canvas'et til alle andre connections med SignalR.
- Modtag andre spilleres tegning og vis det på canvas'et.
- Åben et nyt browservindue for at teste. Alle åbne tabs bør nu kunne sende og modtage tegninger.
- Lav en "lobby" (med en form for unikt id) når første spiller joiner. Dette skal gemmes et sted (hukommelse, database, fil, el. lign.).
- Gør det muligt at tilslutte en eksisterende lobby.
- Når x antal spillere (mindst én mere) har joinet skal spillet starte. Kan hardcodes til f.eks. 2 nu.
- Hints:
- Brug evt. url route/query parameter til at gemme lobby id (ingen lobby id?: ny lobby, lobby id sat?: tilslut eksisterende), så andre kan tilslutte en lobby med en specifik url.
- Det vil give rigtige god mening at kigge på SignalR groups.
- Se evt. på singleton services.
- Gør så tegninger kun sendes til de spillere, der er i den lobby (evt. SignalR gruppe), som brugeren er i.
- Implementer ture og runder:
- Lås for tegning på canvas, medmindre det er spillerens tur.
- Ignorer tegningen fra SignalR serveren i den tegnende spillers browser (eller lav noget logik på serveren, så det ikke sendes til den spiller).
- Giv turen videre til næste spiller efter en timeout.
- Hint: Hvis dette implementeres i backenden, kan man evt. kigge på singleton services eller BackgroundService.
- Clear alle spilleres canvas når en tur starter og slutter.
- Når alle spillere har tegnet er runden slut. Start næste runde, hvis antal runder < max antal runder (hardcode), ellers stop spillet.
- Implementer autogenerering af ord når en tur starter. Ordet sendes kun til den bruger hvis tur det er til at tegne.
- Implementer gætte-funktionalitet.
- De spillere, som ikke tegner, får vist et input felt og en send knap.
- Hvis alle spillere har gættet rigtigt gives turen videre til næste spiller med det samme (vent ikke på timeout).
- Giv point til hver spiller (også tegneren) kriterier, som du bestemmer.
- Efter sidste runde vises alle spilleres point.
- Find selv på andet. Denne står øverst, da jeg gerne vil opfordre til, at vi får så forskellige løsninger, som muligt.
- Implementer viskelæder.
- Gør første spiller der tilslutter sig en ny lobby til "lobby admin". Lav en knap som "admin" spilleren kan bruge til at starte spillet.
- Giv spilleren flere farver (f.eks. 4) at tegne med. Måske kan det skifte fra tur til tur.
- Gør det muligt for spilleren at indtaste sit navn inden spillet starter og brug dette til at vise, hvem der tegner og hvem der har fået, de forskellige antal point.
- Luk for adgang til lobbyen for nye spillere, når spillet er startet.
- Implementer caching af nuværende tegners tegning, så spillere der mister forbindelsen kan komme "up to speed".
- Lad admin sætte indstillinger for spillet. F.eks. antal runder, definere ordliste, hvor meget man må bruge viskelæderet, hvor mange (eller hvilke) farver der kan bruges og lign.
- Lav rigtig login og brug
[Authorize]attributten.
I denne opgave vil du skulle lave lidt mere arbejde i frontenden end i backenden.
- Lav et grid. Du vælger selv hvordan det teknisk skal laves.
- Standard størrelse er 10x10.
- Gør det muligt at placere skibe på grid'et. Hold det gerne simpelt for nu og vend evt. tilbage.
- Standard skibsstørrelser er: 1x5, 1x4, 2x3, 2x2.
- Lav en "lobby" (med en form for unikt id) når første spiller joiner. Dette skal gemmes et sted (hukommelse, database, fil, el. lign.).
- Gør det muligt at tilslutte en eksisterende lobby.
- Når der er to spillere, lukkes adgangen til lobbyen.
- Hints:
- Brug evt. url route/query parameter til at gemme lobby id (ingen lobby id?: ny lobby, lobby id sat?: tilslut eksisterende), så andre kan tilslutte en lobby med en specifik url.
- Det vil give rigtige god mening at kigge på SignalR groups.
- Se evt. på singleton services.
- Gør det muligt at sende ens konfiguration af skibe til backenden.
- Når begge spillere har sendt deres konfiguration vises et nyt (i starten tomt) grid for den spiller, som starter med at skyde.
- Dette grid skal vise tidligere skud, og om det er hit eller miss. Hænger sammen med de næste opgaver.
- Gør det muligt for den skydende spiller at trykke på et felt for at skyde og sende det til backenden.
- Indiker om det var hit eller miss på begge spilleres grids.
- Lav en speciel indikation på den skydende spillers grid, hvis et helt skib er sænket (alle felter som skibet dækker er ramt).
- Implementer ture:
- Byt om på visning af grids, så den spiller der før skød, nu ser sine egne skibe, og hvor der er skudt og omvendt, så den skydende spiller kun ser sine tidligere skud, og selvfølgelig ikke modstanderens skibe.
- Når den ene spillers sidste skib er sænket annonceres slutter spillet og vinderen annonceres.
- Find selv på andet. Denne står øverst, da jeg gerne vil opfordre til, at vi får så forskellige løsninger, som muligt.
- Implementer n-player mode.
- Måske skal man skyde på alle sine modstanderen, når det er ens tur for at gøre det mest fair?
- Skal spilleres skud på en modstander vises for alle eller er det kun de to involverede, som skal kunne se det?
- Implementer "salvemode":
- Den skydende spiller vælger (først) 5 felter som ved tryk på en knap alle sendes til backenden og markeres som hit eller miss på begge spilleres grids.
- For hvert af den skydende spillers skibe der er sænket fratages ét skud fra salven.
- Eks.: Hvis den skydende spiller har mistet 2 skibe, har spilleren kun 3 skud.
- Indiker hvilken slags skib, der er ramt på det grid, den skydende spiller ser.
- Gør første spiller der tilslutter sig en ny lobby til "lobby admin". Lav en knap som "admin" spilleren kan bruge til at starte spillet.
- Gør det muligt for spilleren at indtaste sit navn inden spillet starter og brug dette til at vise, hvem der tegner og hvem der har fået, de forskellige antal point.
- Hvis aktuelt: Giv lobby admin mulighed for at ændre mode.
- Hvis aktuelt: Giv lobby admin mulighed for at ændre om det vises, hvilken type skib, der er ramt.
- Lav rigtig login og brug
[Authorize]attributten.
- Gå til Resource groups [Azure Portal] og lav en ny resource group i "North Europe". Navngiv "RNE-CodeDay2024-ResourceGroup" (skift prefix til dine initialer).
- Tryk på "Review + create" > "Create".
- Gå til Create App Service Plan [Azure Portal].
- Vælg den nye resource group.
- Navngiv "RNE-CodeDay2024-Plan" (skift prefix til dine initialer).
- Vælg Windows.
- Vælg "North Europe".
- Tryk på "Explore pricing plans" og vælg B2.
- Tryk på "Review + create" > "Create".
- Hvis aktuelt: Byg frontend med
npm run build(og sørg for at backenden er konfigureret med den rigtigefileServerOptions). - Hvis Git deploy: Merge ændringer ind i
productionbranchen.
- Højreklik på
WebApiprojektet og trykPublish. - Tryk "New profile".
- Vælg Azure.
- Vælg Azure App Service (Windows).
- Verificer at du er logget ind med den konto, din Azure subscription er tilknyttet.
- Vælg den rigtige subscription (den der er tilknyttet til din Visual Studio subscription eller en anden personlig subscription).
- Tryk "Create new".
- Skriv et nyt navn der starter dine initialer efterfulgt af bindestreg. F.eks. "RNE-CodeDay2024"
- Vælg den rigtige subscription og den nye resource group og hosting plan.
- Tryk på "Create".
- Tryk på "Finish".
- Tryk på "Publish".
- Åben den nye side i browseren.
- Stå i
Backendmappen i terminalen og kørdotnet publish --configuration Release - Åben
Azure Toolsextension'en og login med den bruger, som din Azure subscription er tilknyttet. - Fold den korrekte subscription ud og højreklik på "App Service" og vælg "Create New Web App... (Advanced)".
- Navngiv app og vælg den resource group som du har lavet.
- Vælg .NET 9 (husk at skifte til .NET 9 som beskrevet i starten af denne README).
- Vælg Windows.
- Vælg den app service plan du har lavet.
- Vælg "Skip for now" (Application Insights).
- Højreklik på den nye app service i
Azureextension'en og vælg "Deploy to Web App...". - Vælg "Browse" og vælg `.../Backend/src/WebApi/bin/Release/net9.0/publish.
- Tryk på "Deploy".
- Tryk på "Yes" til "Always deploy the...".
- Åben den nye side i browseren.
-
Kør
az loginfor at logge ind med den bruger, din Azure subscription er tilknyttet og vælg den rigtige subscription. -
Lav en deployment user med
az webapp deployment user set --user-name <username> --password <password>(brugernavn skal være unikt og koden skal være god (og selvfølgelig ikke brugt før)). -
Kør følgende i terminalen (navngiv web app som i Visual Studio guiden):
az webapp create --resource-group <group-name> --plan <app-service-plan-name> --name <app-name> --runtime "dotnet:8" --deployment-local-git- Gem den url fra outputtet der står efter "Local git is configured with url of "
-
Kør
git remote add azure <url>med url'en fra sidste trin mens du står i rodmappen af repo'et. -
Kør
az webapp config appsettings set --name <app-name> --resource-group <group-name> --settings DEPLOYMENT_BRANCH='production' -
Kør
git push azure production.