PDA

Volledige versie bekijken : Slang / Snake laten lopen


debiesven
%Europe/Berlin %738 %2005, 18:43
Ik heb een "bord" van blokjes die 100x100 zijn, het bord bestaat uit 3 verticale en 6 horizontale blokjes.
Ik heb een "slang" van 3 blokjes. Nu is het de bedoeling dat de "slang" willekeurig(random) over het bord loopt. (Automatisch loopt)

Weet iemand hier een mooie script voor? Ik kan niets vinden, en zelf ben ik te onervaren om het zelf te schrijven denk ik, het lukt tenminste niet.

Alvast bedankt!

Fl4sh3r
%Europe/Berlin %762 %2005, 19:18
Een idee om iets dergelijks te doen:

defineer grootte
doe
richting = random richting
zolang (blokje[richting] == bezet || blokje[richting] > grootte van het veld)
beweeg in richting

debiesven
%Europe/Berlin %811 %2005, 20:28
Voor de duidelijkheid.

OOOOOO O###OO O##OOO O#OOOO OOOOOO OOOOOO
OOOOOO OOOOOO O#OOOO O##OOO O###OO OO###O
OOOOOO OOOOOO OOOOOO OOOOOO OOOOOO OOOOOO

Ik heb 18 vakjes. Waarvan 3 nu ingekleurd zijn. Nu moetetn de ingekleurde vakjes random bewegen. Een mogelijkheid is hierboven gegeven.

Dus:
Hij moet kunnen bewegen uit zichzelf.
Hij moet altijd vooruit lopen.
Hij moet 1 vakje per keer opschuiven.
Hij moet iedere keer kiezen welke kant hij op gaat.
De 2 laatste vakjes moeten het eerste vakje volgen.

Ik hoop dat het wat duidelijker is geworden...

Fl4sh3r
%Europe/Berlin %424 %2005, 11:11
Ik zal even proberen een voorbeeldje van mijn idee in elkaar te zetten.

Een voorbeeldje zit erbij als attachment. De code is niet geoptimaliseerd en is een hoop dat nog verbeterd kan worden, maar het geeft je in ieder geval een indruk.

Waar je ook op moet letten is die do ... while, die kan voor een oneindige loop zorgen als de slang langer is dan 3.

OOO### OOOO## OOOOO# OOOOOO
OOOOO# OOOO## OOOO## OOOO##
OOOOOO OOOOOO OOOO#O OOOO##

Fl4sh3r
%Europe/Berlin %460 %2005, 12:02
Ik heb nog wat verder zitten spelen, kijk maar of je er iets aan hebt:

var VELDW:Number = 20;
var VELDH:Number = 10;
var SNAKELENGTH = 20;

var depth:Number = 1;

/* Veld maken */
for(var y:Number = 0; y<VELDH; y++) {
for(var x:Number = 0; x<VELDW; x++) {
var curV:MovieClip = _root.attachMovie("vlakje", "vlakje_" add y add "_" add x, _root.depth++);
curV._x = x*curV._width + 20;
curV._y = y*curV._height + 20;
}
}

/* Slang maken */
var snake:Object = new Object();
snake.x = 2;
snake.y = 1;
snake.parts = Array();

for(var i:Number=0; i<SNAKELENGTH; i++) {
snake.parts[i] = new Object();
snake.parts[i].mc = _root.attachMovie("bolletje", "snake_0", _root.depth++);
snake.parts[i].mc._visible = true;
}
snake.parts[0].x = snake.x;
snake.parts[0].y = snake.y;

/* Slang bewegen */
onEnterFrame = function() {
var whileCounter:Number = 0;
do {
var dir:Number = random(4);
var tempx:Number = snake.x;
var tempy:Number = snake.y;
switch(dir) {
case 0: tempx++; break;
case 1: tempy++; break;
case 2: tempx--; break;
case 3: tempy--; break;
}
whileCounter++;
trace("whileCounter: " add whileCounter);
if(whileCounter > 10)
break;
} while(isTaken(tempx, tempy) || tempx < 0 || tempx >= VELDW || tempy < 0 || tempy >= VELDH);
snake.x = tempx;
snake.y = tempy;
moveSnake(snake.x, snake.y);
}

