Contents



Project Ideas List

(Back to Blog)

Some project ideas which everyone can utilize to create demonstrative skill-proofing applications - to post them to GitHub and thus to create portfolio to be shown to potential employer.

Dice Game

There are many versions of games with dice. In simplest cases you just want to throw more points than your opponent. Here is a more whimsical (for implementation) version:

there a single die (cube with values from 1 to 6 ) - players throw it in turns, accumulating the points;

to ) - players throw it in turns, accumulating the points; in turn the player can throw the cube several times - the score for this turn is calculated as the sum of all throws, unless value 1 is thrown;

is thrown; player can stop voluntarily (then the score for this turn is added to his total) or he is stopped when 1 appears (in this case he scores nothing for the turn);

appears (in this case he scores nothing for the turn); after the turn the die is transferred to another player - who plays in the same manner;

the one who reaches 100 wins the game.

Example:

player1 throws: 5 3 3 (stops, +11) player2 throws: 4 6 (stops, +10) player1 throws: 2 5 1 (bust, +0) player2 throws: 3 2 3 4 (stops, +12)

Here after first two turns for each side the totals are 11 versus 22 .

Easy level - implement it as a console game.

Advanced level - create graphic user interface, perhaps for mobile platform.

Master level - invent some kind of computer opponent to play against.

Related problems: Dice Rolling, Double Dice Roll





Tic-Tac-Toe

Create the game to display the board and allow two users to play. Take care of re-running the game after it is over.

For reference example check the interactive game at Tic-Tac-Toe problem. The AI for the game is discussed in this problem.

Easy level - implement as a console or GUI/mobile version.

Advanced level - implement "take back" option.

Master level - add a computer opponent.





Sorting Comparison

This application have two goals - at first you need to learn and implement from scratch several sorting algorithms - and secondly you need to create some simple application which allows calling them for comparison. This "framework" should take care of generating randomized data and then serving them to several sorts (it would be unfair to call different algorithms on different input data). Also the input sizes should be gradually increased (e.g. 1000 elements, 3000 , 10000 , 30000 etc.), time spent on each sorting measured and some resulting comparison reported. Make sure that your "framework" code do not look like a total mess!

Easy level - make comparison of only "quadratic" sorts BubbleSort, InsertionSort, SelectionSort.

Advanced level - implement QuickSort and MergeSort also.





Sort and Uniq utils

Unix-like systems usually have useful small programs sort and uniq . First of them reads text lines from file (or console) and outputs them in sorted order. The second allows to filter out unique or non-unique lines from the file. Implement both of these utilities in your favorite language. Compare the performance with the original programs.

Advanced level - you'll need to create some random text generating tool to create larger input files. You also need to have a tool to check the results.

Master level - make sure they work even for large files of several gigabytes (i.e. not fitting into memory) - and do it fast enough.





Fahrenheit and Celsius in the web

Create the simple but useful web-page: let it contain the form and some script to convert temperature between Fahrenheit and Celsius scales, as described in this task

If you code in JavaScript , you can make it static web-page with client-side scripts. Otherwise you'll need some active server to host your application (though with Python you can use JS interpreter skulpt). Browse our web-development problems and related wiki pages if you need some introduction to web.

Advanced level for server-based variand add an API-endpoint - i.e. URL which, if called with parameters like /index.php?celsius=60 returns response in machine-readable format (e.g. JSON) so it could be used by other applications over the web. Master level use sessions or local-storage to remember the recent conversions so the user can see them when returning to your page.





Vigenere Cipher

This is the advanced version of Caesar's Cipher - instead of single value for shift key we use the keyword, say, of length M . It is converted to array of M values (for example by taking ASCII indexes of the letters) which are used as shift keys for consecutive letters. Read more at wikipedia article.

Create a console tool which gets as command-line parameters the name of file and the keyword - then encrypts or decrypts the given file. You can use XOR operation instead of shift so that encryption and decryption are the same.

Advanced level use the keyword (or key value) to seed some kind of custom-made random number generator - and use these values for shifts. This will effectually be the Vigenere cipher with very long key.

Master level create web-tool for encrypting files or small texts online. It would be greate if you can make it compatible with some other tools.





Dice Game in the web

Create a simple web-page which allows to throw two dice, side-by-side. See notes for Fahrenheit-and-Celsius above about implementation. Try to make the page beautiful and probably use graphics for dice sides. If possible - add an animation. The purpose of such page should be to allow people to make quick decisions based on fair random lots casting. E.g. when wife and husband could not decide whether to go watch soccer or opera - they will visit your page and by clicking Throw button the winner will be determined at once.

Related problem: Dynamic Web Page





File Archiver

Use one or more algorithms of data compression, e.g. Huffman to create a file tool which allows compressing and decompressing files. E.g. you may have two utilities, call them pack and unpack or aggregate both in one. Decide how to store additional information (e.g. huffman table). Make thorough check to be sure that your tools work correctly. This could be a tough challenge.

Advanced level - combine algorithms. E.g. use LZW and then huffman on its results (perhaps, separately on lenghts and indexes).

Master level - allow archiver to pack multiple files into one (and then unpack them back properly). This will require inventing some internal structure of archive file. Allowing to store directories would be extremely great.





Maze Walker

Create the game of exploring randomly generated maze. Inventing an algorithm for maze generation is up to you - this is an interesting challenge itself. The game screen should show the small portion of the maze (e.g. current cell and few adjacent ones) and an icon of the hero traversing the maze. User should give directions (by pressing keys or entering commands) where to go, after which the screen is redrawn.

The goal could be, for example, to find randomly placed chest of gold. You can implement additional features - like leaving inscriptions in the cells (to help user recollecting where he already was). The Maze of the Wumpus may give you additional ideas on placing some invisible monsters in the game.

It is worth to allow user to enter random seed so that he can replay the same maze more than once.

Advanced level implement it as GUI / mobile / web-page. Provide means to store and load the game state.





Single-Player Poker

The game is single-player. The computer shuffles the deck, then gives 5 cards to user. User marks the cards which should be exchanged. This is repeated, say, twice. The goal is to collect anything better than 1 pair.

Variant - implement BlackJack game instead, its logic may be somewhat simpler.

Master level - implement computer opponent to allow playing against it.

Related problems: Cards Shuffling, Yacht or Dice Poker





Game of Life

Implement Conway's Game of Life. Preferably use some graphics rendering. Study the Hard Life puzzle to come up with some fast processing algorithm. Your game should preferably use infinite (or almost infinite) field, not limited to small matrix. Try to use some GUI library or create mobile/web version.

Advanced level - add functions to load and store configurations - it would be good if configuration could be loaded into the user selected place - and also features like flipping or rotating selected fragments of the field.

2015-10-28