parent
8f76344908
commit
47d4ee7f00
@ -0,0 +1 @@ |
||||
console.log("Hi!"); |
@ -0,0 +1,6 @@ |
||||
console.log("You are writing text to your screen.") |
||||
console.log("This is called 'standard output'.") |
||||
console.log("This stuff in the ( ) is a string.") |
||||
console.log("Start a string with a double-quote.") |
||||
console.log("Write what you want.") |
||||
console.log("Then end with a double-quote.") |
@ -0,0 +1,16 @@ |
||||
// This is a comment, everything after is ignored.
|
||||
|
||||
console.log("I am Code"); |
||||
|
||||
/* This is also a comment. You use this for |
||||
* longer things that you want to say. |
||||
*/ |
||||
|
||||
console.log("So am I"); |
||||
|
||||
// The code inside the next comment will not run:
|
||||
|
||||
/* |
||||
console.log("I will not run."); |
||||
*/ |
||||
|
@ -0,0 +1,8 @@ |
||||
// You can give multiple things for console.log to print.
|
||||
// Separate each thing with a comma.
|
||||
console.log("Name:", 'Zed A. Shaw'); |
||||
console.log("Age:", 43); |
||||
console.log("Feet Tall:", Math.floor(74 / 12)); |
||||
console.log("And Inches:", 74 - (Math.floor(74 / 12) * 12)); |
||||
console.log("Age * Height:", 43 * 74); |
||||
console.log("Age * Feet:", 43 * Math.floor(74 / 12)); |
@ -0,0 +1,19 @@ |
||||
// let is the best way to make a variable
|
||||
let name = 'Zed A. Shaw'; |
||||
let age = 43; |
||||
let height = 74; |
||||
|
||||
// PUZZLE: What happens if you use Math.round?
|
||||
let feet = Math.floor(height / 12); |
||||
let inches = height - (feet * 12); |
||||
|
||||
// you can use a variable as a parameter
|
||||
console.log("Name:", name); |
||||
console.log("Age:", age); |
||||
|
||||
// you can also embed variables in strings with ``
|
||||
console.log(`Height ${feet} feet ${inches} inches.`); |
||||
|
||||
console.log("Age * Height:", age * height); |
||||
// you can also put math in the ${} boundaries
|
||||
console.log(`Age * Feet: ${age * feet}`); |
@ -0,0 +1,13 @@ |
||||
const invincible = 94; |
||||
let changeme = 82; |
||||
|
||||
console.log(`invincible=${invincible} but changeme=${changeme}`); |
||||
|
||||
// this will work just fine
|
||||
changeme = 100; |
||||
|
||||
// uncomment this to see how you can't do it
|
||||
// invincible = 100000;
|
||||
|
||||
|
||||
console.log(`After change: invicible=${invincible} but changeme=${changeme}`); |
@ -0,0 +1,7 @@ |
||||
let talking = "I'm not sure if she said, \"Hello\" or not."; |
||||
let walking = 'I\'ll need to go \'cause you don\'t know.'; |
||||
|
||||
// These strings are broken. Use escapes to fix them.
|
||||
let height = "6'2""; |
||||
console.log('I'm not g'na see y'all for a while.'); |
||||
|
@ -0,0 +1,9 @@ |
||||
const readline = require('readline-sync'); |
||||
|
||||
let name = readline.question("What's your name? "); |
||||
let age = readline.question("What's your age? "); |
||||
let eyes = readline.question("What's your eye color? "); |
||||
|
||||
console.log(`Your name is ${name}`); |
||||
console.log(`Your age is ${age}`); |
||||
console.log(`Your eyes are ${eyes}`); |
@ -0,0 +1,9 @@ |
||||
|
||||
let name = process.argv[2]; |
||||
let age = process.argv[3]; |
||||
let eyes = process.argv[4]; |
||||
|
||||
console.log(`Your name is ${name}`); |
||||
console.log(`Your age is ${age}`); |
||||
console.log(`Your eyes are ${eyes}`); |
||||
|
@ -0,0 +1,15 @@ |
||||
// https://nodejs.org/api/fs.html
|
||||
const fs = require("fs"); |
||||
|
||||
let contents = fs.readFileSync("test.txt"); |
||||
|
||||
console.log("Contents:"); |
||||
console.log(contents.toString()); |
||||
|
||||
// using a callback
|
||||
|
||||
console.log("----------------------"); |
||||
fs.readFile("test.txt", (err, data) => { |
||||
console.log(data.toString()); |
||||
}); |
||||
|
@ -0,0 +1,4 @@ |
||||
I have a problem. |
||||
It's not a problem with you. |
||||
It's a problem with sleep. |
||||
And you have it too. |
@ -0,0 +1,10 @@ |
||||
// Exercise 10: Files, Args, Variables, Oh My
|
||||
|
||||
const fs = require('fs'); |
||||
|
||||
let file_to_open = process.argv[2]; |
||||
let file_contents = fs.readFileSync(file_to_open); |
||||
|
||||
console.log(`The file named ${file_to_open} contains:`); |
||||
console.log(file_contents.toString()); |
||||
|
@ -0,0 +1,4 @@ |
||||
I have a problem. |
||||
It's not a problem with you. |
||||
It's a problem with sleep. |
||||
And you have it too. |
@ -0,0 +1,38 @@ |
||||
// Exercise 11: Functions
|
||||
|
||||
const printPerson = (name, age) => { |
||||
console.log(`Hi ${name}, you are ${age} years old.`); |
||||
} |
||||
|
||||
printPerson('Zed', 44); |
||||
printPerson('Fran', 100); |
||||
printPerson('Alex', 30); |
||||
printPerson('Eve', 35); |
||||
|
||||
console.log('--------------- pets ----------------'); |
||||
|
||||
const printPet = (owner_name, owner_age, pet_name, pet_age) => { |
||||
printPerson(owner_name, owner_age); |
||||
console.log(`That person owns ${pet_name} who is ${pet_age} years old.`); |
||||
} |
||||
|
||||
printPet('Zed', 44, 'Mr. Scruffles', 10); |
||||
printPet('Fran', 100, 'Crazy', 2); |
||||
printPet('Alex', 30, 'Lizzy Lizard', 1); |
||||
printPet('Eve', 35, 'Kong The Donkey', 20); |
||||
|
||||
|
||||
// this part is tough! brain melting! give it a try
|
||||
//
|
||||
console.log('------------------ callback style ----------------'); |
||||
|
||||
const fancyPet = (owner_name, owner_age, pet_name, pet_age, cb) => { |
||||
cb(owner_name, owner_age); |
||||
console.log(`That person owns ${pet_name} who is ${pet_age} years old.`); |
||||
} |
||||
|
||||
// notice how I use a function here as the parameter cb?
|
||||
fancyPet('Zed', 44, 'Mr. Scruffles', 10, (name, age) => { |
||||
console.log(`Ooooh fancy ${name} you are ${age} old.`); |
||||
}); |
||||
|
@ -0,0 +1,23 @@ |
||||
// Exercise 12: Functions, Files, Variables
|
||||
|
||||
const fs = require('fs'); |
||||
|
||||
const print_lines = (err, data) => { |
||||
console.log(data.toString()); |
||||
} |
||||
|
||||
const yell_at_me = (what) => { |
||||
return what.toUpperCase(); |
||||
} |
||||
|
||||
fs.readFile("poem.txt", print_lines); |
||||
|
||||
// let's do that again but with an anonymous function
|
||||
// you've actually seen this before
|
||||
|
||||
fs.readFile("poem.txt", (err, data) => { |
||||
let yelling = yell_at_me(data.toString()); |
||||
print_lines(err, yelling); |
||||
}); |
||||
|
||||
|
@ -0,0 +1,7 @@ |
||||
The living light I once |
||||
could have progressed to vermilion |
||||
and concerned a compact miniscule |
||||
but no, that wasn't |
||||
it was this once in a million |
||||
terrible ways of broken chance |
||||
|
@ -0,0 +1,7 @@ |
||||
const geometry = require('./geometry'); |
||||
|
||||
let area51 = geometry.area(2.8); |
||||
let circ2 = geometry.circumference(6); |
||||
|
||||
console.log(`Area: ${area51}, Circumference: ${circ2}`); |
||||
|
@ -0,0 +1,8 @@ |
||||
const area = (r) => Math.PI * r ** 2; |
||||
const circumference = (r) => 2 * Math.PI * r; |
||||
|
||||
module.exports = { |
||||
area: area, |
||||
circumference: circumference |
||||
} |
||||
|
@ -0,0 +1,28 @@ |
||||
let x = 20; |
||||
|
||||
if (x === 10) { |
||||
console.log("x is equal to 10:", x); |
||||
} else if (x < 10) { |
||||
console.log("x is less than 10:", x); |
||||
} else { |
||||
console.log("x is greater than 10:", x); |
||||
} |
||||
|
||||
// consider this part a puzzle to solve
|
||||
// what's the least number of times you have to change
|
||||
// the code to make each console.log run?
|
||||
let y = 100; |
||||
|
||||
if (y == 100) { |
||||
if(x < 10) { |
||||
console.log("log 1", x, y); |
||||
} else { |
||||
console.log("log 2", x, y); |
||||
} |
||||
} else { |
||||
if(x > 10) { |
||||
console.log("log 3", x, y); |
||||
} else { |
||||
console.log("log 4", x, y); |
||||
} |
||||
} |
@ -0,0 +1,18 @@ |
||||
|
||||
let count = 5; |
||||
|
||||
while(count > 0) { |
||||
console.log(`count down ${count}`); |
||||
count--; |
||||
} |
||||
|
||||
// what value is count right here?
|
||||
while(count < 10) { |
||||
if(count % 2 == 0) { |
||||
console.log(count, "EVEN"); |
||||
} else { |
||||
console.log(count, "ODD"); |
||||
} |
||||
|
||||
count++; |
||||
} |
@ -0,0 +1,25 @@ |
||||
|
||||
let count = 5; |
||||
label1: |
||||
while(count > 0) { |
||||
console.log("in while", count); |
||||
if(count > 2) { |
||||
for(i = 0; i < 4; i++) { |
||||
console.log("in for", i); |
||||
if(i == 2) { |
||||
count--; |
||||
continue label1; |
||||
} |
||||
} |
||||
} else if(count == 2) { |
||||
count -= 2; |
||||
console.log("continue in while"); |
||||
continue label1; |
||||
} else { |
||||
break; |
||||
} |
||||
count--; |
||||
} |
||||
|
||||
label2: |
||||
console.log("Done."); |
@ -0,0 +1,19 @@ |
||||
let pigments = ["perinone", "cadmium", |
||||
"titanium", "ultramarine", "napthol"]; |
||||
|
||||
let i = 0; |
||||
// you've seen this already
|
||||
while(i < pigments.length) { |
||||
console.log(`while ${i}=${pigments[i]}`); |
||||
i++; |
||||
} |
||||
|
||||
// you can do the above in one move like this
|
||||
for(let i = 0; i < pigments.length; i++) { |
||||
console.log(`for ${i}=${pigments[i]}`); |
||||
} |
||||
|
||||
// but this is the easiest of all
|
||||
for(let paint of pigments) { |
||||
console.log(`for-of ${paint}`); |
||||
} |
@ -0,0 +1,18 @@ |
||||
exports.fruit = [ |
||||
['Apples', 12, 'AAA'], ['Oranges', 1, 'B'],
|
||||
['Pears', 2, 'A'], ['Grapes', 14, 'UR']]; |
||||
|
||||
exports.cars = [ |
||||
['Cadillac', ['Black', 'Big', 34500]], |
||||
['Corvette', ['Red', 'Little', 1000000]], |
||||
['Ford', ['Blue', 'Medium', 1234]], |
||||
['BMW', ['White', 'Baby', 7890]] |
||||
]; |
||||
|
||||
exports.languages = [ |
||||
['Python', ['Slow', ['Terrible', 'Mush']]], |
||||
['JavaSCript', ['Moderate', ['Alright', 'Bizarre']]], |
||||
['Perl6', ['Moderate', ['Fun', 'Weird']]], |
||||
['C', ['Fast', ['Annoying', 'Dangerous']]], |
||||
['Forth', ['Fast', ['Fun', 'Difficult']]], |
||||
]; |
@ -0,0 +1,21 @@ |
||||
exports.fruit = [ |
||||
{kind: 'Apples', count: 12, rating: 'AAA'},
|
||||
{kind: 'Oranges', count: 1, rating: 'B'},
|
||||
{kind: 'Pears', count: 2, rating: 'A'}, |
||||
{kind: 'Grapes', count: 14, rating: 'UR'} |
||||
]; |
||||
|
||||
exports.cars = [ |
||||
{type: 'Cadillac', color: 'Black', size: 'Big', miles: 34500}, |
||||
{type: 'Corvette', color: 'Red', size: 'Little', miles: 1000000}, |
||||
{type: 'Ford', color: 'Blue', size: 'Medium', miles: 1234}, |
||||
{type: 'BMW', color: 'White', size: 'Baby', miles: 7890} |
||||
]; |
||||
|
||||
exports.languages = [ |
||||
{name: 'Python', speed: 'Slow', opinion: ['Terrible', 'Mush']}, |
||||
{name: 'JavaScript', speed: 'Moderate', opinion: ['Alright', 'Bizarre']}, |
||||
{name: 'Perl6', speed: 'Moderate', opinion: ['Fun', 'Weird']}, |
||||
{name: 'C', speed: 'Fast', opinion: ['Annoying', 'Dangerous']}, |
||||
{name: 'Forth', speed: 'Fast', opinion: ['Fun', 'Difficult']}, |
||||
]; |
@ -0,0 +1,64 @@ |
||||
const readline = require('readline-sync'); |
||||
|
||||
const say = (prompt) => { |
||||
console.log(prompt); |
||||
} |
||||
|
||||
const die = (message) => { |
||||
say(message); |
||||
process.exit(1); |
||||
} |
||||
|
||||
const ask = (hp, prompt) => { |
||||
console.log(`[[You have ${hp} hit points.]]`); |
||||
if(hp <= 0) { |
||||
die("You died!"); |
||||
} else { |
||||
return readline.question(prompt + ' '); |
||||
} |
||||
} |
||||
|
||||
const door = (hp) => { |
||||
// they have to open the door to get the gold
|
||||
// what kind of puzzle will they solve?
|
||||
} |
||||
|
||||
const spider = (hp) => { |
||||
// they enter here, and the spider takes 10 hit points
|
||||
// if they live then they can run away
|
||||
} |
||||
|
||||
const gold = (hp) => { |
||||
// end of the game they win if they get the gold
|
||||
} |
||||
|
||||
const rope = (hp) => { |
||||
// they are at the bottom of the well
|
||||
// they can go through the door to the gold
|
||||
// or go take a wrong turn to the spider
|
||||
} |
||||
|
||||
const well = (hp) => { |
||||
say("You are walking through the woods and see a well."); |
||||
say("Walking up to it and looking down you see a shiny thing at the bottom."); |
||||
let next = ask(hp, "What do you do?"); |
||||
|
||||
if(next === "climb") { |
||||
say("You climb down the rope."); |
||||
rope(hp); |
||||
} else if(next === "jump") { |
||||
say("Yikes! Let's see if you survive!"); |
||||
hp = Math.floor(hp / 2); |
||||
rope(hp); |
||||
} else { |
||||
say("You can't do that here."); |
||||
well(hp); |
||||
} |
||||
} |
||||
|
||||
// setup hit points
|
||||
let hp = Math.floor(Math.random() * 10) + 1; |
||||
|
||||
// this starts the game
|
||||
well(hp) |
||||
|
@ -0,0 +1,4 @@ |
||||
// let's use that to make someone named alex
|
||||
let alex = Person("Alex", 16, "green"); |
||||
// and see how they can talk without repetition?
|
||||
alex.talk("Hi there!"); |
@ -0,0 +1,52 @@ |
||||
|
||||
// data about a person named Frank
|
||||
let frank = { |
||||
name: "Frank", |
||||
age: 34, |
||||
eyes: "blue" |
||||
} |
||||
|
||||
const frank_talk = (who, words) => { |
||||
console.log(`I am ${who.name} and ${words}.`); |
||||
} |
||||
|
||||
frank_talk(frank, "I am talking here!"); |
||||
|
||||
// working with that data by putting functions on it
|
||||
let mary = { |
||||
name: "Mary", |
||||
age: 44, |
||||
eyes: "brown", |
||||
talk: (who, words) => { |
||||
console.log(`I am ${who.name} and ${words}.`); |
||||
} |
||||
} |
||||
|
||||
// this is kind of annoying though
|
||||
mary.talk(mary, "these are some words"); |
||||
// and this works but that's weird
|
||||
mary.talk(frank, "I am frank what?"); |
||||
|
||||
// we need a way to build these automatically
|
||||
const Person = (name, age, eyes) => { |
||||
// this makes an obj for the data
|
||||
let obj = { |
||||
name: name, |
||||
age: age, |
||||
eyes: eyes |
||||
} |
||||
|
||||
// then attach our function to it
|
||||
obj.talk = (words) => { |
||||
// coolest part is obj here will keep a reference
|
||||
console.log(`I am ${obj.name} and ${words}.`); |
||||
} |
||||
|
||||
// and return our new person
|
||||
return obj; |
||||
} |
||||
|
||||
// let's use that to make someone named alex
|
||||
let alex = Person("Alex", 16, "green"); |
||||
// and see how they can talk without repetition?
|
||||
alex.talk("Hi there!"); |
@ -0,0 +1,6 @@ |
||||
// data about a person named Frank
|
||||
let frank = { |
||||
name: "Frank", |
||||
age: 34, |
||||
eyes: "blue" |
||||
} |
@ -0,0 +1,5 @@ |
||||
const frank_talk = (who, words) => { |
||||
console.log(`I am ${who.name} and ${words}.`); |
||||
} |
||||
|
||||
frank_talk(frank, "I am talking here!"); |
@ -0,0 +1,9 @@ |
||||
// working with that data by putting functions on it
|
||||
let mary = { |
||||
name: "Mary", |
||||
age: 44, |
||||
eyes: "brown", |
||||
talk: (who, words) => { |
||||
console.log(`I am ${who.name} and ${words}.`); |
||||
} |
||||
} |
@ -0,0 +1,4 @@ |
||||
// this is kind of annoying though
|
||||
mary.talk(mary, "these are some words"); |
||||
// and this works but that's weird
|
||||
mary.talk(frank, "I am frank what?"); |
@ -0,0 +1,18 @@ |
||||
// we need a way to build these automatically
|
||||
const Person = (name, age, eyes) => { |
||||
// this makes an obj for the data
|
||||
let obj = { |
||||
name: name, |
||||
age: age, |
||||
eyes: eyes |
||||
} |
||||
|
||||
// then attach our function to it
|
||||
obj.talk = (words) => { |
||||
// coolest part is obj here will keep a reference
|
||||
console.log(`I am ${obj.name} and ${words}.`); |
||||
} |
||||
|
||||
// and return our new person
|
||||
return obj; |
||||
} |
@ -0,0 +1,21 @@ |
||||
class Person { |
||||
constructor (name, age, eyes) { |
||||
this.name = name; |
||||
this.age = age; |
||||
this.eyes = eyes; |
||||
} |
||||
|
||||
talk(words) { |
||||
console.log(`I am ${this.name} and ${words}.`); |
||||
} |
||||
} |
||||
|
||||
let alex = new Person("Alex", 16, "green"); |
||||
let mary = new Person("Mary", 44, "brown"); |
||||
let frank = new Person("Frank", 34, "blue"); |
||||
|
||||
frank.talk("I am talking here!"); |
||||
mary.talk("these are some words"); |
||||
alex.talk("Hi there!"); |
||||
|
||||
console.log(`Frank is ${frank.age}, Mary is ${mary.age}, Alex is ${alex.age}`); |
@ -0,0 +1,23 @@ |
||||
const Person = (name, age, eyes) => { |
||||
let obj = { |
||||
name: name, |
||||
age: age, |
||||
eyes: eyes |
||||
} |
||||
|
||||
obj.talk = (words) => { |
||||
console.log(`I am ${obj.name} and ${words}.`); |
||||
} |
||||
|
||||
return obj; |
||||
} |
||||
|
||||
let alex = Person("Alex", 16, "green"); |
||||
let mary = Person("Mary", 44, "brown"); |
||||
let frank = Person("Frank", 34, "blue"); |
||||
|
||||
frank.talk("I am talking here!"); |
||||
mary.talk("these are some words"); |
||||
alex.talk("Hi there!"); |
||||
|
||||
console.log(`Frank is ${frank.age}, Mary is ${mary.age}, Alex is ${alex.age}`); |
@ -0,0 +1,61 @@ |
||||
class Guitar { |
||||
constructor (color, name, wood) { |
||||
this.color = color; |
||||
this.name = name; |
||||
this.wood = wood; |
||||
} |
||||
|
||||
play(note) { |
||||
console.log(`${this.name}:${this.color}:${this.wood} plays ${note}`); |
||||
} |
||||
} |
||||
|
||||
class Jazzmaster extends Guitar { |
||||
constructor (color, name, wood) { |
||||
super(color, name, wood); |
||||
this.volume = 0; |
||||
this.tone = 0; |
||||
} |
||||
|
||||
volume(level) { |
||||
this.volume = level; |
||||
} |
||||
|
||||
tone(level) { |
||||
this.tone = level; |
||||
} |
||||
} |
||||
|
||||
class BassVI extends Jazzmaster { |
||||
play(note) { |
||||
console.log(`${note}`); |
||||
} |
||||
} |
||||
|
||||
class Person { |
||||
constructor (name, age, eyes) { |
||||
this.name = name; |
||||
this.age = age; |
||||
} |
||||
|
||||
talk(words) { |
||||
console.log(`I am ${this.name} and ${words}.`); |
||||
} |
||||
} |
||||
|
||||
class Musician extends Person { |
||||
play(instrument, sheet_music) { |
||||
for(let note of sheet_music) { |
||||
instrument.play(note); |
||||
} |
||||
} |
||||
} |
||||
|
||||
let babbington = new Musician("Roy Babbington", 78); |
||||
let harris = new Musician("Jet Harris", 71); |
||||
let taliesin = new BassVI("red", "Taliesin"); |
||||
let golden = new BassVI("gold", "Golden Arm"); |
||||
|
||||
babbington.play(taliesin, ['a','b','c','d']); |
||||
harris.play(golden, ['a','b','c','d']); |
||||
|
@ -0,0 +1,107 @@ |
||||
const readline = require('readline-sync'); |
||||
|
||||
class Game { |
||||
constructor () { |
||||
this.hp = Math.floor(Math.random() * 10) + 1; |
||||
} |
||||
|
||||
say(prompt) { |
||||
console.log(prompt); |
||||
} |
||||
|
||||
die(message) { |
||||
this.say(message); |
||||
process.exit(1); |
||||
} |
||||
|
||||
ask(prompt) { |
||||
console.log(`[[You have ${this.hp} hit points.]]`); |
||||
if(this.hp <= 0) { |
||||
this.die("You died!"); |
||||
} else { |
||||
return readline.question(prompt + ' '); |
||||
} |
||||
} |
||||
|
||||
addRoom(room) { |
||||
this[room.name] = room; |
||||
room.game = this; |
||||
} |
||||
|
||||
play(name) { |
||||
this[name].enter(); |
||||
} |
||||
|
||||
hit(amount) { |
||||
this.hp -= amount; |
||||
} |
||||
} |
||||
|
||||
class Room { |
||||
constructor (name) { |
||||
this.name = name; |
||||
} |
||||
|
||||
enter() { |
||||
console.log("Implement me!"); |
||||
} |
||||
} |
||||
|
||||
class Door extends Room { |
||||
enter() { |
||||
// they have to open the door to get the gold
|
||||
// what kind of puzzle will they solve?
|
||||
} |
||||
} |
||||
|
||||
class Spider extends Room { |
||||
enter() { |
||||
// they enter here, and the spider takes 10 hit points
|
||||
// if they live then they can run away
|
||||
} |
||||
} |
||||
|
||||
class Gold extends Room { |
||||
enter() { |
||||
// end of the game they win if they get the gold
|
||||
} |
||||
} |
||||
|
||||
class Rope extends Room { |
||||
enter() { |
||||
// they are at the bottom of the well
|
||||
// they can go through the door to the gold
|
||||
// or go take a wrong turn to the spider
|
||||
} |
||||
} |
||||
|
||||
class Well extends Room { |
||||
|
||||
enter() { |
||||
this.game.say("You are walking through the woods and see a well."); |
||||
this.game.say("Walking up to it and looking down you see a shiny thing at the bottom."); |
||||
let next = this.game.ask("What do you do?"); |
||||
|
||||
if(next === "climb") { |
||||
this.game.say("You climb down the rope."); |
||||
this.game.rope.enter(); |
||||
} else if(next === "jump") { |
||||
this.game.say("Yikes! Let's see if you survive!"); |
||||
this.game.hit(5); |
||||
this.game.rope.enter(); |
||||
} else { |
||||
this.game.say("You can't do that here."); |
||||
this.game.well.enter(); |
||||
} |
||||
} |
||||
} |
||||
|
||||
|
||||
let game = new Game(); |
||||
game.addRoom(new Well("well")); |
||||
game.addRoom(new Rope("rope")); |
||||
game.addRoom(new Gold("gold")); |
||||
game.addRoom(new Spider("spider")); |
||||
game.addRoom(new Door("door")); |
||||
console.log(Object.entries(game)); |
||||
game.play("well"); |
@ -0,0 +1,25 @@ |
||||
// simple recursive counting function
|
||||
const counter = (i, upto) => { |
||||
if(i < upto) { |
||||
console.log("counter", i, upto); |
||||
counter(i+1, upto); |
||||
} |
||||
} |
||||
|
||||
// use counter to just print out 1-5
|
||||
counter(1, 5); |
||||
|
||||
// a more complex counter that can call a callback
|
||||
const cb_counter = (i, upto, cb) => { |
||||
if(i < upto) { |
||||
cb(i, upto); |
||||
cb_counter(i+1, upto, cb); |
||||
} |
||||
} |
||||
|
||||
// do the same thing but with a callback
|
||||
cb_counter(1, 6, (i, j) => { |
||||
console.log(i, j) |
||||
}); |
||||
|
||||
|
@ -0,0 +1,32 @@ |
||||
let pets = [ |
||||
{name: 'Yeller', type: 'Dog', age: 12}, |
||||
{name: 'Akumano', type: 'Japanese Bobtail Cat', age: 2}, |
||||
{name: 'Meaw Peesard', type: 'Siamese Cat', age: 100}, |
||||
{name: 'James', type: 'Gecko', age: 2}, |
||||
] |
||||
|
||||
let ages_only = pets.map(pet => pet.age); |
||||
|
||||
let total_age = ages_only.reduce((acc, age) => acc += age); |
||||
|
||||
let meaw = pets.find(pet => pet.name == 'Meaw Peesard'); |
||||
|
||||
let old_animals = pets.filter(pet => pet.age > 10); |
||||
let young_animals = pets.filter(pet => pet.age <= 10); |
||||
|
||||
console.log("Animal Ages:", ages_only); |
||||
|
||||
console.log("Total Age:", total_age); |
||||
|
||||
console.log("Meaw is:", meaw.age); |
||||
|
||||
console.log("\nOld Animals:"); |
||||
old_animals.forEach(pet => { |
||||
console.log(`\t${pet.name} is a ${pet.age} old ${pet.type}.`); |
||||
}); |
||||
|
||||
console.log("\nYoung Animals:"); |
||||
for(let pet of young_animals) { |
||||
console.log(`\t${pet.name} is a ${pet.age} old ${pet.type}.`); |
||||
} |
||||
|
@ -0,0 +1,31 @@ |
||||
let pets = [ |
||||
{name: 'Yeller', type: 'Dog', age: 12}, |
||||
{name: 'Akumano', type: 'Japanese Bobtail Cat', age: 2}, |
||||
{name: 'Meaw Peesard', type: 'Siamese Cat', age: 100}, |
||||
{name: 'James', type: 'Gecko', age: 2}, |
||||
] |
||||
|
||||
const young_pets = (pet) => { |
||||
return pet.age <= 10; |
||||
} |
||||
|
||||
const age_pets = (pet) => { |
||||
return [pet.name, pet.age + 10]; |
||||
} |
||||
|
||||
const name_age = (pet) => { |
||||
return `${pet[0]} is ${pet[1]}`; |
||||
} |
||||
|
||||
const debug = (msg) => { |
||||
console.log(msg); |
||||
// why am I doing this here?
|
||||
return msg; |
||||
} |
||||
|
||||
let age_young_animals = pets.filter(young_pets) |
||||
.map(age_pets) |
||||
.map(debug) // this is why
|
||||
.map(name_age) |
||||
.forEach(debug); |
||||
|
@ -0,0 +1,20 @@ |
||||
// puzzle: how small can you make this?
|
||||
|
||||
const build_adder = (left) => { |
||||
// do I really need this variable?
|
||||
let left_hand = left; |
||||
return adder = (right) => { |
||||
// do I really need the return?
|
||||
let result = left_hand + right; |
||||
return result; |
||||
} |
||||
} |
||||
|
||||
let add10 = build_adder(10); |
||||
let add20 = build_adder(20); |
||||
|
||||
console.log(`test builder 3 + 10 == ${add10(3)}`); |
||||
console.log(`test builder 3 + 20 == ${add20(3)}`); |
||||
console.log(`test builder 13 + 10 == ${add10(13)}`); |
||||
console.log(`test builder 3 + 10 + 20 == ${add10(add20(3))}`); |
||||
|
@ -0,0 +1,16 @@ |
||||
const var_sucks = () => { |
||||
var var_scope = 10; |
||||
let let_scope = 20; |
||||
|
||||
console.log(`>>> var_sucks before if: var=${var_scope}, let=${let_scope}`); |
||||
|
||||
if(true) { |
||||
var var_scope = 100; |
||||
let let_scope = 100; |
||||
console.log(`>>> var_sucks inside if: var=${var_scope}, let=${let_scope}`); |
||||
} |
||||
|
||||
console.log(`>>> var_sucks after if: var=${var_scope}, let=${let_scope}`); |
||||
} |
||||
|
||||
var_sucks(); |
@ -0,0 +1,48 @@ |
||||
let pets = [ |
||||
{name: 'Yeller', type: 'Dog', age: 12}, |
||||
{name: 'Akumano', type: 'Japanese Bobtail Cat', age: 2}, |
||||
{name: 'Meaw Peesard', type: 'Siamese Cat', age: 100}, |
||||
{name: 'James', type: 'Gecko', age: 2}, |
||||
] |
||||
|
||||
const young_pets = (pet) => { |
||||
return pet.age <= 10; |
||||
} |
||||
|
||||
const age_pets = (pet) => { |
||||
return [pet.name, pet.age + 10]; |
||||
} |
||||
|
||||
const name_age = (pet) => { |
||||
return `${pet[0]} is ${pet[1]}`; |
||||
} |
||||
|
||||
const debug = (msg) => { |
||||
console.log(msg); |
||||
return msg; |
||||
} |
||||
|
||||
const tee = (result, data, cb) => { |
||||
const side = (input) => { |
||||
cb(input, result, data); |
||||
return input; |
||||
} |
||||
|
||||
return side; |
||||
} |
||||
|
||||
let owned_pets = []; |
||||
const add_owner_tee = tee(owned_pets, 'Zed', (i, r, d) => { |
||||
r.push({pet: i, owner: d}); |
||||
}); |
||||
|
||||
let age_young_animals = pets.filter(young_pets) |
||||
.map(add_owner_tee) |
||||
.map(age_pets) |
||||
.map(name_age); |
||||
|
||||
console.log("-- Pets with Owners:"); |
||||
owned_pets.forEach(debug); |
||||
|
||||
console.log("-- Young Animals:"); |
||||
age_young_animals.forEach(debug); |
@ -0,0 +1,16 @@ |
||||
let fs = require('fs').promises |
||||
|
||||
const read_file = async (fname) => { |
||||
try { |
||||
let file = await fs.open(fname, 'r'); |
||||
let stat = await file.stat(); |
||||
let buffer = Buffer.alloc(stat.size); |
||||
let result = await file.read(buffer, 0, stat.size, null); |
||||
console.log(`Read ${result.bytesRead} bytes: ${result.buffer.toString()}`); |
||||
} catch(err) { |
||||
console.log("ERROR", err); |
||||
} |
||||
} |
||||
|
||||
// see the async.mjs version
|
||||
read_file('test.txt'); |
@ -0,0 +1,17 @@ |
||||
import { promises as fs } from "fs"; |
||||
|
||||
const read_file = async (fname) => { |
||||
try { |
||||
let file = await fs.open(fname, 'r'); |
||||
let stat = await file.stat(); |
||||
let buffer = Buffer.alloc(stat.size); |
||||
let result = await file.read(buffer, 0, stat.size, null); |
||||
console.log(`Read ${result.bytesRead} bytes: ${result.buffer.toString()}`); |
||||
} catch(err) { |
||||
console.log("ERROR", err); |
||||
} |
||||
} |
||||
|
||||
// This only works if your package.json has "type": "module",
|
||||
// or if you name the file async.mjs.
|
||||
await read_file('test.txt'); |
@ -0,0 +1,32 @@ |
||||
const fs = require('fs'); |
||||
|
||||
const read_file = (fname, cb) => { |
||||
fs.stat(fname, (err, stats) => { |
||||
if(err) { |
||||
cb(err, null); |
||||
} else { |
||||
fs.open(fname, 'r', (err, fd) => { |
||||
if(err) { |
||||
cb(err, null); |
||||
} else { |
||||
let inbuf = Buffer.alloc(stats.size); |
||||
fs.read(fd, inbuf, 0, stats.size, null, (err, bytesRead, buffer) => { |
||||
if(err) { |
||||
cb(err, null); |
||||
} else { |
||||
cb(err, buffer); |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
read_file('test.txt', (err, result) => { |
||||
if(err) { |
||||
console.log(err); |
||||
} else { |
||||
console.log(`Result is ${result.toString()}`); |
||||
} |
||||
}); |
@ -0,0 +1,16 @@ |
||||
const fs = require('fs'); |
||||
|
||||
const read_file = (fname, cb) => { |
||||
fs.stat(fname, (err, stats) => { |
||||
fs.open(fname, 'r', (err, fd) => { |
||||
let inbuf = Buffer.alloc(stats.size); |
||||
fs.read(fd, inbuf, 0, stats.size, null, (err, bytesRead, buffer) => { |
||||
cb(buffer); |
||||
}); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
read_file('test.txt', (result) => { |
||||
console.log(`Result is ${result.toString()}`); |
||||
}); |
@ -0,0 +1,35 @@ |
||||
const fs = require('fs'); |
||||
|
||||
const read_file = (fname, events) => { |
||||
let noop = () => {}; |
||||
let onStat = events.onStat || noop; |
||||
let onOpen = events.onOpen || noop; |
||||
let onRead = events.onRead || noop; |
||||
|
||||
fs.stat(fname, (err, stats) => { |
||||
onStat(stats); |
||||
|
||||
fs.open(fname, 'r', (err, fd) => { |
||||
onOpen(fd); |
||||
let inbuf = Buffer.alloc(stats.size); |
||||
|
||||
fs.read(fd, inbuf, 0, stats.size, null, (err, bytesRead, buffer) => { |
||||
onRead(bytesRead, buffer); |
||||
}); |
||||
}); |
||||
}); |
||||
} |
||||
|
||||
read_file('test.txt', { |
||||
onRead: (bytesRead, buffer) => { |
||||
console.log(`Read ${bytesRead} bytes: ${buffer.toString()}`); |
||||
},
|
||||
onStat: (stat) => { |
||||
console.log(`Got stats, file is ${stat.size} size.`); |
||||
}, |
||||
onOpen: (fd) => { |
||||
console.log(`Open worked, fd is ${fd}`); |
||||
} |
||||
}); |
||||
|
||||
|
@ -0,0 +1,50 @@ |
||||
const fs = require('fs'); |
||||
|
||||
const read_file = (fname, events) => { |
||||
let noop = () => {}; |
||||
let onError = events.onError || noop; |
||||
let onStat = events.onStat || noop; |
||||
let onOpen = events.onOpen || noop; |
||||
let onRead = events.onRead || noop; |
||||
|
||||
fs.stat(fname, (err, stats) => { |
||||
|
||||
if(err) { |
||||
onError(err); |
||||
} else { |
||||
onStat(stats); |
||||
|
||||
fs.open(fname, 'r', (err, fd) => { |
||||
if(err) { |
||||
onError(err); |
||||
} else { |
||||
onOpen(fd); |
||||
let inbuf = Buffer.alloc(stats.size); |
||||
|
||||
fs.read(fd, inbuf, 0, stats.size, null, (err, bytesRead, buffer) => { |
||||
if(err) { |
||||
onError(err); |
||||
} else { |
||||
onRead(bytesRead, buffer); |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
read_file('test.txt', { |
||||
onRead: (bytesRead, buffer) => { |
||||
console.log(`Read ${bytesRead} bytes: ${buffer.toString()}`); |
||||
}, |
||||
onStat: (stat) => { |
||||
console.log(`Got stats, file is ${stat.size} size.`); |
||||
}, |
||||
onOpen: (fd) => { |
||||
console.log(`Open worked, fd is ${fd}`); |
||||
}, |
||||
onError: (err) => { |
||||
console.error(err); |
||||
} |
||||
}); |
@ -0,0 +1,50 @@ |
||||
// all promise docs I could find fail to mention this feature
|
||||
// they all say (correctly) that if you return a value from a .then it becomes the
|
||||
// next .then callback parameter:
|
||||
|
||||
let test2 = new Promise((res, rej) => { |
||||
res(3); |
||||
}).then(x => [x, x + 4]).then(x => [x, x[1] + 5]); |
||||
|
||||
let res2 = test2.then(x => console.log("Then after math", x)); |
||||
|
||||
// this produces:
|
||||
// Then after math [ [ 3, 7 ], 12 ]
|
||||
|
||||
|
||||
// Ok, but if your .then returns a promise, why does it become the next promise but
|
||||
// not the next promise. Watch.
|
||||
let outer_promise = new Promise((res, rej) => { |
||||
res(1); |
||||
}); |
||||
|
||||
// now I'm going to return this one in first_then
|
||||
let inner_promise = new Promise((res, rej) => { |
||||
console.log("inner promise running"); |
||||
res("INNER_PROMISE"); |
||||
}); |
||||
|
||||
// log the parameter so you can see it's 1
|
||||
let first_then = outer_promise.then(x => { |
||||
console.log("first_then", x); |
||||
return inner_promise; // return the pomise here
|
||||
}); |
||||
|
||||
// at this point you would expect x to == inner_promise, but instead it will equal "INNER PROMISE"
|
||||
let last_then = first_then.then(x => { |
||||
// wtf? ok so then that means when I call first_then.then I should be working on inner_promise right?
|
||||
console.log("first_then === outer_promise", first_then === outer_promise); |
||||
console.log("first_then === inner_promise", first_then === inner_promise); |
||||
console.log("first_then === last_then", first_then === last_then); |
||||
console.log("first_then === first_then", first_then === first_then); |
||||
|
||||
// no, not only is it using inner_promise as the next .then, it's wrapping inner_promise with a promise so
|
||||
// that my call to .then is going through...two promises? Wtf?
|
||||
// The expectation is that first_then === inner_promise since I returned that but instead it's a whole other 3rd
|
||||
// promise adding a layer to the layer.
|
||||
|
||||
// and here's the value "INNER_PROMISE", not a inner_promise like I returned.
|
||||
console.log("Then after promise", x); |
||||
}); |
||||
|
||||
|
@ -0,0 +1,20 @@ |
||||
const fs = require('fs').promises; |
||||
|
||||
// you have to do nested calls any time you need the result of the previous calculation
|
||||
|
||||
const read_file = (fname) => { |
||||
fs.open(fname, 'r').then((fh) => { |
||||
fh.stat().then((stat) => { |
||||
let buf = Buffer.alloc(stat.size); |
||||
|
||||
fh.read(buf, 0, stat.size, null) |
||||
.then((result) => { |
||||
console.log(`Read ${result.bytesRead} bytes: ${result.buffer.toString()}`); |
||||
}).catch((err) => { |
||||
console.error(err); |
||||
}); |
||||
}).catch((err) => console.error(err)); |
||||
}).catch((err) => console.error(err)); |
||||
} |
||||
|
||||
read_file('test.txt'); |
@ -0,0 +1,12 @@ |
||||
const fs = require('fs').promises; |
||||
|
||||
const read_file = (fname) => |
||||
fs.open(fname, 'r') |
||||
.then(fh => fh.stat().then(stat => [fh, stat])) |
||||
.then(res => |
||||
res[0].read(Buffer.alloc(res[1].size), 0, res[1].size, null)) |
||||
.then(result => |
||||
console.log(`Read ${result.bytesRead} bytes: ${result.buffer.toString()}`)) |
||||
.catch(err => console.error(err)) |
||||
|
||||
read_file('test.txt'); |
@ -0,0 +1 @@ |
||||
I am a small file. |
@ -0,0 +1,9 @@ |
||||
const sleeper = (timeout) => { |
||||
return new Promise((resolve, reject) => { |
||||
setTimeout(() => resolve('DONE'), timeout); |
||||
}); |
||||
} |
||||
|
||||
let wait1 = sleeper(100); |
||||
wait1.then(x => console.log("Done.", x)); |
||||
|
@ -0,0 +1,6 @@ |
||||
import geometry from "./geometry.mjs"; |
||||
|
||||
let area51 = geometry.area(2.8); |
||||
let circ2 = geometry.circumference(6); |
||||
|
||||
console.log(`Area: ${area51}, Circumference: ${circ2}`); |
@ -0,0 +1,6 @@ |
||||
import geometry from "./geometry.mjs"; |
||||
|
||||
let area51 = geometry.area(2.8); |
||||
let circ2 = geometry.circumference(6); |
||||
|
||||
console.log(`Area: ${area51}, Circumference: ${circ2}`); |
@ -0,0 +1,7 @@ |
||||
const geometry = require('./geometry'); |
||||
|
||||
let area51 = geometry.area(2.8); |
||||
let circ2 = geometry.circumference(6); |
||||
|
||||
console.log(`Area: ${area51}, Circumference: ${circ2}`); |
||||
|
@ -0,0 +1,8 @@ |
||||
const area = (r) => Math.PI * r ** 2; |
||||
const circumference = (r) => 2 * Math.PI * r; |
||||
|
||||
module.exports = { |
||||
area: area, |
||||
circumference: circumference |
||||
} |
||||
|
@ -0,0 +1,7 @@ |
||||
export const area = (r) => Math.PI * r ** 2; |
||||
export const circumference = (r) => 2 * Math.PI * r; |
||||
|
||||
export default { |
||||
area, |
||||
circumference |
||||
} |
Loading…
Reference in new issue