mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2026-01-03 08:37:59 -08:00
Removed spaces from top-level directory names.
Spaces tend to cause annoyances in a Unix-style shell environment. This change fixes that.
This commit is contained in:
5
01_Acey_Ducey/python/README.md
Normal file
5
01_Acey_Ducey/python/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
Original source downloaded [from Vintage Basic](http://www.vintage-basic.net/games.html)
|
||||
|
||||
Conversion to [Python](https://www.python.org/about/)
|
||||
|
||||
Propose using pylint and black to format python files so that it conforms to some standards
|
||||
87
01_Acey_Ducey/python/acey_ducey.py
Normal file
87
01_Acey_Ducey/python/acey_ducey.py
Normal file
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Play the Acey-Ducey game
|
||||
https://www.atariarchives.org/basicgames/showpage.php?page=2
|
||||
"""
|
||||
|
||||
import random
|
||||
|
||||
cards = {
|
||||
1: "1",
|
||||
2: "2",
|
||||
3: "3",
|
||||
4: "4",
|
||||
5: "5",
|
||||
6: "6",
|
||||
7: "7",
|
||||
8: "8",
|
||||
9: "9",
|
||||
10: "Jack",
|
||||
11: "Queen",
|
||||
12: "King",
|
||||
13: "Ace",
|
||||
}
|
||||
|
||||
|
||||
def play_game():
|
||||
"""Play the game"""
|
||||
cash = 100
|
||||
while cash > 0:
|
||||
print(f"You now have {cash} dollars\n")
|
||||
print("Here are you next two cards")
|
||||
round_cards = list(cards.keys())
|
||||
random.shuffle(round_cards)
|
||||
card_a, card_b, card_c = round_cards.pop(), round_cards.pop(), round_cards.pop()
|
||||
if card_a > card_b:
|
||||
card_a, card_b = card_b, card_a
|
||||
print(f" {cards[card_a]}")
|
||||
print(f" {cards[card_b]}\n")
|
||||
while True:
|
||||
try:
|
||||
bet = int(input("What is your bet? "))
|
||||
if bet < 0:
|
||||
raise ValueError("Bet must be more than zero")
|
||||
if bet == 0:
|
||||
print("CHICKEN!!\n")
|
||||
if bet > cash:
|
||||
print("Sorry, my friend but you bet too much")
|
||||
print(f"You only have {cash} dollars to bet")
|
||||
continue
|
||||
cash -= bet
|
||||
break
|
||||
|
||||
except ValueError:
|
||||
print("Please enter a positive number")
|
||||
print(f" {cards[card_c]}")
|
||||
if bet > 0:
|
||||
if card_a < card_c < card_b:
|
||||
print("You win!!!")
|
||||
cash += bet * 2
|
||||
else:
|
||||
print("Sorry, you lose")
|
||||
|
||||
print("Sorry, friend, but you blew your wad")
|
||||
|
||||
|
||||
def main():
|
||||
"""Main"""
|
||||
keep_playing = True
|
||||
|
||||
while keep_playing:
|
||||
play_game()
|
||||
keep_playing = input("Try again? (yes or no) ").lower().startswith("y")
|
||||
print("Ok hope you had fun")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(
|
||||
"""
|
||||
Acey-Ducey is played in the following manner
|
||||
The dealer (computer) deals two cards face up
|
||||
You have an option to be or not bet depending
|
||||
on whether or not you feel the card will have
|
||||
a value between the first two.
|
||||
If you do not want to bet, input a 0
|
||||
"""
|
||||
)
|
||||
main()
|
||||
206
01_Acey_Ducey/python/aceyducey.py
Normal file
206
01_Acey_Ducey/python/aceyducey.py
Normal file
@@ -0,0 +1,206 @@
|
||||
"""aceyducey.py contains game code"""
|
||||
########################################################
|
||||
#
|
||||
# Acey Ducey
|
||||
#
|
||||
# From: BASIC Computer Games (1978)
|
||||
# Edited by David Ahl
|
||||
#
|
||||
# "This is a simulation of the Acey Ducey card game.
|
||||
# In the game, the dealer (the computer) deals two
|
||||
# cards face up. You have an option to bet or not to
|
||||
# bet depending on whether or not you feel the next
|
||||
# card dealt will have a value between the first two.
|
||||
#
|
||||
# "Your initial money is set to $100. The game keeps
|
||||
# going on until you lose all your money or interrupt
|
||||
# the program.
|
||||
#
|
||||
# "The original BASIC program author was Bill Palmby
|
||||
# of Prairie View, Illinois."
|
||||
#
|
||||
# Python port by Jeff Jetton, 2019
|
||||
#
|
||||
########################################################
|
||||
|
||||
|
||||
import random
|
||||
|
||||
# "You may alter [the following statement] if you want
|
||||
# to start with more or less than $100."
|
||||
DEFAULT_BANKROLL = 100
|
||||
|
||||
# functions
|
||||
def deal_card_num():
|
||||
"""Get card number"""
|
||||
return random.randint(0, 12)
|
||||
|
||||
|
||||
def get_card_name(number):
|
||||
"""Get card name"""
|
||||
card_names = (
|
||||
" 2",
|
||||
" 3",
|
||||
" 4",
|
||||
" 5",
|
||||
" 6",
|
||||
" 7",
|
||||
" 8",
|
||||
" 9",
|
||||
" 10",
|
||||
"Jack",
|
||||
"Queen",
|
||||
"King",
|
||||
"Ace",
|
||||
)
|
||||
return card_names[number]
|
||||
|
||||
|
||||
def display_bankroll(bank_roll):
|
||||
"""Print current bankroll"""
|
||||
if BANK_ROLL > 0:
|
||||
print("You now have %s dollars\n" % bank_roll)
|
||||
|
||||
|
||||
# Display initial title and instructions
|
||||
print("\n Acey Ducey Card Game")
|
||||
print("Creative Computing Morristown, New Jersey")
|
||||
print("\n\n")
|
||||
print("Acey-Ducey is played in the following manner")
|
||||
print("The dealer (computer) deals two cards face up")
|
||||
print("You have an option to bet or not bet depending")
|
||||
print("on whether or not you feel the card will have")
|
||||
print("a value between the first two.")
|
||||
print("If you do not want to bet, input a 0")
|
||||
|
||||
|
||||
# Loop for series of multiple games
|
||||
KEEP_PLAYING = True
|
||||
while KEEP_PLAYING:
|
||||
|
||||
# Initialize bankroll at start of each game
|
||||
BANK_ROLL = DEFAULT_BANKROLL
|
||||
display_bankroll(BANK_ROLL)
|
||||
|
||||
# Loop for a single round. Repeat until out of money.
|
||||
while BANK_ROLL > 0:
|
||||
|
||||
# Deal out dealer cards
|
||||
print("Here are your next two cards")
|
||||
dealer1 = deal_card_num()
|
||||
# If the cards match, we redeal 2nd card until they don't
|
||||
dealer2 = dealer1
|
||||
while dealer1 == dealer2:
|
||||
dealer2 = deal_card_num()
|
||||
# Organize the cards in order if they're not already
|
||||
if dealer1 >= dealer2:
|
||||
(dealer1, dealer2) = (dealer2, dealer1) # Ya gotta love Python!
|
||||
# Show dealer cards to the player
|
||||
# (use card name rather than internal number)
|
||||
print(get_card_name(dealer1))
|
||||
print(get_card_name(dealer2) + "\n")
|
||||
|
||||
# Get and handle player bet choice
|
||||
BET_IS_VALID = False
|
||||
while not BET_IS_VALID:
|
||||
curr_bet = input("What is your bet? ")
|
||||
try:
|
||||
curr_bet = int(curr_bet)
|
||||
except ValueError:
|
||||
# Bad input? Just loop back up and ask again...
|
||||
pass
|
||||
else:
|
||||
if curr_bet == 0:
|
||||
BET_IS_VALID = True
|
||||
print("Chicken!!\n")
|
||||
elif curr_bet > BANK_ROLL:
|
||||
print("Sorry, my friend but you bet too much")
|
||||
print("You have only %s dollars to bet\n" % BANK_ROLL)
|
||||
else:
|
||||
# Deal player card
|
||||
BET_IS_VALID = True
|
||||
player = deal_card_num()
|
||||
print(get_card_name(player))
|
||||
|
||||
# Did we win?
|
||||
if dealer1 < player < dealer2:
|
||||
print("You win!!!")
|
||||
BANK_ROLL += curr_bet
|
||||
else:
|
||||
print("Sorry, you lose")
|
||||
BANK_ROLL -= curr_bet
|
||||
|
||||
# Update player on new bankroll level
|
||||
display_bankroll(BANK_ROLL)
|
||||
|
||||
# End of loop for a single round
|
||||
|
||||
print("\n\nSorry, friend but you blew your wad")
|
||||
player_response = input("Try again (yes or no) ")
|
||||
if player_response.lower() == "yes":
|
||||
print()
|
||||
else:
|
||||
KEEP_PLAYING = False
|
||||
|
||||
# End of multiple game loop
|
||||
|
||||
print("OK Hope you had fun\n")
|
||||
|
||||
|
||||
########################################################
|
||||
#
|
||||
# Porting notes:
|
||||
#
|
||||
# The original BASIC version had a variable named N
|
||||
# that was initialized to 100 and then never used.
|
||||
# Maybe it did something in feature that was edited
|
||||
# out of the final version used in the book?
|
||||
#
|
||||
# The original program simply generated random numbers
|
||||
# for each card. It did not simulate a true card deck,
|
||||
# where the dealing of a card eliminates it from the
|
||||
# deck and reduces the chances of the same value
|
||||
# being drawn. This "infinite deck" logic (or "deal,
|
||||
# with replacement after") has NOT been changed.
|
||||
#
|
||||
# In the interests of historical fidelity, the bug
|
||||
# in the original BASIC listing that let you input a
|
||||
# negative bet value has been faithfully reproduced.
|
||||
# This lets the player lose money when they win and
|
||||
# earn money when they lose! :-)
|
||||
#
|
||||
#
|
||||
# Ideas for Modifications
|
||||
#
|
||||
# Give the user the ability to quit the game, perhaps
|
||||
# by typing "quit" instead of making a bet. Provide a
|
||||
# final assement based on how much of the original
|
||||
# bankroll they have left.
|
||||
#
|
||||
# Or have the game run for a set number of rounds or
|
||||
# until a certain bankroll goal is attained.
|
||||
#
|
||||
# Implement an "ante"--a set amount the player has to
|
||||
# bet each time rather than having the option to lay
|
||||
# out entirely.
|
||||
#
|
||||
# See "porting notes" above about negative bet values.
|
||||
# How would you fix this?
|
||||
#
|
||||
# When the player "chickens out", show them what the
|
||||
# next card would've been and point out whether they
|
||||
# made a good or bad decision.
|
||||
#
|
||||
# In what situations are the odds of winning high
|
||||
# enough to justify making a bet? Create a cheat mode
|
||||
# where the program identifies these situations and
|
||||
# lets the player know.
|
||||
#
|
||||
# Change the card dealing to simulate deals from a
|
||||
# single deck (or a user-selectable number of decks).
|
||||
#
|
||||
# Implement a two-player mode where players take turns
|
||||
# betting (or both bet on the same dealer cards and
|
||||
# get their own player card dealt).
|
||||
#
|
||||
########################################################
|
||||
Reference in New Issue
Block a user