Knuckleheads is played by: knuckleheads [ < input file > ] where < input file > defaults to bin/players.csv The scores are written to a file called high_scores.txt
# pragmatic-studio-game NPCs collect random treasure, are w00ted or blammed, and compete for high scores. Load your own players by modifying the bin/favorite_players.csv file. Created as part of The Pragmatic Studio Ruby Programming course.
This is coding built for practice alongside Pragmatic Studios online course. Feel free to look at it, it's not great. The spec files do not work currently.
This is an example application used in The Pragmatic Studio's Ruby Programming course, as described at http://pragmaticstudio.com Plays a randomized game This code is Copyright 2015 Brant Wellman. See the LICENSE file.
This is an example application used in The Pragmatic Studio's Ruby Programming course, as described at http://pragmaticstudio.com This code is Copyright 2012 The Pragmatic Studio. See the LICENSE file.
A game for knuckleheads
Cute, fun game with some nerds to play! :)
Knuckleheads Game from Pragmatic Studio Ruby course. type: studio_game to play. A CSV filename can be passed to the studio_game to specifiy a collection of Players. Format of CSV: playername,health Players will be randomly 'w00ted' and 'blammed' and find random treasures on each turn. after game play, high scores are written to the working directory.
Welcome to the "Knuckleheads" game, a (slightly enhanced version of the) fully functional text driven game written in Ruby 1.9 and used as a teaching aid for the excellent web-based Ruby course administered by Pragmatic Studios. W00t! W00t! Before playing, fill the default csv file "players.csv" with any number of players by putting the name of each followed by their initial health (an integer separated from the name by a comma). Each player must be on a new line. You may also create an alternate file formatted the same way with a different name. (A sample alternate player file called "more_nuts.csv" is provided as an example.) Invoke an alternate file simply by entering the file name when prompted. How fun is that!! To start the game, start the Ruby file "studio_game.rb" in Ruby 1.9 (or later should work as well) and follow the directions. By the way, there are two players added in hard code with modified behavior. One is "sandro" a LOSER or "clumsy" player who damages his treasure upon collecting it, resulting in the value of each treasure being worth only half of it's original value. What a klutz! The other is a wild-ass player, "bright_eyes." He's a serious partyier! After every other player is spent, he "finds the last beer in the fridge" and can't help but w00t. Bright_eyes starts off just like everyone else. But after being w00ted six times he goes freak'n w00t-crazy and w00ts EVERY TIME! You better think long and hard before committing to joining Mr. bright_eyes. Legend has it that he eats the livers of his prey after he parties them to death, and in this way remains an immortal player! Now fire up that command line for some outrageous fun! CAUTION: It is addictive. My cousin, Schneebo (the Schneebo on my Dad's side, NOT Schneebo Salifronski) once sat down and played Knuckleheads non-stop for 176.39 hours. It's the truth - you've been warned. Oh, and by the way: Three w00ts for Pragmatic Studios - woot, woot, h00ray! - woot, woot, h00ray! - woot, woot, h00ray!
Exercise files for Pragmatic Studio's Learn Ruby Course; The Larry Moe and Curly Knuckleheads Game.
## Studio Game Demo App I made this app following along with The Pragmatic Studio's Ruby course found here: https://pragmaticstudio.com/courses/ruby. ## Install the gem I published the gem for this app on RubyGems.org. In order to install it, run `gem install studio_game_dylan_attal-1.0.0.gem` ## Run the app In order to run the app run the following command `studio_game` ## Summary This is a console app that simulates a game. Players are loaded from the `players.csv` file be default. Each player has a name and a starting health value, i.e.: `Larry,100` If the user wants, they can provide a different CSV file to load the players. For example, I've provided a file `my_favorite_players.csv` as an alternate list of players. The user should provide the file like so `studio_game bin/my_favorite_players.csv` Before the game is played, the user gets to decide how many rounds to play. At this point, the user can also terminate the program by typing in `quit` or `exit`: `How many game rounds? ('quit to exit')` Once the user provides the number of rounds, the game is played automatically. The user then sees 1. Which players are involved ``` There are 5 players in Knuckleheads: I'm Boba with a health = 100, points = 0, and score = 100. I'm Jango with a health = 90, points = 0, and score = 90. I'm Din with a health = 80, points = 0, and score = 80. I'm Klutz with a health = 105, points = 0, and score = 105. I'm Berserker with a health = 50, points = 0, and score = 50. ``` 2. Which treasures there are to find ``` There are 6 treasures to be found: A pie is worth 5 A bottle is worth 25 A hammer is worth 50 A skillet is worth 100 A broomstick is worth 200 A crowbar is worth 400 ``` 3. The results of each round ``` Round 1 Rolled a 3 (StudioGame::Die) Rolled a 4 (StudioGame::Die) Boba has been skipped Boba found a skillet worth 100 points. Boba's treasures: {:skillet=>100} I'm Boba with a health = 100, points = 100, and score = 200. Rolled a 3 (StudioGame::Die) Rolled a 2 (StudioGame::Die) Jango got blammed! Jango found a bottle worth 25 points. Jango's treasures: {:bottle=>25} I'm Jango with a health = 80, points = 25, and score = 105. Rolled a 1 (StudioGame::Die) Rolled a 6 (StudioGame::Die) Din got w00ted! Din found a crowbar worth 400 points. Din's treasures: {:crowbar=>400} I'm Din with a health = 95, points = 400, and score = 495. Rolled a 1 (StudioGame::Die) Rolled a 4 (StudioGame::Die) Klutz has been skipped Klutz found a bottle worth 12.5 points. Klutz's treasures: {:bottle=>12.5} I'm Klutz with a health = 105, points = 12.5, and score = 117.5. Rolled a 1 (StudioGame::Die) Rolled a 4 (StudioGame::Die) Berserker has been skipped Berserker found a hammer worth 50 points. Berserker's treasures: {:hammer=>50} I'm Berserker with a health = 50, points = 50, and score = 100. ``` Once the user quits, they see the final results of all the rounds: ``` How many game rounds? ('quit to exit') quit Knuckleheads Statistics: 2 strong players: Boba (115) Klutz (120) 3 wimpy players: Jango (85) Din (75) Berserker (40) Berserker........... 690 Boba................ 620 Din................. 575 Jango............... 235 Klutz............... 207.5 Boba's point totals: 100 total skillet points 5 total pie points 400 total crowbar points 505 grand total points Jango's point totals: 50 total bottle points 100 total skillet points 150 grand total points Din's point totals: 400 total crowbar points 100 total hammer points 500 grand total points Klutz's point totals: 12.5 total bottle points 25.0 total hammer points 50.0 total skillet points 87.5 grand total points Berserker's point totals: 50 total hammer points 200 total broomstick points 400 total crowbar points 650 grand total points ``` ## Rules of the game Each round, each player rolls the die. If a player rolls between 1 and 2, then they are `blammed`, meaning they lose `10 health`. If a player rolls between 3 and 4, then they are `skipped`, meaning they do not gain or lose points that turn. If a player rolls between 5 and 6, then they are `w00ted`, meaning they gain `15 health`. Each round, players can find treasure worth different points. Treasures are found randomly. Every game, there are two special players added: 1. `ClumsyPlayer`: this player's treasure points are cut in half. 2. `BerserkPlayer`: once this player is `w00ted` five times, it cannot be `blammed` in that game anymore—if this player rolls between 1 and 2, they are `w00ted` instead of `blammed`.
<!-- TABLE OF CONTENTS --> <details open="open"> <summary>Table of Contents</summary> <ol> <li> <a href="#about-the-project">About The Project</a> <ul> <li><a href="#built-with">Built With</a></li> </ul> </li> <li> <a href="#getting-started">Getting Started</a> <ul> <li><a href="#prerequisites">Prerequisites</a></li> <li><a href="#installation">Installation</a></li> </ul> </li> <li><a href="#usage">Usage</a></li> <li><a href="#roadmap">Roadmap</a></li> <li><a href="#contributing">Contributing</a></li> <li><a href="#license">License</a></li> <li><a href="#contact">Contact</a></li> <li><a href="#acknowledgements">Acknowledgements</a></li> </ol> </details> <!-- ABOUT THE PROJECT --> ## About The Project [![Product Name Screen Shot][Screenshot of gameplay and test list]](https://www.dropbox.com/s/mu1rrbx2mqowjkn/studio-game.png?dl=0) This game is a project built following the [Pragmatic Studio Ruby Course](https://online.pragmaticstudio.com/courses/ruby/). I absolutely adored going through this course, because it was unlike other courses in that the main focus wasn't syntax, but how to build a principle-driven, object-oriented program that contains many of the skills we'd need to build real-world projects. The instructors purposefully created exercises to let us build a program using the skills they demonstrated by building a different program. This wasn't a copy and paste kind of course. This game was actually my second run-through, where I test-drove everything from the start based on the objectives only. Skills I valued developing further with this project: - Test-driven development (50+ tests). - Using inheritance to model "is-a" relationships. For example, a clumsy player *is a* kind of player. - Using mixins (modules) to reuse behaviours that are common between classes, but should not be modeled with an inheritance relationship. A good tip was to look for 'able' behaviors in a class to extract, like 'playable', 'printable', 'taxable' etc. - Using a file block which lets you add in class usage examples that are only run when you run the class file specifically. - Overriding default methods (like sort, and renaming things so that they keep a specific format) Things I struggled with: - Testing behaviour that uses blocks. I had a lightbulb moment when I realised I should test the behaviour performed inside the block on a single item. Testing the output of an entire block is like testing Ruby syntax works. Alternatively, test the before and after state of something that changes as a result of using a block. Cooool. - Puts. It felt wrong to use puts to show the output in the console. I'd like to learn how to seperate the view logic for a command-line project later. Things I did to make it my own: - Wrote a lot more tests for my second run-through. - Noticed and extracted further 'able' behaviours into modules (like printing stats, formatting output and handling csv files). ### Built With * [Ruby (language)](https://www.ruby-lang.org/en/) * [RSpec (framework)](https://rspec.info/) * [Vim (text-editor)](https://www.vim.org/) <!-- GETTING STARTED --> ## Getting Started To get a local copy up and running follow these steps: ### Prerequisites This is an example of how to list things you need to use the software and how to install them. * gem ```sh npm install npm@latest -g ``` ### Installation 1. Install the gem ```sh gem install studio_game_2021 ``` <!-- USAGE EXAMPLES --> ## Usage To play a game from the command-line, open a new command project and run the command-line script like so: ```sh studio_game ``` Or, if you'd like to use the game as a library, here's an example of how to use it in `irb`. You can also check the bottom of each class or module file for further usage instructions ``` >> require 'studio_game/game' => true >> game = StudioGame::Game.new("Knuckleheads") => #<StudioGame::Game:0x007fdea10252d8 @title="Knuckleheads", @players=[]> >> player = StudioGame::Player.new("Moe", 90) => I'm Moe with health = 90, points = 0, and score = 90. >> game.add_player(player) => [I'm Moe with health = 90, points = 0, and score = 90.] >> game.play(1) ``` <!-- ROADMAP --> ## Roadmap I plan to customize this game further now that I have a solid foundation to explore from. It'll be fun to let the players interact with each other more, like swapping treasures, and maybe add some kind of board game with it's own features. That's my next focus. ## Contributing Feel free to fork this project and play around with it. Open to feedback-related pr requests. <!-- LICENSE --> ## License Distributed under the MIT License. See `LICENSE` for more information. <!-- CONTACT --> ## Contact Becca - [@becca9941](https://twitter.com/Becca9941) - becca@essentialistdev.com Project Link: [https://gitlab.com/EssentialistDev/studio-game](https://gitlab.com/EssentialistDev/studio-game) <!-- ACKNOWLEDGEMENTS --> ## Acknowledgements - [Pragmatic Studio](https://online.pragmaticstudio.com/courses/ruby/) for empowering me with awesome new development skills. - [Best-README-Template](https://github.com/Becca9941/Best-README-Template) for helping me write a README for this project.