Domanda:
Come posso fare in modo che questo robot finisca il labirinto?
Batophobia
2014-04-09 02:47:01 UTC
view on stackexchange narkive permalink

Al livello 13, il robot si trova in alto a sinistra di un labirinto generato casualmente. Come posso fargli ottenere la chiave blu e darmela?

Non mi sono preoccupato di farlo correre nel labirinto;Ho appena ridefinito "ROT.Map.DividedMaze" così "create" non avrebbe fatto nulla.Nessun labirinto, nessun problema.
Tredici risposte:
#1
+11
Batophobia
2014-04-09 02:47:01 UTC
view on stackexchange narkive permalink

Piuttosto che creare una semplice IA, è molto più facile fare in modo che il Robot rispecchi i tuoi movimenti utilizzando il seguente codice:

  if (me.getY () >map.getPlayer (). getY () -9) me.move ('up'); else if (me.getY () <map.getPlayer (). GetY () - 9) me.move ('down'); else if (me.getX ( ) >map.getPlayer (). GetX ()) me.move ('left'); else if (me.getX () <map.getPlayer (). GetX ()) me.move ('right');  

Quindi spostati in alto e a sinistra finché il robot non rispecchia i tuoi movimenti. Guidalo attraverso il labirinto come se lo stessi controllando. Una volta che ha la chiave ed è fuori, spostati a destra e vai fino in fondo per entrare in collisione con la R e prendere la chiave.

The Maze *

* Nota che il tuo labirinto sarà probabilmente diverso, ma guidare il robot è semplice quando i suoi controlli corrispondono ai tuoi.

Funziona anche per il livello precedente
@CanadianLuke Funzionerebbe anche al livello precedente e praticamente a qualsiasi livello Robot.
Idea interessante, molto più semplice della mia strategia "segui il muro"
#2
+4
nneonneo
2014-04-10 06:33:27 UTC
view on stackexchange narkive permalink

Non hai bisogno di un'intelligenza artificiale sofisticata per risolvere il problema. Usa una semplice strategia "abbraccia il muro alla tua destra" e puoi sfuggire a qualsiasi labirinto. Ci vuole semplicemente un po 'più di tempo.

  var dirs = [' left ',' up ',' right ',' down ']; if (map.rdir === undefined) map.rdir = 0; // Il buon vecchio algoritmo hug-the-wall-to-your-right var trythese = [map.rdir + 1, map.rdir, map.rdir - 1, map.rdir + 2]; for (var i = 0; i<4; i ++) {var d = (trythese [i] + 4)% 4; if (me.canMove (dirs [d])) {me.move (dirs [d]) map.rdir = d; rompere; }}  

Nota che sto memorizzando una proprietà extra su map ( map.rdir ) per farlo. Ciò è totalmente consentito poiché JavaScript consente l'uso di proprietà arbitrarie sugli oggetti.

Questo era il mio piano originale ma sono diventato pigro :)
#3
+2
Mag Roader
2014-04-10 07:18:13 UTC
view on stackexchange narkive permalink

Pensavo che sarebbe stato molto più divertente scrivere un'IA più elaborata, quindi l'ho fatto. Ecco un semplice algoritmo di ricerca del percorso che completerà tutti i labirinti del robot.

  var getMoveToward = function (x, y) {var pointsEqual = function (p1, p2) {return p1 [0] == p2 [0] && p1 [1] == p2 [1]; } var curPoint = [me.getX (), me.getY ()]; var targetPoint = [x, y]; var mark = {}; var pointString = function (p) {return p [0] .toString () + ',' + p [1] .toString (); } var markPoint = function (p) {marks [pointString (p)] = true; } var isPointMarked = function (p) {segni di ritorno [pointString (p)] == true; } var getUnmarkedMoves = function (d, p) {var offsetList = {'left': [-1, 0], 'right': [1, 0], 'up': [0, -1], 'down' : [0, 1]} var unmarkedMoves = [] for (var dir in offsetList) {var offset = offsetList [dir]; var movePoint = [p [0] + offset [0], p [1] + offset [1]]; if (map.getObjectTypeAt (movePoint [0], movePoint [1])! = 'block' &&! isPointMarked (movePoint)) {unmarkedMoves.push ([d == null? dir: d, movePoint]); markPoint (movePoint); }} return unmarkedMoves; } markPoint (curPoint); var moveStack = [[null, curPoint]]; while (moveStack.length > 0) {var move = moveStack [0]; moveStack.shift (); if (pointsEqual (move [1], targetPoint)) {return move [0]; } else {moveStack = moveStack.concat (getUnmarkedMoves (move [0], move [1])); }} return null;} var move = getMoveToward (map.getWidth () - 2, 10); if (move! = null) {me.move (move);}  
