-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtournament.py
130 lines (103 loc) · 3.56 KB
/
tournament.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env python
#
# tournament.py -- implementation of a Swiss-system tournament
#
import psycopg2
def connect():
"""Connect to the PostgreSQL database. Returns a database connection."""
return psycopg2.connect("dbname=tournament")
def deleteMatches():
db = connect()
c = db.cursor()
c.execute("DELETE FROM matches")
db.commit()
db.close()
"""Remove all the match records from the database."""
def deletePlayers():
db = connect()
c = db.cursor()
c.execute("DELETE FROM Player")
db.commit()
db.close()
"""Remove all the player records from the database."""
def countPlayers():
db = connect()
c = db.cursor()
c.execute("SELECT count(*) from player")
result = c.fetchall()
db.commit()
db.close()
return result[0][0]
"""Returns the number of players currently registered."""
def registerPlayer(name):
db = connect()
c = db.cursor()
c.execute("INSERT INTO Player(name) VALUES (%s)", (name,))
db.commit()
db.close()
"""Adds a player to the tournament database.
The database assigns a unique serial id number for the player. (This
should be handled by your SQL database schema, not in your Python code.)
Args:
name: the player's full name (need not be unique).
"""
def playerStandings():
"""Returns a list of the players and their win records, sorted by wins.
The first entry in the list should be the player in first place, or a player
tied for first place if there is currently a tie.
Returns:
A list of tuples, each of which contains (id, name, wins, matches):
id: the player's unique id (assigned by the database)
name: the player's full name (as registered)
wins: the number of matches the player has won
matches: the number of matches the player has played
"""
db = connect()
c = db.cursor()
c.execute("SELECT matches_won.id,matches_won.name,matches_won.win,matches_total.matches from matches_won,matches_total where matches_won.id =matches_total.id order by win desc")
result = []
for a in c.fetchall():
result.append(a)
db.commit()
db.close()
return result
def reportMatch(winner, loser):
"""Records the outcome of a single match between two players.
Args:
winner: the id number of the player who won
loser: the id number of the player who lost
"""
db = connect()
c = db.cursor()
c.execute(
"INSERT INTO Matches(winner_id,looser_id) VALUES (%s,%s)", (winner, loser,))
db.commit()
db.close()
def swissPairings():
"""Returns a list of pairs of players for the next round of a match.
Assuming that there are an even number of players registered, each player
appears exactly once in the pairings. Each player is paired with another
player with an equal or nearly-equal win record, that is, a player adjacent
to him or her in the standings.
Returns:
A list of tuples, each of which contains (id1, name1, id2, name2)
id1: the first player's unique id
name1: the first player's name
id2: the second player's unique id
name2: the second player's name
"""
db = connect()
c = db.cursor()
c.execute("SELECT * FROM matches_won;")
rows = c.fetchall()
db.close()
i = 0
result = []
while i < len(rows):
playerAid = rows[i][0]
playerAname = rows[i][1]
playerBid = rows[i+1][0]
playerBname = rows[i+1][1]
result.append((playerAid, playerAname, playerBid, playerBname))
i = i+2
return result