game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
+  Forums
|-+  Werken met Game Maker
| |-+  Beginners (Moderators: Erik Leppen, ericlegomeer, BlueMoonProductions)
| | |-+  reset board while match = true
Pagina's: [1]
« vorige volgende »
Print
Advertenties

Martientje
Gebruiker

Offline Offline

Berichten: 96


« Gepost op: 9 Juli 2020, 16:11:47 »

Hey iedereen,
Ik ben een online tutorial aan het volgen hoe een match 3 spel te maken. Ik had de code compleet overgenomen, maar hij werkte niet. Dus ben ik gaan experimenteren, maar ik krijg de code nog steeds niet werkend. Kan iemand mij helpen. De code vind je hieronder.

 Game Maker Studio

//initialize the game

width = 6;
height = 10;

offset = 32;

xstart = 88;
ystart = 216;

dot = noone;
match = false;



do
{

for (i=0; i < width; i++){
for (j=0; j <height; j++){
instance_create(offset * i + xstart, offset * j + ystart,obj_background_tile)
var dot = instance_create(offset * i + xstart, offset * j + ystart,obj_dots)
}
}

//check both left and up
if((instance_position(dot.x - offset,dot.y,obj_dots).image_index == dot.image_index
&& instance_position(dot.x - 2*offset,dot.y,obj_dots).image_index == dot.image_index)
|| (instance_position(dot.x,dot.y-offset,obj_dots).image_index == dot.image_index
&& instance_position(dot.x,dot.y-2*offset,obj_dots).image_index == dot.image_index))
{
match = true;
}


//check left
if((instance_position(dot.x - offset,dot.y,obj_dots).image_index == dot.image_index
&& instance_position(dot.x - 2*offset,dot.y,obj_dots).image_index == dot.image_index))
{
match = true;
}


//check up
if((instance_position(dot.x,dot.y-offset,obj_dots).image_index == dot.image_index
&& instance_position(dot.x,dot.y-2*offset,obj_dots).image_index == dot.image_index))
{
match = true;
}
}


until (!match)

alarm[0]=20;

state = "Fill";

Naar boven Gelogd

massimot
Gebruiker


Offline Offline

Berichten: 1391

GameMaker Studo 1.4 Prof + Android/iOS


« Antwoord #1 Gepost op: 25 Juli 2020, 09:02:58 »

Sorry voor de hele late reactie.
Wat bedoel je precies met "hij werkt niet" ?

Ik neem aan dat deze code het speelveld aanmaakt van het spel? Want dat ziet er best goed uit eigenlijk, maar er is één puntje:
Als je een veld hebt gegenereerd, en dan blijkt er een drie-op-een-rij in te zitten (match = true), dan voert GMS de do-until loop nog eens uit. Maar dan maakt hij ook de background tiles weer aan? Dat is vast niet de bedoeling...

Naar boven Gelogd

Martientje
Gebruiker

Offline Offline

Berichten: 96


« Antwoord #2 Gepost op: 11 Augustus 2020, 19:30:53 »

sorry voor mijn hele late reactie,

Ik besef me dat hij dat doet, maar wat hij niet doet is de code herhalen totdat er geen match meer word gemaakt. Ik krijg nog steeds matched pieces. Ik snap niet waarom.

Naar boven Gelogd

massimot
Gebruiker


Offline Offline

Berichten: 1391

GameMaker Studo 1.4 Prof + Android/iOS


« Antwoord #3 Gepost op: 17 Augustus 2020, 07:38:18 »

Omdat je alleen maar instances aanmaakt met instance_create() maar ze niet verwijderd met instance_destroy().

Naar boven Gelogd

Martientje
Gebruiker

Offline Offline

Berichten: 96


« Antwoord #4 Gepost op: 17 Augustus 2020, 16:22:19 »

ik heb inmiddels de code veranderd zodat hij de instanties ook verwijderd nadat de var match true is. Maar toch doet de code het nog steeds niet. Ik ben al met andere objecten gaan werken omdat ik dacht dat het er misschien aan lag dat de instanties van o_Dot nog niet bestonden, maar dat lijkt ook niet te werken, hij pakt daarbij de var dot1, dot2, dot3 en dot4 niet, terwijl ik ze wel initialiseer in het create event.

Naar boven Gelogd

massimot
Gebruiker


Offline Offline

Berichten: 1391

GameMaker Studo 1.4 Prof + Android/iOS


« Antwoord #5 Gepost op: 18 Augustus 2020, 21:52:25 »

Sorry, ik begrijp je script nu pas. Ik zou het volgende adviseren.

- Voer het deel om de instanties aan te maken 1x uit, dan kun je van die instanties de image_index later aanpassen
- In de loop stellen we eerst willekeurige image_index in voor alle instanties
- Daarna checken we of het zo "goed" is, dus geen matches
- Zo ja, stoppen
- Zo nee, herhaal de do-until loop

Zie de code hieronder. Ik weet 90% zeker dat dit werkt, maar misschien moet je nog iets wijzigen. Stel je vragen gerust.

Create Event
GML:
//initialize variables
width = 6;
height = 10;

offset = 32;

xstart = 88;
ystart = 216;


// Create the field
for (i=0; i < width; i++){
for (j=0; j <height; j++){
instance_create(offset * i + xstart, offset * j + ystart,obj_background_tile)
var dot = instance_create(offset * i + xstart, offset * j + ystart,obj_dots)
}
}

// Check that no matches can be made
var match = true;
do
{

// Set random image_index
for (i=0; i < width; i++){
for (j=0; j < height; j++){
var inst = instance_position(offset * i + xstart, offset * j + ystart,obj_dots);
inst.image_index = choose(0,1,2,3); // LET OP: vul hier in wat je nodig hebt
}
}

var match = false;
for (i=0; i < width; i++){
for (j=0; j < height; j++){

var inst = instance_position(offset * i + xstart, offset * j + ystart,obj_dots);

// Left-right check
if (i > 0 and i < width - 1)
{
var inst_left = instance_position(offset * (i-1) + xstart, offset * j + ystart,dot.y,obj_dots);
var inst_right = instance_position(offset * (i+1) + xstart, offset * j + ystart,obj_dots);

// Als er links en rechts een zelfde ligt, dan is er 3 op een rij
if (inst.image_index == inst_left.image_index and inst.image_index == inst_right.image_index)
{
match = true;
break;
}
}

// Bottom-down check
if (j > 0 and j < height-1)
{
var inst_up = instance_position(offset * i + xstart, offset * (j-1) + ystart,obj_dots);
var inst_down = instance_position(offset * i + xstart, offset * (j+1) + ystart,obj_dots);

// Als er links en rechts een zelfde ligt, dan is er 3 op een rij
if (inst.image_index == inst_up.image_index and inst.image_index == inst_down.image_index)
{
match = true;
break;
}
}

}
}
until (!match)

alarm[0]=20;

state = "Fill";

Naar boven Gelogd

Martientje
Gebruiker

Offline Offline

Berichten: 96


« Antwoord #6 Gepost op: 24 Augustus 2020, 18:49:51 »

Helaas. Ik heb uw code gebruikt, maar hij geeft nog steeds een match. Ik vroeg me af of het kon liggen aan het feit dat deze code in het create event word uitgevoerd? Dat het word uitgevoerd nog voordat alle obj_dots bestaan? Want ik zie nergens een fout in de codes die er zijn bedacht (ook andere codes die ik had bedacht moeten in theorie werken) alleen werken ze niet. Zoud u nog een keer naar de code willen kijken? Ik wil heel graag dat het spel gaat werken.

Naar boven Gelogd

massimot
Gebruiker


Offline Offline

Berichten: 1391

GameMaker Studo 1.4 Prof + Android/iOS


« Antwoord #7 Gepost op: 24 Augustus 2020, 20:18:12 »

Ik vroeg me af of het kon liggen aan het feit dat deze code in het create event word uitgevoerd? Dat het word uitgevoerd nog voordat alle obj_dots bestaan?
Slimme vraag, maar het antwoord kun je zelf proberen te achterhalen. Bijvoorbeeld door show_message_async te gebruiken op de variable inst.

Als het niet lukt (probeer het echt eerst zelf!) dan is er nog een andere mogelijkheid.

Een andere manier is de volgende:
- Maak een array aan van width x height en geef allen variabelen waarde nul
- Voer een do-until loop uit
- Geef ieder element in de array een willekeurig getal (net als de image_index)
- Check of voor ieder element uit de array met een dubbele for-loop er een match kan worden gebruikt (net als met instance_position etc.)
- Aan het eind: Maak de objecten aan en geef ze de variabele image_index op basis van de waardes in de array.

Mocht het niet lukken, dan kun je altijd weer om hulp vragen!

Naar boven Gelogd

Martientje
Gebruiker

Offline Offline

Berichten: 96


« Antwoord #8 Gepost op: 24 Augustus 2020, 20:37:33 »

thnx ik ga het proberen. Ik ben wel echt nog nieuw op het gebied van gml, dus ik zal waarschijnlijk wel om hulp moeten vragen Knipoog

Ik heb de show_message actie geprobeerd, en hij lijkt alles te herkennen (zowel de inst als de match) de code lijkt alleen niet de do until uit te voeren. Is er misschien een stap die ik heb overgeslagen in de do loop?

ik heb nog even verder uitgeprobeerd met de volgende code, maar hij geeft meteen aan "no match" en blijft dit herhalen, waardoor ik toch het gevoel heb dat de code niet volledig word uitgevoerd. Kunt u nog een keer kijken?

//initialize variables
width = 6;
height = 10;

offset = 32;

xstart = 88;
ystart = 216;

match = true;

// Create the field
for (i=0; i < width; i++)
    {
    for (j=0; j <height; j++)
        {
        instance_create(offset * i + xstart, offset * j + ystart,o_BackgroundTile)
        var dot = instance_create(offset * i + xstart, offset * j + ystart,o_Dot)
        }
    }

// Check that no matches can be made

do
{

    // Set random image_index
    for (i=0; i < width; i++)
        {
        for (j=0; j < height; j++)
            {
            var inst = instance_position(offset * i + xstart, offset * j + ystart,o_Dot);
            inst.image_index = choose(0,1,2,3,4,5,6,7,8); // LET OP: vul hier in wat je nodig hebt
            }
        }

    for (i=0; i < width; i++;)
        {
        for (j=0; j < height; j++;)
            {

            var inst = instance_position(offset * i + xstart, offset * j + ystart,o_Dot);

            // Left-right check
            if (i > 0 and i < width - 1)
                {
                var inst_left = instance_position(offset * (i-1) + xstart, offset * j + ystart,o_Dot);
                var inst_right = instance_position(offset * (i+1) + xstart, offset * j + ystart,o_Dot);

                // Als er links en rechts een zelfde ligt, dan is er 3 op een rij
                if (inst.image_index == inst_left.image_index && inst.image_index == inst_right.image_index)
                    {
                    match = true;
                    show_message_async(match);
                    }else{match = false; show_message("no match")}
                }

                // Bottom-down check
                if (j > 0 and j < height-1)
                    {
                    var inst_up = instance_position(offset * i + xstart, offset * (j-1) + ystart,o_Dot);
                    var inst_down = instance_position(offset * i + xstart, offset * (j+1) + ystart,o_Dot);

                    // Als er links en rechts een zelfde ligt, dan is er 3 op een rij
                    if (inst.image_index == inst_up.image_index && inst.image_index == inst_down.image_index)
                        {
                        match = true;
                        show_message_async(match);
                        }else{match = false; show_message("no match")}
                    }

            }
        }
}
until (match = false)

alarm[0]=20;

state = "Fill";

« Laatste verandering: 25 Augustus 2020, 01:37:08 door Martientje »
Naar boven Gelogd

Martientje
Gebruiker

Offline Offline

Berichten: 96


« Antwoord #9 Gepost op: 27 Augustus 2020, 20:54:45 »

Ik ben er achter. Waar in het begin var match = true staat, moest var match = false staan. De complete code die ik heb gebruikt staat hieronder, misschien heeft iemand er nog iets aan. Heel erg bedankt voor al jullie hulp en tot bij het volgende probleem Gemoedelijk

 Game Maker Studio
GML:
//initialize variables
width = 6;
height = 10;

offset = 32;

xstart = 88;
ystart = 216;

match = noone;

// Create the field
for (i=0; i < width; i++)
    {
    for (j=0; j <height; j++)
        {
        instance_create(offset * i + xstart, offset * j + ystart,o_BackgroundTile)
        var dot = instance_create(offset * i + xstart, offset * j + ystart,o_Dot)
        }
    }

// Check that no matches can be made

do
{
match = false;

    // Set random image_index
    for (i=0; i < width; i++;)
        {
        for (j=0; j < height; j++;)
            {
            var inst = instance_position(offset * i + xstart, offset * j + ystart,o_Dot);
            inst.image_index = choose(0,1,2,3,4,5,6,7); // LET OP: vul hier in wat je nodig hebt
            }
        }

    for (i=0; i < width; i++;)
        {
        for (j=0; j < height; j++;)
            {

            var inst = instance_position(offset * i + xstart, offset * j + ystart,o_Dot);

            // Left-right check
            if (i > 0 and i < width - 1)
                {
                var inst_left = instance_position(offset * (i-1) + xstart, offset * j + ystart,o_Dot);
                var inst_right = instance_position(offset * (i+1) + xstart, offset * j + ystart,o_Dot);

                // Als er links en rechts een zelfde ligt, dan is er 3 op een rij
                if (inst.image_index == inst_left.image_index && inst.image_index == inst_right.image_index)
                    {
                    match = true;
                    }
                }

                // Bottom-down check
                if (j > 0 and j < height-1)
                    {
                    var inst_up = instance_position(offset * i + xstart, offset * (j-1) + ystart,o_Dot);
                    var inst_down = instance_position(offset * i + xstart, offset * (j+1) + ystart,o_Dot);

                    // Als er links en rechts een zelfde ligt, dan is er 3 op een rij
                    if (inst.image_index == inst_up.image_index && inst.image_index == inst_down.image_index)
                        {
                        match = true;
                        }
                    }

            }
        }

}
until (match == false)

alarm[0]=20;

state = "Fill";

Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2020 Nederlandse Game Maker Community