Slide 1

Slide 1 text

Game written in JavaScript for learning JavaScript and artificial intelligence

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

8BSSJPS+4ͱ͸ʁ What is WarriorJS?

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

https://github.com/olistic/warriorjs

Slide 6

Slide 6 text

͋ͳͨ͸ɺڊౝͷ࠷্֊Ͱʻ͜͜ʹ͋ͳͨͷϞνϕʔγϣϯͱͳΔԿ͔Λૠೖʼ ͢ΔͨΊɺͦΕΛొΔઓ࢜ͱͯ͠ϓϨʔ͠·͢ɻ֤֊Ͱఢͱઓ͍ɺ஥ؒ Λٹग़͠ɺ࣍ͷ֊ʹͭͳ͕Δ֊ஈ΁౸ୡ͢ΔͨΊʹ͸ɺ+BWB4DSJQU &4ϑϧαϙʔτ Λॻ͍ͯઓ࢜ʹࢦࣔΛ༩͑Δඞཁ͕͋Γ·͢ɻ You play as a warrior climbing a tall tower to 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.

Slide 7

Slide 7 text

Πϯετʔϧํ๏ Installation

Slide 8

Slide 8 text

$ npm install -g warriorjs

Slide 9

Slide 9 text

࢖͍ํ Usage

Slide 10

Slide 10 text

$ warriorjs

Slide 11

Slide 11 text

Ҏ্ʂݱࡏͷ৔ॴʹ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 } }

Slide 12

Slide 12 text

໨త Objective

Slide 13

Slide 13 text

͋ͳͨͷ໨త͸ɺ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.

Slide 14

Slide 14 text

Լه͸ɺఢʹ৮Εͨ৔߹͸߈ܸ͠ɺͦΕҎ֎ͷ৔߹͸લਐ͢ΔࢦࣔΛઓ ࢜ʹ༩͑Δ؆୯ͳྫͰ͢ɿ 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(); } } }

Slide 15

Slide 15 text

༡ͼํ Playing

Slide 16

Slide 16 text

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.

Slide 17

Slide 17 text

֊ͷ్தͰίʔυΛมߋ͢Δ͜ͱ͸Ͱ͖·ͤΜɻॳΊ͔Βͦͷ֊Ͱى͜ Γ͑Δ͢΂ͯͷ͜ͱΛߟྀʹೖΕɺઓ࢜ʹద੾ͳࢦࣔΛ༩͑Δඞཁ͕͋ Γ·͢ɻ 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.

Slide 18

Slide 18 text

ମྗ 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.

Slide 19

Slide 19 text

੒ޭʢ֊ஈʹ౸ୡʣ͢ΔͱɺϓϩϑΝΠϧͷ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.

Slide 20

Slide 20 text

ಘ఺ Scoring

Slide 21

Slide 21 text

͋ͳͨͷ໨ඪ͸֊ஈʹ౸ୡ͢Δ͜ͱ͚ͩͰ͸ͳ͘ɺ࠷ߴಘ఺Λ֫ಘ͢Δ ͜ͱͰ΋͋Γ·͢ɻଟ͘ͷํ๏ͰϙΠϯτΛಘΔ͕Ͱ͖·͢ɻ 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.

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

ήʔϜը໘ͷݟํ Perspective

Slide 28

Slide 28 text

͜ͷήʔϜ͸ςΩετϕʔεͰ͸͋Δ͕ɺ্ۭ͔Β၆ᛌ͍ͯ͠Δ%ήʔ Ϝͱߟ͍͑ͯͩ͘͞ɻ͢΂ͯͷ֊͸௕ํܗͰ͋Γɺෳ਺ͷϚεʹΑͬͯ ߏ੒͞Ε͍ͯ·͢ɻϚεʹ͸Ұͭͷཁૉ͔͠ଘࡏ͢Δ͜ͱ͕Ͱ͖·ͤΜɻ ͋ͳͨͷ໨ඪ͸֊ஈͷ͋ΔϚεΛݟ͚ͭΔ͜ͱͰ͢ɻ 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.

Slide 29

Slide 29 text

