摘要:昨天凌晨花了仨小時(shí)通關(guān)了這個(gè)游戲,在這里就粗粗做一下題解吧,好幾題都是過去的。于是寫以下的變色過程就可以了重新執(zhí)行撿起電話機(jī),然后通過綠菊花之后按使用電話機(jī)讓自己變色兒就好了。于是只要把綠菊花的通過判斷函數(shù)里面可修改的區(qū)域改成就好了。
原文地址:http://xcoder.in/2014/06/12/untrusted-solution/
Trusted 是一個(gè)代碼解謎游戲,用 Javascript 來過關(guān)的。
昨天凌晨花了仨小時(shí)通關(guān)了這個(gè)游戲,在這里就粗粗做一下題解吧,好幾題都是 Hack 過去的。(不要臉,( ?Д?)σ
Ceil Block A這有點(diǎn)像教學(xué)關(guān)吧,總之先拿到那臺電腦你就能操作了。拿到電腦后你就能修改地圖內(nèi)部黑色底色的代碼了。
這個(gè)時(shí)候你只需要把中間設(shè)置墻的代碼去掉就可以了,或者注釋掉:
//for(y = 3; y <= map.getHeight() - 10; y++) { // map.placeObject(5, y, "block"); // map.placeObject(map.getWidth() - 5, y, "block"); //} // //for(x = 5; x <= map.getWidth() - 5; x++) { // map.placeObject(x, 3, "block"); // map.placeObject(x, map.getHeight() - 10, "block"); //}
然后
代碼大致是給你創(chuàng)建了一個(gè)迷宮,并且出口處四面用圍墻圍起來。
我用了一個(gè)比較 Hack 的方法,在第一個(gè)黑色區(qū)域的最上方把 maze.create 重定向到自己的一個(gè)空函數(shù),這樣下面調(diào)用創(chuàng)建迷宮的函數(shù)就不會被執(zhí)行,這個(gè)時(shí)候再執(zhí)行的話迷宮就不見了:
maze.create = function() {};
迷宮不見了還不靠譜,因?yàn)檫€有一個(gè)出口四周有墻——那就自己再建一個(gè)出口唄,在第二個(gè)黑色區(qū)域?qū)懮辖⒁粋€(gè)新出口的代碼即可:
map.placeObject(0, 0, "exit");
Validation Engaged勇敢的少年啊,快去創(chuàng)造奇跡!
這題的要求是在還存在著一定量『壁』的情況下你能到達(dá)出口,也就是說純粹地刪除它加『壁』的代碼是不行的,那我們做點(diǎn)改動就 OK 了。把『壁』往外移動,直到把人和出口都是在『壁』內(nèi)。
那一天,人類終于回想起曾經(jīng)一度被他們所支配的恐怖,還有囚禁于鳥籠中的那份屈辱。
for(y = 0; y <= map.getHeight() - 3; y++) { map.placeObject(5, y, "block"); map.placeObject(map.getWidth() - 5, y, "block"); } for(x = 0; x <= map.getWidth() - 5; x++) { map.placeObject(x, 3, "block"); map.placeObject(x, map.getHeight() - 3, "block"); }Multiplicity
嘛嘛,這是第二關(guān)的簡化版——直接再搞一個(gè)出口就 OK 了。
map.placeObject(20, 10, "exit");Minesweeper
這是一個(gè)雷區(qū),你不碰雷就好。從代碼里面看出來有個(gè) map.setSquareColor 函數(shù)可以設(shè)置某個(gè)格子的顏色。那好辦,我們在設(shè)置一個(gè)地雷后把它用別的顏色標(biāo)記出來就好了,然后重新執(zhí)行只要你不是色盲都能安全通過。
map.setSquareColor(x, y, "#ff7800");Drones 101
這題大概就是說有個(gè)癡漢會跟你靠近,然后把你先奸后殺。
但是癡漢很笨,在他的必經(jīng)之路用墻堵住他就不會繼續(xù)動了。
map.placeObject(30, 12, "block"); map.placeObject(31, 11, "block");Colors
這個(gè)是那個(gè)賣相不錯的電話機(jī)的教學(xué)關(guān)卡。所以大致的意思是設(shè)置了打電話的回調(diào)函數(shù)即可。ε?(?> ? <)?з
分析代碼可知,要通過那幾個(gè)長得跟菊花一樣的帶色兒的墻你就要跟那個(gè)菊花顏色一樣。所以電話機(jī)的回調(diào)函數(shù)大致是讓你自己變色就好了。
按照順序所見,如果人是綠色的通過之后要變成紅色,然后再變成黃色再綠色。于是寫以下的變色過程就可以了:
var player = map.getPlayer(); var color = player.getColor(); switch(color) { case "#0f0": player.setColor("#f00"); break; case "#f00": player.setColor("#ff0"); break; case "#ff0": player.setColor("#0f0"); break; }
重新執(zhí)行撿起電話機(jī),然后通過綠菊花之后按 Q 使用電話機(jī)讓自己變色兒就好了。
Into the Woods“哎呀,天!他是惦記弟弟了。……可我還不知道呢!那么這是他老人家的狗?很高興。……你把它帶去吧。……這條小狗怪不錯的。……挺伶俐。……一口就把這家伙的手指咬破了!哈哈哈哈!……咦,你干嗎發(fā)抖?嗚嗚,……嗚嗚。……它生氣了,小壞蛋,……好一條小狗……”
森林里面有樹和墻,我也懶得想或者寫代碼了。(明明是自己想不出來#???)?彡☆))?Д?)?∵
總之我是盡可能向出口靠近,然后到死路了趕緊打電話讓森林重新生成一遍,如此循環(huán)往復(fù)直到出口。
Fording the River23333333333333!做這題的時(shí)候差點(diǎn)沒把自己瀏覽器卡死。
大致的意思是河的上面有一條船,你直接遇水會死,要上船。但是船貌似不跟你走啊 QAQ。
而且設(shè)定寫著只能有一條 raft。
咱就來個(gè)偷天換日,自己造諾亞方舟鋪滿整條河(因?yàn)閼械糜?jì)算)。
首先定義諾亞方舟的類型:
map.defineObject("noah", { "type": "dynamic", "symbol": "a", "color": "#420", "transport": true, "behavior": function(me) { } });
然后呢把它鋪滿整條大河吧:
for(var x = 0; x < map.getWidth(); x++) { for(var y = 5; y < 15; y++) { map.placeObject(x, y, "noah"); } }
Ambush一條大河,兩岸寬,風(fēng)吹稻花香兩岸。(喂喂喂,小心卡死(┐「ε:)
后來我去 Untrusted 的 repo 去看題解,發(fā)現(xiàn)他們都是去驅(qū)使這群癡漢干嘛干嘛。我感覺我的最簡單暴力了——直接廢了他們。
其實(shí)呢只要把碰撞函數(shù)重寫一遍,這堆癡漢馬上就變得人畜無害,你走過去人家還行禮呢233333333333
仔細(xì)看一下我們要完成的部分在 behavior 里面,所以在這里面用 this 是妥妥生效的。
this.onCollision = function() {};
Robot看我碎蛋大粉拳!(忽然覺得下身一陣疼痛 |Д`)ノ⌒●~*
你走一步機(jī)器人走一步,也是教學(xué)關(guān)卡。
機(jī)器人能往下走就往下走,能往右走就往右走就拿到鑰匙了,最后你再追上機(jī)器人把鑰匙搶過來就好了。因?yàn)闄C(jī)器人是可以穿過紫翔色的那扇門的。
if(me.canMove("down")) me.move("down"); else me.move("right");
Robot Nav站住,保護(hù)費(fèi)。你不裝 X 我們還是好朋友。
我居然無聊到自己把路線數(shù)出來了。
var road = "ffffddrrrrrrrrrrrrrrrrrrrrrrrrrrrrrruurrrrrrrrrrrrrrrrrffffdffffdd"; this.cur = this.cur === undefined ? 0 : (this.cur + 1); if(this.cur >= road.length) return; if(road[this.cur] === "d") me.move("down"); if(road[this.cur] === "r") me.move("right"); if(road[this.cur] === "u") me.move("up");Robot Maze
好吧作者早就想到了有人會無聊地去數(shù)。
嘛嘛,就如作者所愿寫個(gè)最基礎(chǔ)的 DFS 了事吧。
var direct = { "d": "down", "u": "up", "l": "left", "r": "right" }; // dfs... if(undefined === this.dfs) { this.ans = ""; this.step = 0; var vis = []; for(var i = 0; i < 100; i++) { vis.push([]); for(var j = 0; j < 100; j++) vis[i].push(false); } var dir = [ [ 0, -1, "u", "#f00" ], [ 0, 1, "d", "#0f0" ], [ -1, 0, "l", "#00f" ], [ 1, 0, "r", "#fff" ] ]; this.dfs = function(x, y) { if(x === map.getWidth() - 2 && y === 8) { return true; } vis[y][x] = true; for(var i = 0; i < 4; i++) { var newx = x + dir[i][0]; var newy = y + dir[i][1]; if(newx < 0 || newy < 0 || newx >= map.getWidth() || newy >= map.getHeight() || vis[newy][newx] || map.getObjectTypeAt(newx, newy) === "block" ) continue; var oldans = this.ans; this.ans += dir[i][2]; if(!this.dfs(newx, newy)) { this.ans = oldans; } else { map.setSquareColor(x, y, dir[i][3]); return true; } } return false; }; this.dfs(1, 1); this.ans += "dd"; } if(this.step >= this.ans.length) return; me.move(direct[this.ans[this.step++]]);
Crisps Contest紅魔館的地下室一樣呢。反正是機(jī)器人多走幾步路沒事,沒必要用 BFS 求最優(yōu)解2333333333
剛才那仨 2B 機(jī)器人引領(lǐng)你拿到了仨顏色的鑰匙在這邊派上用場了。
鉆紅菊花你需要有紅鑰匙,并且用了之后會少掉。其它顏色也一樣。最終你要拿到 A 所代表的 theAlgorithm 走到出口。
等等!啊咧?綠鑰匙的通過判定有個(gè)地方可以修改?就是你通過綠菊花的時(shí)候需要有綠鑰匙并且你可以選擇你丟棄的東西。丟什么好呢?電腦?不行不行,過關(guān)還靠它呢。電話機(jī)?以后肯定要用到。其它顏色鑰匙?那你肯定會被鎖在某個(gè)地方出不來。那就只有丟棄 theAlgorithm 了——反正只要拿到 theAlgorithm 之后不再通過綠菊花就沒事了。
于是只要把綠菊花的通過判斷函數(shù)里面可修改的區(qū)域改成 theAlgorithm 就好了。
最后走的順序大概是:
Exceptional Crossing進(jìn)左上角的門拿到黃藥屎和藍(lán)藥屎出來。然后右上角把紅和藍(lán)拿出來。然后向下直搗黃龍,左黃菊花進(jìn)拿到 theAlgorithm 藍(lán)菊花通過拿到黃藥屎然后再黃菊花出。
大功告成!走向勝利的出口吧!
自古紅藍(lán)出 CP!
又是過河啊,這次你只能是死了,因?yàn)槟愕木庉媴^(qū)域只有在 player.killedBy() 里面。
《訂制死神》:這個(gè)時(shí)候讓死神笑就可以了。
讓我們一起來玩壞它吧!在里面填上 ) = (0 就好了。什么什么看不懂?你填進(jìn)去看一下整句話就知道了:
player.killedBy() = (0);
然后死神就會被你玩壞了。你走過去的時(shí)候這句話執(zhí)行出錯了2333333
Lasers有很多隱藏線,你人必須要跟隱藏線的顏色一致才能通過,然后目前所有線都用白色給畫出來。
目測作者的意思是讓你把硬編碼的白色改成隱藏線的顏色,這樣就能把線的顏色給標(biāo)記出來,然后再給電話機(jī)寫個(gè)函數(shù)就是讓你自己的人變色。
不過我還是用了個(gè) Hack 的方法——
第一條線他要畫就畫,咱不碰它就好了,只不過在第一條線畫完的后面我們把這個(gè)畫線函數(shù)給 Hack 掉:
// using canvas to draw the line var ctx = map.getCanvasContext(); ctx.beginPath(); ctx.strokeStyle = "white"; ctx.lineWidth = 5; ctx.moveTo(x1, y1); ctx.lineTo(x2, y2); ctx.stroke(); createLaser = abc;
接下去是在第二片區(qū)域?qū)懴伦约旱漠嬀€函數(shù)吧,這題最下方檢測了線的數(shù)量不能少于 25 條。么事,爺高興畫 100 條都么問題,因?yàn)槲叶及阉s在左上角了 2333333
function abc() { for(var i = 0; i < 25; i++) { map.createLine([1, 1], [2, 2], function(player) { //... Ahahaha }); var ctx = map.getCanvasContext(); ctx.beginPath(); ctx.strokeStyle = "red"; ctx.lineWidth = 5; ctx.moveTo(1, 1); ctx.lineTo(2, 2); ctx.stroke(); } }Pointers
有好多傳送門,每次執(zhí)行隨機(jī)生成傳送位置,有些傳送門會把你傳到二小姐的地下室然后被吃掉。
我也懶得多動腦筋或者畫線什么的,直接對兩個(gè)都是傳送門的 CP 標(biāo)記一樣的隨機(jī)顏色就好了,最后跟著顏色走到出口去(有個(gè)坑就是有時(shí)候這個(gè)地圖本身就是死局,所以得多試幾次重新執(zhí)行 ?д?
var dict = "0123456789ABCDEF"; if(t1.getType() === "teleporter" && t2.getType() === "teleporter") { var color = "#" + dict[Math.ceil(Math.random() * 15)] + dict[Math.ceil(Math.random() * 15)] + dict[Math.ceil(Math.random() * 15)]; map.setSquareColor(t1.getX(), t1.getY(), color); map.setSquareColor(t2.getX(), t2.getY(), color); }Super Dr. Eval Bros
好吧本意是讓你設(shè)置一個(gè) timer 然后一直跳啊跳的。
不過呢,定一個(gè)新方塊給自己搭一座橋就是了:
map.defineObject("?", { impassable: function() { return true; }, symbol: "?" }); map.placeObject(20, 12, "?"); map.placeObject(21, 12, "?"); map.placeObject(22, 12, "?"); map.placeObject(23, 12, "?"); map.placeObject(24, 12, "?"); map.placeObject(25, 12, "?"); map.placeObject(26, 12, "?"); map.placeObject(27, 12, "?"); map.placeObject(28, 12, "?"); map.placeObject(29, 12, "?");
Document Object Madness你只要打個(gè)電話橋就會出現(xiàn)的。
好神奇!好奇葩!我鍵盤 hjkl 亂按一通就過了。
Boss Fight打 Boss 了。
好吧我承認(rèn)我 Cheat 了——原諒我用了 console.log。
因?yàn)楫?dāng)我打開控制臺的時(shí)候下面的語句出現(xiàn)在我的眼里:
If you can read this, you are cheating!
But really, you don"t need this console to play the game. Walk around using arrow keys (or Vim keys), and pick up the computer (?). Then the fun begins!
嘛嘛,無論如何,過關(guān)了就好。
這題呢是要讓所有的 boss 給毀滅掉即可—— 當(dāng)所有的 boss 毀滅之后會爆出任務(wù)道具 theAlgorithm 然后就能通關(guān)了。
后來我發(fā)現(xiàn)可以讓子彈消滅 boss。但是我當(dāng)時(shí)沒這么做。
我先弄了堵墻把子彈擋住先:
map.defineObject("保命的", { impassable: function() { return true; }, symbol: "?", onCollision: function() { } }); for(var i = 0; i < map.getWidth(); i++) { map.placeObject(i, 9, "保命的"); }
這下你就能撿到電話機(jī)了——然后給電話機(jī)寫回調(diào)函數(shù)。
怎么說呢,當(dāng)你每用一次電話機(jī),我就把當(dāng)前存在于屏幕的 boss 和 bullet 給分開羅列,然后把 boss 的 _destroy(警察叔叔,就是這個(gè)函數(shù)是我 console.log 出來的)給嫁接到 bullet 的 _destroy 去。
這樣會出現(xiàn)什么樣的結(jié)果呢?——當(dāng)子彈碰到墻的時(shí)候就會銷毀,這個(gè)時(shí)候會觸發(fā) _destroy 函數(shù),但是這個(gè)時(shí)候的 _destroy 函數(shù)已經(jīng)會變成了 boss 的了,也就是說這個(gè)時(shí)候子彈不會被銷毀反而是某一個(gè) boss 的 _destroy 函數(shù)被調(diào)用然后被銷毀了。
再怎么說這都是 Hack 的辦法,所以并不會觸發(fā) boss 的 onDestroy 函數(shù)也就是說即使所有 boss 都沒了也不會出現(xiàn) theAlgorithm 這玩意兒。
自己動手豐衣足食!
敵人不給我們我們就自己造唄!反正通關(guān)判定是——boss 數(shù)量為 0 且你有 theAlgorithm 這個(gè)道具。
所以說當(dāng)所有 boss 都被銷毀之后,我們自己去 map.replaceObject 一個(gè) theAlgorithm 道具即可。
map.getPlayer().setPhoneCallback(function() { var bosses = []; var bullets = []; var objects = map.getDynamicObjects(); for(var i = 0; i < objects.length; i++) { if(objects[i].getType() == "boss") { bosses.push(objects[i]); } else { bullets.push(objects[i]); } } for(var i = 0; i < Math.min(bosses.length, bullets.length); i++) { bullets[i]._destroy = bosses[i]._destroy; } if(bosses.length === 0) { map.placeObject(map.getPlayer().getX(), map.getPlayer().getY() + 1, "theAlgorithm"); } });
以上代碼寫完后就開始打 boss 吧!趕緊去拿到電話機(jī),然后你會發(fā)現(xiàn)打一個(gè)電話 boss 就少一堆,那感覺倍爽兒!
End of the Line馬上要通關(guān)了。這里是個(gè)坑,開始我還以為這里就是真·通關(guān)了 QAQ。
隨后看看后面還是有關(guān)卡啊。但是我突然發(fā)現(xiàn)
最后發(fā)現(xiàn)原來是要修改 scripts/objects.js 文件→_→。
好吧,分析通關(guān)驗(yàn)證來看,這一關(guān)的 map.finalLevel 為 true。所以我們只需要把 scripts/objects.js 文件里面的:
if(!game.map.finalLevel) { game._moveToNextLevel(); }
給改成如果是 finalLevel 就跑到下一關(guān)去就可以了:
if(game.map.finalLevel) { game._moveToNextLevel(); }Credits
由于事先文章結(jié)構(gòu)沒有寫好,就接這關(guān)的坑位來小結(jié)吧 0. 0。(反正人家只是序幕章了
好的,其實(shí)也什么總結(jié)的,但是總覺得得有這么個(gè)小結(jié)才對。
找工作啊找工作——有想要我的請聯(lián)系我 2333333333
聯(lián)系資料在 CV 里面。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/87546.html
摘要:如果你稍微想一下,就明白源代碼繪制了一大堆的符號用來阻擋你的去路,那么生成符號的方式當(dāng)然可以由你來篡改在允許你改動的代碼范圍內(nèi)。所以本游戲的精神分兩個(gè)層面認(rèn)真思考,精確計(jì)算,給自己開出一條道來發(fā)揮黑客精神,破壞源代碼,徹底顛覆迷途。 有人提到了 Untrusted 這個(gè)有意思的編程游戲,于是我也去嘗試一下,結(jié)果發(fā)現(xiàn)挺好玩的,一玩玩上癮了,搞了一通宵…… 這個(gè)游戲?qū)嶋H上是很容易作...
摘要:群里的今天問了個(gè)問題,源自上的一關(guān)。看了下,跟差不多,也是一個(gè)代碼通關(guān)游戲,覺得挺有趣,遂玩了一遍。現(xiàn)放上我的通關(guān)攻略。首先放上游戲地址這關(guān)是教學(xué)關(guān),按照文字描述直接輸入即可通關(guān)。代碼這一關(guān)的目的是要創(chuàng)造一個(gè)函數(shù),使得其既返回又返回。 群里的 @krew 今天問了個(gè)問題,源自JSRobot上的一關(guān)。看了下JSRobot,跟Untrusted差不多,也是一個(gè)代碼通關(guān)游戲,覺得挺有趣,遂玩...
摘要:拿到最后一顆石頭的一方為剩方。現(xiàn)給定一個(gè)石頭數(shù)量,判斷你最終是否能取得勝利。對方全拿,對方贏。因此,必輸無疑。當(dāng)剩下的石頭為的整數(shù)倍雙方都采取最優(yōu)策略時(shí),先下手的一方為輸家。因此這個(gè)題目就很簡單了,只要判斷給定的數(shù)字是否是的整數(shù)倍即可。 D64 292. Nim Game 題目鏈接 292. Nim Game 題目分析 假設(shè)你和朋友玩一個(gè)撿石頭的游戲,你和朋友輪流拿1~3顆石頭。拿到最...
閱讀 2263·2021-09-28 09:36
閱讀 1996·2021-09-22 15:14
閱讀 3623·2019-08-30 12:47
閱讀 3034·2019-08-30 12:44
閱讀 1226·2019-08-29 17:06
閱讀 536·2019-08-29 14:12
閱讀 973·2019-08-29 14:01
閱讀 2581·2019-08-29 12:17