• 1
  • 2
2022-03-29, 18:43
  #13
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Bonnatorp
Nja särskilt användarovänligt behöver det inte vara.

Knappen kan heta "Enter", bara för att göra det extra drygt och mena på att det fungerade bättre med konsolapplikationen.
Spelet har ändå bara en enda funktion åt gången hela tiden, så det finns ingen orsak att ha fler än en knapp, utom möjligen att det blir lättare att koda flera knappar.

Tänker mest att det finns betydligt snyggare sätt att lösa det på, som dessutom inte blir så rörigt att koda. Att växla instruktioner för varje gång knappen trycks riskerar spontant att resultera i spaghettikod som det kallas.

Du skulle ju t.ex. kunna ha tre textboxar samt en rullgardinsmeny (drop down list), där du väljer vilken spelare du ska reglera i rullgardinsmenyn samt skriver in variabel 1-3 i resp. textbox, sedan när du trycker på knappen är alla attribut satta för den spelaren och så går man bara vidare till nästa spelare i menyn.
Citera
2022-04-02, 02:14
  #14
Medlem
Bonnatorps avatar
För att utveckla ämnet så kan jag egentligen använda vilket verktyg jag vill för ett grafiskt gränssnitt.
Men det var windows forms som togs upp i studieguiden, även om den har rejäla brister.

Finns annars något annat som är bra att använda?
ASP.NET?
Jag har ju grundkunskaper i HTML och CSS sedan webbutvecklingskursen, och en Udemykurs i ASP.NET liggandes på lager, men jag är lite orolig för att jag måste dyka in i javascript då också.

Huvudsaken känner jag är lite att jag kan ta min kod i C# och klippa in i interfacet, och pussla ihop med de nödvändiga funktionerna för att trigga att något händer.

Så Windows Forms duger egentligen, men jag har fortfarande inte riktigt någon aning hur jag ska börja.
Som sagt, studieguiden innehåller noll kod, så ett faktiskt kodstycke eller två till att börja med skulle vara uppskattat.
Citera
2022-04-02, 09:06
  #15
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Bonnatorp
För att utveckla ämnet så kan jag egentligen använda vilket verktyg jag vill för ett grafiskt gränssnitt.
Men det var windows forms som togs upp i studieguiden, även om den har rejäla brister.

Finns annars något annat som är bra att använda?
ASP.NET?
Jag har ju grundkunskaper i HTML och CSS sedan webbutvecklingskursen, och en Udemykurs i ASP.NET liggandes på lager, men jag är lite orolig för att jag måste dyka in i javascript då också.

Huvudsaken känner jag är lite att jag kan ta min kod i C# och klippa in i interfacet, och pussla ihop med de nödvändiga funktionerna för att trigga att något händer.

Så Windows Forms duger egentligen, men jag har fortfarande inte riktigt någon aning hur jag ska börja.
Som sagt, studieguiden innehåller noll kod, så ett faktiskt kodstycke eller två till att börja med skulle vara uppskattat.
Lite inspirerad av dina försök här så uppdaterade jag själv Visual Studio 2019 för att kunna prova göra lite Windows Forms (har inte gjort det sedan Visual Basic-tiden). Vad som slog mig var att resultatet (i vart fall om man kör default-kontroller utan att hålla på att mickla) designmässigt känns väldigt mossigt.
Så ja, det känns förlegat, designmässigt. HTML används ju numera allt mer även i GUI-sammanhang och är hyfsat portabelt till sin natur.
Citera
2022-04-02, 11:44
  #16
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Bonnatorp
För att utveckla ämnet så kan jag egentligen använda vilket verktyg jag vill för ett grafiskt gränssnitt.
Men det var windows forms som togs upp i studieguiden, även om den har rejäla brister.

Finns annars något annat som är bra att använda?
ASP.NET?
Jag har ju grundkunskaper i HTML och CSS sedan webbutvecklingskursen, och en Udemykurs i ASP.NET liggandes på lager, men jag är lite orolig för att jag måste dyka in i javascript då också.

Huvudsaken känner jag är lite att jag kan ta min kod i C# och klippa in i interfacet, och pussla ihop med de nödvändiga funktionerna för att trigga att något händer.

Så Windows Forms duger egentligen, men jag har fortfarande inte riktigt någon aning hur jag ska börja.
Som sagt, studieguiden innehåller noll kod, så ett faktiskt kodstycke eller två till att börja med skulle vara uppskattat.

Om du kan JavaScript så kan du absolut bygga ihop det som en vanlig webb-app, det är förstås inte bara enklare kodmässigt utan även lite mer modernt (som Enterprise nämner så är den föreslagna lösningen lite väl förlegad). Dock får du i ett sådant läge sitta och "översätta" all din skrivna kod, så den extra utvecklingstiden för det måste förstås vägas mot vinsten med det (känns spontant inte som att du bryr dig så mycket om kvaliteten på slutprodukten utan snarare att få till ett gränssnitt på kortast möjligast utvecklingstid).
Citera
2022-04-02, 11:45
  #17
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Enterprise
Lite inspirerad av dina försök här så uppdaterade jag själv Visual Studio 2019 för att kunna prova göra lite Windows Forms (har inte gjort det sedan Visual Basic-tiden). Vad som slog mig var att resultatet (i vart fall om man kör default-kontroller utan att hålla på att mickla) designmässigt känns väldigt mossigt.
Så ja, det känns förlegat, designmässigt. HTML används ju numera allt mer även i GUI-sammanhang och är hyfsat portabelt till sin natur.

Stämmer, själv har jag inte suttit med Windows Forms på typ 4 år men det var rätt omodernt redan då, man får mycket känslan av hur det var att bygga appar i början av 2000-talet.
Citera
2022-04-08, 20:53
  #18
Medlem
Bonnatorps avatar
Lyckades ragga en privatlärare som satt och hjälpte mig utförligt i en och en halv timme med att komma igång, helt fantastisk typ.
Så nu har jag grepp på det här med att konstruera tillstånd för knappen, och har väl kommit halvvägs känns det som.

Nu i slutspurten så har jag fastnat på hur jag ska formatera min output för resultaten.
Jag har en funktion för att skriva ut slutresultatet, och jag tänkte ha detta i en dialogruta istället, med MessageBox.Show.

Kod:
public void PrintTurns() //Metod som skriver ut slutstatistiken för varje spelare.
        {
            Console.WriteLine("Statistics for player {0}", name);
            Console.WriteLine("------------------------------------------");
            foreach (var turns in throwList) //Foreach-loop som repeterar en gång för varje runda i spelarens lista över rundor.
            {
                Console.WriteLine(turns); //Skriver ut den runda i throwList som är aktuell i foreach-loopen.
            }
            Console.WriteLine("------------------------------------------");
            Console.WriteLine("Total score for {0}: {1}", name, CalculatePoints());
        }

Problemet är att jag får inte till det med att formatera strängarna tillsammans med foreachloopen, och returnera dessa som en enhetlig sträng.
Har bifogat originalfunktionen ovan.
Hur formaterar jag en foreachloop till en strängvariabel?
__________________
Senast redigerad av Bonnatorp 2022-04-08 kl. 21:27.
Citera
2022-04-08, 22:05
  #19
Medlem
Citat:
Ursprungligen postat av Bonnatorp
Lyckades ragga en privatlärare som satt och hjälpte mig utförligt i en och en halv timme med att komma igång, helt fantastisk typ.
Så nu har jag grepp på det här med att konstruera tillstånd för knappen, och har väl kommit halvvägs känns det som.

Nu i slutspurten så har jag fastnat på hur jag ska formatera min output för resultaten.
Jag har en funktion för att skriva ut slutresultatet, och jag tänkte ha detta i en dialogruta istället, med MessageBox.Show.

Kod:
public void PrintTurns() //Metod som skriver ut slutstatistiken för varje spelare.
        {
            Console.WriteLine("Statistics for player {0}", name);
            Console.WriteLine("------------------------------------------");
            foreach (var turns in throwList) //Foreach-loop som repeterar en gång för varje runda i spelarens lista över rundor.
            {
                Console.WriteLine(turns); //Skriver ut den runda i throwList som är aktuell i foreach-loopen.
            }
            Console.WriteLine("------------------------------------------");
            Console.WriteLine("Total score for {0}: {1}", name, CalculatePoints());
        }