#4
+2
Riking
2014-04-10 11:36:54 UTC
view on stackexchange narkive permalink

La mia soluzione era ancora un'altra: ho creato una mappa di riempimento alla prima corsa mappando le posizioni nella direzione verso l'uscita.

In questo modo, ottieni il ritardo di calcolo solo al primo movimento e tutte le mosse successive sono veloci e il robot è sicuro di farcela senza dover rigenerare il labirinto.

  funzione getMove (me) {if (me.getY () > 9) return '' ; return me.floodPath [[me.getX (), me.getY ()]];} if (! me.floodPath) {me.floodPath = {}; var rcol = map.getWidth () - 2; var direction = ['su', 'giù', 'sinistra', 'destra']; var opposites = {up: 'down', down: 'up', left: 'right', right: 'left'}; var diffs = {su: [0, -1], giù: [0, 1], sinistra: [-1, 0], destra: [1, 0]}; // Inizia floodPath con un percorso attraverso la barriera me.floodPath [[rcol, 10]] = 'down'; me.floodPath [[rcol, 9]] = 'down'; me.floodPath [[rcol, 8]] = 'down'; var iterEdges; // Inizializza i bordi con la chiave var edge = [[rcol, 8]]; funzione addDiff (pos, dir) {var dif = diffs [dir]; ritorno [pos [0] + dif [0], pos [1] + dif [1]]; } console.log ('ciao'); // Questo terminerà non appena il flood-fill raggiungerà la posizione iniziale while (! GetMove (me)) {iterEdges = edge.slice (0); // bordi.clone (); bordi = bordi.slice (bordi.lunghezza); // bordi.clear (); iterEdges.forEach (function (pos) {direction.forEach (function (dir) {var nextPos = addDiff (pos, dir); if (me.floodPath [nextPos]) return; if (map.getObjectTypeAt (nextPos [0], nextPos [1])! = 'vuoto') ritorno; bordi.push (nextPos); me.floodPath [nextPos] = opposites [dir];});}); } console.log (me.floodPath);} me.move (getMove (me));  
Fantastico e più breve di [codice @MagRoader's] (http://gaming.stackexchange.com/a/163681/42984).Inoltre, non ho notato alcun ritardo nel calcolo alla prima mossa, quindi forse dipende dalla mappa.
#5
+2
votbear
2014-04-10 18:15:39 UTC
view on stackexchange narkive permalink

Disclaimer: molto probabilmente è molto lontano dalla soluzione prevista, ma è ancora una.

Approfitta del fatto che un labirinto viene generato casualmente.

Grazie al modo in cui viene generato il labirinto, c'è una possibilità molto affidabile che riavviando il labirinto solo poche volte, in uno di quei labirinti, il semplice codice

  if (me.canMove ('down')) me.move ('down'); else me.move ('right');  

è sufficiente per far uscire il robot il labirinto.

#6
+2
Tale
2014-04-10 21:54:28 UTC
view on stackexchange narkive permalink

Avevo fatto più o meno la stessa soluzione di nneonneo, solo leggermente diversa nella formattazione:

  // Implementa la regola della mano destra per maze solving.if (me.facing = == undefined) me.facing = 'right'; var dirs = {'right': ['down', 'right', 'up', 'left'], 'down': ['left', 'down' , "destra", "su"], "sinistra": ["su", "sinistra", "giù", "destra"], "su": ["destra", "su", "sinistra", " down ']} var scelte = dirs [me.facing]; for (var i = 0; i < 4; i ++) if (me.canMove (scelte [i])) {me.move (scelte [i]); me.facing = scelte [i];}  
#7
+2
Piotr
2014-04-11 12:29:23 UTC
view on stackexchange narkive permalink

hackeriamo e non disturbiamo il labirinto ...

  player.hasItem = function (item) {return true; };  
Intelligente!Ma in realtà non risponde alla domanda.
Il gioco ora ha il rilevamento delle manomissioni sui metodi principali.
#8
+1
user2357112 supports Monica
2014-04-11 05:08:04 UTC
view on stackexchange narkive permalink

Invece di correre nel labirinto, perché non eliminarlo del tutto? Ho chiuso la chiamata defineObject , quindi ho ridefinito ROT.Map.DividedMaze in modo che create non facesse nulla.

  map.defineObject ('robot', {'type': 'dynamic', 'symbol': 'R', 'color': 'gray', 'onCollision': function (player, me) {me.giveItemTo ( player, 'blueKey');}, 'behavior': function (me) {// codice utente inizia}}); ROT.Map.DividedMaze = function () {this.create = function () {}}; (function () {{// fine del codice utente}});  
#9
+1
user75412
2014-04-28 13:36:40 UTC
view on stackexchange narkive permalink

Puoi anche ridefinire defineObject per rendere la barriera passabile prima di chiamare l'originale, quindi vai a prendere la chiave tu stesso.

Il gioco ora ha il rilevamento delle manomissioni sui metodi principali.
#10
+1
theNightKiller
2016-09-30 12:23:34 UTC
view on stackexchange narkive permalink

Ho usato il campo come controller

  if (player.atLocation (1, 24)) {
            me.move ('down');
            } if (player.atLocation (1, 23)) {
            me.move ('up');
            } if (player.atLocation (1,22)) {
            me.move ('right');
            }
 

vai all'uscita e a destra.La terza dal basso è destra, la seconda è in alto e quella più bassa è in basso.

#11
  0
Schilcote
2014-04-11 18:39:34 UTC
view on stackexchange narkive permalink

AI? Ah!

  'behavior': function (me) {me.move (robodir);}}); var robodir = "right" player.setPhoneCallback (function () {if (robodir = = "right") {robodir = "down";} else if (robodir == "down") {robodir = "left";} else if (robodir == "left") {robodir = "up";} else if (robodir == "up") {robodir = "right";}}) map.defineObject ('null', {'behavior': function () { 

Il robot behiavor ora lo fa muovere lungo la direzione memorizzata in robodir ogni tick. L'attivazione del telefono cambia quella direzione. Banale!

#12
  0
Hazem Lotfy
2014-11-25 15:24:19 UTC
view on stackexchange narkive permalink

semplicemente, chiedi al robot di trovarlo, puoi sempre valutare prima il percorso e poi camminare, ma questo fa camminare solo il robot:

  if (! me.g) {me.g = 0; me.dir = [['destra', 0, -1], ['su', - 1,0], ['sinistra', 0,1], ['giù', 1,0]] ;} move = function () {x = me.getX () + me.dir [me.g] [1]; y = me.getY () + me.dir [me.g] [2]; if ( map.getObjectTypeAt (x, y)! = 'block') me.g = (me.g + 1)% 4; else if (! me.canMove (me.dir [me.g] [0])) me .g = (me.g + 3)% 4; me.move (me.dir [me.g] [0]);} if (me.getY () <10) move ();  

la cosa divertente è che puoi eseguire qualsiasi metodo, anche quelli bloccati, usa questo, probabilmente verrà risolto in futuro ma per ora sembra che abbiano lasciato una backdoor per tutti:

  map._display.game._setPlayerCodeRunning (false); map._display.game.map._removeItemFromMap (map.getWidth () - 2, 9, 'barrier');  
#13
  0
Xi Han
2014-12-29 12:02:06 UTC
view on stackexchange narkive permalink

HAHAHA

  'behavior': function (me) {player.setPhoneCallback (function () {color = player.getColor (); if (color == "# 0f0") { player.setColor ("# f00");} else if (color == "# f00") {player.setColor ("# 00f");} else if (color == "# 00f") {player.setColor ( "# ff0");} else if (color == "# ff0") {player.setColor ("# 0f0");}}); color = player.getColor (); if (color == "# 0f0") {me.move ("right"); } else if (color == "# f00") {me.move ("left"); } else if (color == "# 00f") {me.move ("up"); } else if (color == "# ff0") {me.move ("down"); }  


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...