From ad9d918f885ab63a4ca755a3eb93b721eca5f8d0 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Wed, 3 Jun 2015 18:30:33 -0400 Subject: [PATCH 1/9] card deck w/.pop() --- .DS_Store | Bin 0 -> 6148 bytes .ipynb_checkpoints/Untitled-checkpoint.ipynb | 141 ++++++++++++++++ READ_ME.md | 4 + Untitled.ipynb | 166 +++++++++++++++++++ cards.py | 28 ++++ 5 files changed, 339 insertions(+) create mode 100644 .DS_Store create mode 100644 .ipynb_checkpoints/Untitled-checkpoint.ipynb create mode 100644 READ_ME.md create mode 100644 Untitled.ipynb create mode 100644 cards.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f53ef2cb1454a56edaf63973edf6f86aca4f34c2 GIT binary patch literal 6148 zcmeHKOHKko5Pgj#f^1m2oTV!hJi$o7goPVC01CKJ28jZR%Q*&z@&MijUsZLG8HTMI zQUq!3-0rBkQMSiN_l4(qK|9zFv2ZMmzZN( zBR1zZ7FV5fk59}>D?8ZkH2PX~iu0f==r ztFbIUjKWDGrV(>P_RxY+iAD|aiV=*?_9W(|5pzSMBgD%`h%<+HLkT)N$4@jJAvN^q z3b+DA1x~Emmh-=V{Qh4gdCe7Y1^$%+q29aeb-AQ?wjL}_&f0{2PZyKC+;B%>L62hQ e%29kyS7Uo31!5X8H)IRVe*{zp53azED)0qx)Mw=Y literal 0 HcmV?d00001 diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..4d52a11 --- /dev/null +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,141 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "object of type 'NoneType' has no len()", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mdeck\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdeck\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/random.py\u001b[0m in \u001b[0;36mshuffle\u001b[0;34m(self, x, random)\u001b[0m\n\u001b[1;32m 267\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrandom\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 268\u001b[0m \u001b[0mrandbelow\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_randbelow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 269\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mreversed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 270\u001b[0m \u001b[0;31m# pick an element in x[:i+1] with which to exchange x[i]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 271\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrandbelow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: object of type 'NoneType' has no len()" + ] + } + ], + "source": [ + "# Cards includes a list of 52 regular cards with no Jokers\n", + "import random\n", + "\n", + "whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs',\n", + " '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs',\n", + " '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts',\n", + " 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts',\n", + " '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts',\n", + " '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds',\n", + " 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds',\n", + " '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds',\n", + " '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades',\n", + " 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades',\n", + " '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades',\n", + " '2 of spades']\n", + "\n", + "\n", + "deck = whole_deck\n", + "\n", + "\n", + "# played_cards = []\n", + "\n", + "live_card = deck.pop()\n", + "\n", + "\n", + "random.shuffle(lst)\n", + "\n", + "random.shuffle(deck)\n", + "print(deck)\n", + "print(live_card)\n", + " \n", + " \n", + "live_card not in deck == True" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/site-packages/IPython/kernel/zmq/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 675\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 676\u001b[0;31m \u001b[0mident\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreply\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstdin_socket\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 677\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/site-packages/IPython/kernel/zmq/session.py\u001b[0m in \u001b[0;36mrecv\u001b[0;34m(self, socket, mode, content, copy)\u001b[0m\n\u001b[1;32m 718\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 719\u001b[0;31m \u001b[0mmsg_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msocket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv_multipart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 720\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mzmq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mZMQError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/site-packages/zmq/sugar/socket.py\u001b[0m in \u001b[0;36mrecv_multipart\u001b[0;34m(self, flags, copy, track)\u001b[0m\n\u001b[1;32m 339\u001b[0m \"\"\"\n\u001b[0;32m--> 340\u001b[0;31m \u001b[0mparts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mflags\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrack\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 341\u001b[0m \u001b[0;31m# have first part already, only loop while more to receive\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.recv (zmq/backend/cython/socket.c:5785)\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.recv (zmq/backend/cython/socket.c:5585)\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket._recv_copy (zmq/backend/cython/socket.c:1738)\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/site-packages/zmq/backend/cython/checkrc.pxd\u001b[0m in \u001b[0;36mzmq.backend.cython.checkrc._check_rc (zmq/backend/cython/socket.c:6035)\u001b[0;34m()\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mcdef\u001b[0m \u001b[0mint\u001b[0m \u001b[0merrno\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mzmq_errno\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 11\u001b[0;31m \u001b[0mPyErr_CheckSignals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 12\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrc\u001b[0m \u001b[0;34m<\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: ", + "\nDuring handling of the above exception, another exception occurred:\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 14\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma_string\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 15\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 16\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma_func\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Word? \"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/site-packages/IPython/kernel/zmq/kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m 649\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 650\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 651\u001b[0;31m \u001b[0mpassword\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 652\u001b[0m )\n\u001b[1;32m 653\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/site-packages/IPython/kernel/zmq/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 679\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 680\u001b[0m \u001b[0;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 681\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 682\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 683\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "\n", + "''''''class Decide:\n", + " def is_empty(self, word):\n", + " if len(word) == 0:\n", + " return True\n", + " else:\n", + " return\n", + "\n", + "def a_func(a_string):\n", + " decision = Decide()\n", + " if decision.is_empty(a_string):\n", + " return(\"\")\n", + " else:\n", + " return a_string[0]\n", + "\n", + "print(a_func(input(\"Word? \")))''\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/READ_ME.md b/READ_ME.md new file mode 100644 index 0000000..addd23b --- /dev/null +++ b/READ_ME.md @@ -0,0 +1,4 @@ +# Blackjack +# Jeff Hacker + +* diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 0000000..1e7bef1 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,166 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "object of type 'NoneType' has no len()", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mdeck\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdeck\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/random.py\u001b[0m in \u001b[0;36mshuffle\u001b[0;34m(self, x, random)\u001b[0m\n\u001b[1;32m 267\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrandom\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 268\u001b[0m \u001b[0mrandbelow\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_randbelow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 269\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mreversed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 270\u001b[0m \u001b[0;31m# pick an element in x[:i+1] with which to exchange x[i]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 271\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrandbelow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: object of type 'NoneType' has no len()" + ] + } + ], + "source": [ + "# Cards includes a list of 52 regular cards with no Jokers\n", + "import random\n", + "\n", + "whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs',\n", + " '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs',\n", + " '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts',\n", + " 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts',\n", + " '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts',\n", + " '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds',\n", + " 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds',\n", + " '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds',\n", + " '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades',\n", + " 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades',\n", + " '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades',\n", + " '2 of spades']\n", + "\n", + "\n", + "deck = whole_deck\n", + "\n", + "\n", + "# played_cards = []\n", + "\n", + "live_card = deck.pop()\n", + "\n", + "\n", + "# random.shuffle(lst)\n", + "\n", + "random.shuffle(deck)\n", + "print(deck)\n", + "print(live_card)\n", + " \n", + " \n", + "live_card not in deck == True" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Word? Jeff\n", + "J\n" + ] + } + ], + "source": [ + "\n", + "class Decide:\n", + " def is_empty(self, word):\n", + " if len(word) == 0:\n", + " return True\n", + " else:\n", + " return\n", + "\n", + "def a_func(a_string):\n", + " decision = Decide()\n", + " if decision.is_empty(a_string):\n", + " return(\"\")\n", + " else:\n", + " return a_string[0]\n", + "\n", + "print(a_func(input(\"Word? \")))\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K of clubs\n", + "3 of clubs\n", + "2 of clubs\n", + "[]\n" + ] + } + ], + "source": [ + "alist = ['2 of clubs', '3 of clubs', 'K of clubs']\n", + "\n", + "x = alist.pop()\n", + "print(x)\n", + "x = alist.pop()\n", + "print(x)\n", + "x = alist.pop()\n", + "print(x)\n", + "\n", + "print(alist)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/cards.py b/cards.py new file mode 100644 index 0000000..0a6444e --- /dev/null +++ b/cards.py @@ -0,0 +1,28 @@ +# Cards includes a list of 52 regular cards with no Jokers +import random + +whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs', + '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs', + '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts', + 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', + '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts', + '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds', + 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds', + '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds', + '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', + 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades', + '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades', + '2 of spades'] + + +deck = whole_deck.random.shuffle() +print(deck) + +# played_cards = []while card in deck: + +live_card = deck.pop() +print(live_deck) + +random.shuffle() + +live_card not in deck == True From fd7743cee4f255db3466f7196757c705bb461fe0 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Wed, 3 Jun 2015 21:17:50 -0400 Subject: [PATCH 2/9] dealing hands and decreasing bankroll. Displaying player hand --- Untitled.ipynb | 40 ++++++----------------- bankroll.py | 15 +++++++++ blackjack.py | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ cards.py | 42 +++++++++++++----------- 4 files changed, 134 insertions(+), 50 deletions(-) create mode 100644 bankroll.py create mode 100644 blackjack.py diff --git a/Untitled.ipynb b/Untitled.ipynb index 1e7bef1..7654547 100644 --- a/Untitled.ipynb +++ b/Untitled.ipynb @@ -2,24 +2,11 @@ "cells": [ { "cell_type": "code", - "execution_count": 182, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "ename": "TypeError", - "evalue": "object of type 'NoneType' has no len()", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 18\u001b[0;31m \u001b[0mdeck\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrandom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshuffle\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdeck\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 19\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 20\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/Users/jeffreyhacker/Documents/Python/Iron_Yard/homework/blackjack/.direnv/python-3.4.3/lib/python3.4/random.py\u001b[0m in \u001b[0;36mshuffle\u001b[0;34m(self, x, random)\u001b[0m\n\u001b[1;32m 267\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrandom\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 268\u001b[0m \u001b[0mrandbelow\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_randbelow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 269\u001b[0;31m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mreversed\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 270\u001b[0m \u001b[0;31m# pick an element in x[:i+1] with which to exchange x[i]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 271\u001b[0m \u001b[0mj\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrandbelow\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mTypeError\u001b[0m: object of type 'NoneType' has no len()" - ] - } - ], + "outputs": [], "source": [ "# Cards includes a list of 52 regular cards with no Jokers\n", "import random\n", @@ -39,18 +26,18 @@ "\n", "\n", "deck = whole_deck\n", + "random.shuffle(deck)\n", "\n", - "\n", - "# played_cards = []\n", + "played_cards = []\n", "\n", "live_card = deck.pop()\n", - "\n", + "print(live_card)\n", "\n", "# random.shuffle(lst)\n", "\n", - "random.shuffle(deck)\n", + "# random.shuffle(deck)\n", "print(deck)\n", - "print(live_card)\n", + "# print(live_card)\n", " \n", " \n", "live_card not in deck == True" @@ -58,20 +45,11 @@ }, { "cell_type": "code", - "execution_count": 184, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Word? Jeff\n", - "J\n" - ] - } - ], + "outputs": [], "source": [ "\n", "class Decide:\n", diff --git a/bankroll.py b/bankroll.py new file mode 100644 index 0000000..2698b10 --- /dev/null +++ b/bankroll.py @@ -0,0 +1,15 @@ +# The player will start the game with $100. Each play will cost $10 + +money = 100 +cost = 10 + + +def bankroll(money, cost): + if money >= 10: + money -+ cost + print(money) + return True + else: + return + +bankroll(money, cost) diff --git a/blackjack.py b/blackjack.py new file mode 100644 index 0000000..11c81e7 --- /dev/null +++ b/blackjack.py @@ -0,0 +1,87 @@ +import random +import os +os.system("clear") +# The player will start the game with $100. Each play will cost $10 + +money = 100 +cost = 10 + + +def bankroll(money, cost): + if money >= 10: + money -+ cost + print(money) + return True + else: + return + + +# Cards includes a list of 52 regular cards with no Jokers + + +whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', + '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', + '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', + '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', + 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', + '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', + '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', + 'Q of diamonds', 'J of diamonds', '10 of diamonds', + '9 of diamonds', '8 of diamonds', '7 of diamonds', + '6 of diamonds', '5 of diamonds', '4 of diamonds', + '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', + 'Q of spades', 'J of spades', '10 of spades', '9 of spades', + '8 of spades', '7 of spades', '6 of spades', '5 of spades', + '4 of spades', '3 of spades', '2 of spades'] + +deck = whole_deck + +def setup_deck(deck, whole_deck): + random.shuffle(deck) + return + + +def get_new_card(player_hand, dealer_hand): + live_card = deck.pop() + # print("{} cards left in deck".format(len(deck))) + # print(live_card) + return(live_card) + + +def win_lose(): + if win: + bankroll += 10 + print("You win") + else: + print("Better luck next time") + print("Your have {}".format(bankroll)) + + +print("Let's play some Blackjack") +print("\n") +print("You start with $100 and each play will cost $10") +money -= 10 +print("you currently have ${}".format(money)) +print("\n") +print("Hit = 'H', and Pass = 'P'") +setup_deck(deck, whole_deck) + +player_hand = [] +dealer_hand = [] + + +def deal(player_hand, dealer_hand): + counter = 0 + while counter < 2: + player_hand.append(get_new_card(player_hand, dealer_hand)) + dealer_hand.append(get_new_card(player_hand, dealer_hand)) + counter += 1 + print("{} : Your hand".format(player_hand)) + print("{} : Secret dealer hand for testing".format(dealer_hand)) + +deal(player_hand, dealer_hand) +print("\n") +print("\n") + + +# end diff --git a/cards.py b/cards.py index 0a6444e..89fcd72 100644 --- a/cards.py +++ b/cards.py @@ -1,28 +1,32 @@ # Cards includes a list of 52 regular cards with no Jokers import random -whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs', - '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs', - '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts', - 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', - '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts', - '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds', - 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds', - '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds', - '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', - 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades', - '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades', - '2 of spades'] +whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', + '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', + '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', + '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', + 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', + '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', + '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', + 'Q of diamonds', 'J of diamonds', '10 of diamonds', + '9 of diamonds', '8 of diamonds', '7 of diamonds', + '6 of diamonds', '5 of diamonds', '4 of diamonds', + '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', + 'Q of spades', 'J of spades', '10 of spades', '9 of spades', + '8 of spades', '7 of spades', '6 of spades', '5 of spades', + '4 of spades', '3 of spades', '2 of spades'] - -deck = whole_deck.random.shuffle() -print(deck) - -# played_cards = []while card in deck: +deck = whole_deck +random.shuffle(deck) live_card = deck.pop() -print(live_deck) +print(live_card) +print("{} cards left in deck".format(len(deck))) +# random.shuffle(lst) + +# random.shuffle(deck) +# print(deck) +# print(live_card) -random.shuffle() live_card not in deck == True From 1a212398a499754574960d86a6610563060de360 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Wed, 3 Jun 2015 22:21:21 -0400 Subject: [PATCH 3/9] added player decision logic. needs work --- blackjack.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/blackjack.py b/blackjack.py index 11c81e7..137485f 100644 --- a/blackjack.py +++ b/blackjack.py @@ -7,13 +7,13 @@ cost = 10 -def bankroll(money, cost): +'''def bankroll(money, cost): if money >= 10: money -+ cost print(money) return True else: - return + return''' # Cards includes a list of 52 regular cards with no Jokers @@ -79,9 +79,19 @@ def deal(player_hand, dealer_hand): print("{} : Your hand".format(player_hand)) print("{} : Secret dealer hand for testing".format(dealer_hand)) + +def player_hit_pass(player_hand): + player_input = input("'H'it or 'P'ass?").upper() + if player_input == "H": + while player_input == "H": + player_hand.append(get_new_card(player_hand, dealer_hand)) + print("{} : Your hand".format(player_hand)) + print(input("OK, hit ENTER for dealer's turn")) + + deal(player_hand, dealer_hand) print("\n") print("\n") - +player_hit_pass(player_hand) # end From 6879c11ed672d16c20516167065786a9ae73f447 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Mon, 8 Jun 2015 13:08:47 -0400 Subject: [PATCH 4/9] added Blackjack2 that Joel helped Paul, Jeff with --- .DS_Store | Bin 6148 -> 6148 bytes blackjack.py | 12 +++++--- blackjack/.DS_Store | Bin 0 -> 6148 bytes blackjack2.py | 72 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 5 deletions(-) create mode 100644 blackjack/.DS_Store create mode 100644 blackjack2.py diff --git a/.DS_Store b/.DS_Store index f53ef2cb1454a56edaf63973edf6f86aca4f34c2..8c01ff36dc251b2e916a5464d4ff5e17df0c8eed 100644 GIT binary patch delta 618 zcmZuvOH0E*5S}DexAhgV7Q{yj zst0fV10F;#{s8?Yf|oj}RYct(J70G8o7tUjPqY*5EGCB{)%{pCIXct}01|)-;DP{- zmISA9tke}f2z3Jm18ms)8HS@JF19Hb6n7v~dO?5QYz=@~k33$%1-aS886b=)I40S~ zB)gxU7Com;f2R&-p08=IlB|R}I=e_X(jAyO5ZTHUL^0zV{((1VxErlMW?Hn3(}rL8 z!Ye}XZ*0&?mRZHT8l4xmZ!p_(e{eT*%r-@FP8`^#x0(4&m}912$g4wX*E&RM+OVxG z^B85E`9~xiSY912l_pYCsYHBIpDZWhC0*AN@#!hOTvqQ185v8>F0VV~(~HZi%JohC z_TjO0e~_@htufg4U+xLPKixUZxHcE|4n_lJ&)@z98vPal7I8aii!c_HAlPyPbu+>H zm+%}A8Z+{OG|>mED6$U>KModBl8CVeuF}6^OQhx~l|~ooC-{=^wY({{{^%^hB)qu~2NHo}wr_0|Nsi1A_nqLpDPeLn1>mL$+tm#=_-{jO>#qu!>EN wU=i6Y#OBJlS&T!FWnx41W_AvK4xskUf*jwOC-aLqasUkgnZU9+LSzjy0M}0x4gdfE diff --git a/blackjack.py b/blackjack.py index 137485f..88c50ae 100644 --- a/blackjack.py +++ b/blackjack.py @@ -64,6 +64,7 @@ def win_lose(): print("you currently have ${}".format(money)) print("\n") print("Hit = 'H', and Pass = 'P'") + setup_deck(deck, whole_deck) player_hand = [] @@ -83,12 +84,13 @@ def deal(player_hand, dealer_hand): def player_hit_pass(player_hand): player_input = input("'H'it or 'P'ass?").upper() if player_input == "H": - while player_input == "H": - player_hand.append(get_new_card(player_hand, dealer_hand)) - print("{} : Your hand".format(player_hand)) - print(input("OK, hit ENTER for dealer's turn")) + # while player_input == "H": + player_hand.append(get_new_card(player_hand, dealer_hand)) + print("{} : Your hand".format(player_hand)) + print("\n") + print(input("OK, hit ENTER for dealer's turn")) + - deal(player_hand, dealer_hand) print("\n") print("\n") diff --git a/blackjack/.DS_Store b/blackjack/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..bdd96333064f0f0a12e1ae981f3a079738008616 GIT binary patch literal 6148 zcmeHKF-`+P474Fgk(|btfB;onh&4=U8EF&{wm(Z&ypG2LPV!4Qlvp+$(~)G zXE!&+IW{w2eZ4=LEzN8WC)zi|*!Y}2vYW~{5RNkr&%6EGcDLV-YNrz9-r1*p*a7h` zpFimd{%{PNIzV|TAO)m=6p#W^;35UsdtviMqM{U#0#e{t0e&AEoY)J8#Q1a|#0UVK zAsvQw%o4!H1h5wliO9e_slcRqjToMEzDNkuT;Ht^m6RA4gLye%@3T0bx;tZ9Rs5s hW5afQA4OT$xW@BdI3xxg`Je;!XMnoMq` Date: Mon, 20 Jul 2015 22:50:58 -0400 Subject: [PATCH 5/9] another start --- ClassJack.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++ blackjack.py | 5 +-- 2 files changed, 122 insertions(+), 4 deletions(-) create mode 100644 ClassJack.py diff --git a/ClassJack.py b/ClassJack.py new file mode 100644 index 0000000..f47e7aa --- /dev/null +++ b/ClassJack.py @@ -0,0 +1,121 @@ +import random +import os +os.system("clear") +# I want to try this again using classes! + +# The player will start the game with $100. Each play will cost $10 + +class Cards: + def __init__(self): + self.deck = deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', + '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', + '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', + '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', + 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', + '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', + '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', + 'Q of diamonds', 'J of diamonds', '10 of diamonds', + '9 of diamonds', '8 of diamonds', '7 of diamonds', + '6 of diamonds', '5 of diamonds', '4 of diamonds', + '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', + 'Q of spades', 'J of spades', '10 of spades', '9 of spades', + '8 of spades', '7 of spades', '6 of spades', '5 of spades', + '4 of spades', '3 of spades', '2 of spades'] + + def __str__(self): + pass + + +class Bankroll: + def __init__(self): + self.bank = 100 + self.play = 10 + + def pay_to_play(self): + if self.bank <= 0 + return + else: + self.bank -= self.play + +class PlayerHand: + def __init__(self): + self.player_hand = [] + + def __str__(self): + return self.player_hand + +class DealerHand: + def __int__(self): + self.dealer_hand = [] + + def __str__(self): + return dealer_hand = [] + + +class Dealer: + def __init__(self): + self.player = player_1 + self.dealer = dealer + + + +def setup_deck(deck, whole_deck): + random.shuffle(deck) + return + + +def get_new_card(player_hand, dealer_hand): + live_card = deck.pop() + # print("{} cards left in deck".format(len(deck))) + # print(live_card) + return(live_card) + + +def win_lose(): + if win: + bankroll += 10 + print("You win") + else: + print("Better luck next time") + print("Your have {}".format(bankroll)) + + +print("Let's play some Blackjack") +print("\n") +print("You start with $100 and each play will cost $10") +money -= 10 +print("you currently have ${}".format(money)) +print("\n") +print("Hit = 'H', and Pass = 'P'") + + + + + + +def deal(player_hand, dealer_hand): + counter = 0 + while counter < 2: + player_hand.append(get_new_card(player_hand, dealer_hand)) + dealer_hand.append(get_new_card(player_hand, dealer_hand)) + counter += 1 + print("{} : Your hand".format(player_hand)) + print("{} : Secret dealer hand for testing".format(dealer_hand)) + + +def player_hit_pass(player_hand): + player_input = input("'H'it or 'P'ass?").upper() + if player_input == "H": + # while player_input == "H": + player_hand.append(get_new_card(player_hand, dealer_hand)) + print("{} : Your hand".format(player_hand)) + print("\n") + print(input("OK, hit ENTER for dealer's turn")) + + +deal(player_hand, dealer_hand) +print("\n") +print("\n") +player_hit_pass(player_hand) + +# end diff --git a/blackjack.py b/blackjack.py index 88c50ae..13eed8f 100644 --- a/blackjack.py +++ b/blackjack.py @@ -16,10 +16,7 @@ return''' -# Cards includes a list of 52 regular cards with no Jokers - - -whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', +WHOLE_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', From 8614981ca67d225f04d670677652e75b55e274a9 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Fri, 24 Jul 2015 11:49:31 -0400 Subject: [PATCH 6/9] working Classes and most funcdtions built --- .DS_Store | Bin 6148 -> 6148 bytes .ipynb_checkpoints/ClassJack-checkpoint.ipynb | 242 ++++++++++++ ...ipynb => Joel assistance-checkpoint.ipynb} | 0 ClassJack.ipynb | 370 ++++++++++++++++++ ClassJack.py | 131 ++++--- ClassJack2.py | 31 ++ ClassJackLogic.numbers | Bin 0 -> 158196 bytes Joel assistance.ipynb | 357 +++++++++++++++++ READ_ME.md | 4 - Untitled.ipynb | 144 ------- bankroll.py | 15 - blackjack.py | 96 ----- blackjack2.py | 72 ---- docs/.gitkeep | 0 14 files changed, 1076 insertions(+), 386 deletions(-) create mode 100644 .ipynb_checkpoints/ClassJack-checkpoint.ipynb rename .ipynb_checkpoints/{Untitled-checkpoint.ipynb => Joel assistance-checkpoint.ipynb} (100%) create mode 100644 ClassJack.ipynb create mode 100644 ClassJack2.py create mode 100644 ClassJackLogic.numbers create mode 100644 Joel assistance.ipynb delete mode 100644 READ_ME.md delete mode 100644 Untitled.ipynb delete mode 100644 bankroll.py delete mode 100644 blackjack.py delete mode 100644 blackjack2.py delete mode 100644 docs/.gitkeep diff --git a/.DS_Store b/.DS_Store index 8c01ff36dc251b2e916a5464d4ff5e17df0c8eed..075581f0bf4fbeccf461aa68355ea6b153a9f40e 100644 GIT binary patch delta 92 zcmZoMXfc@JFUrNhz`)4BAi%(o&5*^A$dJsC?U}P#kYhPBBiG~!tYVuZSdKEvi!yjI qhZ*?B-6sgpC3I)Uw#0Ps}{Qe delta 210 zcmZoMXfc@JFUrfnz`)4BAi%&-#E{RB1B7}E1)BvqmNOfJq_`Q97!n!s7_yP287e(< z@{^Nt@{@onfI1m(0O=Y3fnc%~i_~T%mZOY;EDR|?^O6~gQI#^B0V>r1DgFN+$YNmN zVhCbzWpHG0VTfn&1+w%Qav4%k^)Lp3^h{P`dnw4r5DIim2}33j=P;x)q)cXG)1FvX KvYDOZFFyeFelj=! diff --git a/.ipynb_checkpoints/ClassJack-checkpoint.ipynb b/.ipynb_checkpoints/ClassJack-checkpoint.ipynb new file mode 100644 index 0000000..1d7127e --- /dev/null +++ b/.ipynb_checkpoints/ClassJack-checkpoint.ipynb @@ -0,0 +1,242 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Deck:\n", + " def __init__(self, deck):\n", + " self.deck = deck" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Player:\n", + " def __init__(self, Deck, Game):\n", + " self.hand = []\n", + "\n", + " def draw_card(self):\n", + " self.hand.append(random.choice(deck.deck))\n", + "\n", + " def hand_value(self):\n", + " if 1 in self.hand:\n", + " if 7 <= sum(self.hand) <= 11:\n", + " return sum(self.hand) + 10\n", + " return sum(self.hand)\n", + "\n", + " def dealer_hit_or_stay(self):\n", + " if self.hand_value() < 17:\n", + " self.draw_card()\n", + " else:\n", + " pass\n", + " \n", + " def player_hit_or_stay(self):\n", + " choice = input(\"Enter 'h' to Hit or just 'Enter' to Stay. \").lower()\n", + " if choice == 'h':\n", + " self.draw_card()\n", + " else:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Game:\n", + " def __init__(self, player1, player2):\n", + " self.player1 = player1\n", + " self.player2 = player2\n", + " \n", + " def __str__(self):\n", + " \n", + " def begin_game(self):\n", + " pass\n", + " \n", + " def check_for_blackjack(self):\n", + " pass\n", + " \n", + " def play_again_choice(self):\n", + " pass\n", + " \n", + " def winner(self):\n", + " if self.player1.hand > self.player2.hand:\n", + " return(\"{} is the winner with a score of {}.\".format(self.player1, self.player1.hand_value()))\n", + " elif self.player2.hand > self.player1.hand:\n", + " return(\"{} is the winner with a score of {}.\".format(self.player2, self.player2.hand_value()))\n", + " else:\n", + " return(\"It's a tie. {} {} and {} {}.\".format(self.player1, player1.hand_value(), self.player2, self.player2.hand_value()))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", + "player1 = Player(Deck, Game)" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n", + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n", + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n", + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n" + ] + } + ], + "source": [ + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[8, 10]\n", + "18\n" + ] + } + ], + "source": [ + "player1.draw_card()\n", + "player1.dealer_hit_or_stay()\n", + "player1.dealer_hit_or_stay()\n", + "player1.dealer_hit_or_stay()\n", + "player1.dealer_hit_or_stay()\n", + "print(player1.hand)\n", + "print(player1.hand_value())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Joel assistance-checkpoint.ipynb similarity index 100% rename from .ipynb_checkpoints/Untitled-checkpoint.ipynb rename to .ipynb_checkpoints/Joel assistance-checkpoint.ipynb diff --git a/ClassJack.ipynb b/ClassJack.ipynb new file mode 100644 index 0000000..7946a65 --- /dev/null +++ b/ClassJack.ipynb @@ -0,0 +1,370 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 72, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Deck:\n", + " def __init__(self, deck):\n", + " self.deck = deck" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Player:\n", + " def __init__(self, Deck, Game):\n", + " self.hand = []\n", + " self.money = 100\n", + " \n", + " def draw_card(self):\n", + " self.hand.append(random.choice(deck.deck))\n", + "\n", + " def hand_value(self):\n", + " if 1 in self.hand:\n", + " if 7 <= sum(self.hand) <= 11:\n", + " return sum(self.hand) + 10\n", + " return sum(self.hand)\n", + "\n", + " def dealer_hit_or_stay(self):\n", + " if self.hand_value() < 17:\n", + " self.draw_card()\n", + " else:\n", + " pass\n", + " \n", + " def player_hit_or_stay(self):\n", + " choice = input(\"Enter 'h' to Hit or just 'Enter' to Stay. \").lower()\n", + " if choice == 'h':\n", + " self.draw_card()\n", + " else:\n", + " pass" + ] + }, + { + "cell_type": "code", + "execution_count": 280, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "ename": "IndentationError", + "evalue": "expected an indented block (, line 42)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m42\u001b[0m\n\u001b[0;31m def check_for_blackjack(self):\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n" + ] + } + ], + "source": [ + "class Game:\n", + " def __init__(self, player1, player2):\n", + " self.player1 = player1\n", + " self.player2 = player2\n", + " \n", + " def begin_game(self):\n", + " print(\"Player funds = $\", player1.money)\n", + " print(\"Dealing cards\")\n", + " for _ in range (1, 2):\n", + " player1.draw_card()\n", + " player2.draw_card()\n", + " if player1.hand_value() == 21:\n", + " if player2.hand_value() == 21:\n", + " print(\"Player and Dealer have BlackJack!\")\n", + " print(\"Game is a tie\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " print(\"Player funds = $\", player1.money)\n", + " play_again()\n", + " print(\"Player wins with BlackJack!\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " player1.money += 10\n", + " print(\"Player funds = $\", player1.money)\n", + " game.play_again()\n", + " elif player2.hand_value() == 21:\n", + " print(\"Dealer wins with BlackJack!\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " game.play_again()\n", + " else:\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer shows\", player2.hand[0])\n", + " \n", + " def player_wins(self):\n", + " print(\"Player wins!\")\n", + " game.play_again()\n", + " \n", + " def dealer_wins(self):\n", + " \n", + " \n", + " def check_for_blackjack(self):\n", + " pass\n", + "\n", + " def play_again(self):\n", + " print('play again?')\n", + " pass\n", + "\n", + " def winner(self):\n", + " if self.player1.hand > self.player2.hand:\n", + " return(\"{} is the winner with a score of {}.\".format(self.player1, self.player1.hand_value()))\n", + " elif self.player2.hand > self.player1.hand:\n", + " return(\"{} is the winner with a score of {}.\".format(self.player2, self.player2.hand_value()))\n", + " else:\n", + " return(\"It's a tie. {} {} and {} {}.\".format(self.player1, player1.hand_value(), self.player2, self.player2.hand_value()))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 291, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Player funds = $ 100\n", + "Dealing cards\n", + "Player wins with BlackJack!\n", + "play again?\n" + ] + } + ], + "source": [ + "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", + "player1 = Player(Deck, Game)\n", + "player2 = Player(Deck, Game)\n", + "game = Game(player1, player2)\n", + "game.begin_game()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n", + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n", + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n", + "Enter 'h' to Hit or just 'Enter' to Stay. p\n", + "0\n", + "[]\n" + ] + } + ], + "source": [ + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "player1.player_hit_or_stay()\n", + "print(player1.hand_value())\n", + "print(player1.hand)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[5, 5, 10, 3, 10, 2, 10, 2, 10, 10]\n", + "67\n" + ] + } + ], + "source": [ + "player1.draw_card()\n", + "player1.dealer_hit_or_stay()\n", + "player1.dealer_hit_or_stay()\n", + "player1.dealer_hit_or_stay()\n", + "player1.dealer_hit_or_stay()\n", + "print(player1.hand)\n", + "print(player1.hand_value())\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/ClassJack.py b/ClassJack.py index f47e7aa..adcc887 100644 --- a/ClassJack.py +++ b/ClassJack.py @@ -1,42 +1,9 @@ import random import os -os.system("clear") -# I want to try this again using classes! - -# The player will start the game with $100. Each play will cost $10 - -class Cards: - def __init__(self): - self.deck = deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', - '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', - '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', - '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', - 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', - '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', - '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', - 'Q of diamonds', 'J of diamonds', '10 of diamonds', - '9 of diamonds', '8 of diamonds', '7 of diamonds', - '6 of diamonds', '5 of diamonds', '4 of diamonds', - '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', - 'Q of spades', 'J of spades', '10 of spades', '9 of spades', - '8 of spades', '7 of spades', '6 of spades', '5 of spades', - '4 of spades', '3 of spades', '2 of spades'] - def __str__(self): - pass - - -class Bankroll: - def __init__(self): - self.bank = 100 - self.play = 10 - - def pay_to_play(self): - if self.bank <= 0 - return - else: - self.bank -= self.play +os.system("clear") +# classes class PlayerHand: def __init__(self): self.player_hand = [] @@ -44,28 +11,33 @@ def __init__(self): def __str__(self): return self.player_hand + class DealerHand: def __int__(self): self.dealer_hand = [] def __str__(self): - return dealer_hand = [] + return self.dealer_hand + + +# functions +def setup_deck(deck, money): + print("Let's play some Blackjack") + print("\n") + money -= 10 + print("You currently have ${} and each play will cost $10".format(money)) + print("\n") + print("Hit = 'H', and Pass = 'P'") + return -class Dealer: - def __init__(self): - self.player = player_1 - self.dealer = dealer -def setup_deck(deck, whole_deck): - random.shuffle(deck) - return def get_new_card(player_hand, dealer_hand): - live_card = deck.pop() + live_card = Cards.pop() # print("{} cards left in deck".format(len(deck))) # print(live_card) return(live_card) @@ -80,13 +52,6 @@ def win_lose(): print("Your have {}".format(bankroll)) -print("Let's play some Blackjack") -print("\n") -print("You start with $100 and each play will cost $10") -money -= 10 -print("you currently have ${}".format(money)) -print("\n") -print("Hit = 'H', and Pass = 'P'") @@ -105,17 +70,73 @@ def deal(player_hand, dealer_hand): def player_hit_pass(player_hand): player_input = input("'H'it or 'P'ass?").upper() - if player_input == "H": - # while player_input == "H": + if player_input == "P": + return sum(player_hand) + + else: player_hand.append(get_new_card(player_hand, dealer_hand)) print("{} : Your hand".format(player_hand)) print("\n") + print(input("OK, hit ENTER for dealer's turn")) +player_hand = + + -deal(player_hand, dealer_hand) + + + +deal (player_hand, dealer_hand) print("\n") print("\n") player_hit_pass(player_hand) -# end + + + + + + +''' +class Cards: + def __init__(self): + self.deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', + '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', + '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', + '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', + 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', + '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', + '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', + 'Q of diamonds', 'J of diamonds', '10 of diamonds', + '9 of diamonds', '8 of diamonds', '7 of diamonds', + '6 of diamonds', '5 of diamonds', '4 of diamonds', + '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', + 'Q of spades', 'J of spades', '10 of spades', '9 of spades', + '8 of spades', '7 of spades', '6 of spades', '5 of spades', + '4 of spades', '3 of spades', '2 of spades'] + + @property + def __str__(self): + return random.shuffle(self.deck) +''' + +''' +class Dealer: + def __init__(self): + self.player = player_1 + self.dealer = dealer +''' + +''' +class Bankroll: + def __init__(self): + self.bank = 100 + self.play = 10 + + def pay_to_play(self): + if self.bank <= 0 + return + else: + self.bank -= self.play +''' diff --git a/ClassJack2.py b/ClassJack2.py new file mode 100644 index 0000000..4df8d87 --- /dev/null +++ b/ClassJack2.py @@ -0,0 +1,31 @@ +import random +import os +os.system("clear") + + +class Card: + + def __init__(self, value, suite=None): + self.value = value + self.suite = suite + + def __str__(self): + return self.value + + +class Player: + def __init__(self, name): + self.name = name + self.hand = [] + + def draw_card(self, card): + return sum([card.number for card in self.cards]) + + def hand_value(self): + return sum(self.hand) + + def hit_or_stay(self): + + + +class \ No newline at end of file diff --git a/ClassJackLogic.numbers b/ClassJackLogic.numbers new file mode 100644 index 0000000000000000000000000000000000000000..5fbfe2074f8a6529d2056468d9f4225c1aa381f4 GIT binary patch literal 158196 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%0DCyt3xHM6f?k7FZ86-~^wj6~ z3hC#I?=KenlZ0M+%FR68s~3GBs7RTWozn$leMnH5RWKMz2ISA>>HRQgj-Eb}BRZ|3 zk9ooxa`Fi$jbyd`K)pHz37VSIPOp9qFpW#PACewuC&%LELBO9l?-0OY4vql)%)wEB zV;uYfa9p-^8%SxVU!-9yM~4U>znKji39?x;??C;VzwQI|&Z)kl9tjz(PaoJRjQ&yQ zu34qVvYN&8y~a?UF~UH{1Q97}f>mNl&$W`C^d;8(xw4gN7wihIV0hQSB1EF!1SdjO zmoWnrY`tz$^FBATrXl6WPN~z8q!~F#$2S1QT-Xy3_GG)rFx%a5^%U^0ocSBTX%5Z+ z{LaByfO8z22e=^H+D)(OghJMaI`*W|P{xhPU+bx-ce?(~U-#+ykY_$vqcz*_B!v6Y zr|pDJ)2Rh&4AW1vQm;ZvX;(-mk{gifhFGb_kf{x*S08mIE@tHv=+$olX7iU{#LF+W z6Jq=5)ysfaIPWUJH4d%={K3HufSVlL0=O;P`t)g?O(i9bQE>*-G+Ii#=`20L$GRw% z#u|G2=->Qx@1qZy=qm~+j^PP*UuxAZxKkf$jlw9@_xg|ujS;yzU(^new88=pymZ-i zSC`e1ewd0eH&6Gl1t1 ze2Q3`nq3M~mYJ&Vr;GFgI$eQfu*R&bcZ&YaU-v2ckXt_37htwuObGI&wuJ@VrcgVs z+wCEGHGQx7PSUU zli9S9j?xV>un?BWYI{5B-~4s&q!01>h`z}B2ML|@)HU;NuN2y_Yj4(kGi`=apA_PH zrBe@{s-B$m;-ohx|K#Lz)M8})B8a~@r%0Z{b5wkS%Ydep4lmtrxkOn%_wjShVC*E~8V?e)g%fgJdUHMMFI4TdOlcmNFSJKXx(t#o ?bR{*T! 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 literal 0 HcmV?d00001 diff --git a/Joel assistance.ipynb b/Joel assistance.ipynb new file mode 100644 index 0000000..604fc75 --- /dev/null +++ b/Joel assistance.ipynb @@ -0,0 +1,357 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "5 of diamonds\n", + "['K of spades', '4 of hearts', '4 of diamonds', '8 of spades', 'A of diamonds', 'A of clubs', 'K of diamonds', 'Q of hearts', 'Q of diamonds', 'J of hearts', 'J of spades', '8 of clubs', '8 of hearts', '10 of spades', 'K of clubs', '2 of spades', '4 of spades', '5 of hearts', 'Q of spades', '7 of diamonds', '6 of diamonds', '2 of diamonds', 'K of hearts', '9 of hearts', '4 of clubs', 'A of hearts', '6 of clubs', '6 of spades', '5 of clubs', '3 of diamonds', 'A of spades', '5 of spades', '10 of clubs', '9 of spades', 'J of clubs', '2 of clubs', '7 of clubs', '3 of spades', '9 of clubs', '2 of hearts', '10 of diamonds', '7 of spades', '10 of hearts', '9 of diamonds', 'Q of clubs', '3 of clubs', '3 of hearts', 'J of diamonds', '6 of hearts', '7 of hearts', '8 of diamonds']\n" + ] + }, + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Cards includes a list of 52 regular cards with no Jokers\n", + "import random\n", + "\n", + "whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs',\n", + " '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs',\n", + " '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts',\n", + " 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts',\n", + " '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts',\n", + " '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds',\n", + " 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds',\n", + " '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds',\n", + " '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades',\n", + " 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades',\n", + " '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades',\n", + " '2 of spades']\n", + "\n", + "\n", + "deck = whole_deck\n", + "random.shuffle(deck)\n", + "\n", + "played_cards = []\n", + "\n", + "live_card = deck.pop()\n", + "print(live_card)\n", + "\n", + "# random.shuffle(lst)\n", + "\n", + "# random.shuffle(deck)\n", + "print(deck)\n", + "# print(live_card)\n", + " \n", + " \n", + "live_card not in deck == True" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "K of clubs\n", + "3 of clubs\n", + "2 of clubs\n", + "[]\n" + ] + } + ], + "source": [ + "alist = ['2 of clubs', '3 of clubs', 'K of clubs']\n", + "\n", + "x = alist.pop()\n", + "print(x)\n", + "x = alist.pop()\n", + "print(x)\n", + "x = alist.pop()\n", + "print(x)\n", + "\n", + "print(alist)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Play again? 'Y' or 'N' y\n", + "deal\n" + ] + } + ], + "source": [ + "def deal():\n", + " print(\"deal\")\n", + "\n", + "def play_again_choice():\n", + " play_choice = input(\"Play again? 'Y' or 'N' \").lower()\n", + " if play_choice == 'y':\n", + " return deal()\n", + " \n", + "play_again_choice()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "aaron\n" + ] + } + ], + "source": [ + "class Person:\n", + " \n", + " def __init__(self, name, friend=None):\n", + " self.name = name\n", + " self.friend = friend\n", + "\n", + "aaron = Person(\"aaron\")\n", + "joel = Person(\"joel\", aaron)\n", + "print(joel.friend.name)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "card\n", + " - suit <- attribute\n", + " - number <- attribute\n", + " - has no abilities\n", + "\n", + "player\n", + " - cards <- attribute\n", + " - has the ability to accept cards <- methods\n", + " - has the ability to hit\n", + " - has the ability to stay\n", + " \n", + "dealer\n", + " - cards <- attribute\n", + " - has the ability to accept cards <- methods\n", + " - has the ability to hit\n", + " - has the ability to stay\n", + " - can decide to stay or hit\n", + "\n", + "game\n", + " - player <- attribute\n", + " - dealer <- attribute\n", + " - has the ability to generate a deck of cards\n", + " - has the ability to give cards to player & dealer <- methods\n", + " - has the ability to ask a player/dealer to hit or stay" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Card:\n", + " \n", + " def __init__(self, suit, number):\n", + " self.suit = suit\n", + " self.number = number\n", + " \n", + " def __str__(self):\n", + " return \"{} of {}s\".format(self.number, self.suit)" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "class Player:\n", + " \n", + " def __init__(self):\n", + " self.cards = []\n", + " \n", + " def add_card(self, card):\n", + " self.cards.append(card)\n", + " \n", + " def get_hand_value(self):\n", + " return sum([card.number for card in self.cards])\n", + " \n", + " def should_i_hit(self):\n", + " return self.get_hand_value() < 14" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "joel = Player()\n", + "joel.add_card(cards[1])\n", + "joel.add_card(cards[8])" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[<__main__.Card object at 0x10f356b70>, <__main__.Card object at 0x10f356cf8>]\n", + "11\n", + "True\n", + "False\n", + "17\n" + ] + } + ], + "source": [ + "print(joel.cards)\n", + "print(joel.get_hand_value())\n", + "print(joel.should_i_hit())\n", + "joel.add_card(cards[5])\n", + "print(joel.should_i_hit())\n", + "print(joel.get_hand_value())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/READ_ME.md b/READ_ME.md deleted file mode 100644 index addd23b..0000000 --- a/READ_ME.md +++ /dev/null @@ -1,4 +0,0 @@ -# Blackjack -# Jeff Hacker - -* diff --git a/Untitled.ipynb b/Untitled.ipynb deleted file mode 100644 index 7654547..0000000 --- a/Untitled.ipynb +++ /dev/null @@ -1,144 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "# Cards includes a list of 52 regular cards with no Jokers\n", - "import random\n", - "\n", - "whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs',\n", - " '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs',\n", - " '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts',\n", - " 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts',\n", - " '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts',\n", - " '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds',\n", - " 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds',\n", - " '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds',\n", - " '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades',\n", - " 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades',\n", - " '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades',\n", - " '2 of spades']\n", - "\n", - "\n", - "deck = whole_deck\n", - "random.shuffle(deck)\n", - "\n", - "played_cards = []\n", - "\n", - "live_card = deck.pop()\n", - "print(live_card)\n", - "\n", - "# random.shuffle(lst)\n", - "\n", - "# random.shuffle(deck)\n", - "print(deck)\n", - "# print(live_card)\n", - " \n", - " \n", - "live_card not in deck == True" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "\n", - "class Decide:\n", - " def is_empty(self, word):\n", - " if len(word) == 0:\n", - " return True\n", - " else:\n", - " return\n", - "\n", - "def a_func(a_string):\n", - " decision = Decide()\n", - " if decision.is_empty(a_string):\n", - " return(\"\")\n", - " else:\n", - " return a_string[0]\n", - "\n", - "print(a_func(input(\"Word? \")))\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": 190, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "K of clubs\n", - "3 of clubs\n", - "2 of clubs\n", - "[]\n" - ] - } - ], - "source": [ - "alist = ['2 of clubs', '3 of clubs', 'K of clubs']\n", - "\n", - "x = alist.pop()\n", - "print(x)\n", - "x = alist.pop()\n", - "print(x)\n", - "x = alist.pop()\n", - "print(x)\n", - "\n", - "print(alist)\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.4.3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/bankroll.py b/bankroll.py deleted file mode 100644 index 2698b10..0000000 --- a/bankroll.py +++ /dev/null @@ -1,15 +0,0 @@ -# The player will start the game with $100. Each play will cost $10 - -money = 100 -cost = 10 - - -def bankroll(money, cost): - if money >= 10: - money -+ cost - print(money) - return True - else: - return - -bankroll(money, cost) diff --git a/blackjack.py b/blackjack.py deleted file mode 100644 index 13eed8f..0000000 --- a/blackjack.py +++ /dev/null @@ -1,96 +0,0 @@ -import random -import os -os.system("clear") -# The player will start the game with $100. Each play will cost $10 - -money = 100 -cost = 10 - - -'''def bankroll(money, cost): - if money >= 10: - money -+ cost - print(money) - return True - else: - return''' - - -WHOLE_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', - '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', - '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', - '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', - 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', - '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', - '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', - 'Q of diamonds', 'J of diamonds', '10 of diamonds', - '9 of diamonds', '8 of diamonds', '7 of diamonds', - '6 of diamonds', '5 of diamonds', '4 of diamonds', - '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', - 'Q of spades', 'J of spades', '10 of spades', '9 of spades', - '8 of spades', '7 of spades', '6 of spades', '5 of spades', - '4 of spades', '3 of spades', '2 of spades'] - -deck = whole_deck - -def setup_deck(deck, whole_deck): - random.shuffle(deck) - return - - -def get_new_card(player_hand, dealer_hand): - live_card = deck.pop() - # print("{} cards left in deck".format(len(deck))) - # print(live_card) - return(live_card) - - -def win_lose(): - if win: - bankroll += 10 - print("You win") - else: - print("Better luck next time") - print("Your have {}".format(bankroll)) - - -print("Let's play some Blackjack") -print("\n") -print("You start with $100 and each play will cost $10") -money -= 10 -print("you currently have ${}".format(money)) -print("\n") -print("Hit = 'H', and Pass = 'P'") - -setup_deck(deck, whole_deck) - -player_hand = [] -dealer_hand = [] - - -def deal(player_hand, dealer_hand): - counter = 0 - while counter < 2: - player_hand.append(get_new_card(player_hand, dealer_hand)) - dealer_hand.append(get_new_card(player_hand, dealer_hand)) - counter += 1 - print("{} : Your hand".format(player_hand)) - print("{} : Secret dealer hand for testing".format(dealer_hand)) - - -def player_hit_pass(player_hand): - player_input = input("'H'it or 'P'ass?").upper() - if player_input == "H": - # while player_input == "H": - player_hand.append(get_new_card(player_hand, dealer_hand)) - print("{} : Your hand".format(player_hand)) - print("\n") - print(input("OK, hit ENTER for dealer's turn")) - - -deal(player_hand, dealer_hand) -print("\n") -print("\n") -player_hit_pass(player_hand) - -# end diff --git a/blackjack2.py b/blackjack2.py deleted file mode 100644 index 1b5ed83..0000000 --- a/blackjack2.py +++ /dev/null @@ -1,72 +0,0 @@ -import random -import os - - -# This class is being used only to create a shuffled deck to draw from -class Deck: - card_deck = [['A of clubs', 'A'], ['K of clubs', 10], ['Q of clubs',10], ['J of clubs',10], - ['10 of clubs',10], ['9 of clubs',9], ['8 of clubs',8], ['7 of clubs', 7], - ['6 of clubs',6], ['5 of clubs', 5], ['4 of clubs', 4], ['3 of clubs',3], - ['2 of clubs',2], ['A of hearts','A'], ['K of hearts', 10], ['Q of hearts', 10], - ['J of hearts',10], ['10 of hearts',10], ['9 of hearts', 9], ['8 of hearts', 8], - ['7 of hearts', 7], ['6 of hearts', 6], ['5 of hearts', 5], ['4 f hearts', 4], - ['3 of hearts', 3], ['2 of hearts', 2], ['A of diamonds','A'], ['K of diamonds', 10], - ['Q of diamonds', 10], ['J of diamonds', 10], ['10 of diamonds', 10], - ['9 of diamonds', 9], ['8 of diamonds', 8], ['7 of diamonds', 7], - ['6 of diamonds', 6], ['5 of diamonds', 5], ['4 of diamonds', 4], - ['3 of diamonds', 3], ['2 of diamonds', 2], ['A of spades','A'], ['K of spades', 10], - ['Q of spades', 10], ['J of spades', 10], ['10 of spades', 10], ['9 of spades', 9], - ['8 of spades', 8], ['7 of spades', 7], ['6 of spades', 6], ['5 of spades', 5], - ['4 of spades', 4], ['3 of spades', 3], ['2 of spades', 2]] - - -# this obviously is the generic hand used to create the players hands -class Hand: - def __init__(self, name): - self.name = name - self.value_hand = [] - self.display_hand = [] - def initial_has_21(self): - if "A" in self.value_hand and 10 in self.value_hand: - return True - else: - return False -#class Dealer: - -def initial_deal(deck, player_hand, dealer_hand): - for i in range(2): - live_card, card_value = deck.card_deck.pop() - print(live_card) - #return live_card - player_hand.display_hand.append(live_card) - player_hand.value_hand.append(card_value) - live_card, card_value = deck.card_deck.pop() - dealer_hand.display_hand.append(live_card) - dealer_hand.value_hand.append(card_value) - player_hand.value_hand = ["A", 10] - if player_hand.initial_has_21() or dealer_hand.initial_has_21(): - print("Black Jack") - print(player_hand.display_hand) - print(player_hand.value_hand) - print(dealer_hand.display_hand) - print(dealer_hand.value_hand) - -player_hand = Hand("Player 1") -dealer_hand = Hand("Dealer") -deck = Deck() -player_hand.value_hand = ["A", 10] -dealer_hand.value_hand = ["A", 9] - -#initial_deal(deck, player_hand, dealer_hand) -#print(deck.card_deck) -#game = Dealer() -#game.init_hand(self, dealer_hand, player_hand, card) - -#print('player display {}'.format(player_hand.display_hand)) -#print('player value {}'.format(player_hand.value_hand)) - -#print('dealer display {}'.format(dealer_hand.display_hand)) -#print('dealer value {}'.format(dealer_hand.value_hand)) - -#deal = Deal() -#deal.deal_init_hands() diff --git a/docs/.gitkeep b/docs/.gitkeep deleted file mode 100644 index e69de29..0000000 From 9c2ba528fd981b614ba8dfe68a2b0b0c13e94d63 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Fri, 24 Jul 2015 23:46:34 -0400 Subject: [PATCH 7/9] working self-play, minor bugs in interactive, iPyth version works --- .ipynb_checkpoints/ClassJack-checkpoint.ipynb | 254 +++++++++---- ClassJack.ipynb => BlackJack.ipynb | 198 +++++----- BlackJack_interactive.py | 142 +++++++ BlackJack_self-playing.py | 138 +++++++ ClassJack.py | 142 ------- ClassJack2.py | 31 -- Joel assistance.ipynb | 357 ------------------ cards.py | 32 -- 8 files changed, 584 insertions(+), 710 deletions(-) rename ClassJack.ipynb => BlackJack.ipynb (58%) create mode 100644 BlackJack_interactive.py create mode 100644 BlackJack_self-playing.py delete mode 100644 ClassJack.py delete mode 100644 ClassJack2.py delete mode 100644 Joel assistance.ipynb delete mode 100644 cards.py diff --git a/.ipynb_checkpoints/ClassJack-checkpoint.ipynb b/.ipynb_checkpoints/ClassJack-checkpoint.ipynb index 1d7127e..7b411be 100644 --- a/.ipynb_checkpoints/ClassJack-checkpoint.ipynb +++ b/.ipynb_checkpoints/ClassJack-checkpoint.ipynb @@ -26,18 +26,20 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class Player:\n", - " def __init__(self, Deck, Game):\n", + " def __init__(self, deck):\n", " self.hand = []\n", - "\n", + " self.money = 100\n", + " self.deck = deck\n", + " \n", " def draw_card(self):\n", - " self.hand.append(random.choice(deck.deck))\n", + " self.hand.append(random.choice(self.deck.deck))\n", "\n", " def hand_value(self):\n", " if 1 in self.hand:\n", @@ -46,22 +48,20 @@ " return sum(self.hand)\n", "\n", " def dealer_hit_or_stay(self):\n", - " if self.hand_value() < 17:\n", - " self.draw_card()\n", - " else:\n", - " pass\n", - " \n", + " for _ in range(10):\n", + " if self.hand_value() < 17:\n", + " self.draw_card()\n", + "\n", " def player_hit_or_stay(self):\n", " choice = input(\"Enter 'h' to Hit or just 'Enter' to Stay. \").lower()\n", " if choice == 'h':\n", " self.draw_card()\n", - " else:\n", - " pass" + " self.player_hit_or_stay()" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": { "collapsed": false }, @@ -73,40 +73,73 @@ " self.player2 = player2\n", " \n", " def __str__(self):\n", - " \n", + " pass\n", + "\n", " def begin_game(self):\n", - " pass\n", - " \n", - " def check_for_blackjack(self):\n", - " pass\n", - " \n", - " def play_again_choice(self):\n", - " pass\n", - " \n", - " def winner(self):\n", - " if self.player1.hand > self.player2.hand:\n", - " return(\"{} is the winner with a score of {}.\".format(self.player1, self.player1.hand_value()))\n", - " elif self.player2.hand > self.player1.hand:\n", - " return(\"{} is the winner with a score of {}.\".format(self.player2, self.player2.hand_value()))\n", - " else:\n", - " return(\"It's a tie. {} {} and {} {}.\".format(self.player1, player1.hand_value(), self.player2, self.player2.hand_value()))\n" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", - "player1 = Player(Deck, Game)" + " print(\"Player funds = $\", player1.money)\n", + " print(\"Dealing cards\")\n", + " for _ in range(2):\n", + " player1.draw_card()\n", + " player2.draw_card()\n", + " if player1.hand_value() == 21:\n", + " if player2.hand_value() == 21:\n", + " print(\"Player and Dealer have BlackJack!\")\n", + " print(\"Game is a tie\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", + " print(\"Player wins with BlackJack!\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " player1.money += 10\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", + " elif player2.hand_value() == 21:\n", + " print(\"Dealer wins with BlackJack!\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " player1.money -= 10\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", + " else:\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer shows\", player2.hand[0])\n", + " \n", + " def play_again(self):\n", + " play_choice = input(\"Play again? Enter 'Y'es or just Enter to quit\").lower()\n", + " if play_choice == y:\n", + " player1.hand = []\n", + " player2.hand = []\n", + " self.begin_game()\n", + " else:\n", + " return(\"Your final dollar amount is ${}\".format(player.money))\n", + " enter(\"Press Enter to exit\")\n", + " os.system(\"clear\")\n", + "\n", + " def winner(self):\n", + " if player1.hand_value() > 21:\n", + " if player2.hand_value() > 21:\n", + " return \"Player and Dealer have both busted\"\n", + " player1.money -= 10\n", + " return \"Player has gone bust. Dealer wins\"\n", + " elif self.player2.hand_value() > 21:\n", + " player1.money += 10\n", + " return \"Dealer has gone bust. Player wins\"\n", + " elif self.player1.hand > self.player2.hand:\n", + " player1.money += 10\n", + " return(\"Player is the winner with a score of {}.\".format(self.player1.hand_value()))\n", + " elif self.player2.hand > self.player1.hand:\n", + " player1.money -= 10\n", + " return(\"Dealer is the winner with a score of {}.\".format(self.player2.hand_value()))\n", + " else:\n", + " return(\"It's a tie. Player {} / Dealer {}\".format(self.player1.hand_value(), self.player2.hand_value()))\n", + "\n" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -115,21 +148,123 @@ "name": "stdout", "output_type": "stream", "text": [ - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n", - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n", - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n", - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n" + "Player funds = $ 100\n", + "Dealing cards\n", + "Player hand [1, 2]\n", + "Dealer shows 10\n", + "Player has $100\n" ] } ], + "source": [ + "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", + "player1 = Player(deck)\n", + "player2 = Player(deck)\n", + "game = Game(player1, player2)\n", + "game.begin_game()\n", + "player1.dealer_hit_or_stay()\n", + "player2.dealer_hit_or_stay()\n", + "game.winner()\n", + "print(\"Player has ${}\".format(player1.money))\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], "source": [ "player1.player_hit_or_stay()\n", "print(player1.hand_value())\n", @@ -148,20 +283,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[8, 10]\n", - "18\n" - ] - } - ], + "outputs": [], "source": [ "player1.draw_card()\n", "player1.dealer_hit_or_stay()\n", diff --git a/ClassJack.ipynb b/BlackJack.ipynb similarity index 58% rename from ClassJack.ipynb rename to BlackJack.ipynb index 7946a65..b6e6dca 100644 --- a/ClassJack.ipynb +++ b/BlackJack.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 72, + "execution_count": 1, "metadata": { "collapsed": true }, @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -26,19 +26,20 @@ }, { "cell_type": "code", - "execution_count": 116, + "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "class Player:\n", - " def __init__(self, Deck, Game):\n", + " def __init__(self, deck):\n", " self.hand = []\n", " self.money = 100\n", + " self.deck = deck\n", " \n", " def draw_card(self):\n", - " self.hand.append(random.choice(deck.deck))\n", + " self.hand.append(random.choice(self.deck.deck))\n", "\n", " def hand_value(self):\n", " if 1 in self.hand:\n", @@ -47,45 +48,37 @@ " return sum(self.hand)\n", "\n", " def dealer_hit_or_stay(self):\n", - " if self.hand_value() < 17:\n", - " self.draw_card()\n", - " else:\n", - " pass\n", - " \n", + " for _ in range(10):\n", + " if self.hand_value() < 17:\n", + " self.draw_card()\n", + "\n", " def player_hit_or_stay(self):\n", " choice = input(\"Enter 'h' to Hit or just 'Enter' to Stay. \").lower()\n", " if choice == 'h':\n", " self.draw_card()\n", - " else:\n", - " pass" + " self.player_hit_or_stay()" ] }, { "cell_type": "code", - "execution_count": 280, + "execution_count": 94, "metadata": { "collapsed": false }, - "outputs": [ - { - "ename": "IndentationError", - "evalue": "expected an indented block (, line 42)", - "output_type": "error", - "traceback": [ - "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m42\u001b[0m\n\u001b[0;31m def check_for_blackjack(self):\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n" - ] - } - ], + "outputs": [], "source": [ "class Game:\n", " def __init__(self, player1, player2):\n", " self.player1 = player1\n", " self.player2 = player2\n", - " \n", + " \n", + " def __str__(self):\n", + " pass\n", + "\n", " def begin_game(self):\n", - " print(\"Player funds = $\", player1.money)\n", + " print(\"Player funds = ${}\".format(player1.money))\n", " print(\"Dealing cards\")\n", - " for _ in range (1, 2):\n", + " for _ in range(2):\n", " player1.draw_card()\n", " player2.draw_card()\n", " if player1.hand_value() == 21:\n", @@ -95,48 +88,80 @@ " print(\"Player hand \", player1.hand)\n", " print(\"Dealer hand \", player2.hand)\n", " print(\"Player funds = $\", player1.money)\n", - " play_again()\n", + " self.play_again()\n", " print(\"Player wins with BlackJack!\")\n", " print(\"Player hand \", player1.hand)\n", " print(\"Dealer hand \", player2.hand)\n", " player1.money += 10\n", " print(\"Player funds = $\", player1.money)\n", - " game.play_again()\n", + " self.play_again()\n", " elif player2.hand_value() == 21:\n", " print(\"Dealer wins with BlackJack!\")\n", " print(\"Player hand \", player1.hand)\n", " print(\"Dealer hand \", player2.hand)\n", - " game.play_again()\n", + " player1.money -= 10\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", " else:\n", " print(\"Player hand \", player1.hand)\n", " print(\"Dealer shows\", player2.hand[0])\n", + " game.game_continue()\n", " \n", - " def player_wins(self):\n", - " print(\"Player wins!\")\n", - " game.play_again()\n", - " \n", - " def dealer_wins(self):\n", - " \n", - " \n", - " def check_for_blackjack(self):\n", - " pass\n", + " def game_continue(self):\n", + " player1.dealer_hit_or_stay()\n", + " player2.dealer_hit_or_stay()\n", + " game.winner()\n", "\n", + " \n", " def play_again(self):\n", - " print('play again?')\n", - " pass\n", + " play_choice = input(\"Play again? Enter 'Y'es or just Enter to quit\").lower()\n", + " if play_choice == 'y':\n", + " player1.hand = []\n", + " player2.hand = []\n", + " game.begin_game()\n", + " else:\n", + " return(\"Your final dollar amount is ${}\".format(player1.money))\n", + " enter(\"Press Enter to exit\")\n", + " #os.system(\"clear\")\n", "\n", " def winner(self):\n", - " if self.player1.hand > self.player2.hand:\n", - " return(\"{} is the winner with a score of {}.\".format(self.player1, self.player1.hand_value()))\n", - " elif self.player2.hand > self.player1.hand:\n", - " return(\"{} is the winner with a score of {}.\".format(self.player2, self.player2.hand_value()))\n", + " if player1.hand_value() > 21:\n", + " if player2.hand_value() > 21:\n", + " print(\"Player and Dealer have both gone bust\")\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " player1.money -= 10\n", + " print(\"Player has gone bust. Dealer wins\")\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " elif player2.hand_value() > 21:\n", + " player1.money += 10\n", + " print(\"Dealer has gone bust. Player wins\")\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " elif player1.hand > player2.hand:\n", + " player1.money += 10\n", + " print(\"Player is the winner with a score of {}.\".format(self.player1.hand_value()))\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " elif player2.hand > player1.hand:\n", + " player1.money -= 10\n", + " print(\"Dealer is the winner with a score of {}.\".format(self.player2.hand_value()))\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", " else:\n", - " return(\"It's a tie. {} {} and {} {}.\".format(self.player1, player1.hand_value(), self.player2, self.player2.hand_value()))\n" + " print(\"It's a tie. Player {} / Dealer {}\".format(self.player1.hand_value(), self.player2.hand_value()))\n", + " game.show_cards()\n", + "\n", + " def show_cards(self):\n", + " print(\"Player hand \", player1.hand, \"total score\", player1.hand_value())\n", + " print(\"Dealer hand \", player2.hand, \"total score\", player2.hand_value())\n", + " game.play_again()\n" ] }, { "cell_type": "code", - "execution_count": 291, + "execution_count": 95, "metadata": { "collapsed": false }, @@ -145,19 +170,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "Player funds = $ 100\n", + "Player funds = $100\n", + "Dealing cards\n", + "Player hand [10, 10]\n", + "Dealer shows 10\n", + "Player is the winner with a score of 20.\n", + "Player has $110\n", + "Player hand [10, 10] total score 20\n", + "Dealer hand [10, 4, 7] total score 21\n", + "Play again? Enter 'Y'es or just Enter to quity\n", + "Player funds = $110\n", "Dealing cards\n", - "Player wins with BlackJack!\n", - "play again?\n" + "Player hand [5, 6]\n", + "Dealer shows 3\n", + "Player is the winner with a score of 21.\n", + "Player has $120\n", + "Player hand [5, 6, 10] total score 21\n", + "Dealer hand [3, 5, 9] total score 17\n", + "Play again? Enter 'Y'es or just Enter to quit\n" ] } ], "source": [ "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", - "player1 = Player(Deck, Game)\n", - "player2 = Player(Deck, Game)\n", + "player1 = Player(deck)\n", + "player2 = Player(deck)\n", "game = Game(player1, player2)\n", - "game.begin_game()" + "game.begin_game()\n", + "#print(\"Player has ${}\".format(player1.money))\n" ] }, { @@ -234,30 +274,29 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n", - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n", - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n", - "Enter 'h' to Hit or just 'Enter' to Stay. p\n", - "0\n", - "[]\n" - ] - } - ], + "outputs": [], "source": [ "player1.player_hit_or_stay()\n", "print(player1.hand_value())\n", @@ -276,20 +315,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[5, 5, 10, 3, 10, 2, 10, 2, 10, 10]\n", - "67\n" - ] - } - ], + "outputs": [], "source": [ "player1.draw_card()\n", "player1.dealer_hit_or_stay()\n", diff --git a/BlackJack_interactive.py b/BlackJack_interactive.py new file mode 100644 index 0000000..2b2e5be --- /dev/null +++ b/BlackJack_interactive.py @@ -0,0 +1,142 @@ +import random +import os + + +class Deck: + def __init__(self, deck): + self.deck = deck + + +class Player: + def __init__(self, deck): + self.hand = [] + self.money = 100 + self.deck = deck + + def draw_card(self): + self.hand.append(random.choice(self.deck.deck)) + + def hand_value(self): + if 1 in self.hand: + if 7 <= sum(self.hand) <= 11: + return sum(self.hand) + 10 + return sum(self.hand) + + def dealer_hit_or_stay(self): + for _ in range(10): + if self.hand_value() < 17: + self.draw_card() + + def player_hit_or_stay(self): + choice = input("Enter 'h' to Hit or just 'Enter' to Stay. ").lower() + if choice == 'h': + self.draw_card() + print(player1.hand, "score", player1.hand_value()) + if player1.hand_value() > 21: + game.winner() + game.begin_game() + self.player_hit_or_stay() + + +class Game: + def __init__(self, player1, player2): + self.player1 = player1 + self.player2 = player2 + + + def begin_game(self): + import os + os.system("clear") + + print ("Player has ${} to play with:".format(player1.money)) + print("Dealing cards...") + for _ in range(2): + player1.draw_card() + player2.draw_card() + if player1.hand_value() == 21: + if player2.hand_value() == 21: + print("Player and Dealer have BlackJack!") + print("Game is a tie") + print("Player hand ", player1.hand) + print("Dealer hand ", player2.hand) + print("Player funds = $", player1.money) + self.play_again() + print("Player wins with BlackJack!") + print("Player hand ", player1.hand) + print("Dealer hand ", player2.hand) + player1.money += 10 + print("Player funds = $", player1.money) + self.play_again() + elif player2.hand_value() == 21: + print("Dealer wins with BlackJack!") + print("Player hand ", player1.hand) + print("Dealer hand ", player2.hand) + player1.money -= 10 + print("Player funds = $", player1.money) + self.play_again() + else: + print("Player hand ", player1.hand) + print("Dealer is showing a [{}]".format(player2.hand[0])) + game.game_continue() + + def game_continue(self): + player1.player_hit_or_stay() + if player1.hand_value() > 21: + game.winner() + return + player2.dealer_hit_or_stay() + game.winner() + + def play_again(self): + play_choice = input("Play again? Enter 'Y'es or just Enter to quit ").lower() + if play_choice == 'y': + player1.hand = [] + player2.hand = [] + else: + print("Your final dollar amount is ${}".format(player1.money)) + return + + + def winner(self): + if player1.hand_value() > 21: + player1.money -= 10 + print("Player has gone bust") + print("Player has ${}".format(player1.money)) + elif player2.hand_value() > 21: + print("Dealer has gone bust") + player1.money += 10 + print("Player has ${}".format(player1.money)) + game.show_cards() + elif player2.hand_value() > 21: + player1.money += 10 + print("Dealer has gone bust. Player wins") + print("Player has ${}".format(player1.money)) + game.show_cards() + elif player1.hand_value() > player2.hand_value(): + player1.money += 10 + print("Player is the winner with a score of {}.".format(self.player1.hand_value())) + print("Player has ${}".format(player1.money)) + game.show_cards() + elif player2.hand_value() > player1.hand_value(): + player1.money -= 10 + print("Dealer is the winner with a score of {}.".format(self.player2.hand_value())) + print("Player has ${}".format(player1.money)) + game.show_cards() + else: + print("It's a tie. Player {} / Dealer {}".format(self.player1.hand_value(), self.player2.hand_value())) + game.show_cards() + + def show_cards(self): + print("Player hand ", player1.hand, "total score", player1.hand_value()) + print("Dealer hand ", player2.hand, "total score", player2.hand_value()) + if player1.money == 0: + print("Sorry, you are out of money. You'll have to start the game again.") + quit() + else: + game.play_again() + +deck = Deck(deck=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]) +player1 = Player(deck) +player2 = Player(deck) +game = Game(player1, player2) +game.begin_game() diff --git a/BlackJack_self-playing.py b/BlackJack_self-playing.py new file mode 100644 index 0000000..5d87b43 --- /dev/null +++ b/BlackJack_self-playing.py @@ -0,0 +1,138 @@ +import random +import os + + +class Deck: + def __init__(self, deck): + self.deck = deck + + +class Player: + def __init__(self, deck): + self.hand = [] + self.money = 100 + self.deck = deck + + def draw_card(self): + self.hand.append(random.choice(self.deck.deck)) + + def hand_value(self): + if 1 in self.hand: + if 7 <= sum(self.hand) <= 11: + return sum(self.hand) + 10 + return sum(self.hand) + + def dealer_hit_or_stay(self): + for _ in range(10): + if self.hand_value() < 17: + self.draw_card() + + def player_hit_or_stay(self): + choice = input("Enter 'h' to Hit or just 'Enter' to Stay. ").lower() + if choice == 'h': + self.draw_card() + self.player_hit_or_stay() + + +class Game: + def __init__(self, player1, player2): + self.player1 = player1 + self.player2 = player2 + + + def begin_game(self): + import os + os.system("clear") + + print ("Player has ${} to play with:".format(player1.money)) + print("Dealing cards...") + for _ in range(2): + player1.draw_card() + player2.draw_card() + if player1.hand_value() == 21: + if player2.hand_value() == 21: + print("Player and Dealer have BlackJack!") + print("Game is a tie") + print("Player hand ", player1.hand) + print("Dealer hand ", player2.hand) + print("Player funds = $", player1.money) + self.play_again() + print("Player wins with BlackJack!") + print("Player hand ", player1.hand) + print("Dealer hand ", player2.hand) + player1.money += 10 + print("Player funds = $", player1.money) + self.play_again() + elif player2.hand_value() == 21: + print("Dealer wins with BlackJack!") + print("Player hand ", player1.hand) + print("Dealer hand ", player2.hand) + player1.money -= 10 + print("Player funds = $", player1.money) + self.play_again() + else: + print("Player hand ", player1.hand) + print("Dealer is showing a [{}]".format(player2.hand[0])) + game.game_continue() + + def game_continue(self): + player1.dealer_hit_or_stay() + player2.dealer_hit_or_stay() + game.winner() + + def play_again(self): + play_choice = input("Play again? Enter 'Y'es or just Enter to quit").lower() + if play_choice == 'y': + player1.hand = [] + player2.hand = [] + game.begin_game() + else: + print("Your final dollar amount is ${}".format(player1.money)) + #return + + + def winner(self): + if player1.hand_value() > 21: + player1.money -= 10 + print("Player has gone bust") + if player2.hand_value() > 21: + print("Dealer has also gone bust") + player1.money += 10 + print("Player has ${}".format(player1.money)) + game.show_cards() + return + print("Player has ${}".format(player1.money)) + game.show_cards() + elif player2.hand_value() > 21: + player1.money += 10 + print("Dealer has gone bust. Player wins") + print("Player has ${}".format(player1.money)) + game.show_cards() + elif player1.hand_value() > player2.hand_value(): + player1.money += 10 + print("Player is the winner with a score of {}.".format(self.player1.hand_value())) + print("Player has ${}".format(player1.money)) + game.show_cards() + elif player2.hand_value() > player1.hand_value(): + player1.money -= 10 + print("Dealer is the winner with a score of {}.".format(self.player2.hand_value())) + print("Player has ${}".format(player1.money)) + game.show_cards() + else: + print("It's a tie. Player {} / Dealer {}".format(self.player1.hand_value(), self.player2.hand_value())) + game.show_cards() + + def show_cards(self): + print("Player hand ", player1.hand, "total score", player1.hand_value()) + print("Dealer hand ", player2.hand, "total score", player2.hand_value()) + if player1.money == 0: + print("Sorry, you are out of money. You'll have to start the game again.") + return + else: + game.play_again() + +deck = Deck(deck=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]) +player1 = Player(deck) +player2 = Player(deck) +game = Game(player1, player2) +game.begin_game() diff --git a/ClassJack.py b/ClassJack.py deleted file mode 100644 index adcc887..0000000 --- a/ClassJack.py +++ /dev/null @@ -1,142 +0,0 @@ -import random -import os - -os.system("clear") - -# classes -class PlayerHand: - def __init__(self): - self.player_hand = [] - - def __str__(self): - return self.player_hand - - -class DealerHand: - def __int__(self): - self.dealer_hand = [] - - def __str__(self): - return self.dealer_hand - - -# functions -def setup_deck(deck, money): - print("Let's play some Blackjack") - print("\n") - money -= 10 - print("You currently have ${} and each play will cost $10".format(money)) - print("\n") - print("Hit = 'H', and Pass = 'P'") - return - - - - - - - -def get_new_card(player_hand, dealer_hand): - live_card = Cards.pop() - # print("{} cards left in deck".format(len(deck))) - # print(live_card) - return(live_card) - - -def win_lose(): - if win: - bankroll += 10 - print("You win") - else: - print("Better luck next time") - print("Your have {}".format(bankroll)) - - - - - - - - -def deal(player_hand, dealer_hand): - counter = 0 - while counter < 2: - player_hand.append(get_new_card(player_hand, dealer_hand)) - dealer_hand.append(get_new_card(player_hand, dealer_hand)) - counter += 1 - print("{} : Your hand".format(player_hand)) - print("{} : Secret dealer hand for testing".format(dealer_hand)) - - -def player_hit_pass(player_hand): - player_input = input("'H'it or 'P'ass?").upper() - if player_input == "P": - return sum(player_hand) - - else: - player_hand.append(get_new_card(player_hand, dealer_hand)) - print("{} : Your hand".format(player_hand)) - print("\n") - - print(input("OK, hit ENTER for dealer's turn")) - -player_hand = - - - - - - -deal (player_hand, dealer_hand) -print("\n") -print("\n") -player_hit_pass(player_hand) - - - - - - - -''' -class Cards: - def __init__(self): - self.deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', - '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', - '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', - '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', - 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', - '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', - '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', - 'Q of diamonds', 'J of diamonds', '10 of diamonds', - '9 of diamonds', '8 of diamonds', '7 of diamonds', - '6 of diamonds', '5 of diamonds', '4 of diamonds', - '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', - 'Q of spades', 'J of spades', '10 of spades', '9 of spades', - '8 of spades', '7 of spades', '6 of spades', '5 of spades', - '4 of spades', '3 of spades', '2 of spades'] - - @property - def __str__(self): - return random.shuffle(self.deck) -''' - -''' -class Dealer: - def __init__(self): - self.player = player_1 - self.dealer = dealer -''' - -''' -class Bankroll: - def __init__(self): - self.bank = 100 - self.play = 10 - - def pay_to_play(self): - if self.bank <= 0 - return - else: - self.bank -= self.play -''' diff --git a/ClassJack2.py b/ClassJack2.py deleted file mode 100644 index 4df8d87..0000000 --- a/ClassJack2.py +++ /dev/null @@ -1,31 +0,0 @@ -import random -import os -os.system("clear") - - -class Card: - - def __init__(self, value, suite=None): - self.value = value - self.suite = suite - - def __str__(self): - return self.value - - -class Player: - def __init__(self, name): - self.name = name - self.hand = [] - - def draw_card(self, card): - return sum([card.number for card in self.cards]) - - def hand_value(self): - return sum(self.hand) - - def hit_or_stay(self): - - - -class \ No newline at end of file diff --git a/Joel assistance.ipynb b/Joel assistance.ipynb deleted file mode 100644 index 604fc75..0000000 --- a/Joel assistance.ipynb +++ /dev/null @@ -1,357 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 129, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "5 of diamonds\n", - "['K of spades', '4 of hearts', '4 of diamonds', '8 of spades', 'A of diamonds', 'A of clubs', 'K of diamonds', 'Q of hearts', 'Q of diamonds', 'J of hearts', 'J of spades', '8 of clubs', '8 of hearts', '10 of spades', 'K of clubs', '2 of spades', '4 of spades', '5 of hearts', 'Q of spades', '7 of diamonds', '6 of diamonds', '2 of diamonds', 'K of hearts', '9 of hearts', '4 of clubs', 'A of hearts', '6 of clubs', '6 of spades', '5 of clubs', '3 of diamonds', 'A of spades', '5 of spades', '10 of clubs', '9 of spades', 'J of clubs', '2 of clubs', '7 of clubs', '3 of spades', '9 of clubs', '2 of hearts', '10 of diamonds', '7 of spades', '10 of hearts', '9 of diamonds', 'Q of clubs', '3 of clubs', '3 of hearts', 'J of diamonds', '6 of hearts', '7 of hearts', '8 of diamonds']\n" - ] - }, - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 129, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Cards includes a list of 52 regular cards with no Jokers\n", - "import random\n", - "\n", - "whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', '10 of clubs',\n", - " '9 of clubs', '8 of clubs', '7 of clubs', '6 of clubs', '5 of clubs',\n", - " '4 of clubs', '3 of clubs', '2 of clubs', 'A of hearts', 'K of hearts',\n", - " 'Q of hearts', 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts',\n", - " '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', '3 of hearts',\n", - " '2 of hearts', 'A of diamonds', 'K of diamonds', 'Q of diamonds',\n", - " 'J of diamonds', '10 of diamonds', '9 of diamonds', '8 of diamonds',\n", - " '7 of diamonds', '6 of diamonds', '5 of diamonds', '4 of diamonds',\n", - " '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades',\n", - " 'Q of spades', 'J of spades', '10 of spades', '9 of spades', '8 of spades',\n", - " '7 of spades', '6 of spades', '5 of spades', '4 of spades', '3 of spades',\n", - " '2 of spades']\n", - "\n", - "\n", - "deck = whole_deck\n", - "random.shuffle(deck)\n", - "\n", - "played_cards = []\n", - "\n", - "live_card = deck.pop()\n", - "print(live_card)\n", - "\n", - "# random.shuffle(lst)\n", - "\n", - "# random.shuffle(deck)\n", - "print(deck)\n", - "# print(live_card)\n", - " \n", - " \n", - "live_card not in deck == True" - ] - }, - { - "cell_type": "code", - "execution_count": 190, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "K of clubs\n", - "3 of clubs\n", - "2 of clubs\n", - "[]\n" - ] - } - ], - "source": [ - "alist = ['2 of clubs', '3 of clubs', 'K of clubs']\n", - "\n", - "x = alist.pop()\n", - "print(x)\n", - "x = alist.pop()\n", - "print(x)\n", - "x = alist.pop()\n", - "print(x)\n", - "\n", - "print(alist)\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Play again? 'Y' or 'N' y\n", - "deal\n" - ] - } - ], - "source": [ - "def deal():\n", - " print(\"deal\")\n", - "\n", - "def play_again_choice():\n", - " play_choice = input(\"Play again? 'Y' or 'N' \").lower()\n", - " if play_choice == 'y':\n", - " return deal()\n", - " \n", - "play_again_choice()" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "aaron\n" - ] - } - ], - "source": [ - "class Person:\n", - " \n", - " def __init__(self, name, friend=None):\n", - " self.name = name\n", - " self.friend = friend\n", - "\n", - "aaron = Person(\"aaron\")\n", - "joel = Person(\"joel\", aaron)\n", - "print(joel.friend.name)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "card\n", - " - suit <- attribute\n", - " - number <- attribute\n", - " - has no abilities\n", - "\n", - "player\n", - " - cards <- attribute\n", - " - has the ability to accept cards <- methods\n", - " - has the ability to hit\n", - " - has the ability to stay\n", - " \n", - "dealer\n", - " - cards <- attribute\n", - " - has the ability to accept cards <- methods\n", - " - has the ability to hit\n", - " - has the ability to stay\n", - " - can decide to stay or hit\n", - "\n", - "game\n", - " - player <- attribute\n", - " - dealer <- attribute\n", - " - has the ability to generate a deck of cards\n", - " - has the ability to give cards to player & dealer <- methods\n", - " - has the ability to ask a player/dealer to hit or stay" - ] - }, - { - "cell_type": "code", - "execution_count": 130, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Card:\n", - " \n", - " def __init__(self, suit, number):\n", - " self.suit = suit\n", - " self.number = number\n", - " \n", - " def __str__(self):\n", - " return \"{} of {}s\".format(self.number, self.suit)" - ] - }, - { - "cell_type": "code", - "execution_count": 131, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "class Player:\n", - " \n", - " def __init__(self):\n", - " self.cards = []\n", - " \n", - " def add_card(self, card):\n", - " self.cards.append(card)\n", - " \n", - " def get_hand_value(self):\n", - " return sum([card.number for card in self.cards])\n", - " \n", - " def should_i_hit(self):\n", - " return self.get_hand_value() < 14" - ] - }, - { - "cell_type": "code", - "execution_count": 132, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "joel = Player()\n", - "joel.add_card(cards[1])\n", - "joel.add_card(cards[8])" - ] - }, - { - "cell_type": "code", - "execution_count": 77, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[<__main__.Card object at 0x10f356b70>, <__main__.Card object at 0x10f356cf8>]\n", - "11\n", - "True\n", - "False\n", - "17\n" - ] - } - ], - "source": [ - "print(joel.cards)\n", - "print(joel.get_hand_value())\n", - "print(joel.should_i_hit())\n", - "joel.add_card(cards[5])\n", - "print(joel.should_i_hit())\n", - "print(joel.get_hand_value())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.4.3" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/cards.py b/cards.py deleted file mode 100644 index 89fcd72..0000000 --- a/cards.py +++ /dev/null @@ -1,32 +0,0 @@ -# Cards includes a list of 52 regular cards with no Jokers -import random - -whole_deck = ['A of clubs', 'K of clubs', 'Q of clubs', 'J of clubs', - '10 of clubs', '9 of clubs', '8 of clubs', '7 of clubs', - '6 of clubs', '5 of clubs', '4 of clubs', '3 of clubs', - '2 of clubs', 'A of hearts', 'K of hearts', 'Q of hearts', - 'J of hearts', '10 of hearts', '9 of hearts', '8 of hearts', - '7 of hearts', '6 of hearts', '5 of hearts', '4 of hearts', - '3 of hearts', '2 of hearts', 'A of diamonds', 'K of diamonds', - 'Q of diamonds', 'J of diamonds', '10 of diamonds', - '9 of diamonds', '8 of diamonds', '7 of diamonds', - '6 of diamonds', '5 of diamonds', '4 of diamonds', - '3 of diamonds', '2 of diamonds', 'A of spades', 'K of spades', - 'Q of spades', 'J of spades', '10 of spades', '9 of spades', - '8 of spades', '7 of spades', '6 of spades', '5 of spades', - '4 of spades', '3 of spades', '2 of spades'] - -deck = whole_deck -random.shuffle(deck) - -live_card = deck.pop() -print(live_card) -print("{} cards left in deck".format(len(deck))) -# random.shuffle(lst) - -# random.shuffle(deck) -# print(deck) -# print(live_card) - - -live_card not in deck == True From c7878ced3c8fadcd2475e45161313edc9cec8e1c Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Tue, 18 Aug 2015 12:59:32 -0400 Subject: [PATCH 8/9] Ipython Notebook aerrors fixed. Removed interactive blackjack --- .DS_Store | Bin 6148 -> 6148 bytes .idea/.name | 1 + .idea/blackjack.iml | 16 + .idea/misc.xml | 14 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/workspace.xml | 390 ++++++++++++++++++ .ipynb_checkpoints/BlackJack-checkpoint.ipynb | 210 ++++++++++ BlackJack.ipynb | 220 +--------- ...ackLogic.numbers => BlackJackLogic.numbers | Bin BlackJack_interactive.py | 142 ------- BlackJack_self-playing.py | 1 - 12 files changed, 660 insertions(+), 348 deletions(-) create mode 100644 .idea/.name create mode 100644 .idea/blackjack.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 .ipynb_checkpoints/BlackJack-checkpoint.ipynb rename ClassJackLogic.numbers => BlackJackLogic.numbers (100%) delete mode 100644 BlackJack_interactive.py diff --git a/.DS_Store b/.DS_Store index 075581f0bf4fbeccf461aa68355ea6b153a9f40e..48252322b557795a1d27250a7e457d193e3af996 100644 GIT binary patch delta 36 scmZoMXfc@J&&a+pU^g=(`(!&7vCT>>v5cDy*{(58Y}mA!o#QV*0Ly_3ivR!s delta 210 zcmZoMXfc@J&&ahgU^g=(*JL{uvCT>>v5fUR3`q<*42cZM4A~4>P+E_nfT7YeCqFqU zCqIdSfk6O>-53}cIsStIkjKEl0o0MmP{feJP|Sc${TVd%q6}UP`3$K*yA*)>ih(c_ mh)WEBoIIdWsX#+ALDm9!NvKvc-as~La}DcF#?9;;fB69n);NLy diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..4646aab --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +blackjack \ No newline at end of file diff --git a/.idea/blackjack.iml b/.idea/blackjack.iml new file mode 100644 index 0000000..ec65220 --- /dev/null +++ b/.idea/blackjack.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..da36f54 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..23b3126 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..dc62f7f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,390 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1439748272711 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.ipynb_checkpoints/BlackJack-checkpoint.ipynb b/.ipynb_checkpoints/BlackJack-checkpoint.ipynb new file mode 100644 index 0000000..a675822 --- /dev/null +++ b/.ipynb_checkpoints/BlackJack-checkpoint.ipynb @@ -0,0 +1,210 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import random" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Deck:\n", + " def __init__(self, deck):\n", + " self.deck = deck" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Player:\n", + " def __init__(self, deck):\n", + " self.hand = []\n", + " self.money = 100\n", + " self.deck = deck\n", + " \n", + " def draw_card(self):\n", + " self.hand.append(random.choice(self.deck.deck))\n", + "\n", + " def hand_value(self):\n", + " if 1 in self.hand:\n", + " if 7 <= sum(self.hand) <= 11:\n", + " return sum(self.hand) + 10\n", + " return sum(self.hand)\n", + "\n", + " def dealer_hit_or_stay(self):\n", + " for _ in range(10):\n", + " if self.hand_value() < 17:\n", + " self.draw_card()\n", + "\n", + " def player_hit_or_stay(self):\n", + " choice = input(\"Enter 'h' to Hit or just 'Enter' to Stay. \").lower()\n", + " if choice == 'h':\n", + " self.draw_card()\n", + " self.player_hit_or_stay()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "class Game:\n", + " def __init__(self, player1, player2):\n", + " self.player1 = player1\n", + " self.player2 = player2\n", + " \n", + " def __str__(self):\n", + " pass\n", + "\n", + " def begin_game(self):\n", + " print(\"Player funds = ${}\".format(player1.money))\n", + " print(\"Dealing cards\")\n", + " for _ in range(2):\n", + " player1.draw_card()\n", + " player2.draw_card()\n", + " if player1.hand_value() == 21:\n", + " if player2.hand_value() == 21:\n", + " print(\"Player and Dealer have BlackJack!\")\n", + " print(\"Game is a tie\")\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " print(\"Player wins with BlackJack!\")\n", + " player1.money += 10\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", + " elif player2.hand_value() == 21:\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer hand \", player2.hand)\n", + " print(\"Dealer wins with BlackJack!\")\n", + " player1.money -= 10\n", + " print(\"Player funds = $\", player1.money)\n", + " self.play_again()\n", + " else:\n", + " print(\"Player hand \", player1.hand)\n", + " print(\"Dealer shows\", player2.hand[0])\n", + " game.game_continue()\n", + " \n", + " def game_continue(self):\n", + " player1.dealer_hit_or_stay()\n", + " player2.dealer_hit_or_stay()\n", + " game.winner()\n", + "\n", + " \n", + " def play_again(self):\n", + " play_choice = input(\"Play again? Enter 'Y'es or just Enter to quit\").lower()\n", + " print(\"___________________________________________________________\")\n", + " if play_choice == 'y':\n", + " player1.hand = []\n", + " player2.hand = []\n", + " game.begin_game()\n", + " else:\n", + " return(\"Your final dollar amount is ${}\".format(player1.money))\n", + " enter(\"Press Enter to exit\")\n", + " #os.system(\"clear\")\n", + "\n", + " def winner(self):\n", + " if player1.hand_value() > 21:\n", + " if player2.hand_value() > 21:\n", + " print(\"Player and Dealer have both gone bust\")\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " player1.money -= 10\n", + " print(\"Player has gone bust. Dealer wins\")\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " elif player2.hand_value() > 21:\n", + " player1.money += 10\n", + " print(\"Dealer has gone bust. Player wins\")\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " elif player1.hand_value() > player2.hand_value():\n", + " player1.money += 10\n", + " print(\"Player is the winner with a score of {}.\".format(self.player1.hand_value()))\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " elif player2.hand_value() > player1.hand_value():\n", + " player1.money -= 10\n", + " print(\"Dealer is the winner with a score of {}.\".format(self.player2.hand_value()))\n", + " print(\"Player has ${}\".format(player1.money))\n", + " game.show_cards()\n", + " else:\n", + " print(\"It's a tie. Player {} / Dealer {}\".format(self.player1.hand_value(), self.player2.hand_value()))\n", + " game.show_cards()\n", + "\n", + " def show_cards(self):\n", + " print(\"Player hand was\", player1.hand, \"with a total score of\", player1.hand_value())\n", + " print(\"Dealer hand was\", player2.hand, \"with a total score of\", player2.hand_value())\n", + " game.play_again()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "\n", + "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", + "player1 = Player(deck)\n", + "player2 = Player(deck)\n", + "game = Game(player1, player2)\n", + "game.begin_game()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/BlackJack.ipynb b/BlackJack.ipynb index b6e6dca..a675822 100644 --- a/BlackJack.ipynb +++ b/BlackJack.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": { "collapsed": true }, @@ -13,7 +13,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { "collapsed": false }, @@ -26,7 +26,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": { "collapsed": false }, @@ -61,7 +61,7 @@ }, { "cell_type": "code", - "execution_count": 94, + "execution_count": null, "metadata": { "collapsed": false }, @@ -89,16 +89,16 @@ " print(\"Dealer hand \", player2.hand)\n", " print(\"Player funds = $\", player1.money)\n", " self.play_again()\n", - " print(\"Player wins with BlackJack!\")\n", " print(\"Player hand \", player1.hand)\n", " print(\"Dealer hand \", player2.hand)\n", + " print(\"Player wins with BlackJack!\")\n", " player1.money += 10\n", " print(\"Player funds = $\", player1.money)\n", " self.play_again()\n", " elif player2.hand_value() == 21:\n", - " print(\"Dealer wins with BlackJack!\")\n", " print(\"Player hand \", player1.hand)\n", " print(\"Dealer hand \", player2.hand)\n", + " print(\"Dealer wins with BlackJack!\")\n", " player1.money -= 10\n", " print(\"Player funds = $\", player1.money)\n", " self.play_again()\n", @@ -115,6 +115,7 @@ " \n", " def play_again(self):\n", " play_choice = input(\"Play again? Enter 'Y'es or just Enter to quit\").lower()\n", + " print(\"___________________________________________________________\")\n", " if play_choice == 'y':\n", " player1.hand = []\n", " player2.hand = []\n", @@ -139,12 +140,12 @@ " print(\"Dealer has gone bust. Player wins\")\n", " print(\"Player has ${}\".format(player1.money))\n", " game.show_cards()\n", - " elif player1.hand > player2.hand:\n", + " elif player1.hand_value() > player2.hand_value():\n", " player1.money += 10\n", " print(\"Player is the winner with a score of {}.\".format(self.player1.hand_value()))\n", " print(\"Player has ${}\".format(player1.money))\n", " game.show_cards()\n", - " elif player2.hand > player1.hand:\n", + " elif player2.hand_value() > player1.hand_value():\n", " player1.money -= 10\n", " print(\"Dealer is the winner with a score of {}.\".format(self.player2.hand_value()))\n", " print(\"Player has ${}\".format(player1.money))\n", @@ -154,218 +155,27 @@ " game.show_cards()\n", "\n", " def show_cards(self):\n", - " print(\"Player hand \", player1.hand, \"total score\", player1.hand_value())\n", - " print(\"Dealer hand \", player2.hand, \"total score\", player2.hand_value())\n", + " print(\"Player hand was\", player1.hand, \"with a total score of\", player1.hand_value())\n", + " print(\"Dealer hand was\", player2.hand, \"with a total score of\", player2.hand_value())\n", " game.play_again()\n" ] }, { "cell_type": "code", - "execution_count": 95, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Player funds = $100\n", - "Dealing cards\n", - "Player hand [10, 10]\n", - "Dealer shows 10\n", - "Player is the winner with a score of 20.\n", - "Player has $110\n", - "Player hand [10, 10] total score 20\n", - "Dealer hand [10, 4, 7] total score 21\n", - "Play again? Enter 'Y'es or just Enter to quity\n", - "Player funds = $110\n", - "Dealing cards\n", - "Player hand [5, 6]\n", - "Dealer shows 3\n", - "Player is the winner with a score of 21.\n", - "Player has $120\n", - "Player hand [5, 6, 10] total score 21\n", - "Dealer hand [3, 5, 9] total score 17\n", - "Play again? Enter 'Y'es or just Enter to quit\n" - ] - } - ], + "outputs": [], "source": [ + "\n", "deck = Deck(deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10])\n", "player1 = Player(deck)\n", "player2 = Player(deck)\n", "game = Game(player1, player2)\n", - "game.begin_game()\n", - "#print(\"Player has ${}\".format(player1.money))\n" + "game.begin_game()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "player1.player_hit_or_stay()\n", - "print(player1.hand_value())\n", - "print(player1.hand)\n", - "player1.player_hit_or_stay()\n", - "print(player1.hand_value())\n", - "print(player1.hand)\n", - "player1.player_hit_or_stay()\n", - "print(player1.hand_value())\n", - "print(player1.hand)\n", - "player1.player_hit_or_stay()\n", - "print(player1.hand_value())\n", - "print(player1.hand)\n", - "\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "player1.draw_card()\n", - "player1.dealer_hit_or_stay()\n", - "player1.dealer_hit_or_stay()\n", - "player1.dealer_hit_or_stay()\n", - "player1.dealer_hit_or_stay()\n", - "print(player1.hand)\n", - "print(player1.hand_value())\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [] - }, { "cell_type": "code", "execution_count": null, diff --git a/ClassJackLogic.numbers b/BlackJackLogic.numbers similarity index 100% rename from ClassJackLogic.numbers rename to BlackJackLogic.numbers diff --git a/BlackJack_interactive.py b/BlackJack_interactive.py deleted file mode 100644 index 2b2e5be..0000000 --- a/BlackJack_interactive.py +++ /dev/null @@ -1,142 +0,0 @@ -import random -import os - - -class Deck: - def __init__(self, deck): - self.deck = deck - - -class Player: - def __init__(self, deck): - self.hand = [] - self.money = 100 - self.deck = deck - - def draw_card(self): - self.hand.append(random.choice(self.deck.deck)) - - def hand_value(self): - if 1 in self.hand: - if 7 <= sum(self.hand) <= 11: - return sum(self.hand) + 10 - return sum(self.hand) - - def dealer_hit_or_stay(self): - for _ in range(10): - if self.hand_value() < 17: - self.draw_card() - - def player_hit_or_stay(self): - choice = input("Enter 'h' to Hit or just 'Enter' to Stay. ").lower() - if choice == 'h': - self.draw_card() - print(player1.hand, "score", player1.hand_value()) - if player1.hand_value() > 21: - game.winner() - game.begin_game() - self.player_hit_or_stay() - - -class Game: - def __init__(self, player1, player2): - self.player1 = player1 - self.player2 = player2 - - - def begin_game(self): - import os - os.system("clear") - - print ("Player has ${} to play with:".format(player1.money)) - print("Dealing cards...") - for _ in range(2): - player1.draw_card() - player2.draw_card() - if player1.hand_value() == 21: - if player2.hand_value() == 21: - print("Player and Dealer have BlackJack!") - print("Game is a tie") - print("Player hand ", player1.hand) - print("Dealer hand ", player2.hand) - print("Player funds = $", player1.money) - self.play_again() - print("Player wins with BlackJack!") - print("Player hand ", player1.hand) - print("Dealer hand ", player2.hand) - player1.money += 10 - print("Player funds = $", player1.money) - self.play_again() - elif player2.hand_value() == 21: - print("Dealer wins with BlackJack!") - print("Player hand ", player1.hand) - print("Dealer hand ", player2.hand) - player1.money -= 10 - print("Player funds = $", player1.money) - self.play_again() - else: - print("Player hand ", player1.hand) - print("Dealer is showing a [{}]".format(player2.hand[0])) - game.game_continue() - - def game_continue(self): - player1.player_hit_or_stay() - if player1.hand_value() > 21: - game.winner() - return - player2.dealer_hit_or_stay() - game.winner() - - def play_again(self): - play_choice = input("Play again? Enter 'Y'es or just Enter to quit ").lower() - if play_choice == 'y': - player1.hand = [] - player2.hand = [] - else: - print("Your final dollar amount is ${}".format(player1.money)) - return - - - def winner(self): - if player1.hand_value() > 21: - player1.money -= 10 - print("Player has gone bust") - print("Player has ${}".format(player1.money)) - elif player2.hand_value() > 21: - print("Dealer has gone bust") - player1.money += 10 - print("Player has ${}".format(player1.money)) - game.show_cards() - elif player2.hand_value() > 21: - player1.money += 10 - print("Dealer has gone bust. Player wins") - print("Player has ${}".format(player1.money)) - game.show_cards() - elif player1.hand_value() > player2.hand_value(): - player1.money += 10 - print("Player is the winner with a score of {}.".format(self.player1.hand_value())) - print("Player has ${}".format(player1.money)) - game.show_cards() - elif player2.hand_value() > player1.hand_value(): - player1.money -= 10 - print("Dealer is the winner with a score of {}.".format(self.player2.hand_value())) - print("Player has ${}".format(player1.money)) - game.show_cards() - else: - print("It's a tie. Player {} / Dealer {}".format(self.player1.hand_value(), self.player2.hand_value())) - game.show_cards() - - def show_cards(self): - print("Player hand ", player1.hand, "total score", player1.hand_value()) - print("Dealer hand ", player2.hand, "total score", player2.hand_value()) - if player1.money == 0: - print("Sorry, you are out of money. You'll have to start the game again.") - quit() - else: - game.play_again() - -deck = Deck(deck=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]) -player1 = Player(deck) -player2 = Player(deck) -game = Game(player1, player2) -game.begin_game() diff --git a/BlackJack_self-playing.py b/BlackJack_self-playing.py index 5d87b43..8b42504 100644 --- a/BlackJack_self-playing.py +++ b/BlackJack_self-playing.py @@ -43,7 +43,6 @@ def __init__(self, player1, player2): def begin_game(self): import os os.system("clear") - print ("Player has ${} to play with:".format(player1.money)) print("Dealing cards...") for _ in range(2): From 105640b0e3fbd69a6b23310c44b0e600f46b8d54 Mon Sep 17 00:00:00 2001 From: Jeff Hacker Date: Tue, 18 Aug 2015 13:20:15 -0400 Subject: [PATCH 9/9] readme.md --- .DS_Store | Bin 6148 -> 6148 bytes .idea/workspace.xml | 40 +++++++---- README.md | 4 +- README_1.md | 76 --------------------- README_2.md | 77 ---------------------- BlackJack_self-playing.py => blackjack.py | 0 6 files changed, 30 insertions(+), 167 deletions(-) delete mode 100644 README_1.md delete mode 100644 README_2.md rename BlackJack_self-playing.py => blackjack.py (100%) diff --git a/.DS_Store b/.DS_Store index 48252322b557795a1d27250a7e457d193e3af996..be72b4212ab772500c8f21182c81dc4598c61fb6 100644 GIT binary patch delta 72 zcmZoMXfc=|#>B)qu~2NHo+2ab#(>?7jI5LGSj09fvGg-;mSuazxUnIJX)`+qKL=3V aWB!ku~2NHo+2ar#(>?7i&&T#*(cjEiEUP5>Ss*lW(Z<%WpHG0Vekdg z@eGCxdJMS?DV{m`$w@i+Nem1O0t^g{H-NOpe=q>D7#PrX8DZ1K;09DV1Be+nuVVhl ixS5@Up9AQa%^#V+Gf(ChapYiRU|<57wmCv%4Ko0xC?>=J diff --git a/.idea/workspace.xml b/.idea/workspace.xml index dc62f7f..fd010cc 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,10 +2,10 @@ - - - - + + + + @@ -27,10 +27,10 @@ - - + + - + @@ -86,7 +86,6 @@ - @@ -125,6 +124,7 @@ + @@ -209,6 +209,12 @@ + + + + + true + @@ -337,14 +343,14 @@ - + - + @@ -376,9 +382,19 @@ - + + + + + + + + + + + - + diff --git a/README.md b/README.md index e5d7b00..36b9d10 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # Blackjack -* [Part 1](README_1.md) -* [Part 2](README_2.md) \ No newline at end of file +## blackjack.ipynb: An Ipython Notebook version of BlackJack +## blackjack.py: A self-playing version of BlackJack. Run with Python3 diff --git a/README_1.md b/README_1.md deleted file mode 100644 index 3d3e96d..0000000 --- a/README_1.md +++ /dev/null @@ -1,76 +0,0 @@ -# Blackjack, Part I - -## Description - -Plan how to create a game of blackjack. - -## Objectives - -### Learning Objectives - -After completing this assignment, you should understand: - -* Object-oriented design. - -### Performance Objectives - -After completing this assignment, you should be able to: - -* Design a system using responsibilities and collaborators. -* Turn your design into objects. - -## Details - -### Deliverables - -* A Git repo called blackjack containing at least: - * a `README.md` file explaining your design. - * a `blackjack` directory with a file for each of your classes, with - their responsibilities and collaborators described in a comment - * a completed Card and Deck class - * tests for Cards and Decks - -### Requirements - -* Passing unit tests -* No PEP8 or Pyflakes warnings or errors -* Use the project layout from _The Hacker's Guide to Python_ - -## Normal Mode - -Read through [the rules of blackjack](https://en.wikipedia.org/wiki/Blackjack) -carefully. After reading through them, write out the steps to run the game in -outline format. (See the additional resources for more on the rules of -blackjack.) - -After that, go through your steps and find all the actors -- that is, nouns -that take actions. Create class-responsibility-collaborator (CRC) cards for -each and then create empty classes for each of them with the responsibilities -and collaborators at the top as a comment. Here is an example that you might -find in `blackjack/card.py`: - -```py -class Card: - """A playing card. - - Responsibilities: - - * Has a rank and a suit. - * Has a point value. Aces point values depend on the Hand. - - Collaborators: - - * Collected into a Deck. - * Collected into a Hand for each player and a Hand for the dealer. - """ -``` - -Lastly, implement the `Card` and `Deck` classes. - -## Additional Resources - -* Other Blackjack rule summaries: - * http://www.pagat.com/banking/blackjack.html - * http://wizardofodds.com/games/blackjack/basics/#toc-Rules -* [Portland Pattern Repository page on CRC cards](http://c2.com/cgi/wiki?CrcCard) -* [A Brief Tour of Responsibility-Driven Design](http://www.wirfs-brock.com/PDFs/A_Brief-Tour-of-RDD.pdf) diff --git a/README_2.md b/README_2.md deleted file mode 100644 index 1e6c0bb..0000000 --- a/README_2.md +++ /dev/null @@ -1,77 +0,0 @@ -# Blackjack - -## Description - -Implement the game of Blackjack. - -## Objectives - -### Learning Objectives - -After completing this assignment, you should understand: - -* how to track state by using objects - -### Performance Objectives - -After completing this assignment, you should be able to: - -* Build an interactive game -* Test an object-oriented program - -## Details - -### Deliverables - -* A Git repo called blackjack containing at least: - * `README.rst` file explaining how to run your project - * a `requirements.txt` file - * a full suite of tests for your project - -### Requirements - -* Passing unit tests -* No PEP8 or Pyflakes warnings or errors - -## Normal Mode - -Take your notes and code from [the previous project](README_1.md). Using those, -create a game of Blackjack that one person plays on the command line against a -computer dealer, with the following rules: - -* The game should start the player with $100 and bets are $10. -* The only valid moves are hit and stand. -* Allow the player to keep playing as long as they have money. -* The dealer uses one deck in their shoe and reshuffles after each round. - -## Hard Mode - -In addition to the requirements from **Normal Mode**: - -* The dealer uses a shoe of six decks. With a shoe, the dealer uses something called a _cut card_. A plastic card is inserted somewhere near the bottom of the shoe. Once it is hit, the shoe is reshuffled at the end of the round. You can simulate this by reshuffling after there are 26 or less cards left in the shoe. -* The player can choose how much they want to bet before each round. -* Add doubling-down. -* Add surrender (early surrender as opposed to late surrender.) -* Add [insurance](https://en.wikipedia.org/wiki/Blackjack#Insurance). -* Add splitting hands. - -## Nightmare Mode - -In addition to the requirements from **Hard Mode**: - -* Add the ability to choose rulesets, like: - * No surrender/early surrender/late surrender. - * Dealer hits soft 17 vs dealer stands of soft 17. - * Number of decks used in the shoe. - -Each choice should be able to be made separately. - -## Notes - -This is again an assignment with a text-based interface, which can be very hard -to test. You will do best at this assignment by building all the logic for each -piece and testing it well before then adding the interface on top of it. - -## Additional Resources - -* [Building Skills in Object-Oriented Design](http://www.itmaybeahack.com/book/oodesign-python-2.1/html/index.html) diff --git a/BlackJack_self-playing.py b/blackjack.py similarity index 100% rename from BlackJack_self-playing.py rename to blackjack.py