Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import operator
- import sqlite3
- from random import randint
- import sys
- from time import time
- """
- 24-NOV-2019
- 3.11 Assignment
- """
- # verbose == true : activate logging for the SQL statements
- verbose = False
- # verbose = True
- conn = sqlite3.connect("computer_cards.db")
- def log(msg):
- """log messages for debugging"""
- if verbose:
- print("LOG:", msg)
- def read_all_cards():
- """Read all cards from table computer"""
- sql = "SELECT * FROM computer"
- log("SQL:>>>>>" + sql + "<<<<<")
- result = conn.execute(sql)
- return result.fetchall()
- def insert_picked(name):
- """add a card to table picked"""
- sql = "INSERT INTO picked(name, time) VALUES ('{}', {})".format(name, time())
- log("SQL:>>>>>" + sql + "<<<<<")
- conn.execute(sql)
- conn.commit()
- def read_last_picked():
- """get the last card added to table picked"""
- sql = "SELECT * FROM picked ORDER BY time DESC"
- log("SQL:>>>>>" + sql + "<<<<<")
- result = conn.execute(sql)
- return result.fetchone()
- def pick_card():
- """choose a card and add it to table picked"""
- last_picked_card = read_last_picked()
- log("last_picked_card:")
- log(last_picked_card)
- random_card = cards[randint(0, len(cards) - 1)]
- if last_picked_card is not None:
- while random_card[0] == last_picked_card[0]:
- random_card = cards[randint(0, len(cards) - 1)]
- insert_picked(random_card[0])
- log("picked card:")
- log(random_card)
- return random_card
- def read_last2_picked():
- """get the last 2 cards added to table picked"""
- sql = "SELECT * FROM picked ORDER BY time DESC"
- log("SQL:>>>>>" + sql + "<<<<<")
- result = conn.execute(sql)
- # card played 2nd
- r1 = result.fetchone()
- # card played 1st
- r2 = result.fetchone()
- return [r1, r2]
- def add_to_result(card1_name, card2_name, winner_name):
- """add the game result of a round to table result"""
- sql = "INSERT INTO result(card1, card2, winner) VALUES ('{}', '{}', '{}')".format(card1_name, card2_name, winner_name)
- log("SQL:>>>>>" + sql + "<<<<<")
- conn.execute(sql)
- conn.commit()
- def print_statistics():
- """collect and print all available statistics data"""
- sql = "SELECT * FROM result"
- log("SQL:>>>>>" + sql + "<<<<<")
- result = conn.execute(sql)
- results = result.fetchall()
- if results is None:
- print("")
- print("Game Statistics")
- print("---------------")
- print("Number of results so far: 0")
- print("---------------")
- return
- # use a dictionary for each field in table result
- # key: card, value: count (how often was this card found)
- dict_card1 = {}
- dict_card2 = {}
- dict_winner = {}
- for result in results:
- card1 = result[0]
- card2 = result[1]
- winner = result[2]
- if card1 in dict_card1:
- dict_card1[card1] = dict_card1[card1] + 1
- else:
- dict_card1[card1] = 1
- if card2 in dict_card2:
- dict_card2[card2] = dict_card2[card2] + 1
- else:
- dict_card2[card2] = 1
- if winner in dict_winner:
- dict_winner[winner] = dict_winner[winner] + 1
- else:
- dict_winner[winner] = 1
- # now we have to revert sort the dictionaries by the values (i.e. counter)
- # the following code is a very short solution of this problem
- # source of the dict sort by value code:
- # Thomas Cokelaer
- # How to sort a dictionary by values in Python
- # https://thomas-cokelaer.info/blog/2017/12/how-to-sort-a-dictionary-by-values-in-python/
- sorted_dict_card1 = sorted(dict_card1.items(), key=operator.itemgetter(1), reverse=True)
- sorted_dict_card2 = sorted(dict_card2.items(), key=operator.itemgetter(1), reverse=True)
- sorted_dict_winner = sorted(dict_winner.items(), key=operator.itemgetter(1), reverse=True)
- print("")
- print("Game Statistics")
- print("---------------")
- print("Number of results so far: {}".format(len(results)))
- print("")
- print("+---------------------------------------------------+")
- print("| WINNER HIGHSCORE LIST |")
- print("+---------------------------------------------------+")
- print("| hits | card |")
- print("+--------+------------------------------------------+")
- for k,v in sorted_dict_winner:
- print("| {:6} | {:40} |".format(v, k))
- print("+---------------------------------------------------+")
- print("")
- print("+---------------------------------------------------+")
- print("| CARD1 HIGHSCORE LIST |")
- print("+---------------------------------------------------+")
- print("| hits | card |")
- print("+--------+------------------------------------------+")
- for k,v in sorted_dict_card1:
- print("| {:6} | {:40} |".format(v, k))
- print("+---------------------------------------------------+")
- print("")
- print("+---------------------------------------------------+")
- print("| CARD2 HIGHSCORE LIST |")
- print("+---------------------------------------------------+")
- print("| hits | card |")
- print("+--------+------------------------------------------+")
- for k,v in sorted_dict_card2:
- print("| {:6} | {:40} |".format(v, k))
- print("+---------------------------------------------------+")
- while True:
- player = input("Are you player (1) or (2) (or q for quit)>")
- if player in ["q", "Q"]:
- sys.exit(0)
- if player in ["1", "2"]:
- break
- cards = read_all_cards()
- choosing_player = "1"
- rounds = 5
- for r in range(rounds):
- resp = input("Press enter to pick a card when both players are ready (or q to quit)>")
- if resp in ["q", "Q"]:
- break
- card = pick_card()
- print("picked card:")
- print("{:10}: {}".format("name", card[0]))
- print("{:10}: {}".format("cores", card[1]))
- print("{:10}: {}".format("cpu_speed", card[2]))
- print("{:10}: {}".format("ram", card[3]))
- print("{:10}: {}".format("cost", card[4]))
- if player == "1":
- print("Player " + choosing_player + " picks.")
- winner = input("Did you win? (Y)es, (N)o, (D)raw >").lower()
- last_cards = read_last2_picked()
- # last_cards[0] : card played 2nd
- # last_cards[1] : card played 1st
- if winner == "y":
- if player == choosing_player:
- add_to_result(last_cards[1][0], last_cards[0][0], last_cards[0][0])
- else:
- add_to_result(last_cards[1][0], last_cards[0][0], last_cards[1][0])
- choosing_player = player
- elif winner == "n":
- if player == choosing_player:
- add_to_result(last_cards[1][0], last_cards[0][0], last_cards[1][0])
- else:
- add_to_result(last_cards[1][0], last_cards[0][0], last_cards[0][0])
- choosing_player = "2" if player == "1" else "1"
- else:
- if r < (rounds - 1):
- print("You are Player 2 - wait until Player 1 have entered the result of this round.")
- if player == "1":
- print_statistics()
- else:
- print("")
- print("Game statistics is shown for Player 1 only after Player 1 entered the result")
- conn.close()
Advertisement
Add Comment
Please, Sign In to add comment