Behöver hjälp med c# program - runda går över till motståndaren

Permalänk

Behöver hjälp med c# program - runda går över till motståndaren

Hej!

Det är så att jag håller på med ett tärningsspel kallat "pig". Spelet går ut på att man slår en tärning där poängen adderas, man kan slå tärningen tills man väljer att avsluta rundan eller om man slår en 6:a, varav rundan går över till motståndaren och man inte får några poäng. Först till 100 poäng gäller. Jag är verkligen ingen höjdare på programmering och undrar nu hur jag ska göra för att kunna ha rundor för varje spelare, alltså om en spelare slår en sexa eller väljer att avsluta rundan så ska den gå över till en annan och då ska tärningskasten istället bli för den spelarens beräkning. Jag funderar även på att göra så att man kan spela mot datorn men då behöver jag än en gång veta hur man ska föra över rundan eller vad man ska säga.

Tack så hemskt mycket på förhand!!

Edit: glömde säga att jag gör det i windows forms.

Permalänk
Avstängd

Utan kod så blir det ganska generellt, men det är väl bara att ha en räknare för aktuella poäng och en per spelare där de aktuella adderas till spelaren om hen väljer att avsluta.

Permalänk
Keeper of Traditions

Om man ska komma till 100 först, varför skulle man välja att avsluta sin runda? Eller ska man komma så nära 100 som möjligt utan att gå över?

Enklast är väl bara att ha två while-loopar; en som alternerar mellan spelarna och en där man rullar en tärning tills man stannar eller får en 6:a.

Visa hur långt du kommit så kan du får mer hjälp, det är inte meningen att vi ska göra din läxa åt dig. Klistra in här med kod-taggar runt koden, eller på Pastebin.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk

Försöker göra en b-lösning, som sagt så är jag rent ut sagt urusel på detta:

private void SwitchTurns()
{
bool SwitchTurns = true; (false annars)
}

private void SlåBtn_Click(object sender, EventArgs e)
{
if (SwitchTurns)
{
RollDicePlayer2();
}

else
{
RollDicePlayer1();
}
}

Eftersom spelare 1 får börja så kallar jag på SwitchTurns då han förlorar/avslutar sin runda.

private void LostRoundPlayer1()
{
CurrentPointslbl.Text = "0";
CurrentPoints1 = 0;
MessageBox.Show("Du slog en 6:a! Rundan går över till motståndaren.");
SwitchTurns();
}
men hur gör jag så att min private void SlåBtn_Click vet att boolen SwitchTurns nu är true? Den ligger i en private void vet jag är problemet men jag vill bara att den ska bli true då jag kallar på den, dvs då spelare 1 förlorar/avslutar sin runda, och inte alltid.

Än en gång: jag vill kunna skicka att min bool nu är true till min "slå tärning" knapp bara då jag kallar på SwitchTurns, dvs då ena spelaren förlorat/avslutat rundan. Just nu ligger den i en private void eftersom jag inte vill att den ska vara publik om jag inte kallar på den, hur ska jag göra?

Är säkert jättesvårt att förstå vad jag menar så sorry för det. Här är spelet i fråga: http://www.playonlinedicegames.com/pig

Permalänk
Keeper of Traditions
Skrivet av Fenix1996:

Försöker göra en b-lösning, som sagt så är jag rent ut sagt urusel på detta:

private void SwitchTurns()
{
bool SwitchTurns = true; (false annars)
}

private void SlåBtn_Click(object sender, EventArgs e)
{
if (SwitchTurns)
{
RollDicePlayer2();
}

else
{
RollDicePlayer1();
}
}

Eftersom spelare 1 får börja så kallar jag på SwitchTurns då han förlorar/avslutar sin runda.

private void LostRoundPlayer1()
{
CurrentPointslbl.Text = "0";
CurrentPoints1 = 0;
MessageBox.Show("Du slog en 6:a! Rundan går över till motståndaren.");
SwitchTurns();
}
men hur gör jag så att min private void SlåBtn_Click vet att boolen SwitchTurns nu är true? Den ligger i en private void vet jag är problemet men jag vill bara att den ska bli true då jag kallar på den, dvs då spelare 1 förlorar/avslutar sin runda, och inte alltid.

Än en gång: jag vill kunna skicka att min bool nu är true till min "slå tärning" knapp bara då jag kallar på SwitchTurns, dvs då ena spelaren förlorat/avslutat rundan. Just nu ligger den i en private void eftersom jag inte vill att den ska vara publik om jag inte kallar på den, hur ska jag göra?

Är säkert jättesvårt att förstå vad jag menar så sorry för det. Här är spelet i fråga: http://www.playonlinedicegames.com/pig

Lägg code-taggar runt din kod så blir den lättare att läsa. Undvik också svenska bokstäver som å, ä och ö när du programmerar, använd engelska så långt du kan så blir det lättare att få hjälp utanför svenska forum.

Variabeln SwitchTurns är endast aktiv inom kodblocket för den funktionen, så om du vill få tillbaks värdet så får du returnera variabelns värde. Ändra då funktionen till "private bool SwitchTurns()"

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk

Okej förlåt! Men hur returnerar jag värdet då? För det är väl det jag ska göra. Jag har nog krånglat ihop allt men om jag minns så gjorde man något liknande med det här:

private bool SwitchTurns()
{
bool SwitchTurns = true;
return SwitchTurns;
}

private void SlåBtn_Click(object sender, EventArgs e, bool SwitchTurns)
{
if (SwitchTurns)
{
RollDicePlayer2();
}
else
{
RollDicePlayer1();
}
}