Problemet är att jag får inte till det med att formatera strängarna tillsammans med foreachloopen, och returnera dessa som en enhetlig sträng.
Har bifogat originalfunktionen ovan.
Hur formaterar jag en foreachloop till en strängvariabel?

Kika på StringBuilder
Citera
2022-04-09, 03:15
  #20
Medlem
Bonnatorps avatar
Citat:
Ursprungligen postat av erkki17
Kika på StringBuilder
Mentorn nämnde samma sak, fungerade perfekt.

Nu är jag förhoppningsvis på den absolut sista snutten kod.

Kod:
foreach (var j in nameList)
{
MessageBox.Show(nameList[j].PrintTurns());
 }

Jag får felmeddelandet på indexvariabeln j i nameList[] att "Argument 1: cannot convert from 'Dartspelet_forms.Player to 'int'".

nameList innehåller listan med spelarobjekt, och PrintTurns returnerar en sträng med resultatet för den aktuella spelaren.
Så min förhoppning var att det skulle vara exakt det här som returnerade en dialogbox för varje spelare, med spelarens resultat i. Jag förstår i princip felmeddelandet, men jag förstår inte vad jag ska göra åt det då jag förutsatte att iterationen j i foreachvillkoret helt enkelt skulle vara den indexsiffra som sattes som integer i nameList[].
Citera
2022-04-09, 07:19
  #21
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Bonnatorp
Mentorn nämnde samma sak, fungerade perfekt.

Nu är jag förhoppningsvis på den absolut sista snutten kod.

Kod:
foreach (var j in nameList)
{
MessageBox.Show(nameList[j].PrintTurns());
 }

Jag får felmeddelandet på indexvariabeln j i nameList[] att "Argument 1: cannot convert from 'Dartspelet_forms.Player to 'int'".

nameList innehåller listan med spelarobjekt, och PrintTurns returnerar en sträng med resultatet för den aktuella spelaren.
Så min förhoppning var att det skulle vara exakt det här som returnerade en dialogbox för varje spelare, med spelarens resultat i. Jag förstår i princip felmeddelandet, men jag förstår inte vad jag ska göra åt det då jag förutsatte att iterationen j i foreachvillkoret helt enkelt skulle vara den indexsiffra som sattes som integer i nameList[].
j i loopen är objektet som hämtas från foreach-itereringen (alltså inte ett index)
Det blir därför kaka på kaka att skriva namelist[j].PrintTurns när det räcker med j.PrintTurns.

(Ej testat)

Läs på:
https://docs.microsoft.com/en-us/dot...each-statement
__________________
Senast redigerad av Enterprise 2022-04-09 kl. 07:22.
Citera
2022-04-09, 11:05
  #22
Moderator
Pontiac-Garages avatar
Citat:
Ursprungligen postat av Bonnatorp
Mentorn nämnde samma sak, fungerade perfekt.

Nu är jag förhoppningsvis på den absolut sista snutten kod.

Kod:
foreach (var j in nameList)
{
MessageBox.Show(nameList[j].PrintTurns());
 }

Jag får felmeddelandet på indexvariabeln j i nameList[] att "Argument 1: cannot convert from 'Dartspelet_forms.Player to 'int'".

nameList innehåller listan med spelarobjekt, och PrintTurns returnerar en sträng med resultatet för den aktuella spelaren.
Så min förhoppning var att det skulle vara exakt det här som returnerade en dialogbox för varje spelare, med spelarens resultat i. Jag förstår i princip felmeddelandet, men jag förstår inte vad jag ska göra åt det då jag förutsatte att iterationen j i foreachvillkoret helt enkelt skulle vara den indexsiffra som sattes som integer i nameList[].

Som nämnts, läs på om skillnaden mellan for-loop och foreach-loop. I en for-loop går du igenom ett block så länge ett villkor är uppfyllt (t.ex. att iteratorn är under ett visst värde), i en foreach-loop går du igenom alla element i en collection (t.ex. en array):

