Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WarriorJS: Game written in JavaScript for learning JavaScript and artificial intelligence

Kite
October 05, 2016

WarriorJS: Game written in JavaScript for learning JavaScript and artificial intelligence

WarriorJS とは、インタラクティブな方法で JavaScript と人工知能を楽しく教えるために設計されたゲーム。
WarriorJS is a game designed to teach JavaScript and artificial intelligence in a fun, interactive way.

Kite

October 05, 2016
Tweet

More Decks by Kite

Other Decks in Programming

Transcript

  1. Game written in JavaScript for
    learning JavaScript and
    artificial intelligence

    View full-size slide

  2. Kite
    KITERETZ inc. CEO & Founder
    kite.koga ixkaito ixkaito
    Web & graphic designer
    Programmer
    WordPress core contributor
    Ruby on Rails contributor
    React contributor
    Wocker developer
    Bathe developer
    Frasco developer

    View full-size slide

  3. 8BSSJPS+4ͱ͸ʁ
    What is WarriorJS?

    View full-size slide

  4. 8BSSJPS+4ͱ͸ɺΠϯλϥΫςΟϒͳํ๏Ͱ+BWB4DSJQUͱਓ޻஌ೳΛָ
    ͘͠ڭ͑ΔͨΊʹઃܭ͞ΕͨήʔϜɻ
    WarriorJS is a game designed to teach JavaScript and artificial intelligence in a fun,
    interactive way.

    View full-size slide

  5. https://github.com/olistic/warriorjs

    View full-size slide

  6. ͋ͳͨ͸ɺڊౝͷ࠷্֊Ͱʻ͜͜ʹ͋ͳͨͷϞνϕʔγϣϯͱͳΔԿ͔Λૠೖʼ
    ͢ΔͨΊɺͦΕΛొΔઓ࢜ͱͯ͠ϓϨʔ͠·͢ɻ֤֊Ͱఢͱઓ͍ɺ஥ؒ
    Λٹग़͠ɺ࣍ͷ֊ʹͭͳ͕Δ֊ஈ΁౸ୡ͢ΔͨΊʹ͸ɺ+BWB4DSJQU
    &4ϑϧαϙʔτ
    Λॻ͍ͯઓ࢜ʹࢦࣔΛ༩͑Δඞཁ͕͋Γ·͢ɻ
    You play as a warrior climbing a tall tower to here> at the top level. On each floor, you need to write JavaScript (with full ES2015
    support) to instruct the warrior to battle enemies, rescue captives, and reach the stairs.

    View full-size slide

  7. Πϯετʔϧํ๏
    Installation

    View full-size slide

  8. $ npm install -g warriorjs

    View full-size slide

  9. ࢖͍ํ
    Usage

    View full-size slide

  10. Ҏ্ʂݱࡏͷ৔ॴʹXBSSJPSKTσΟϨΫτϦ͕࡞੒͞Εɺͦͷதͷϓϩ
    ϑΝΠϧσΟϨΫτϦͰ1MBZFSΫϥεΛؚΜͩ1MBZFSKTϑΝΠϧΛݟ
    ͚ͭΔ͜ͱ͕Ͱ͖·͢ɻ
    That's it! This will create a warriorjs directory in your current location, where you will find
    a Player.js file in your profile's directory containing the Player class.
    class Player {
    playTurn(warrior) {
    // Cool code goes here
    }
    }

    View full-size slide

  11. ໨త
    Objective

    View full-size slide

  12. ͋ͳͨͷ໨త͸ɺplayTurnϝιουʹ໋ྩΛهೖ͢Δ͜ͱͰɺઓ࢜ʹԿ
    Λ͢΂͖͔ࢦࣔΛ༩͑Δ͜ͱͰ͢ɻ֤֊Ͱɺઓ࢜ͷΞϏϦςΟ͸೉қ౓
    ͱͱ΋ʹ੒௕͠·͢ɻݱࡏͷ֊Ͱઓ͕࢜ར༻Ͱ͖ΔΞϏϦςΟͷৄࡉʹ
    ͍ͭͯ͸ɺϓϩϑΝΠϧσΟϨΫτͷ3&"%.&Λࢀর͍ͯͩ͘͠͞ɻ
    Your objective is to fill the playTurn method with commands to instruct the warrior what
    to do. With each level, your abilities will grow along with the difficulty. See the README
    in your profile's directory for details on what abilities your warrior has available on the
    current level.

    View full-size slide

  13. Լه͸ɺఢʹ৮Εͨ৔߹͸߈ܸ͠ɺͦΕҎ֎ͷ৔߹͸લਐ͢ΔࢦࣔΛઓ
    ࢜ʹ༩͑Δ؆୯ͳྫͰ͢ɿ
    Here is a simple example which will instruct the warrior to attack if he feels an enemy,
    otherwise he will walk forward:
    class Player {
    playTurn(warrior) {
    if (warrior.feel().isEnemy()) {
    warrior.attack();
    } else {
    warrior.walk();
    }
    }
    }

    View full-size slide

  14. ༡ͼํ
    Playing

    View full-size slide

  15. 1MBZFSKTͷฤू͕׬ྃͨ͠ΒɺϑΝΠϧΛอଘ͠ɺͦͷ֊ΛϓϨʔ͢Δ
    ʹ͸࠶౓warriorjsίϚϯυΛ࣮ߦ͍ͯͩ͘͠͞ɻҰ࿈ͷλʔϯͷ࠶
    ੜ͕࢝·Γ·͢ɻ֤λʔϯͰ͸ɺϓϨΠϠʔͱఢͷplayTurnϝιου
    ͕ಉ࣌ʹ࣮ߦ͞Ε·͢ɻ
    Once you are done editing Player.js, save the file and run the warriorjs command
    again to start playing the level. The play happens through a series of turns. On each
    one, your playTurn method is called along with any enemy's.

    View full-size slide

  16. ֊ͷ్தͰίʔυΛมߋ͢Δ͜ͱ͸Ͱ͖·ͤΜɻॳΊ͔Βͦͷ֊Ͱى͜
    Γ͑Δ͢΂ͯͷ͜ͱΛߟྀʹೖΕɺઓ࢜ʹద੾ͳࢦࣔΛ༩͑Δඞཁ͕͋
    Γ·͢ɻ
    You cannot change your code in the middle of a level. You must take into account
    everything that may happen on that level and give your warrior the proper instructions
    from the start.

    View full-size slide

  17. ମྗ IFBMUI
    Λશࣦͯ͏ͱͦͷ֊͸ࣦഊʹͳΓ·͢ɻࣦഊʹΑΔേ͸͋
    Γ·ͤΜɻ1MBZFSKTϑΝΠϧʹ໭ΓɺίʔυΛվળͯ͠࠶ࢼߦͯͩ͘͠
    ͍͞ɻ
    Losing all of your health will cause you to fail the level. You are not punished by this,
    you simply need to go back to your Player.js file, improve your code, and try again.

    View full-size slide

  18. ੒ޭʢ֊ஈʹ౸ୡʣ͢ΔͱɺϓϩϑΝΠϧͷ3&"%.&͸࣍ͷ֊ͷͨΊ
    ʹߋ৽͞Ε·͢ɻ࣍ͷ֊ΛϓϨʔ͢Δʹ͸ɺ1MBZFSKTϑΝΠϧΛมߋ͠ɺ
    ࠶౓warriorjsΛ࣮ߦ͍ͯͩ͘͠͞ɻ
    Once you pass a level (by reaching the stairs), the profile README will be updated for
    the next level. Alter the Player.js file and run warriorjs again to play the next level.

    View full-size slide

  19. ಘ఺
    Scoring

    View full-size slide

  20. ͋ͳͨͷ໨ඪ͸֊ஈʹ౸ୡ͢Δ͜ͱ͚ͩͰ͸ͳ͘ɺ࠷ߴಘ఺Λ֫ಘ͢Δ
    ͜ͱͰ΋͋Γ·͢ɻଟ͘ͷํ๏ͰϙΠϯτΛಘΔ͕Ͱ͖·͢ɻ
    Your objective is to not only reach the stairs, but to get the highest score you can. There
    are many ways you can earn points on a level.

    View full-size slide

  21. ఢΛ౗͢͜ͱͰɺͦͷମྗͷ࠷େ஋͕ಘ఺ʹՃࢉ͞Ε·͢
    defeat an enemy to add his max health to your score

    View full-size slide

  22. ஥ؒΛٹग़͢Δ͜ͱͰɺϙΠϯτΛ֫ಘͰ͖·͢
    rescue a captive to earn 20 points

    View full-size slide

  23. ϘʔφελΠϜ಺Ͱ੒ޭ͢Δ͜ͱͰɺϘʔφελΠϜͷ࢒ྔΛಘ఺ͱ͠
    ͯಘΔ͜ͱ͕ग़དྷ·͢
    pass the level within the bonus time to earn the amount of bonus time remaining

    View full-size slide

  24. ͢΂ͯͷఢΛ౗͠ɺ͢΂ͯͷ஥ؒΛٹग़͢Δ͜ͱͰɺಘ఺ͷΛϘʔ
    φεͱͯ֫͠ಘ͢Δ͜ͱ͕Ͱ͖·͢
    defeat all enemies and rescue all captives to receive a 20% overall bonus

    View full-size slide

  25. ొ͖ͬͯͨ֊ͷ߹ܭಘ఺͸ه࿥͞Ε·͢ɻ֊Λ௨ա͢Δ͝ͱʹͦͷ֊ͷ
    ಘ఺͸߹ܭಘ఺ʹՃࢉ͞Ε·͢ɻ
    A total score is kept as you progress through the levels. When you pass a level, that
    score is added to your total.

    View full-size slide

  26. ήʔϜը໘ͷݟํ
    Perspective

    View full-size slide

  27. ͜ͷήʔϜ͸ςΩετϕʔεͰ͸͋Δ͕ɺ্ۭ͔Β၆ᛌ͍ͯ͠Δ%ήʔ
    Ϝͱߟ͍͑ͯͩ͘͞ɻ͢΂ͯͷ֊͸௕ํܗͰ͋Γɺෳ਺ͷϚεʹΑͬͯ
    ߏ੒͞Ε͍ͯ·͢ɻϚεʹ͸Ұͭͷཁૉ͔͠ଘࡏ͢Δ͜ͱ͕Ͱ͖·ͤΜɻ
    ͋ͳͨͷ໨ඪ͸֊ஈͷ͋ΔϚεΛݟ͚ͭΔ͜ͱͰ͢ɻ
    Even though this is a text-based game, think of it as two-dimensional where you are
    viewing from overhead. Each level is always rectangular in shape and is made up of a
    number of squares. Only one unit can be on a given square at a time, and your
    objective is to find the square with the stairs.

    View full-size slide

  28. Լه͸ϑϩΞϚοϓͱཁૉͷҰྫͰ͢ɿ
    Here is an example level map and key:
    ╔════╗
    ║C s>║
    ║ S s║
    ║C @ ║
    ╚════╝
    > = Stairs | ֊ஈ
    @ = Warrior (20 HP) | ઓ࢜
    s = Sludge (12 HP) | εϥΠϜ
    S = Thick Sludge (24 HP) | ڧεϥΠϜ
    C = Captive (1 HP) | ஥ؒ

    View full-size slide

  29. ΞϏϦςΟ
    Abilities

    View full-size slide

  30. ͸͡Ί͸ɺઓ࢜͸Θ͔ͣͳΞϏϦςΟ͔͍࣋ͬͯ͠ͳ͍͕ɺ֊্͕͕Δ
    ʹͭΕͯΞϏϦςΟ͸੒௕͠·͢ɻେ͖͘෼͚ͯೋछྨͷΞϏϦςΟ͕
    ͋Γ·͢ɿΞΫγϣϯͱηϯεɻ
    When you first start, your warrior will only have a few abilities, but with each level your
    abilities will grow. A warrior has two kinds of abilities: Actions and Senses.

    View full-size slide

  31. ଟ͘ͷΞϏϦςΟ͸ɺԼهͷ޲͖Ͱߦ͏͜ͱ͕Ͱ͖·͢ɿGPSXBSE લ
    ɺ
    CBDLXBSE ޙ
    ɺMFGU ࠨ
    ɺSJHIU ӈ
    ɻ࠷ॳͷҾ਺ͱͯ͠޲͖ͷจࣈ
    ྻΛ౉͢ඞཁ͕͋Γ·͢ɻྫɿwarrior.walk('backward');ɻ
    Many abilities can be performed in the following directions: forward, backward, left and
    right. You have to pass a string with the direction as the first argument, e.g.
    warrior.walk('backward');.

    View full-size slide

  32. ΞΫγϣϯ ߦಈ

    Actions

    View full-size slide

  33. ΞΫγϣϯ͸Կ͔͠ΒͷӨڹΛήʔϜʹ༩͑·͢ɻλʔϯ͝ͱʹ࣮ߦͰ
    ͖ΔΞΫγϣϯ͸ҰͭͷΈͰ͢ͷͰɺݡ͍બ୒Λ͍ͯͩ͘͠͞ɻ
    An action is something that affects the game in some way. Only one action can be
    performed per turn, so choose wisely.

    View full-size slide

  34. ΞΫγϣϯҰཡ
    Here is the complete list of actions

    View full-size slide

  35. warrior.walk([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ʹҠಈ͠·͢ɻ
    Move in given direction (forward by default).

    View full-size slide

  36. warrior.attack([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ͷཁૉΛ߈ܸ͠·͢ɻ
    Attack a unit in given direction (forward by default).

    View full-size slide

  37. warrior.rest()
    ࠷େମྗͷΛճ෮͠·͢ɻ࠷େମྗΛ௒͑Δ͜ͱ͸͋Γ·ͤΜɻ
    Gain 10% of max health back, but do nothing more.

    View full-size slide

  38. warrior.rescue([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ͷ஥ؒΛٹग़͠·͢ ϙΠϯτΛ
    ֫ಘ
    ɻ
    Rescue a captive from his chains (earning 20 points) in given direction (forward by
    default).

    View full-size slide

  39. warrior.pivot([direction])
    ࠨɺӈɺ΋͘͠͸ޙํ σϑΥϧτ
    ʹ޲͖Λม͑·͢ɻ
    Rotate left, right or backward (default).

    View full-size slide

  40. warrior.shoot([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ʹٷ໼Λ์ͭɻ
    Shoot your bow & arrow in given direction (forward by default).

    View full-size slide

  41. warrior.bind([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ͷཁૉΛറͬͯಈ͚ͳ͍Α͏ʹ͢Δɻ
    Bind a unit in given direction to keep him from moving (forward by default).

    View full-size slide

  42. warrior.detonate([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ͷര஄Λരൃͤ͞ΔɻपғϚε ࣗ
    ෼ࣗ਎΋ؚΉ
    ʹμϝʔδΛ༩͑·͢ɻ
    Detonate a bomb in a given direction (forward by default) which damages that space and
    surrounding 4 spaces (including yourself).

    View full-size slide

  43. warrior.explode()
    ࣗ෼ࣗ਎ͱपғ͢΂ͯͷཁૉΛരൃͤ͞Δɻ͓ͦΒ͘ҙਤతʹ͜ΕΛͨ͠
    ͘͸ͳ͍Ͱ͠ΐ͏ɻ
    Kills you and all surrounding units. You probably don't want to do this intentionally.

    View full-size slide

  44. ηϯε ײ஌

    Senses

    View full-size slide

  45. ηϯεͱ͸ɺݱࡏͷ֊ͷ৘ใΛऩू͢ΔΞϏϦςΟͰ͢ɻपғͷ֬ೝ΍
    ద੾ͳΞΫγϣϯͷબ୒ͷͨΊɺඞཁͳͱ͖ʹηϯεΛߦ͏͜ͱ͕Ͱ͖
    ·͢ɻ
    A sense is something which gathers information about the floor. You can perform
    senses as often as you want per turn to gather information about your surroundings and
    to aid you in choosing the proper action.

    View full-size slide

  46. ηϯεҰཡ
    Here is the complete list of senses

    View full-size slide

  47. warrior.feel([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ͷεϖʔεΛฦ͠·͢ɻ
    Return a Space for the given direction (forward by default).

    View full-size slide

  48. warrior.health()
    ݱࡏͷମྗͷ਺஋Λฦ͠·͢ɻ
    Return an integer representing your current health.

    View full-size slide

  49. warrior.look([direction])
    ༩͑ΒΕͨํ޲ σϑΥϧτͰલํ
    ͷ࠷େεϖʔεͷ഑ྻΛฦ͠·͢ɻ
    Return an array of up to three Spaces in the given direction (forward by default).

    View full-size slide

  50. warrior.directionOfStairs()
    ݱࡏͷҐஔ͔Βݟͨ֊ஈͷ͋Δํ޲Λฦ͠·͢ɻ
    Return the direction the stairs are from your location.

    View full-size slide

  51. warrior.directionOf(space)
    Ҿ਺ͱͯ͠εϖʔεΛ౉͢͜ͱͰɺͦͷεϖʔεͷํ޲͕ฦ͞Ε·͢ɻ
    Pass a Space as an argument, and the direction to that space will be returned.

    View full-size slide

  52. warrior.distanceOf(space)
    Ҿ਺ͱͯ͠εϖʔεΛ౉͢͜ͱͰɺͦͷεϖʔε·Ͱͷڑ཭Λද͢਺஋Λ
    ฦ͠·͢ɻ
    Pass a Space as an argument, and it will return an integer representing the distance to
    that space.

    View full-size slide

  53. warrior.listen()
    ཁૉΛ࣋ͭ͢΂ͯͷεϖʔεΛ഑ྻͰฦ͠·͢ɻ
    Return an array of all spaces which have units in them.

    View full-size slide

  54. ײ஌ͨ͠৘ใ͸λʔϯ͝ͱʹมԽ͢ΔͷͰɺ࣍ͷλʔϯͰ࢖༻͢ΔͨΊ
    ूΊͨ৘ใ͸ɺه࿥͓ͯ͘͠ඞཁ͕͋Γ·͢ɻྫ͑͹ɺମྗ͕લͷλʔ
    ϯΑΓ΋ݮ͍ͬͯΔ͔Ͳ͏͔Ͱɺ߈ܸ͞Ε͍ͯΔ͔Ͳ͏͔Λ֬ೝ͢Δ͜
    ͱ͕Ͱ͖·͢ɻ
    Since what you sense will change each turn, you should record what information you
    gather for use on the next turn. For example, you can determine if you are being
    attacked if your health has gone down since the last turn.

    View full-size slide

  55. εϖʔε
    Spaces

    View full-size slide

  56. εϖʔε͸ϚοϓͷϚεΛද͠·͢ɻ͋ΔΤϦΞʹରͯ͠ηϯεΛߦͬ
    ͨ৔߹ɺ௨ৗҰͭ·ͨ͸ෳ਺ͷ Ұͭͷ഑ྻͰ
    εϖʔε͕ฦ͞Ε·͢ɻ
    A space is an object representing a square in the level. Whenever you sense an area,
    often one or multiple spaces (in an array) will be returned.

    View full-size slide

  57. ͋Δεϖʔεʹରͯ͠ϝιουΛݺͼग़͢͜ͱͰɺͦ͜ʹԿ͕͋Δ͔ʹ
    ͍ͭͯͷ৘ใΛऩू͢Δ͜ͱ͕Ͱ͖·͢ɻ
    You can call methods on a space to gather information about what is there.

    View full-size slide

  58. εϖʔεʹରͯ͠ར༻Մೳͳϝιου
    Here are the various methods that are available to you for spaces

    View full-size slide

  59. space.isEmpty()
    trueͷ৔߹ɺ͜ͷ৔ॴʹ͸Կ΋ͳ͘ ֊ஈΛআ͘
    ɺ͜͜·Ͱา͚Δ͜ͱ
    Λҙຯ͠·͢ɻ
    If true, this means that nothing (except maybe stairs) is at this location and you can walk
    here.

    View full-size slide

  60. space.isStairs()
    ͦ͜ͷ৔ॴʹ֊ஈ͕͋Δ͔Ͳ͏͔Λ֬ೝ͠·͢ɻ
    Determine if stairs are at that location.

    View full-size slide

  61. space.isEnemy()
    ͦ͜ͷ৔ॴʹఢ͕͍Δ͔Ͳ͏͔Λ֬ೝ͠·͢ɻ
    Determine if an enemy unit is at this location.

    View full-size slide

  62. space.isCaptive()
    ͦ͜ͷ৔ॴʹั·͍ͬͯΔ஥͕͍ؒΔ͔Ͳ͏͔Λ֬ೝ͠·͢ɻ
    Determine if a captive is at this location.

    View full-size slide

  63. space.isWall()
    ͕͜͜֊ͷ୺Ͱ͋Ε͹trueΛฦ͠·͢ɻ͜͜·Ͱา͘͜ͱ͸Ͱ͖·ͤ
    Μɻ
    Return true if this is the edge of the level. You can't walk here.

    View full-size slide

  64. space.isTicking()
    ͜ͷεϖʔεʹ΍͕ͯരൃ͢Δര஄ؚ͕·Ε͍ͯΔ৔߹trueΛฦ͠·
    ͢ɻ
    Return true if this space contains a bomb which will explode in time.

    View full-size slide

  65. ଟ͘ͷ৔߹ɺηϯεͷ௚ޙʹ͜ΕΒͷϝιουΛݺͼग़͢͜ͱʹͳΓ·
    ͢ɻྫ͑͹ɺfeelηϯε͸SpaceΛฦ͠·͢ɻ͜Εʹରͯ͠
    isCaptive()Λݺͼग़͢͜ͱͰɺ໨ͷલʹั·͍ͬͯΔ஥͕͍ؒΔ͔Ͳ
    ͏͔Λ֬ೝ͢Δ͜ͱ͕Ͱ͖·͢ɻ
    You will often call these methods directly after a sense. For example, the feel sense
    returns one Space. You can call isCaptive() on this to determine if a captive is in front
    of you:
    warrior.feel().isCaptive();

    View full-size slide

  66. ςΟοϓεͱώϯτ
    Tips & hints

    View full-size slide

  67. ΋͋͠Δ֊Ͱߦ͖٧·ͬͨ৔߹͸ɺ3&"%.&υΩϡϝϯςʔγϣϯΛ
    ݟ௚͠ɺ͢΂ͯͷΞϏϦςΟΛࢼ͍ͯ͠Δ͔Ͳ͏͔Λ֬ೝ͍ͯͩ͘͠͞ɻ
    ΋͠ମྗΛҡ࣋Ͱ͖ͳ͍৔߹͸ɺपΓʹఢ͕͍ͳ͍ͱ͖ʹ ମྗʹ஫ҙ
    ͠ͳ͕Β
    ճ෮͍ͯͩ͘͠͞ɻ·ͨɺՄೳͳ͔͗Γԕڑ཭෢ث ྫ͑͹
    ٷͳͲ
    Λ࢖༻͍ͯͩ͘͠͞ɻ
    If you ever get stuck on a level, review the README documentation and be sure
    you're trying each ability out. If you can't keep your health up, be sure to rest when no
    enemy is around (while keeping an eye on your health). Also, try to use far-ranged
    weapons whenever possible (such as the bow).

    View full-size slide

  68. +BWB4DSJQUͰ࡞ۀ͍ͯ͠Δ͜ͱΛ๨Εͳ͍Ͱ͍ͩ͘͞ɻͨͩ୯ʹଟ͘
    ͷίʔυͰplayTurnϝιουΛຒΊͳ͍Ͱ͍ͩ͘͞ɻϝιου΍Ϋϥ
    εΛ࢖ͬͯ੔ཧ͠·͠ΐ͏ɻ
    Remember, you're working in JavaScript here. Don't simply fill up the playTurn
    method with a lot of code. Organize it with methods and classes.

    View full-size slide

  69. ηϯε͸ؾܰʹ࢖༻Ͱ͖·͢ɻײ஌͞Εͨ৘ใΛอଘ͓ͯ͘͜͠ͱͰɺ
    ͜ͷઌԿͷΞΫγϣϯΛߦ͏΂͖͔ʹ͍ͭͯͷΑΓΑ͍൑அʹ໾ཱͯͯ
    ͍ͩ͘͞ɻ
    Senses are cheap, so use them liberally. Store the sensed information to help you
    better determine what actions to take in the future.

    View full-size slide

  70. ϓϩϑΝΠϧσΟϨΫτϦʹ͍Δؒ͸ɺwarriorjsΛ࣮ߦ͢Δͱɺϓ
    ϩϑΝΠϧΛࣗಈతʹબ୒͠·͢ɻͦͷͨΊɺ࣮ߦͷͨͼʹબ୒͢Δඞ
    ཁ͸͋Γ·ͤΜɻ
    Running warriorjs while you are in your profile directory will auto-select that profile
    so you don't have to each time.

    View full-size slide

  71. ΋͠ߴಘ఺Λૂ͍ͬͯΔͳΒɺ๨ΕͣʹΤϦΞશମΛݟ౉͍ͯͩ͘͠͞ɻ
    ͨͱ͑֊ஈۙ͘ʹ͍ͨͱͯ͠΋ɺ ମྗ͕͋ΔͳΒ͹
    ͢΂ͯͷ΋ͷΛ
    ೖख͢Δ·ͰதʹೖΒͳ͍Ͱ͍ͩ͘͞ɻԕڑ཭ηϯε ྫ͑͹MPPLͱ
    MJTUFO
    Λ࢖ͬͯɺఢ͕࢒͍ͬͯΔ͔Ͳ͏͔Λ֬ೝ͍ͯͩ͘͠͞ɻ
    If you're aiming for points, remember to sweep the area. Even if you're close to the
    stairs, don't go in until you've gotten everything (if you have the health). Use far-
    ranged senses (such as look and listen) to determine if there are any enemies left.

    View full-size slide

  72. ೔ຊޠԽʹ౒Ί͍ͯ·͢
    Translating to Japanese

    View full-size slide

  73. https://github.com/ixkaito/warriorjs-ja

    View full-size slide

  74. ,*5&3&5;JOD גࣜձࣾΩςϨπ
    Ͱ͸ɺ

    ຐ๏࢖͍ʹͳΓ͍ͨਓΛืू͠·͢ɻ

    ϦϞʔτɺύʔτλΠϜ׻ܴɻ
    αΠτ͔Β

    http://kiteretz.com/
    'BDFCPPLϝοηʔδ͔Β

    http://facebook.com/kite.koga
    (JU)VC*TTVF͔Β

    https://github.com/kiteretz

    View full-size slide