Givetvis så funkar inte detta så jag har nog gjort och tänkt helt fel. Tack för de snabba svaren förresten, då jag har fått hjälp med det här så lovar jag att jag klarar resten, har varit fast på det här så jäkla länge bara..

Permalänk
Keeper of Traditions
Skrivet av Fenix1996:

Okej förlåt! Men hur returnerar jag värdet då? För det är väl det jag ska göra. Jag har nog krånglat ihop allt men om jag minns så gjorde man något liknande med det här:

private bool SwitchTurns()
{
bool SwitchTurns = true;
return SwitchTurns;
}

private void SlåBtn_Click(object sender, EventArgs e, bool SwitchTurns)
{
if (SwitchTurns)
{
RollDicePlayer2();
}
else
{
RollDicePlayer1();
}
}

Givetvis så funkar inte detta så jag har nog gjort och tänkt helt fel. Tack för de snabba svaren förresten, då jag har fått hjälp med det här så lovar jag att jag klarar resten, har varit fast på det här så jäkla länge bara..

Precis. Genom

return SwitchTurns;

så skickar du tillbaks variabelns värde, men eftersom den alltid kommer returnera true så åstadkommer den inte så mycket.

Om du lägger in en if-sats i funktionen som kollar värdet (true/false) och sen returnerar det motsatta värdet, så kan du anropa den funktionen direkt i if-satsen i din "SlåBtn_click()" funktion och det kommer då alternera mellan de två spelarna.

Visa signatur

|| Intel 8700K || Asus RTX 4070 TI Super TUF || Samsung 750 EVO 500GB & Kingston A2000 1TB & Samsung 960 EVO 250GB || Corsair RM 850x || Antec P183 || Asus G-Sync RoG Swift PG279Q || Dell XPS 15 || Thinkpad X220

The Force is like Duct Tape, it has a light side, a dark side, and holds the universe together.

Permalänk

Förlåt men nu förstår jag inte. Om jag kallar på SwitchRounds(); i SlåBtn_click() så blir det ett error i if-satsen if (SwitchRounds),

Error 1 Cannot convert method group 'SwitchRounds' to non-delegate type 'bool'. Did you intend to invoke the method?

Om du kan skicka hur du tänkte med if-satsen så skulle jag vara evigt tacksam, vi har aldrig gjort något liknande i kursen men då jag får klart det här så borde det gå bra.

Permalänk
Medlem

Här har du ett exempel över hur du kan byta runda mellan två spelare.

for(;;) { if(IsPlayerOne()) { foo(); ... } else { bar(); ... } } void SwitchTurn() { playerOne = !playerOne; } bool IsPlayerOne() { return playerOne; }

Varje gång SwitchTurn blir kallad, ändrar den värdet i playerOne till sin invers och således byter spelare.

Permalänk

Vart ska jag lägga for(;;) och det inuti? Och skall jag ändra ;; till något? Och om jag förstår det rätt så är "if" där jag ska lägga koden för spelare 1 och "else" för spelare 2.

Än en gång tack så hemskt mycket för att ni hjälper mig.

Permalänk
Medlem

Dessa är synonymer, i att dem gör likadant. Enligt följande svar på stackoverflow, översätts båda till samma kod: Stackoverflow

for(;;) { } while(true) { }

If skulle vara spelare 1, och else spelare 2.

Permalänk

Ja ok. Förstår konceptet men playerOne blir ju aldrig deklarerad till någonting? Programmet säger till om det. Och jag satte void till private samt boolen till private, är det rätt?

private void SwitchTurn() { playerOne = !playerOne; } private bool IsPlayerOne() { return playerOne; } private void SlåBtn_Click(object sender, EventArgs e) { while (true) { if (IsPlayerOne()) { RollDicePlayer1(); } else { RollDicePlayer2(); } } }

Permalänk
Medlem

@Fenix1996: Jag gav dig inte all kod, resten måste du själv lägga in! Jag hjälpte bara med logiken för att växla mellan två spelare.

Jag skulle rekommendera att du läste på om scope. Jag gjorde en enkel sökning och kom till en arkiverad guide från Microsoft själv. Även denna guide verkar förklara skillnaden på olika scope.

Hör av dig om du vill ha mer vägledning.

Permalänk

Något som hjälpte mig att förstå C# logik var bob tabors C# lektioner på channel 9. Bygg inte för stort innan du lärt dig grunderna!

https://channel9.msdn.com/Series/C-Sharp-Fundamentals-Develop...

Mitt tips är att du tittar igenom dessa i bakgrunden eller hänger med helt beroende på hur lärt eller svårt du har att lära dig c#

Permalänk

@Razki: jag skickade pm!

Permalänk

Hej igen. Det är så att jag nu har skapat två formulär, ett formulär för namninmatning och det andra för själva spelet. Jag har dock problem med att kunna skicka data mellan dessa, närmaste bestämt spelarnas namn.

Jag löste det!
[s]
Mitt andra, inte lika stora problem är att både formulären öppnas fast jag vill att bara namninput formuläret ska öppnas i början, för att sedan öppna spelformuläret då användaren trycker på en knapp. Just nu ligger koden för öppningen av Form2 så här:
Löste även detta. Har dock ett nytt problem, och det gäller inmatningskontroll. Jag vill kunna kontrollera om användaren skriver in något alls, så ett minimum på 5 bokstäver skulle väl passa men jag vet inte hur!

Permalänk
Medlem
Skrivet av Fenix1996:

Jag vill kunna kontrollera om användaren skriver in något alls, så ett minimum på 5 bokstäver skulle väl passa men jag vet inte hur!

https://msdn.microsoft.com/library/system.string.length(v=vs....