https://docs.microsoft.com/en-us/dot...ion-statements
Citera
2022-04-09, 11:41
  #23
Medlem
Enterprises avatar
Det här är väl också ett exempel på att man inte bör använda "var" när "typen" inte ändå framgår tydligt (eller om man i övrigt är absolut tvungen).
Annars hade kompilatorn fångat upp felet, antar jag.
__________________
Senast redigerad av Enterprise 2022-04-09 kl. 12:11.
Citera
2022-04-09, 18:23
  #24
Medlem
Bonnatorps avatar
Citat:
Ursprungligen postat av Enterprise
.
Jajjamän, den fungerade perfekt.
Citat:
Ursprungligen postat av Pontiac-Garage
.
Mycket bra information som hjälper i fortsättningen, tack!

Jag har hursomhelst blivit färdig med programmet. Det är inte perfekt då det saknas t.ex. en del felhantering som jag hoppas läraren kan ha överseende med för ett E iallafall.
Men jag tänkte dela med mig av resultatet här ifall någon framtida student snubblar över det och vill ha inspiration. Finns som sagt en del att förbättra.

Kod:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Dartspelet_forms
{
    public partial class Form1 : Form
    {
        private List<Player> nameList = new List<Player>();
        private int numberPlayers = 0; //Variabel som lagrar hur många spelare som är med.
        int arrow1 = 0; //Lagrinsvariabler för vardera pil som kastas i vardera omgång.
        int arrow2 = 0;
        int arrow3 = 0;
        int total = 0; //Variabel som lagrar spelarens totalpoäng.
        int win = 301; //Vinnande poäng
        int i = 0; //Iteration av aktuell spelare
        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button_Click(object sender, EventArgs e)
        {
            if (numberPlayers == 0) //Tillstånd för spelets början, när spelare matas in.
            {
                if (Int32.TryParse(input.Text, out numberPlayers)) //Här sparas antalet spelare, om det är ett heltal.
                {
                    label1.Text = String.Format("Enter the name of player 1");
                }
                else
                {
                    label1.Text = "You have not entered a whole number.\n" +
                                  "Please enter a whole number stating the amount of players.";
                }
                return;
            }

            if (numberPlayers != nameList.Count && numberPlayers != 0) //Tillstånd för att mata in spelarna. Uppfyllt när spelarlistan är lika lång som antalet spelare.
            {
                    string name = input.Text;
                    AddPlayer(name); //Här läggs en spelare till, med namnet som villkor för metoden.
                label1.Text = String.Format("{0}, make your 1st throw.", nameList[i].ToString());
                if (numberPlayers != nameList.Count)
                {
                    label1.Text = String.Format("Enter the name of player {0}", nameList.Count + 1);
                }
                    return;
            }
            if (numberPlayers == nameList.Count) //Tillstånd som endast körs när alla spelare än inmatade.
            {
                if (arrow1 == 0) //Tillstånd för när första pilen ej är kastad.
                {
                    label1.Text = String.Format("{0}, make your 1st throw.", nameList[i].ToString());
                    if (Int32.TryParse(input.Text, out arrow1))
                    {
                        label1.Text = String.Format("{0}, make your 2nd throw.", nameList[i].ToString());
                        return;
                    }
                    else
                    {
                        label1.Text = "You did not enter a correct throw number";
                    }
                }
                if (arrow2 == 0 && arrow1 != 0) //Tillstånd för när andra pilen ej är kastad.
                {
                    if (Int32.TryParse(input.Text, out arrow2))
                    {
                        label1.Text = String.Format("{0}, make your 3rd throw.", nameList[i].ToString());
                        return;
                    }
                    else
                    {
                        label1.Text = "You did not enter a correct throw number";
                    }
                }
                if (arrow3 == 0 && arrow1 != 0 && arrow2 != 0) //Tillstånd för när tredje pilen ej är kastad.
                {
                    if (!Int32.TryParse(input.Text, out arrow3))
                    {
                        label1.Text = "You did not enter a correct throw number";
                    }
                }
                if (arrow1 != 0 && arrow2 != 0 && arrow3 != 0 && numberPlayers == nameList.Count) //Tillstånd för när alla pilar kastats.
                {
                    nameList[i].AddThrows(arrow1, arrow2, arrow3); //Sparar varje kastpoäng i den aktuella spelarens throwList lista via metoden AddThrows.
                    if (nameList[i].CalculatePoints() > win) //Tillstånd när den senaste spelaren ansamlat en vinnande poäng.
                    {
                        label1.Text = String.Format("{0} has won the game!", nameList[i].ToString());
                        foreach (var player in nameList)
                        {
                            MessageBox.Show(player.PrintTurns()); //Skriver ut varje spelares statistik i varsin dialogruta.
                        }
                        return;
                    }
                    arrow1 = 0; //Återställer pilarnas variabler för att de första tillstånden för kast ska köras igen.
                    arrow2 = 0;
                    arrow3 = 0;
                    if (i == nameList.Count - 1) //Återställer kastordningen om sista spelaren kastat.
                    {
                        i = 0;
                        label1.Text = String.Format("{0}, make your 1st throw.", nameList[i].ToString());
                        return;
                    }
                    if (i < nameList.Count - 1) //Ökar i så att nästa spelare kast sparas i nästa körning, om inte sista spelaren har kastat.
                    {
                        i++;
                        label1.Text = String.Format("{0}, make your 1st throw.", nameList[i].ToString());
                    }
                }
            }
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        public void AddPlayer(string name) //Metod som skapar ett spelarobjekt och lägger till i spelarlistan.
        {
            Player players = new Player(name);
            nameList.Add(players);
        }
    }
    
    public class Player
    {
        public string name; //Initierar en variabel för spelarens namn.
        public List<Turns> throwList = new List<Turns>(); //Initierar en lista för spelrundorna.
        public Player(string name) //Konstruktor för att hämta spelarens namn från ett villkor och spara inom klassen.
        {
            this.name = name; //Sparar den lokala variabeln name till klassvariabeln name genom att klassvariabeln kallas genom funktionen this.
        }
        public void AddThrows(int throw1, int throw2, int throw3) //Metod som sparar kastvärdena till listan throwList
        {
            throwList.Add(new Turns(throw1, throw2, throw3));
        }
        public int CalculatePoints()
        {
            int score = 0;
            foreach (var turns in throwList) //Foreach-loop som repeterar en gång för varje objekt i listan throwList.
            {
                score = score + turns.GetScore(); //Adderar nuvarande poäng i räkningen med poängen för den runda som foreachloopen är på.
            }
            return score;
        }

        public string PrintTurns() //Metod som skriver ut slutstatistiken för varje spelare.
        {
            StringBuilder output = new StringBuilder(); //Skapar en stringbuilder att spara följande strängar i.
            output.AppendLine(String.Format("Statistics for player {0}", name));
            output.AppendLine("------------------------------------------");
            foreach (var i in throwList) //Foreach-loop som repeterar en gång för varje runda i spelarens lista över rundor.
            {
                output.AppendLine(i.ToString()); //Skriver ut den runda i throwList som är aktuell i foreach-loopen.
            }
            output.AppendLine("------------------------------------------");
            output.AppendLine(String.Format("Total score for {0}: {1}", name, CalculatePoints()));
            return output.ToString(); // För att få ut all text ur stringbuildern
        }

        public override string ToString() //Returnerar spelarens namn.
        {
            return name;
        }
    }
    public class Turns
    {
        public int arrow1; //Lagringsvariabler som lagrar poängvärdet för varje kast i en runda.
        public int arrow2;
        public int arrow3;

        public Turns(int throw1, int throw2, int throw3) //Konstruktor som kontruerar ett objekt för varje runda, och lagrar tre värden i detta objekt.
        {
            arrow1 = throw1;
            arrow2 = throw2;
            arrow3 = throw3;
        }
        public int GetScore() //Metod som returnerar poängen för kasten i en runda.
        {
            int totalt = arrow1 + arrow2 + arrow3;
            return totalt;
        }
        public override string ToString() //Returnerar kasten för den aktuella spelaren.
        {
            return String.Format("Throw one: {0}, Throw two: {1}, Throw three: {2} ", arrow1, arrow2, arrow3);
        }

    }
}
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in