Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Hangman</title>
- <style type="text/css">
- body {
- background-color:#CFC;
- margin:2em auto;
- width:500px;
- }
- #alphabet td {
- background-color:#DDD;
- border:1px solid black;
- cursor:pointer;
- font-family:arial, sans-serif;
- font-weight:bold;
- margin:3px;
- padding:2px 4px;
- text-align:center;
- width:1.25em;
- }
- #gallows {font-size:1.5em;}
- #word {
- font-family:monospace;
- font-size:1.5em;
- letter-spacing:.5em;
- }
- #msg {
- color:red;
- font-style:italic;
- height:1.5em;
- margin:0 0 1em 0;
- }
- #score {font-size:1.25em;}
- </style>
- <script type="text/javascript">
- // G E N E R A L U T I L I T I E S - - - - - - - - - - -
- // convenience method
- function get( eid ) {return document.getElementById( eid );};
- // S T A T I S T I C A L U T I L I T I E S - - - - - -
- // get a random integer in the range [min, max]
- // note: min is optional with default of 0
- function getRandomInt(max, min) {
- if ('undefined' == typeof min) min = 0;
- var range = max - min + 1;
- var r = Math.floor( range*Math.random( ));
- return min + r;
- };
- // simulate the random draw of integers without replacement
- // of cnt values from the range [min, max]
- // this is like drawing cards from a deck without replacing
- // the cards until the entire number of desired cards is
- // drawn, i.e., there will be no duplicates
- function drawRandomInts(cnt, max, min) {
- if ('undefined' == typeof min) min = 0;
- if ('undefined' == typeof max) max = cnt - 1;
- // reject request for more items than exist in range
- if (cnt > max - min + 1) return null;
- var hash = new Array();
- var drawn = 0;
- while (cnt > drawn) {
- var r = '' + getRandomInt(max, min);
- if ('undefined' == typeof hash[r]) {
- hash[r] = drawn++;
- }
- }
- var ints = new Array();
- var i = 0;
- for (key in hash) {
- ints[i] = parseInt(hash[key]);
- i++;
- }
- return ints;
- };
- // randomly rearrange the elements of an array
- function shuffle( arr ) {
- var idxs = drawRandomInts( arr.length );
- var last = arr.length;
- var shuffled = new Array();
- for (var i = 0; i < last; i++ ) {
- shuffled.push( arr[ idxs[ i ]] );
- }
- return shuffled;
- };
- // G A M E D A T A A N D F U N C T I O N S - - - -
- // set base word lists for each level of difficulty
- var easyWords = [ // 4-6 letters
- 'apple', 'basic', 'design', 'read', 'object', 'model', 'view'
- ];
- var mediumWords = [ // 7-9 letters
- 'computer', 'keyboard', 'program', 'hypertext', 'function', 'variable'
- ];
- var hardWords = [ // 10-12 letters
- 'instantiate', 'architecture', 'transmission', 'controller', 'dereference'
- ];
- // randomize the order of each list
- easyWords = shuffle( easyWords );
- mediumWords = shuffle( mediumWords );
- hardWords = shuffle( hardWords );
- // current index of each list
- var easyIdx = mediumIdx = hardIdx = -1;
- var states = [
- // 0 misses - empty gallows...start of game
- '______#|| |#|| #|| #|| #|| #||#========',
- // 1st miss - add head
- '______#|| |#|| O#|| #|| #|| #||#========',
- // 2nd miss - add body
- '______#|| |#|| O#|| | #|| |#|| #||#========',
- // 3rd miss - add one arm
- '______#|| |#|| O#|| /| #|| |#|| #||#========',
- // 4th miss - add second arm
- '______#|| |#|| O#|| /|\\#|| |#|| #||#========',
- // 5th miss - add one leg
- '______#|| |#|| O#|| /|\\#|| |#|| / #||#========',
- // 6th miss - add second leg...end of game - lost
- '______#|| |#|| O#|| /|\\#|| |#|| / \\#||#========'
- ];
- // #'s are placeholders for line-breaks - expand them
- for (var i = 0; i < states.length; i++) {
- states[i] = states[i].replace( /#/g, '<br />');
- };
- var b = ' '; // global blank value
- var alphas = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- var scores = [0, 0]; // running score [player, hangman]
- var misses = 0; // miss count for current round
- // word has five possible states:
- // -2 ==> game not yet started even once since page (re)load
- // -1 ==> game not restarted since last round - no word chosen
- // 0 ==> level has not been selected - no word choice possible
- // 1 ==> all words at current level have been chosen
- // String ==> word from one of the lists selected randomly by level
- var word = -2;
- function drawAlphaTable() {
- var t = '';
- for (var i = 0; i < 2; i++) {
- t += '<tr>';
- for (var j = 0; j < 13; j++) {
- t += '<td onclick="guess( this );">' +
- alphas.charAt( 13*i + j ) + '</td>';
- }
- t += '</tr>';
- }
- get( 'alphabet' ).innerHTML = t;
- };
- function displayMsg( m ) {
- // 7 blink cycles for non-blank m - blank just wipes display
- var last = (b != m)?7:1;
- var cmdOff = 'get("msg").innerHTML = "' + b + '"';
- var cmdOn = 'get("msg").innerHTML = "' + m + '"';
- for (var i = 0; i < last; i++) {
- setTimeout((1 == i%2)?cmdOff:cmdOn, 300*i);
- }
- };
- function rptOutOfWords( level ) {
- displayMsg(
- 'Sorry! There are no more ' + level + ' words to play.' +
- '<br />Select another level of difficulty.'
- );
- };
- function isAllPlayed() {
- var is = true;
- var levels = document.forms[0].level;
- // check each radio button
- for (var i = 0; i < levels.length; i++) {
- is = is && levels[i].disabled;
- }
- return is;
- };
- function rptAllPlayed() {
- displayMsg('All words at all levels of difficulty have been played.' +
- '<br />Reload the page to get the same words in a different order.');
- return null;
- };
- function getWord( f ) {
- var levels = f.level;
- var lIdx = -1;
- var level = '';
- for (var i = 0; i < levels.length; i++) {
- if (levels[ i ].checked) {
- lIdx = i;
- level = levels[ i ].value;
- };
- }
- if ('' != level) {
- // increment count of words used at requested level of difficulty
- eval(level + 'Idx++');
- // determine whether any words unused remain at level
- eval('var isDone = ' + level + 'Idx >=' + level + 'Words.length');
- // if all used at level, advise user and exit
- if (isDone) {
- levels[lIdx].disabled = 'disabled';
- levels[lIdx].checked = false;
- rptOutOfWords(level);
- return 1;
- }
- // otherwise, pick next word for level
- return eval(level +'Words[ ' + level + 'Idx ].toUpperCase()');
- };
- return 0;
- };
- function start( f ) {
- displayMsg(b); // wipe message field
- if (isAllPlayed()) return rptAllPlayed();
- drawAlphaTable();
- get( 'gallows' ).innerHTML = states[ 0 ];
- word = getWord( f );
- // no more words at requested level of difficulty
- if (1 == word ) return;
- if (0 == word ) {
- displayMsg('You must pick a level before starting.');
- return;
- }
- var display = word.replace( /[A-Z]/g, '_');
- get( 'word' ).innerHTML = display;
- };
- function guess( a ) {
- displayMsg(b); // clear message field
- if (isAllPlayed()) return rptAllPlayed();
- if ('string' != typeof word) {
- displayMsg('You need to start a new game before guessing!');
- return;
- }
- var letter = a.innerHTML;
- if (b == letter) {
- displayMsg('You already guessed that - try again!');
- return;
- }
- var display = get( 'word' ).innerHTML;
- if ( -1 != word.indexOf( letter ) ) {
- last = word.length;
- for (var i = 0; i < last; i++) {
- if (letter == word.charAt( i ))
- display = display.substring(0, i) +
- letter + display.substring(i + 1);
- }
- get( 'word' ).innerHTML = display;
- if ( word == display ) doEnd();
- }
- else {
- misses++;
- get( 'gallows' ).innerHTML = states[ misses ];
- if (misses == states.length - 1) doEnd( false );
- }
- a.innerHTML = b;
- };
- function doEnd( won ) {
- if ('undefined' == typeof won) won = true;
- if (won) {
- scores[0]++;
- displayMsg('You won!! (click start button to play again)');
- }
- else {
- scores[1]++;
- displayMsg('You lost...word was: ' + word +
- '.<br />(click start button to play again)');
- }
- get( 'scoreYou' ).innerHTML = scores[0];
- get( 'scoreHangman' ).innerHTML = scores[1];
- misses = 0;
- word = -1;
- };
- // paint "gameboard" without starting game
- window.onload = function() {
- drawAlphaTable( );
- get( 'gallows' ).innerHTML = states[ 0 ];
- var levels = document.forms[0].level;
- // deset radio buttons in case page was reloaded
- for (var i = 0; i < levels.length; i++) {
- levels[i].disabled = false;
- levels[i].checked = false;
- }
- };
- </script>
- </head>
- <body>
- <form>
- <p>
- Difficulty Level:
- <input type="radio" name="level" value="easy" /> Easy
- <input type="radio" name="level" value="medium" /> Medium
- <input type="radio" name="level" value="hard" /> Hard<br /><br />
- <input type="button" value="Start New Game"
- onclick="start( this.parentNode.parentNode );" />
- </p>
- </form>
- <table id="alphabet"></table>
- <p>(click a letter to make a guess)</p>
- <div>
- <pre id="gallows"></pre>
- <p>WORD: <span id="word">not yet in play</span></p>
- <p id="msg"> </p>
- <h3>Cumulative Scores</h3>
- <p id="score">
- You: <span id="scoreYou">0</span>
-
- Hangman: <span id="scoreHangman">0</span>
- </p>
- </div>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement