Trädvy Permalänk
Medlem
Registrerad
Apr 2017

hjälp med programmering 1 c#

hej, ska skapa ett spel där jag ska använda mig av en array med 5 index, där användaren ska kunna lägga till 5 ord som sedan ska kunna användas för att man ska ta dom orden användaren har skrivit in och random ta fram ett ord som användaren själv ska gissa sig fram till rätt ord.

vet att man ska använda sig av en while-loop tills användaren gissar rätt och annars ska det bara fortsätta tills ordet är rätt.
vet dock inte hur jag ska få till så att man använder sig av sin array för att random ta ett ord och sedan låta användaren gissa sig fram, har letat skitlänge och inte hitta något. har en bok som "ska" vara till hjälp men den förklara så dåligt och den ger inget vettigt att använda så skulle behöva lite hjälp.

så här långt har jag kommit än så länge.

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Projekt___komplettering { class Program { static void Main(string[] args) { string[] spelord = new string[5]; bool isRunning = true; while (isRunning) { Console.WriteLine("\n\t------Välkommen till Menyn------"); Console.WriteLine("\n\t[1] Mata in spelord"); Console.WriteLine("\n\t[2] Mata in gissning"); Console.WriteLine("\n\t[3] Avsluta spelet"); Console.Write("Välj mellan 1-3: "); int menyVal = Convert.ToInt32(Console.ReadLine()); int.TryParse(Console.ReadLine(), out menyVal); switch (menyVal) { case 1: Console.WriteLine("\tMata in spelord"); spelord[0] = Console.ReadLine(); spelord[1] = Console.ReadLine(); spelord[2] = Console.ReadLine(); spelord[3] = Console.ReadLine(); spelord[4] = Console.ReadLine(); Console.Clear(); break; case 2: Console.WriteLine("\tMata in gissning"); while (true) { Console.WriteLine("Grattis du har gissat rätt"); } case 3: isRunning = false; break; default: Console.WriteLine("\n\tFelaktig inmatnig, pröva något annat"); break; } Console.ReadLine(); } } } }

Lagt till [code]-taggar //mod
Trädvy Permalänk
Medlem
Plats
Huskvarna
Registrerad
Aug 2010

Du får nog skriva mer specifikt vad du behöver hjälp med?

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

glömde det, la till det där uppe

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av freshadesha:

vet dock inte hur jag ska få till så att man använder sig av sin array för att random ta ett ord och sedan låta användaren gissa sig fram, har letat skitlänge och inte hitta något.

Vilken del är det du har problem med? Att slumpa fram ett index? För det kan du använda Random:

Random rnd = new Random(); int index = rnd.Next(0, 5); // 0 <= index < 5

Notera gränserna ovan, det lägsta värdet som kommer returneras är 0 och det största 4 (inte 5). Random är sen inte slumpmässig på riktigt, vilket kan skapa problem om du anropar new Random() flera gånger i följd. Du kan läsa mer om det här om du är intresserad.

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

@perost:

så om jag lägger till så här:

bool isRunning = true; while (isRunning) { Console.WriteLine("\n\t------Välkommen till Menyn------"); Console.WriteLine("\n\t[1] Mata in spelord"); Console.WriteLine("\n\t[2] Mata in gissning"); Console.WriteLine("\n\t[3] Avsluta spelet"); Console.Write("Välj mellan 1-3: "); int menyVal = Convert.ToInt32(Console.ReadLine()); int.TryParse(Console.ReadLine(), out menyVal); switch (menyVal) { case 1: Console.WriteLine("\tMata in spelord"); spelord[0] = Console.ReadLine(); spelord[1] = Console.ReadLine(); spelord[2] = Console.ReadLine(); spelord[3] = Console.ReadLine(); spelord[4] = Console.ReadLine(); Console.Clear(); break; case 2: Console.WriteLine("\tMata in gissning"); Random word = new Random(); int index = word.Next(0, 5); while (true) { Console.WriteLine("Grattis du har gissat rätt"); } case 3: isRunning = false; break; default: Console.WriteLine("\n\tFelaktig inmatnig, pröva något annat"); break; } Console.ReadLine();

blir det rätt då eller kommer jag behöva lägga till mer grejer för att få det att funka och vad isåfall?

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

eller hur ska jag skriva för när jag gör att man skrivit in fel ord så att loopen körs igen tills det blir rätt?

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@freshadesha: Då har du ett index du kan använda för att plocka ut ett slumpmässigt ord ur arrayen, ja. Sen måste du förstås lägga till kod för att faktiskt låta användaren gissa också. Just nu slumpar du ju bara fram ett index som du sen inte använder.

Trädvy Permalänk
Medlem
Plats
Örebro
Registrerad
Maj 2011
Skrivet av freshadesha:

eller hur ska jag skriva för när jag gör att man skrivit in fel ord så att loopen körs igen tills det blir rätt?

Du är lite svår att förstå ibland. Men för att få loopen att fortsätta tills du fått rätt ord kan du ha typ
PSUEDO:

slumpa ord
do {

ta inmatning
while (inmatning != ord)

Corsair Air 540 | Asus Z87-PRO | INTEL i7-4770K @ 4,2 ghz| 4x4gb 1600mhz RAM | Zotac 980 AMP! XTREME 4GB | SSD 512GB | 2x1tb WD 7200rpm | Cooler Master V1000 1000W | Skärm: ACER XB280HK | OSx + Win 10 pro N 64-bit
---------------------------------------------------------------------------------
Server: Supermicro X7DBP-8 | 2x Intel Xeon E5420 | 16gb ECC | 700w PSU | TS3 | CS:GO | mer i framtiden

Trädvy Permalänk
Medlem
Registrerad
Maj 2013
Skrivet av freshadesha:

eller hur ska jag skriva för när jag gör att man skrivit in fel ord så att loopen körs igen tills det blir rätt?

Just nu har du skrivit så att din while-loop alltid kommer att köras. Du måste på något vis kunna avsluta din loop, t.ex. när användaren gissat rätt ord.

bool continue = true; while(continue){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ continue = false; }else{ //Du har gissat fel } }

Det går även att göra på ditt sätt, men då måste du bryta loopen med "break;" där du vill att det ska brytas. T.ex.

while(true){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ break; }else{ //Du har gissat fel } }

M-ITX: Fractal Design Node 304 Gigabyte H97N i7 4790k Msi GTX980 Gaming Ballistix Sport 16GB @ 1600MHz

Trädvy Permalänk
Medlem
Registrerad
Apr 2017
Skrivet av Pamudas:

Just nu har du skrivit så att din while-loop alltid kommer att köras. Du måste på något vis kunna avsluta din loop, t.ex. när användaren gissat rätt ord.

bool continue = true; while(continue){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ continue = false; }else{ //Du har gissat fel } }

Det går även att göra på ditt sätt, men då måste du bryta loopen med "break;" där du vill att det ska brytas. T.ex.

while(true){ //Gissa ordet string ord = Console.ReadLine(); if(ord == slumpatord){ break; }else{ //Du har gissat fel } }

har skrivit in det här nu men får felmeddelande Operator '==' cannot be applied to operands of type 'string' and 'Random'. varför blir det så?

case 2: Console.WriteLine("\tMata in gissning"); Random word = new Random(); int index = word.Next(0, 5); while (true) { string Ord = Console.ReadLine(); if (Ord == word) { Console.WriteLine("Grattis du gissa rätt"); break; } else { Console.WriteLine("Du har gissat fel"); } } break;

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002
Skrivet av freshadesha:

blir det rätt då eller kommer jag behöva lägga till mer grejer för att få det att funka och vad isåfall?

Som andra redan har nämnt så har du nu bara slumpat fram ett index som sedan aldrig används för att testa gissningar. Fastnar man på den här typen av problem så kan det vara hjälpsamt att börja skriva ner vilka steg som behöver genomföras som så kallad pseudokod, och när man har en tydligare bild av stegen så kan man fokusera på hur det ska uttryckas i t.ex. C# som separata, mindre problem.

En rutin för gissningar skulle kunna se ut så här:

låt lösning = ett slumpvis valt ord i listan upprepa: låt gissning = ord från användaren till dess att gissning = lösning

Abstractions all the way down.

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002
Skrivet av freshadesha:

har skrivit in det här nu men får felmeddelande Operator '==' cannot be applied to operands of type 'string' and 'Random'. varför blir det så?

Du jämför strängen i Ord mot word, som inte alls innehåller ett ord utan istället en instans av Random, din slumptansgenerator, och det är nonsens för kompilatorn. Hur jämför man ett äpple med ett päron? Du behöver använda slumptalsgeneratorn för att hitta ett index till din lista över ord, och ordet som lagrats på den motsvarande positionen är din lösning:

Random random = new Random(); String solution = spelord[random.Next(spelord.Length)]; String guess; do { guess = Console.ReadLine(); } while(guess != solution);

Abstractions all the way down.

Trädvy Permalänk
Medlem
Registrerad
Maj 2013
Skrivet av freshadesha:

har skrivit in det här nu men får felmeddelande Operator '==' cannot be applied to operands of type 'string' and 'Random'. varför blir det så?

case 2: Console.WriteLine("\tMata in gissning"); Random word = new Random(); int index = word.Next(0, 5); while (true) { string Ord = Console.ReadLine(); if (Ord == word) { Console.WriteLine("Grattis du gissa rätt"); break; } else { Console.WriteLine("Du har gissat fel"); } } break;

Det du har tagit fram med Random är ett index. Detta index är alltså positionen i din array som du själv matat in värdena.
Du måste använda ditt index i din array för att på så vis kunna jämföra det värde som finns lagrat vid ditt index.
T.ex. ord == spelord[word]

M-ITX: Fractal Design Node 304 Gigabyte H97N i7 4790k Msi GTX980 Gaming Ballistix Sport 16GB @ 1600MHz

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

fan sorry fattar nada, kan ni förklara på något annat sätt. känner mig helt ut och cyklar nu, men förstår ingenting....

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av Pamudas:

T.ex. ord == spelord[word]

Du menar spelord[index].

Trädvy Permalänk
Medlem
Registrerad
Apr 2017

https://www.draw.io/#G0By8h1fe2h1BqU2JDT2pMRjZia00

så här ska programmet fungera om det blir lättare att förklara.

Trädvy Permalänk
Legendarisk
Hedersmedlem
Plats
::1
Registrerad
Dec 2002
Skrivet av freshadesha:

fan sorry fattar nada, kan ni förklara på något annat sätt. känner mig helt ut och cyklar nu, men förstår ingenting....

Det här kanske hjälper?

// Låt variabeln "word" innehålla en slumptalsgenerator. // * Observera att "word" knappast är ett lämpligt namn för en sådan. Random word = new Random(); // Låt variabeln "index" innehålla ett slumpat tal 0 <= x < 5. // * Här bör du vara försiktig med "magiska tal" eftersom att subtila buggar // kan uppstå om du ändrar på antalet gissningar, det är säkrare att hänvisa // till spelord.Length eftersom att den alltid kommer innehålla rätt värde. int index = word.Next(0, 5); // Upprepa... // * Eftersom att du alltid vill köra loopen minst en gång så är det antagligen // bättre att använda sig av do { ... } while (condition); istället (ex. ovan). // * På det viset behöver inte heller de som senare läser koden leta efter villkor // eller avbrott längre ner eller skiljda från varandra. while (true) <<-------+ Loopa för alltid? { | // Låt variabeln "Ord" innehålla en rad text inläst från terminalen | // * Tidigare variabler har varit namngivna med små bokstäver och på engelska, | // din kod blir lättare att läsa om den är konsekvent formaterad. | // * Är "Ord" tillräckligt beskrivande? Är koden lättare att förstå om du | // t.ex. kallar variabeln "gissning" istället? | string Ord = Console.ReadLine(); | | // Jämför värdet i "Ord" mot värdet i "word". Eftersom att "Ord" innehåller | // text och "word" (förvirrande nog) innehåller en slumptalsgenerator så | // misslyckas jämförelsen. | // För att jämförelsen ska göra vad du vill så måste du jämföra gissningen | // med det ord i listan som har din slumpade position / index, och det kan du | // t.ex. göra så här: | // if(Ord == spelord[index]) | if (Ord == word) <<-------+ Villkor { | Console.WriteLine("Grattis du gissa rätt"); | break; <<-------+ Avbryt loopen } else { Console.WriteLine("Du har gissat fel"); } }

Ser inget där.

Abstractions all the way down.