function moveSnake(x:Number, y:Number) {
//trace("moveSnake()");
_root["vlakje_" add snake.parts[snake.parts.length-1].y add "_" add snake.parts[snake.parts.length-1].x].bezet = false;
for(var i:Number=snake.parts.length-1; i>0; i--) {
snake.parts[i].x = snake.parts[i-1].x;
snake.parts[i].y = snake.parts[i-1].y;
moveSnakePart(snake.parts[i]);
//trace(i add ": " add snake.parts[i].x add ", " add snake.parts[i].y);
}
snake.parts[0].x = x;
snake.parts[0].y = y;
moveSnakePart(snake.parts[0]);
}

function moveSnakePart(part:Object) {
_root["vlakje_" add part.y add "_" add part.x].bezet = true;
part.mc._x = _root["vlakje_" add part.y add "_" add part.x]._x;
part.mc._y = _root["vlakje_" add part.y add "_" add part.x]._y;
}
function isTaken(x:Number, y:Number) {
//trace("isTaken(" add x add ", " add y add "): " add _root["vlakje_" add y add "_" add x].bezet);
return _root["vlakje_" add y add "_" add x].bezet;
}

Strato
%Europe/Berlin %547 %2005, 14:07
cool gedaan Fl4sh3r... ik had ook wat zitten vogelen maar hier was ik niet op gekomen

theFlashWizard
%Europe/Berlin %296 %2005, 08:06
als ik die zip combineer met dat nieuwe script moet ik er eerst nog een } onderaan zetten..
ook wordt de slang alsk het goed zie bij elke stap n stap langer.. dat zal ook wel niet helemaal de bedoeling zijn..
voorderest zou ik hem proberen wat minder bochten te laten maken..
en er moet echt iets van een voorkant opgezet worden want tenzij je de snelheid verhoogt zie je maar moeilijk hoe die nou echt beweegt..

Fl4sh3r
%Europe/Berlin %410 %2005, 10:51
Het klopt dat ie steeds langer wordt, hij groeit tot de maximale lengte.

Die } zal wel een copy-paste foutje zijn :P

Minder bochten, kop/midden/staart verschil e.a. laat ik graag over aan debiesven. Dit is enkel om 'm opweg te helpen.

theFlashWizard
%Europe/Berlin %732 %2005, 18:34
alleen had ik ooit dat spelletje ook op me mobiel.. en die werdt toch echt niet elke stap dat ie verplaatste groter.. dus vandaar.. dat zou toch echt iets minder vaak moeten gebeuren.. maar je hebt gelijk dat dat mshn wel weer het uitzoek werk is voor debiesven :) kan wellis heel leerzaam zijn.. :)

Fl4sh3r
%Europe/Berlin %754 %2005, 19:05
var SNAKELENGTH = 20;

als die op 5 gezet wordt stopt ie heel snel met groeien ;)

kH_
%Europe/Berlin %476 %2005, 12:25
Je kunt zo'n snake ENORM optimaliseren, waardoor de slang met een lengte van bijvoorbeeld 5000 NET zo snel loopt als bij een lengte van 2. Denk eens na of het nodig is om de delen tussen de kop en de staart ook te bewegen ;)

Fl4sh3r
%Europe/Berlin %514 %2005, 13:20
Denk eens na of het nodig is om de delen tussen de kop en de staart ook te bewegen ;)

Dat is idd wel een goeie opmerking ;-)

Misschien dat ik daar nog ns naar ga kijken een dezer dagen.

edit: of nu meteen :P
var VELDW:Number = 20;
var VELDH:Number = 10;
var SNAKELENGTH = 20;

var depth:Number = 1;

/* Veld maken */
for(var y:Number = 0; y<VELDH; y++) {
for(var x:Number = 0; x<VELDW; x++) {
var curV:MovieClip = _root.attachMovie("vlakje", "vlakje_" add y add "_" add x, _root.depth++);
curV._x = x*curV._width + 20;
curV._y = y*curV._height + 20;
}
}

/* Slang maken */
var snake:Object = new Object();
snake.x = 2;
snake.y = 1;
snake.parts = Array();

for(var i:Number=0; i<SNAKELENGTH; i++) {
snake.parts[i] = new Object();
snake.parts[i].mc = _root.attachMovie("bolletje", "snake_0", _root.depth++);
snake.parts[i].mc._visible = true;
snake.parts[i].x = snake.x;
snake.parts[i].y = snake.y;
}
snake.parts[0].x = snake.x;
snake.parts[0].y = snake.y;
var tail:Number = snake.parts.length-1;

