135 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | ||
|  | title: Counting Cards | ||
|  | --- | ||
|  |  Remember to use <a>**`Read-Search-Ask`**</a> if you get stuck. Try to pair program  and write your own code  | ||
|  | 
 | ||
|  | ###  Problem Explanation:
 | ||
|  | 
 | ||
|  | In the casino game **Blackjack**, a player can gain an advantage over the house by keeping track of the relative number of high and low cards remaining in the deck. This is called card counting. | ||
|  | 
 | ||
|  | Having more high cards remaining in the deck favors the player. Each card is assigned a value according to the table below. When the count is positive, the player should bet high. When the count is zero or negative, the player should bet low. | ||
|  | 
 | ||
|  | Value | Cards   | ||
|  | ----- | :-------------------:   | ||
|  | +1 | 2, 3, 4, 5, 6   | ||
|  | 0 | 7, 8, 9   | ||
|  | -1 | 10, 'J', 'Q', 'K','A' | ||
|  | 
 | ||
|  | You will write a card counting function. It will receive a **card** parameter and increment or decrement the global **count** variable according to the card's value (see table). The function will then return a string with the current count and the string `Bet` if the count is positive, or `Hold` if the count is zero or negative. The current count and the player's decision (`Bet` or `Hold`) should be separated by a single space. | ||
|  | 
 | ||
|  | *   Change the code below `// Only change code below this line` and up to `// Only change code above this line` | ||
|  | *   Ensure that you are editing the inside of the `cc` function. | ||
|  | *   Use what you've learned to check the value of each **card** parameter passed into the function. | ||
|  | *   Keep a running count of that number. | ||
|  | *   If the final count is 1 or greater, return **# Hold**. | ||
|  | *   If the final count is 0 or less, return **# Bet**. | ||
|  | 
 | ||
|  | **Example Output:** | ||
|  | 
 | ||
|  | *   -3 Hold | ||
|  | *   5 Bet | ||
|  | 
 | ||
|  | 
 | ||
|  | ##  Hint: 1
 | ||
|  | 
 | ||
|  | Use a `switch` (or `else if`) statement to count the value of each card. | ||
|  | 
 | ||
|  | > _try to solve the problem now_
 | ||
|  | 
 | ||
|  | ##  Hint: 2
 | ||
|  | 
 | ||
|  | Add/subtract the value of each card to variable **count**. If the card is worth 0, don't do anything. | ||
|  | 
 | ||
|  | > _try to solve the problem now_
 | ||
|  | 
 | ||
|  | ##  Hint: 3
 | ||
|  | 
 | ||
|  | After you've counted the cards, use an `if` statement to check the value of **count**. Also, make sure your `return` has a space between the number and the string. | ||
|  | 
 | ||
|  | > _try to solve the problem now_
 | ||
|  | 
 | ||
|  | ## Spoiler Alert!
 | ||
|  | 
 | ||
|  |  | ||
|  | 
 | ||
|  | **Solution ahead!** | ||
|  | 
 | ||
|  | ##  Basic Code Solution:
 | ||
|  | ```javascript | ||
|  |     function cc(card) { | ||
|  |       // Only change code below this line | ||
|  |       switch(card){ | ||
|  |         case 2: | ||
|  |         case 3: | ||
|  |         case 4: | ||
|  |         case 5: | ||
|  |         case 6: | ||
|  |           count++; | ||
|  |           break; | ||
|  |         case 10: | ||
|  |         case "J": | ||
|  |         case "Q": | ||
|  |         case "K": | ||
|  |         case "A": | ||
|  |           count--; | ||
|  |           break; | ||
|  |       } | ||
|  |       if (count > 0){ | ||
|  |         return count + " Bet"; | ||
|  |       } else { | ||
|  |         return count + " Hold"; | ||
|  |       } | ||
|  |       // Only change code above this line | ||
|  |     } | ||
|  | ``` | ||
|  | ### Code Explanation:
 | ||
|  | 
 | ||
|  | *   Check the value of each card via a `switch` statement. | ||
|  | *   The variable **count**: | ||
|  |     *   Increases by 1 if the card is a 2, 3, 4, 5, or 6. | ||
|  |     *   Since 7, 8, and 9 aren't worth anything, we ignore those cards in our `switch` statement. | ||
|  |     *   Decreases by 1 if the card is a 10, 'J', 'Q', 'K', or 'A'. | ||
|  | *   Check the value of **count** and return the appropriate response. | ||
|  | 
 | ||
|  | **Example Run** | ||
|  | 
 | ||
|  | *   `cc(2);` runs. | ||
|  | *   The `switch` statement hits `case 2`, jumps down and adds 1 to the variable `count`. | ||
|  | *   The `switch` statement then hits the `break` and `cc(3);` runs. | ||
|  | *   This cycle continues until the final call is made, `cc('A');`. | ||
|  | *   After the `switch` statement, the `if` statement checks `count`, which is now 0. | ||
|  | *   This then drops down to the `else` statement, which will return **0 Hold**. | ||
|  | 
 | ||
|  | **_Note_**: As mentioned earlier, the `switch` statement could have also been an `else if` statement. | ||
|  | 
 | ||
|  | 
 | ||
|  | ## Additional code solution:
 | ||
|  | 
 | ||
|  | ```javascript | ||
|  | function cc(card) { | ||
|  |   // Only change code below this line | ||
|  |   var regex = /[JQKA]/; | ||
|  |   if (card > 1 && card < 7){count++;} | ||
|  |   else if (card === 10 || String(card).match(regex)){count--;} | ||
|  | 
 | ||
|  |   if (count > 0) return count + " Bet"; | ||
|  |   return count + " Hold"; | ||
|  | 
 | ||
|  |   // Only change code above this line | ||
|  | } | ||
|  | ``` | ||
|  | ·  Run code at [repl.it](https://repl.it/@AdrianSkar/Basic-JS-Counting-cards). | ||
|  | 
 | ||
|  | ### Code explanation
 | ||
|  | · The function first evaluates `if` the condition `card` is a value greater than `1` and lower than `7`, in which case it increments `count` by one. | ||
|  | · Then if the card is `10` or higher it decrements `count` by one. | ||
|  | · The variable `regex` is a [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp) representing values (letters) for the higher cards. | ||
|  | · The `else` statement checks those values with the `|| (logical OR)` operator; first for `10` and then for any string that matches the regular expression using [String.match()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match). | ||
|  | 
 | ||
|  | #### Resources
 | ||
|  | 
 | ||
|  | *   <a href='https://en.wikipedia.org/wiki/Card_counting' target='_blank' rel='nofollow'>Card counting at Wikipedia</a> | ||
|  | *   <a href='http://www.freecodecamp.com/challenges/selecting-from-many-options-with-switch-statements' target='_blank' rel='nofollow'>Challenge: Selecting from many options with Switch Statements</a> | ||
|  | *   <a href='http://www.freecodecamp.com/challenges/chaining-if-else-statements' target='_blank' rel='nofollow'>Challenge: Chaining If Else Statements</a> | ||
|  | *   <a href='http://www.freecodecamp.com/challenges/increment-a-number-with-javascript' target='_blank' rel='nofollow'>Challenge: Increment a Number with Javascript</a> |