Լه͸ϑϩΞϚοϓͱཁૉͷҰྫͰ͢ɿ 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) | ஥ؒ

Slide 30

Slide 30 text

ΞϏϦςΟ Abilities

Slide 31

Slide 31 text

͸͡Ί͸ɺઓ࢜͸Θ͔ͣͳΞϏϦςΟ͔͍࣋ͬͯ͠ͳ͍͕ɺ֊্͕͕Δ ʹͭΕͯΞϏϦςΟ͸੒௕͠·͢ɻେ͖͘෼͚ͯೋछྨͷΞϏϦςΟ͕ ͋Γ·͢ɿΞΫγϣϯͱηϯεɻ 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.

Slide 32

Slide 32 text

ଟ͘ͷΞϏϦςΟ͸ɺԼهͷ޲͖Ͱߦ͏͜ͱ͕Ͱ͖·͢ɿ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');.

Slide 33

Slide 33 text

ΞΫγϣϯ ߦಈ Actions

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

ηϯε ײ஌ Senses

Slide 46

Slide 46 text

ηϯεͱ͸ɺݱࡏͷ֊ͷ৘ใΛऩू͢ΔΞϏϦςΟͰ͢ɻपғͷ֬ೝ΍ ద੾ͳΞΫγϣϯͷબ୒ͷͨΊɺඞཁͳͱ͖ʹηϯεΛߦ͏͜ͱ͕Ͱ͖ ·͢ɻ 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.

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

ײ஌ͨ͠৘ใ͸λʔϯ͝ͱʹมԽ͢ΔͷͰɺ࣍ͷλʔϯͰ࢖༻͢ΔͨΊ ूΊͨ৘ใ͸ɺه࿥͓ͯ͘͠ඞཁ͕͋Γ·͢ɻྫ͑͹ɺମྗ͕લͷλʔ ϯΑΓ΋ݮ͍ͬͯΔ͔Ͳ͏͔Ͱɺ߈ܸ͞Ε͍ͯΔ͔Ͳ͏͔Λ֬ೝ͢Δ͜ ͱ͕Ͱ͖·͢ɻ 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.

Slide 56

Slide 56 text

εϖʔε Spaces

Slide 57

Slide 57 text

εϖʔε͸ϚοϓͷϚεΛද͠·͢ɻ͋ΔΤϦΞʹରͯ͠ηϯεΛߦͬ ͨ৔߹ɺ௨ৗҰͭ·ͨ͸ෳ਺ͷ Ұͭͷ഑ྻͰ εϖʔε͕ฦ͞Ε·͢ɻ 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.

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

ଟ͘ͷ৔߹ɺηϯεͷ௚ޙʹ͜ΕΒͷϝιουΛݺͼग़͢͜ͱʹͳΓ· ͢ɻྫ͑͹ɺ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();

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

΋͋͠Δ֊Ͱߦ͖٧·ͬͨ৔߹͸ɺ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).

Slide 69

Slide 69 text

+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.

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

΋͠ߴಘ఺Λૂ͍ͬͯΔͳΒɺ๨ΕͣʹΤϦΞશମΛݟ౉͍ͯͩ͘͠͞ɻ ͨͱ͑֊ஈۙ͘ʹ͍ͨͱͯ͠΋ɺ ମྗ͕͋ΔͳΒ͹ ͢΂ͯͷ΋ͷΛ ೖख͢Δ·ͰதʹೖΒͳ͍Ͱ͍ͩ͘͞ɻԕڑ཭ηϯε ྫ͑͹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.

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

,*5&3&5;JOD גࣜձࣾΩςϨπ Ͱ͸ɺ
 ຐ๏࢖͍ʹͳΓ͍ͨਓΛืू͠·͢ɻ
 ϦϞʔτɺύʔτλΠϜ׻ܴɻ αΠτ͔Β
 http://kiteretz.com/ 'BDFCPPLϝοηʔδ͔Β
 http://facebook.com/kite.koga (JU)VC*TTVF͔Β
 https://github.com/kiteretz

Slide 76

Slide 76 text

Thank You!