GithubHelp home page GithubHelp logo

ranviermud / ranviermud Goto Github PK

View Code? Open in Web Editor NEW
785.0 68.0 247.0 6.59 MB

A node.js based MUD game engine

Home Page: https://ranviermud.com

License: MIT License

JavaScript 100.00%
nodejs mud rpg game-engine javascript multi-user-dungeon

ranviermud's Introduction

ranvier

Node.js-based MUD engine

Ranvier is a MUD game engine whose goal is to be a simple but powerful way to build whatever MUD you want with special care given to extensibility. The core code strives to be completely unopinionated toward any specific style of game while using the bundle system to build the game you want without having to dig through the engine's code.

Special Features

  • Robust bundle system: Nearly every aspect of the game can be modified without changing the core and allows for easy packaging and sharing of commands/areas/items/npcs/channels/behaviors
  • Unopinionated network layer: easily swap out telnet for any network layer you like. No need to gut the whole codebase just to support a different transport type, just drop in a file.
  • Customizable data layer: You are not tied to saving in any particular database or file storage sytem
  • Optional coordinate based room system allowing for the flexibilty of a standard MUD world with the easy mappability of a strict 3D world.
  • Scripting for all entities in the game for any event along with behaviors to create shared, composable scripts
  • Skill system with passive/active skills
  • Effects e.g., buffs/debuffs
  • Quest system allowing for starting/progress/completion from any event in the game
  • Communication channels with custom audiences

Documentation

Ranvier prides itself on having thorough documentation which is available on our website: ranviermud.com

Slack

We have a Slack channel you can use to ask questions, suggest features, or just keep up to date with the project: https://ranviermud.slack.com

Get an invite

Requirements

Demo

Point your favorite client or telnet to ranviermud.com port 4000. This demo server is wiped and updated from the master branch every hour.

ranviermud's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

ranviermud's Issues

Softaculous?

Once this project hits a comfortable developed stage, perhaps getting it adopted by Softaculous to make it easier on install? Ghost runs on node.js too, but somehow Softaculous can get it installed on a regular shared server. Perhaps Ranviermud could use the same method?

A Web API for building/administration

Building a world viewer dashboard and eventually an editor, and thus a web API is necessary. Really just putting this issue out there so it's documented.

Needs:
[ ] A POST route for authentication.
[X] A GET request for each piece of world date (WIP).
[ ] POST routes to add new entities (NPCs, Rooms, etc) for builders.

Nice-to-have:
[ ] Ability to spawn copies of mobs or items.
[ ] Ability to edit existing entities, including players.
[ ] Ability to execute server commands (such as restart) or to use admin-related chat channels directly from the dashboard.

HTML5 Browser Client?

There is a project here that seems interesting: http://www.phudbase.com/webmud.php

It's designed to support MUD-style games with socket-based, real-time communication across any protocol, including HTML5 WebSockets for no plugin browser-based clients.

Can we get something like this for ranviermud, but built in node.js instead of php? That is simple to use as a web interface instead of using telnet? I know telenet is faster, but some folks may want a slight graphical appear, or at least some game "branding" in the interface.

Attributes update

All attributes should follow a pattern similar to below.

damage/healing scenario

baseHealth: 100
maxHealth: 100
healthDelta: Math.min(0, healthDelta)
health = Math.max(maxHealth, maxHealth + healthDelta) = 100

player takes 25 damage

baseHealth = 100
maxHealth = 100
healthDelta = Math.min(0, -25) = -25
health = health = Math.max(maxHealth, maxHealth + healthDelta) = 75

player heals for 100

baseHealth = 100
maxHealth = 100
healthDelta = Math.min(0, 75) = 0
health = health = Math.max(maxHealth, maxHealth + healthDelta) = 100

temporary stat debuff scenario (-5 str for 5 seconds, for example)

In practice pools (health/mana/energy) should be the only stats where the delta changes. Attributes (str, int, wis, etc.) buffs/debuffs should modify only the max property

baseStr = 10
maxStr = 5
delta = 0    // stat buffs/debuffs modify max _not_ delta
str = 5

delta is essentially a effect-agnostic modification to a stat. So there would be no reason for an effect to ever directly modify delta. Effects could cause damage but that would happen by them firing damage events which in turn modify delta

Combat

Implement a rudimentary real time automatic combat system via a kill command

Remove EventUtil and refactor input events

The "staged" approach to input events works without needing a giant switch. Remove eventutils and move all the different input event stages into their own event files

Don't log off characters from a player when he logs in

This would allow for a configuration setting letting the MUD admins decide whether or not to allow multiple characters from the same user logged in at the same time.
It would also allow session takeovers (log in into a character that is already logged in, and the new session takes over the old one).

Need Group Commands

It would be a nice feature if players could travel in groups.

There should be "Group Open" and "Group Close" commands. When a player's group is open, other players can follow that player ("Follow Player"). The player that is the group leader can "Group Disband" to stop followers without closing his/her group. Also, If a player's group is set to open, you can also be dragged ("Drag Player") which puts them in your group.

Make move command less special

Right now _move is a magic hidden command that is the backbone of how movement works. Make this command not magic (i.e., rename it move, don't hide it, and make CommandParser look at a moveCommand config to send movement to. This will allow players to literally type move east in addition to just east

Walkthrough?

This isn't an issue, this is a request for help. I'm really wanting to try this out, but I don't know how to get it started. I don't have a server running Node.js so I tried cloud9 and couldn't figure out how to run it.

So I downloaded node.js for windows, and downloaded the ranvier.zip. From there I do not know what to do. Anyone willing to walk me through how to get this running on my local machine so I can play with it? I've Google several tutorials, but I'm not not getting it.

Install?

How to install Ranviermud?
NPM does not seem to work...

new player creation and connection is broken (crashes server)

Trying to create a new player and character breaks the server.
That happens because at https://github.com/shawncplus/ranviermud/blob/staging/bundles/core-input-events/input-events/createPlayer.js#L120 we refer to an inexiestent 'player' object (should be args.player). But even if you do that, the saved player object looses its socket. I had no time to look into the issue, but that will cause this crash:

  TypeError: Cannot read property 'once' of undefined
  
  - commands.js:12 TelnetStream.player
    /home/marado/github/ranviermud/bundles/core-input-events/input-events/commands.js:12:20
  
  - createPlayer.js:122 args.player.save
    /home/marado/github/ranviermud/bundles/core-input-events/input-events/createPlayer.js:122:32
  
  - Data.js:38 Object.save
    /home/marado/github/ranviermud/src/Data.js:38:7
  
  - Player.js:64 Player.save
    /home/marado/github/ranviermud/src/Player.js:64:10
  
  - createPlayer.js:117 TelnetStream.<anonymous>
    /home/marado/github/ranviermud/bundles/core-input-events/input-events/createPlayer.js:117:23
  
  - ---------------------------------------------
  
  - ranvier:128 Server.Telnet.TelnetServer.socket
    /home/marado/github/ranviermud/ranvier:128:16
  
  - Telnet.js:196 Server.TelnetServer.netServer.net.createServer
    /home/marado/github/ranviermud/src/Telnet.js:196:22
  
  - ---------------------------------------------
  
  - Telnet.js:199 new TelnetServer
    /home/marado/github/ranviermud/src/Telnet.js:199:20
  
  - ranvier:119 init
    /home/marado/github/ranviermud/ranvier:119:14
  
  - ranvier:168 Object.<anonymous>
    /home/marado/github/ranviermud/ranvier:168:1

NPC/Item/Room Events

Currently only input events are implemented, implement the event loader for entities

Quitting broken while having stuff in inventory (possibly related to picking up container).

  TypeError: this.inventory.values is not a function
  
  - Item.js:135 Item.serialize
    /Users/seanohue/myProjects/ranviermud/src/Item.js:135:33
  
  - Player.js:163 data.inventory.inventory.Array.from.map.item
    /Users/seanohue/myProjects/ranviermud/src/Player.js:163:60
  
  - Array.map
  
  - Player.js:163 Player.serialize
    /Users/seanohue/myProjects/ranviermud/src/Player.js:163:43
  
  - Player.js:79 Player.save
    /Users/seanohue/myProjects/ranviermud/src/Player.js:79:41
  
  - quit.js:12 Command.func
    /Users/seanohue/myProjects/ranviermud/bundles/core-commands/commands/quit.js:12:14
  
  - Command.js:28 Command.execute
    /Users/seanohue/myProjects/ranviermud/src/Command.js:28:17
  
  - commands.js:35 TelnetStream.player.socket.once.data
    /Users/seanohue/myProjects/ranviermud/bundles/core-input-events/input-events/commands.js:35:30
  
  - ---------------------------------------------
  
  - commands.js:16 TelnetStream.player
    /Users/seanohue/myProjects/ranviermud/bundles/core-input-events/input-events/commands.js:16:21
  
  - commands.js:18 loop
    /Users/seanohue/myProjects/ranviermud/bundles/core-input-events/input-events/commands.js:18:25
  
  - commands.js:52 TelnetStream.player.socket.once.data
    /Users/seanohue/myProjects/ranviermud/bundles/core-input-events/input-events/commands.js:52:9

This happened after I had the shiv in my inventory, quit, reloaded, picked up the wooden chest (sans shiv, now), dropped it, then tried to quit again.

Refactor server commands

The server controls right now are really shitty and literally just bolted onto the end of the executable. Allow server commands to be part of a bundle as well and in the same format as normal commands. The only difference is that they can only be run from the server itself instead of from game. This includes things like shutdown, restart, reload, saveall, etc.

Usage of the translation library

The translation library is being used in a subverted way. The idea behind the library is that you have translations like:

Welcome!:
  es: "Bienvenido!"
  pt: "Bem vindo!"

And then you set the defaultLanguage as en, getting:

 console.log(myLocalize.translate("Welcome!")); // Welcome!
 myLocalize.setLocale("es");
 console.log(myLocalize.translate("Welcome!")); // Bienvenido!

ranviermud subverts this, setting the default language as "zz", and forcing every string to have an "en" translation. Doing this makes us loose a powerful tool: the ability of having things untranslated. If we were using the library as meant, this would happen:

 myLocalize.setLocale("de");
 console.log(myLocalize.translate("Welcome!")); // Welcome!

Since there's no german translation to "Welcome!", it would fallback to the default language. Right now, that can't happen (and that explains why we have an unusable Spanish translation). This problem will only grow: what happens when we have full support for a language, but then we want to accept patches that introduce strings for which we still don't have translation?

All the above made me want to start working on fixing this, using the translation library as it is supposed to. There's a bit of a problem with that, tho: we started depending on the mechanism as it is. Check rooms.yml for instance: we depend on the sentence on the original language being "description" and not the actual sentence, for each room.

So, in summary:

  • we should start using the translation library as it was designed to: we'll reap benefits, and as the project grows the current state keeps getting more unmanageable. But, in order to do so,
  • we should re-write the automatism mechanisms we have already in place, that are assuming the "wrong way of doing things" as being the way things will be. That means not a small undertaking, rewriting the Building mechanism.

checking commands list before exits

When entering 's' instead of going south you save, 'w' does 'where' instead of 'west' etc.

That seems to violate the principle of least surprise for users.

I'm not sure if the order should just be switched, or if directions should get precedence if the command entered is 2 characters or less, or something else.

Hypothetically, lets say a mud creator wanted to change how this works without editing src/commands.js since that's considered part of the engine. Is that something that the plugin system could address, and how would that look?

Mention that yaml files cannot be formatted with tabs

I used Sublime Text 2 and I indented the file with tabs and it refused to load.
I had to choose the "Convert indentation to spaces"

Spent an awful lot of time trying to figure out why the server wasn't able to parse my yml files sucessfully

Classes/Skills

The previous skill system has been completely scrapped so... re-implement skills

Why does it need to run as root?

In the example on the github front page, the mud is started as root. When I try to start it as a different user, I get an error. Why does it need to be run as root?

Refactor Channel.js to be polymorphic instead of stupid

Channel.js currently has a big switch based on the type. Instead commands should have an instance of the audience instead of a constant. Then the audience instance should be passed the game state and return a list of targets. Big code cleanup opportunity

Coordinate based room system?

I've been thinking about making the room system coordinate based. So when you're building rooms you don't even specify standard cardinal exits, the coordinate system does it for you. If you want non-euclidean exits (i.e., portals to non-connecting rooms) that should still be supported. But I think a coordinate system lends itself much better for building, player expectations of their surroundings, and for the possibility of say mapping features outside of a trivial AFKMud style compass.

Zlib

I strongly advise that you add zlib into the package.json for people wanting to deploy Ranvier on Heroku!

Effects

Make sure the events code still works and that events are saved/loaded correctly across logout/boot

go to a new area

Hi how do i go to a new area ( a new folders) instead of a room?

repeat() not working as expected

Example: you try to type just 'enter' on your password prompt:

Welcome, what is your name? asd
Do you want your account's username to be Asd? [y/n] y
Creating account...
Your password must be between 6 and 30 characters.
Enter your account password: 
You must use a password.
Connection closed by foreign host.

This is what happened:

  TypeError: Cannot read property 'apply' of undefined
  
  - EventUtil.js:19 
    /home/marado/github/ranviermud/src/EventUtil.js:19:16
  
  - EventUtil.js:30 
    /home/marado/github/ranviermud/src/EventUtil.js:30:10
  

I could submit a patch to avoid the use of repeat(), but it seems to me that the function should be fixed instead, and I think probably you know better on what were your intentions regarding that code, so I'll leave it to you.

Docs

Documentation should be updated - it does not document everything. Such as adding player attributes, authentication...

How do I add drops

Hi I have been tinkering with this for the past weak and I am wandering how do i add npc drops?
oh a no offense @shawncplus but your support is poor and docs are poor. I have opened 4 tickets and got no reply so far and been forced to work it out my self, and there are still some things i havnt work out, and on your docs it says on extending, 'This page will go over how to extend the codebase: adding new commands, new events, new room/player/item properties' and there is nothing about item/room/player properties, so yeah. please get back ASAP

Alternative skill or level systems?

Hello there,

I'm considering various MUD engines in order to decide which one to use as base for a MUD of my own.

I'm looking for the option to have skill levels, a system where skills get stronger and more effective the more you use them.

Additionally, I'm entertaining the idea of using a leveling system where instead of defeating monsters the player must perform certain actions to gain XP for their class. (I.e., a player of the 'farmer' class must plant crops to gain XP.)

How hard would out be to implement such systems in this engine?

Thanks in advance,
Loid.

Update prompt arch

  • Reimplement prompt tokens
  • Add a ability to have additional prompt lines which can be arbitrarily added/removed by skills, commands, events, etc.
  • Add ability to add custom tokens to the default prompt (Maybe)

Change Item Serialization

Items currently serialize their entire object. Update serialize to only serialize the item's entity reference and a new state object.

state will default to an empty object. Any runtime modifications to items should be done in state.

For example:

  • I enchant Item A to have +5 damage.
  • additionalState should be something like { "bonusDamage": 5 }

This makes it so that if the builder later updates that item's base damage the item saved to the player's inventory isn't broken.

  • Update Player.hydrate inventory hydration to fetch the base item definition from ItemFactory and then set the item's additionalState

  • Move the item hydration into the ItemFactory so the code is shared between all entity inventories

The following copied from slack:

I don't think items need a whole effects system. Anything that an effect would accomplish could be done with a behavior/script or an effect on the player
take for example a poisoned weapon effect. It would be an effect that applies to the player with an Infinity duration and it would just listen for player hit events to remove stacks until it was 0 then remove the effect
if a weapon was, for example, a "fiery weapon" that did extra fire damage it would just be a behavior called elemental-damage that looked for a elementalDamage config on the item's attributes

Quests

Some sort of quest system, a vague 5000 foot details looks like this:

  1. Quests and achievements are very similar. They're both systems that watch for any event the player performs and updates some record and after fulfilling a criteria doing something. The only difference is that quests are started at some point and achievements are always active. So should the implementation of quests really instead be some more generic concept that quests and achievements extend from?
  2. Should quests be a first class citizen a la rooms/items or should quests be built as a bundle? Personally I think quests being part of the core is the easiest in the long run; in the short run it will take some more thought into making quests modular and extensible enough to allow customization via bundle without having to touch the core.

For me they would be implemented something like this:

Override the EventEmitter.on method for Player to proxy the event to the quest/achievement system. This to me seems like the most flexible.

Example flow for an achievement:

  1. Player gains experience
  2. Player experience event notices player leveled up
  3. experience event fires levelup event
  4. levelup event gets proxied to the achievement system
  5. achievement system has a levelup listener which checks to see player's level is 10
  6. achievement system does... something (gives gold/achievement points/temporary buff/anything) in theory each different achievement event could do something different

Example flow for quests:

  1. Player sees [NPC] [!] Guild Leader indicating that the NPC has a quest the player can take
  2. Player executes quest list leader
  3. quest command calls something like npc.getAvailableQuests(player) which would loop over all the NPC's quests and check quest.canStart(player) which would call a customizable method on the quest to see if the player can start it (Some quests could depend on other quests being finished, or require the player be a certain level, or certain class, etc.)
  4. Player executes quest accept 3 which will mark the given quest as in progress.

For a kill quest "Kill 10 Bandits" which auto-completes:

  1. Player kills a bandit
  2. Combat event emits deathblow event
  3. Quest listens for deathblow event and checks to see killed NPC's vnum
  4. Quest increments its internal state
  5. Player kills 9 more bandits.
  6. Quest notices player has killed 10 bandits. Quest calls customizable complete() method

For a fetch quest "Bring me 5 apples" which only completes when turned in:

  1. Player gathers 5 apples
  2. Quest is listening for get event and notifies the player "You have all the apples you need, return to the Guild Leader"
  3. Player returns to NPC and types quest list to show his active quests.
  4. Player types quest complete 3 which will, again, call the customizable complete() method which in this case removes 5 apples from the players inventory, gives them to the guild leader and gives the player experience.

You can see the power in a system that is completely event based. Literally anything can trigger the start, progress, or completion of events. You can have events which autocomplete, you can have events which are based a player going to a specific room, using a specific command, killing a certain enemy, logging in on a particular day, whatever you want.

Allow for Node 6

Both README and nvmrc state Node 7 is needed for ranvier, but it seems that only 6 is actually needed code-wise.
We should relax the minimum version to 6 to allow users in that version (official Debian package users, for instance) to still run the code.

Quest messaging should indicate that the shiv is in the chest...

Quest Started: Find A Weapon!
-------------------------------------------------------------------------------
You're defenseless! Pick up the shiv on the ground by typing 'get shiv'

A rat hisses as you enter the room.
get shiv

You don't see anything like that here.

I can probably fix this, but I am at work, and will fix/push when I get home...

Fails on startup

I just git cloned and npm installed, then tried to run it. I get the following error:

$ node ranvier 
5 Oct 13:11:21 - START - Loading entities
5 Oct 13:11:21 - Loading command l10n... 
5 Oct 13:11:21 - Done
5 Oct 13:11:21 - Loading event l10n... 
5 Oct 13:11:21 - Done
5 Oct 13:11:21 - START - Starting server
5 Oct 13:11:21 - Setting autosave to 10 minutes.
5 Oct 13:11:21 - Setting respawn to 20 minutes.
5 Oct 13:11:21 - Examining plugin directory - /private/tmp/ranvier/ranviermud/src/../plugins/
5 Oct 13:11:21 - Loading rooms...

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:901:11)
    at Server._listen2 (net.js:1020:19)
    at listen (net.js:1061:10)
    at Server.listen (net.js:1127:5)
    at init (/private/tmp/ranvier/ranviermud/ranvier:112:10)
    at Object.<anonymous> (/private/tmp/ranvier/ranviermud/ranvier:148:1)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

