Archief - [PROG][JAVA] Probleem met algoritme

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

horse_99

Legacy Member
Hallo allemaal,

Ik ben bezig met het maken van een Java game. De spelers krijgen een speelveld te zien waarbij Z x Z kaarten liggen. Achter elke kaart schuilt een getal. De spelers mogen om de beurt twee kaarten omdraaien. Als de getallen achter deze kaarten gelijk zijn, wint de speler een punt. "Raadje plaatje" met getallen dus.

Ik zit echter met een probleem voor het uitdelen van de getallen aan de kaarten.

value[j] is de array die gevuld moet worden, waarbij telkens 1 willekeurig getal wordt uitgedeeld aan twee kaarten. Eerst wordt voor ieder element in de array de waarde op 0 gezet.

Ik heb het volgende geprobeerd.

Code:
for(i = 0; i <= n; i++)
{
    // Getal berekenen dat uitgedeeld moet worden aan de kaarten.
    random = (int) (100 * Math.random() + 1);

    // While-lus waarin 2 kaarten worden geselecteerd die nog geen waarde hebben.
    while(done == false)
    {
         done = false;
         // Array-posities kiezen.
         a = (int) (n * Math.random());
         b = (int) (n * Math.random());
         c = (int) (n * Math.random());
         d = (int) (n * Math.random());

         // Als deze waarden nog niet gezet zijn, ...
         if(value[a][b] == 0 && value[c][d] == 0)
         {
             value[a][b] = random;
             value[c][d] = random;
             // done op true zetten: men mag uit de while-lus gaan, en terug in de volgende doorloop van de for-lus.
             done = true;
         }
         else
         {
             // done op false zetten, er moeten opnieuw twee kaarten gekozen worden.
             done = false;
         }        
    }
}

Dit voorbeeld werkt dus niet. Het gaf geen fouten, maar het programma start gewoon niet op, waarschijnlijk omdat het zeer lang duurt vooraleer alle waarden van de kaarten geset zijn. Mijn PC werkt ook verschrikkelijk traag op dat moment.

Iemand suggesties?

Alle hulp is welkom.

MVG, Kristof.

forloRn_

Legacy Member
Je gaat op zoek naar twee kaarten die nog de waarde nul hebben. Naarmate meer kaarten een waarde krijgen, wordt de kans kleiner dat je er twee vindt die nog 0 zijn.

Ik zou het andersom aanpakken: steek de waarden (allen dubbel) in een array, schud de array door elkaar, loop je Z x Z kaarten af en ken er een waarde uit de array aan toe.

horse_99

Legacy Member
@ forloRn_

Zo had ik ook al liggen denken, maar wat je daar zegt, de array door elkaar schudden. Bestaat hier een functie voor, of zal ik hier zelf ook nog iets voor moeten schrijven? Sorry voor al de vragen, ik ben nog niet ver gevorderd in Java :).

Merci voor de reactie!

MVG, Kristof.

steinerwarrior

Legacy Member
Misschien met een for-los gewoon iedere keer de achterste waarde van de meerdimensionele array naar de 1e positie brengen (index [0][0]).
En in de for(int i = 0 ; i < hoeveel keer schudden ; i++).

Ge zult wel voor die "hoeveel keer schudden" altijd een andere waarden moeten nemen ook via random gewoon.

Kweet niet of dat zal lukken. Have a try.;)

Yuu
Stijn aka Greenbert:)

.Acku.

Legacy Member
The Java Collections API includes many algorithmic capabilities behind the scenes. For instance, up to this point, when various balanced tree-oriented collections were mentioned, how the tree was sorted was not. The time has come to describe this behavior and other similar capabilities. For random sorting or reordering of a List, just use Collections.shuffle().

http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#shuffle(java.util.List)

Maak van je array eerst een list met:
// vb van gewone array
int [] myArray = new int [10];
// vul array
// Converteer naar Colletions List
List arrayList = Arrays.asList(myArray);
// randomiseer volgorde
Collections.shuffle(arrayList);
// zet terug om naar array
myArray = arrayList.toArray();
// gebruik arrray


Rocking' the API ;)

steinerwarrior

Legacy Member
Ja zo is veel simpeler. Lol C# is zo hetzelfde als JAVA

horse_99

Legacy Member
Aha, zal het eens proberen.

Bedankt voor de reacties allemaal! :woohoo:

MVG, Kristof.

*EDIT*
Het voorlopige resultaat: http://users.skynet.be/fa031709/test/Test.html

Bijna af, enkel het shuffelen nog :s.

@ .Acku.
Bij de code die je me gaft onderlijnt JBuilder het volgende:

Code:
List arrayList = [u]Arrays[/u].asList(myArray);
[u]Collections[/u].shuffle(arrayList);
myArray = arrayList.[u]toArray[/u]();

Ik heb volgende regels bovenaan toegevoegd:

import java.lang.Object.*;
import java.util.Collections.*;
import java.awt.List.*;


Maar hielp niet :s.

Iemand raad?

MVG, Kristof.

Bubbling Zombie

Legacy Member
java.util.Arrays. Kan borland da nie automatique doen voor jou?

Slicer

Legacy Member
horse_99 zei:

import java.lang.Object.*;
import java.util.Collections.*;
import java.awt.List.*;

1) je imports zijn fout, je importeert ofwel alle klassen van een package: java.util.* ofwel de benodigde klasse: java.util.Collections