/* Slang bewegen */
onEnterFrame = function() {
var whileCounter:Number = 0;
do {
var dir:Number = random(4);
var tempx:Number = snake.x;
var tempy:Number = snake.y;
switch(dir) {
case 0: tempx++; break;
case 1: tempy++; break;
case 2: tempx--; break;
case 3: tempy--; break;
}
whileCounter++;
//trace("whileCounter: " add whileCounter);
if(whileCounter > 10)
break;
} while(isTaken(tempx, tempy) || tempx < 0 || tempx >= VELDW || tempy < 0 || tempy >= VELDH);
snake.x = tempx;
snake.y = tempy;
moveSnake(snake.x, snake.y);
}

function moveSnake(x:Number, y:Number) {
_root["vlakje_" add snake.parts[snake.parts.length-1].y add "_" add snake.parts[snake.parts.length-1].x].bezet = false;
snake.parts[tail].x = snake.parts[0].x;
snake.parts[tail].y = snake.parts[0].y;
moveSnakePart(snake.parts[tail]);
if(--tail <= 0)
tail = snake.parts.length-1;
snake.parts[0].x = x;
snake.parts[0].y = y;
moveSnakePart(snake.parts[0]);
}

function moveSnakePart(part:Object) {
_root["vlakje_" add part.y add "_" add part.x].bezet = true;
part.mc._x = _root["vlakje_" add part.y add "_" add part.x]._x;
part.mc._y = _root["vlakje_" add part.y add "_" add part.x]._y;
}
function isTaken(x:Number, y:Number) {
//trace("isTaken(" add x add ", " add y add "): " add _root["vlakje_" add y add "_" add x].bezet);
return _root["vlakje_" add y add "_" add x].bezet;
}

kH_, wat heb je voor suggesties voor de 'random' bewegingen?

Roenes
%Europe/Berlin %517 %2005, 13:25
Goede opmerking kH_ :)

Maar dit is erg makkelijk te implementeren: je verplaatst de kop 1 plaatsje en daarna verplaats je het laatste blokje van de staart naar de plaats waar eerst de kop stond. Zo doe je dit constant. Dus puur een kwestie van 2 elementen in een array verplaatsen :)

kH_
%Europe/Berlin %781 %2005, 19:45
Inderdaad Roenes. Je houdt alleen de positie van de kop en de staart bij, meer niet :)

Voor wat betreft random bewegingen. Tja, very simpel eigenlijk. In theorie kun je 8 kanten op, als je diagonaal ook kunt bewegen. Maak nu een lijstje (in een tijdelijke Array) van alle mogelijke bestemmingen (dus vlak via collision detection en edge detection de onmogelijke bestemmingen uit) en pik uit die bestemmingen een willekeurige bestemming via de Math.round(Math.random()*(aantal_geldige_bestemmin gen-1)) meuk. Nou ja, dat is EEN manier wat mij als logisch lijkt.

Wat btw ook wel leuk is, gebruik ff de A* implementatie van Dauntless om je slangetje door een maze te begeleiden. Hmmm...dat doet me weer ergens aan denken, een maze algoritme in Flash. Ik ken nog een heel tof maze generation algorithm. Als ik het niet vergeet zal ik in het weekend ff een perfect maze algoritme in Flash implementeren. Hmm....misschien is het leuk voor een soort van game programming tutorial?

Ow...btw...Dauntless, heb je al eens zitten experimenteren met Dijkstra en andere kosten-functies? Is wel lachen als je naar het resultaat kijkt. Dijkstra vindt namelijk ALTIJD de kortste weg, is wel relaxed (maar ook logisch, als je kijkt naar de recursieve aard v/d functie (wat voor 1 situatie geldt, geldt voor alle situaties).

Het maze algoritme wat me zo weer te binnen schiet is btw ook recursief. ENORM simpel algoritme trouwens, maar je krijgt een perfecte maze (ieder vakje is via maar precies 1 pad te bereiken EN, dit geldt voor ieder vakje). Het algo is heel simpel. Je begint met een 2D grid met vakjes, waarbij ieder vakje omringt is met vier muren. Je gaat nu gewoon steeds at random een vakkie pakken en een muur omslaan, waarna je dit recursief herhaalt voor de omringende vakjes. Op die manier is het dus logisch te verklaren, dat IEDER vakje PRECIES door 1 pad te bereiken is en dat dit voor ieder vakje geldt (vanwege de recursie).

******, ik begin af te dwalen :)

Sorry mensen! Maareh, optimize ur little snaky ;)

Fl4sh3r
%Europe/Berlin %449 %2005, 11:47
Ik heb even zitten proberen om dat maze algoritme te implementeren, maar óf ik snap m niet, óf je uitleg is niet compleet.

Bijgesloten zit een fla met wat ik heb.