maroph

2_player_game_v2.py

Nov 24th, 2019
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.40 KB | None | 0 0
  1. import operator
  2. import sqlite3
  3. from random import randint
  4. import sys
  5. from time import time
  6.  
  7. """
  8. 24-NOV-2019
  9. 3.11 Assignment
  10. """
  11.  
  12. # verbose == true : activate logging for the SQL statements
  13. verbose = False
  14. # verbose = True
  15.  
  16. conn = sqlite3.connect("computer_cards.db")
  17.  
  18.  
  19. def log(msg):
  20.     """log messages for debugging"""
  21.     if verbose:
  22.         print("LOG:", msg)
  23.  
  24.  
  25. def read_all_cards():
  26.     """Read all cards from table computer"""
  27.     sql = "SELECT * FROM computer"
  28.     log("SQL:>>>>>" + sql + "<<<<<")
  29.     result = conn.execute(sql)
  30.     return result.fetchall()
  31.  
  32.  
  33. def insert_picked(name):
  34.     """add a card to table picked"""
  35.     sql = "INSERT INTO picked(name, time) VALUES ('{}', {})".format(name, time())
  36.     log("SQL:>>>>>" + sql + "<<<<<")
  37.     conn.execute(sql)
  38.     conn.commit()
  39.  
  40.  
  41. def read_last_picked():
  42.     """get the last card added to table picked"""
  43.     sql = "SELECT * FROM picked ORDER BY time DESC"
  44.     log("SQL:>>>>>" + sql + "<<<<<")
  45.     result = conn.execute(sql)
  46.     return result.fetchone()
  47.  
  48.  
  49. def pick_card():
  50.     """choose a card and add it to table picked"""
  51.     last_picked_card = read_last_picked()
  52.     log("last_picked_card:")
  53.     log(last_picked_card)
  54.  
  55.     random_card = cards[randint(0, len(cards) - 1)]
  56.  
  57.     if last_picked_card is not None:
  58.         while random_card[0] == last_picked_card[0]:
  59.             random_card = cards[randint(0, len(cards) - 1)]
  60.  
  61.     insert_picked(random_card[0])
  62.     log("picked card:")
  63.     log(random_card)
  64.     return random_card
  65.  
  66.  
  67. def read_last2_picked():
  68.     """get the last 2 cards added to table picked"""
  69.     sql = "SELECT * FROM picked ORDER BY time DESC"
  70.     log("SQL:>>>>>" + sql + "<<<<<")
  71.     result = conn.execute(sql)
  72.     # card played 2nd
  73.     r1 = result.fetchone()
  74.     # card played 1st
  75.     r2 = result.fetchone()
  76.     return [r1, r2]
  77.  
  78.  
  79. def add_to_result(card1_name, card2_name, winner_name):
  80.     """add the game result of a round to table result"""
  81.     sql = "INSERT INTO result(card1, card2, winner) VALUES ('{}', '{}', '{}')".format(card1_name, card2_name, winner_name)
  82.     log("SQL:>>>>>" + sql + "<<<<<")
  83.     conn.execute(sql)
  84.     conn.commit()
  85.  
  86.  
  87. def print_statistics():
  88.     """collect and print all available statistics data"""
  89.     sql = "SELECT * FROM result"
  90.     log("SQL:>>>>>" + sql + "<<<<<")
  91.     result = conn.execute(sql)
  92.     results = result.fetchall()
  93.  
  94.     if results is None:
  95.         print("")
  96.         print("Game Statistics")
  97.         print("---------------")
  98.         print("Number of results so far: 0")
  99.         print("---------------")
  100.         return
  101.  
  102.     # use a dictionary for each field in table result
  103.     # key: card, value: count (how often was this card found)
  104.     dict_card1 = {}
  105.     dict_card2 = {}
  106.     dict_winner = {}
  107.     for result in results:
  108.         card1 = result[0]
  109.         card2 = result[1]
  110.         winner = result[2]
  111.         if card1 in dict_card1:
  112.             dict_card1[card1] = dict_card1[card1] + 1
  113.         else:
  114.             dict_card1[card1] = 1
  115.         if card2 in dict_card2:
  116.             dict_card2[card2] = dict_card2[card2] + 1
  117.         else:
  118.             dict_card2[card2] = 1
  119.         if winner in dict_winner:
  120.             dict_winner[winner] = dict_winner[winner] + 1
  121.         else:
  122.             dict_winner[winner] = 1
  123.  
  124.     # now we have to revert sort the dictionaries by the values (i.e. counter)
  125.     # the following code is a very short solution of this problem
  126.     # source of the dict sort by value code:
  127.     # Thomas Cokelaer
  128.     # How to sort a dictionary by values in Python
  129.     # https://thomas-cokelaer.info/blog/2017/12/how-to-sort-a-dictionary-by-values-in-python/
  130.     sorted_dict_card1 = sorted(dict_card1.items(), key=operator.itemgetter(1), reverse=True)
  131.     sorted_dict_card2 = sorted(dict_card2.items(), key=operator.itemgetter(1), reverse=True)
  132.     sorted_dict_winner = sorted(dict_winner.items(), key=operator.itemgetter(1), reverse=True)
  133.  
  134.     print("")
  135.     print("Game Statistics")
  136.     print("---------------")
  137.     print("Number of results so far: {}".format(len(results)))
  138.     print("")
  139.     print("+---------------------------------------------------+")
  140.     print("|           WINNER HIGHSCORE LIST                   |")
  141.     print("+---------------------------------------------------+")
  142.     print("|   hits | card                                     |")
  143.     print("+--------+------------------------------------------+")
  144.     for k,v in sorted_dict_winner:
  145.         print("| {:6} | {:40} |".format(v, k))
  146.     print("+---------------------------------------------------+")
  147.     print("")
  148.     print("+---------------------------------------------------+")
  149.     print("|            CARD1 HIGHSCORE LIST                   |")
  150.     print("+---------------------------------------------------+")
  151.     print("|   hits | card                                     |")
  152.     print("+--------+------------------------------------------+")
  153.     for k,v in sorted_dict_card1:
  154.         print("| {:6} | {:40} |".format(v, k))
  155.     print("+---------------------------------------------------+")
  156.     print("")
  157.     print("+---------------------------------------------------+")
  158.     print("|            CARD2 HIGHSCORE LIST                   |")
  159.     print("+---------------------------------------------------+")
  160.     print("|   hits | card                                     |")
  161.     print("+--------+------------------------------------------+")
  162.     for k,v in sorted_dict_card2:
  163.         print("| {:6} | {:40} |".format(v, k))
  164.     print("+---------------------------------------------------+")
  165.  
  166.  
  167. while True:
  168.     player = input("Are you player (1) or (2) (or q for quit)>")
  169.     if player in ["q", "Q"]:
  170.         sys.exit(0)
  171.     if player in ["1", "2"]:
  172.         break
  173.  
  174. cards = read_all_cards()
  175. choosing_player = "1"
  176. rounds = 5
  177. for r in range(rounds):
  178.     resp = input("Press enter to pick a card when both players are ready (or q to quit)>")
  179.     if resp in ["q", "Q"]:
  180.         break
  181.  
  182.     card = pick_card()
  183.     print("picked card:")
  184.     print("{:10}: {}".format("name", card[0]))
  185.     print("{:10}: {}".format("cores", card[1]))
  186.     print("{:10}: {}".format("cpu_speed", card[2]))
  187.     print("{:10}: {}".format("ram", card[3]))
  188.     print("{:10}: {}".format("cost", card[4]))
  189.  
  190.     if player == "1":
  191.         print("Player " + choosing_player + " picks.")
  192.         winner = input("Did you win? (Y)es, (N)o, (D)raw >").lower()
  193.  
  194.         last_cards = read_last2_picked()
  195.         # last_cards[0] : card played 2nd
  196.         # last_cards[1] : card played 1st
  197.  
  198.         if winner == "y":
  199.             if player == choosing_player:
  200.                 add_to_result(last_cards[1][0], last_cards[0][0], last_cards[0][0])
  201.             else:
  202.                 add_to_result(last_cards[1][0], last_cards[0][0], last_cards[1][0])
  203.             choosing_player = player
  204.         elif winner == "n":
  205.             if player == choosing_player:
  206.                 add_to_result(last_cards[1][0], last_cards[0][0], last_cards[1][0])
  207.             else:
  208.                 add_to_result(last_cards[1][0], last_cards[0][0], last_cards[0][0])
  209.             choosing_player = "2" if player == "1" else "1"
  210.     else:
  211.         if r < (rounds - 1):
  212.             print("You are Player 2 - wait until Player 1 have entered the result of this round.")
  213.  
  214. if player == "1":
  215.     print_statistics()
  216. else:
  217.     print("")
  218.     print("Game statistics is shown for Player 1 only after Player 1 entered the result")
  219.  
  220. conn.close()
Advertisement
Add Comment
Please, Sign In to add comment