Am I doing something wrong? Am I missing docs somewhere?

Use another transport instead telnet

Hello!
This is really nice work here, thank you!

What about change code to work with different transports. For example: using in web, or in chat apps.
I don't talk about implement it, but about ability to switch it easy.

Best regards, Dmitry.

NPC inventories?

Hey,

I see that NPCs have setInventory and getInventory methods. Is this implemented? I am trying to write in some shopkeeper functionality and would like the shop inventories to be part of the NPC object.

How would I indicate which items each NPC has in the YAML files?

Thanks.

Enhanced Wearables.

I would like to see wearables for the following:

Head
Neck
Torso
Left Arm
Left Hand
Left Finger
Right Arm
Right Hand
Right Finger
Waist
Left Leg
Left Foot
Right Leg
Right Foot

events.js:71 throw arguments[1]; // Unhandled 'error' event

Using node v0.8.20. Looking into it myself, but figured I'd post an issue as well.

10 Mar 17:18:02 -   Examining npc directory -   /Users/danny/Development/ranviermud/src/../entities/npcs/

events.js:71
        throw arguments[1]; // Unhandled 'error' event
                       ^
Error: listen EACCES
    at errnoException (net.js:770:11)
    at Server._listen2 (net.js:893:19)
    at listen (net.js:937:10)
    at Server.listen (net.js:986:5)
    at init (/Users/danny/Development/ranviermud/ranvier:112:10)
    at Object.<anonymous> (/Users/danny/Development/ranviermud/ranvier:148:1)
    at Module._compile (module.js:449:26)
    at Object.Module._extensions..js (module.js:467:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)

Containers

  • Update Item.hydrate to load the default items in the same way Npc hydrate does.
  • Update get command to take a third argument which is a container name
  • (Maybe) Implement a put command to put things in containers

I think as a phase one container contents don't need to save across boot. As long as their default list is loaded on boot. So putting an item in a container would effectively be the same as dropping it on the ground, it's lost when the server is shutdown

awkward room assignments?

So I was just evaluating this for a rewrite of another mud, and I noticed that the yaml file for defining rooms in an area is 100% dependent on the order rooms are defined in...

ie: if I write an area that has 5 rooms and later it was found that there really should be an additional room in the entry part of the area.... if the room is added at the beginning of the file, every room then has to have its exits and location information updated?

This seems very fragile, are there any other plans to maybe provide an alternative (safer to edit) format for these?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.