Soduko spil i C#

Tags:    .net

Hej udviklere!

Jeg har et eksamens projekt hvor jeg vil lave et soduko spil.
Jeg kender dog ikke reglerne for tal oprettelsen. Eller, altså, i en række må der jo kun opstå det samme tal en gang.

Jeg har snakket lidt med min lære om det, og søgt på nettet. Men kan ikke rigtig finde frem til svaret på problemet..

Håber der er nogle af jer derude der ved hvordan det kan løses:)





9 svar postet i denne tråd vises herunder
5 indlæg har modtaget i alt 11 karma
Sorter efter stemmer Sorter efter dato


Hej Martin,

Der er en masse mattematisk kombinatorik i projektet, men den letteste løsning er at generere en fuld spilleplade som skal være målet spilleren skal nå.

Denne spilleplade skal selvfølgelig genereres lovligt, sådan at samtlige felter checkes lovligheden af igennem processen. Ved at starte og tage hvert af de 9 hovedfelter i random rækkefølge og med random 1. hovedfelt, vil det være muligt at generere spilleplader.

Denne generering startes på ny hvis det ikke er muligt at generere en lovlig spilleplade med de foregående genererede hovedfelter.

Herefter er der en masse metoder til at finde ud af hvor man kan sætte et tal. Disse metoder kodes ind. Derefter forsøges et tilfældigt felt fjernet i et tilfældigt hovedfelt. Programmet checker nu spillepladen, at det fjernede kan placeres med placeringsreglerne som programmet kender. Kan det placeres med reglerne, er dette den nye spilleplade. Derefter gentages processen med at fjerne et tilfældigt tal. Fejler det at fjerne tallet prøves et nyt tal, til samtlige tilbageværende tal er blevet testet om de kan fjernes (skal checkes i tilfældig rækkefølge).

nu har du en soduku med sværhedsgrad let-medium.

Med venlig hilsen
Ieet

Ps. Jeg kan ikke huske reglerne for fjernelse af 2 tal samtidigt.



Der var en gut der forskede i det i flere år og skrev en algoritme til det, som han så sidenhen har tjent fedt på.

min tilgang til ville være først at skrive en løsnings algoritme, det er ikke så svært, backtracking er et godt bud, og med lidt simpel modifikation kan du også få algoritmen til at fortælle om der er tale om en entydig løsning.

generering af opaver er dog langt fra trivielt, og det bliver ikke nemmere hvis man ønsker en automatisk vurdering af sværhedsgraden.

en mulighed, som jeg dog ikke har prøvet og derfor ikke kender effektiviteten af er:

Først skal vi have en vurdering af hvor svær en opgave er:
Vi lister derfor alle kandidater for alle tomme felter
et felt med kun 1 kandidat udfyldes direkte, og sværhedsgrad værdien punkes op med 1. listerne genberegnes så.
hvis man skal bruge en tvillinge par for at få tal, så ligges f.eks. 2 til, 3 ved tripler osv. hvis vi kommer til en situation hvor man skal "gætte" (backtracke i løsnings algoritmen) så kunne der lægges 10 til.

genereringen starter så med den komplette løsning hvorefter der så fjernes tal til sværhedsgraden passer, denne kunne også meget passende implementeres som backtracking.

værdierne for inkrementeringen af sværhedsgrad skal helt sikkert justeres.

alternativt fandt jeg det her på google:
http://www.devx.com/dotnet/Article/30752/0/page/1

god fornøjelse



Ved de har lavet det med WPF på coding4fun http://blogs.msdn.com/coding4fun du kunne kigge på deres tutorials og så bare hive deres logik ud...



Faktisk tror jeg ikke at det er muligt, jeg tror at alle spillene skal tænkes igennem, det kan self. gøres med MEGET avanceret kode, som jeg (og det tror jeg heller ikke andre herinde ved) ved noget af...

Kan ikke rigtig forestille sig hvordan,
først skal du jo lave selve pladen med tallene, men at trække nogen fra, altså dem man selv skal udfylde tror jeg desværre er noget man skal tænke over...

Men håber ikke jeg har ret og håber at andre herinde ved noget mere end mig om det.. :)



Idéen med at fjerne et tal af gangen er mildest talt elendig. DON'T DO IT!! :)

Jeg kan godt lave en sudoku "i hånden", men det er lidt svært at forklare, så det må blive en anden gang. Bare start med at lave en algoritme til at løse selve sudokuen - det er forholdsvist nemt.
Og hvis jeg engang skriver et program, som laver sine egne plader kan jeg jo lægge det herud. (Det burde vel allerede kunne findes vha. Google?!)



man kan vel lave det med 27 sæt af tallene 1-9

9 sæt for rækker
9 sæt for søjler
9 sæt for hver celle af de 9 store celler.

Og en algorithme der i mørket binder dem sammen ved for det første felt tage det samme tal fra de 3 sæt der er påvirket af cellen.
Efter dette iterers der indtil alle sæt er tomme, ved hver iteration vælg et af de sæt med færest tal tilbage. Lav en intersection mellem dette sæt de 2 andre sæt for en tilfældig plads som det færste sæt dækker, tag et tal fra intersectionen og put i feltet lig feltets index til en liste af indeks, fjern tallet fra de 3 sæt. Hvis intersectionen er tom så gå til bage i felt listen indtil du kan gøre et valg du ikke har gjort før, gem det dårlige valg i en anden liste så du kan teste for ikke at gøre samme valg 2 gange.


Det er bare en ide har reelt ikke testet om det er virker.



Tusind tak til alle der har bidraget med et forslag..

Jeg kigger det hele igennem, og så vender jeg tilbage når jeg har fundet ud af noget. Kan godt være jeg skal bruge lidt opbakning hen ad vejen:)





Nå, nu har jeg prøvet og prøvet.. Men har ikke rigtig kunnet få det til at virke..
Min lære var heller ikke helt positiv over for projektet da vi ikke har så meget tid.
Så jeg må desværre ligge det til side og gå i krig med noget andet..

Mange tak for alle budne, jeg fordeler point imellem alle som har kommet med et løsnings forslag:)



Hvis det har interesse kan jeg sende dig en kopi at et gammelt spil i Java (:



t