2) import java.lang.* moet je niet doen want dit gebeurt standaard al

3) je moet niet java.awt.List hebben maar de java.util.List (de Collection)

horse_99

Legacy Member
Code:
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.Collections;
import java.util.List;
import java.util.Arrays.*;

Resultaat:

Code:
// Array converteren naar een List.
list = [U]Arrays[/U].asList(v);

// Lijst door elkaar halen.
Collections.shuffle(list);

// Lijst terug converteren naar een array.
v = list.[U]toArray[/U]();

Wat mis ik?

MVG.

Kn0t

Legacy Member
Heeft dat spul geen auto-import / organize imports functie?
Zo nee, weg ermee.

anyway
import java.util.Arrays; ipv import java.util.Arrays.*;

horse_99

Legacy Member
---> http://users.skynet.be/fa031709/java.JPG <---

Verwacht een object: "Object[] a"

Maar ik kom af met een int[], een primitief type. Schort daar het schoentje?

*EDIT*

Probleem is opgelost :-).

Misschien omslachtiger, maar het werkt.

Code:
        // Oorspronkelijke array converteren naar een array van strings.
        for(i = 0; i < (rows * rows); i++)
        {
            s[i] = "" + v[i];
        }
        
        // Array converteren naar een lijst.
        List list = Arrays.asList(s);
               
        // Lijst door elkaar halen.
        Collections.shuffle(list);
        
        // Lijst omzetten naar array (van strings).
        list.toArray(z);
        
        // Oorspronkelijke array reconstrueren.
        for(i = 0; i < (rows * rows); i++)
        {
            v[i] = Integer.parseInt(z[i]);
        }

Allen bedankt voor de reacties!!!

MVG, Kristof.

.Acku.

Legacy Member
hmm, ja, dat is iets omslachtiger. Beetje vervelend dat hij het niet met primitives kan, wrappers zuigen.
In C# gebruikt men auto-boxing dacht ik, een systeem die automatisch primitives wrapped in Objects dacht ik

killgore

Legacy Member
Als je toch expliciet gaat loopen, wrm dan nog een tussenstap gebruiken???

Code:
ArrayList list = new ArrayList();
        for(i = 0; i < rows*rows; i++)
        {
            list.add(new Integer(v[i]));
        }
        Collections.shuffle(list);
        for(i = 0; i < rows*rows; i++)
        {
            v[i] = ((Integer)list.get(i)).intValue();
        }
kheb dus uw 2 totaal onnodige string arrays (wrom 2 trouwens, zelfs 1 was al voldoende) verwijdert hiermee.

trouwens: kheb uw iterators wel laten staan, maar waarom declareert ge i buiten uw iterator?
En waarom die rows*rows? Moe ge nie ganse rij shufflen, en zelfs al hebt ge rows*rows nodig (en dus 100% zeker zijt dat dat array.length niet overschrijdt) -> iets beter is nog steeds for(int i=0,l=rows*rows;i<l;i++)

:)
@ .Acku. in java 1.5 konden primitives toch ook in een list??? Dunno of het echt autoboxing is, maar ge moet ze allessinds niet meer expliciet boxen voor de lijsten (dunno hoe het met andere zit).

.Acku.

Legacy Member
@opmerking: maybe, dunno, 1.5 is nog steeds niet srandaard in professioenle omgeving, ik werk met 1.4 wegens applicatieservers die met 1.4 werken.
Geen generics etc voor mij

MacK

Legacy Member
@threadstarter.

Ge zou misschien best meer shuffle'n . Waarom vraagt ge? Wel ik speelde daarnet uw spelleke, en het viel mij op dat er nogal een 'zekere' systematiek in zit.

Check het volgende:

1234
5678
8765
4321

Ze staan dus steeds diagonaal over elkaar.. (welja, ongeveer hé. Ge ziet wel wat ik bedoel)

Nog 'n opm : ik kan gelijk maar enkel het getal '4' ingeven als rij.. Misschien een tijdelijke beperking die er doelbewust inzit, anyway, ik zeg het maar hé.

Voor de rest, leuk idee van een spelletje, moet ik ook eens proberen..

killgore

Legacy Member
@Mack: die versie was dan ook wanneer hij het shuffle-algoritme nog niet werkende kreeg :p.

puzzle-games zijn idd oude ideeën eigenlijk :p.

MacK

Legacy Member
mja, ken het spel ook hoor, speelde het vroeger vaak als kind.

'Twinkel pinkeltje' (ofzoiet) noemde het dan. Allemaal 'piramide'tjes' die boven een vakje stonden. als je 2 juiste omdraaide mocht je de piramide'tjes nemen..

maar kbedoel gewoon, dat moet ik ook eens proberen te maken..

killgore

Legacy Member
MacK zei:
mja, ken het spel ook hoor, speelde het vroeger vaak als kind.

'Twinkel pinkeltje' (ofzoiet) noemde het dan. Allemaal 'piramide'tjes' die boven een vakje stonden. als je 2 juiste omdraaide mocht je de piramide'tjes nemen..

maar kbedoel gewoon, dat moet ik ook eens proberen te maken..
uhu, zijn altijd nice dingskes om wa van te leren :)

Ik heb hier nog steeds ergens een schuifpuzzel gamecode liggen die elke image (dak kon lzen, dus bmp :p & liefst vierkant) opsplitste in 16 deeltjes en dan puzzelen maar :).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan