-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
143 lines (116 loc) · 3.47 KB
/
main.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import socket
import threading
import time
from classes import Card, Player, Client, HostGame, ClientGame
PORT = 5050
BUFFER_SIZE = 1024
# stage where players connect to game
def readyStage(server, game):
while not game.started:
try:
conn, addr = server.accept()
except TimeoutError:
continue
name = None
while not name:
name = conn.recv(BUFFER_SIZE)
if name:
message = f"You've connected succesfully {name.decode('UTF-8')}!"
conn.send(message.encode('UTF-8'))
player = Client(name.decode('UTF-8'), (conn, addr))
print(f"\nPlayer connected! {player.name}")
game.players.append(player)
# multicasts players list
players_string = ""
for player in game.players:
players_string += player.name + ";"
for player in game.players:
if type(player) == Player:
continue
player.addr[0].send(players_string[:-1].encode('UTF-8'))
time.sleep(0.5)
# multicasts first card of the game
card = str(game.currentCard.cardType) + ";" + str(game.currentCard.attribute)
for player in game.players:
if type(player) == Player:
continue
player.addr[0].send(card.encode('UTF-8'))
def server():
# grabs the local ip of the machine
SERVER_IP = socket.gethostbyname(socket.gethostname())
# starting server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((SERVER_IP, PORT))
# creates a player and a game
print("Please insert your name: ")
name = input()
player = Player(name)
game = HostGame(player)
# starts the ready stage
server.settimeout(0.2)
server.listen()
thread = threading.Thread(target=readyStage, args=(server, game))
thread.start()
print(f"Tell your friends to connect to {SERVER_IP}")
print("Press enter when all of them connected!")
input()
game.started = True
if len(game.players) == 0:
print("Sorry but you need some friends to play!")
return
server.settimeout(0)
time.sleep(1)
while game.started:
game.runRound()
return
def client():
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("Please type the server IP: ")
valid = False
while not valid:
SERVER_IP = input()
try:
client.connect((SERVER_IP, PORT))
valid = True
except:
print("Please type a valid ip addres!")
print("please type your name:")
name = input()
client.send(name.encode('UTF-8'))
data, addr = client.recvfrom(BUFFER_SIZE)
print(f"{data.decode('UTF-8')}")
time.sleep(0.5)
# wait to receive player list
players_list, addr = client.recvfrom(BUFFER_SIZE)
player = Player(name)
players_list = players_list.decode('UTF-8').split(";")
# receives the first card of the game
current_card, addr = client.recvfrom(BUFFER_SIZE)
current_card = current_card.decode('UTF-8').split(";")
current_card = Card(current_card[0], current_card[1])
game = ClientGame(client, player, players_list, current_card)
# Game
while data[0] != "0":
data, addr = game.client.recvfrom(BUFFER_SIZE)
data = data.decode('UTF-8').split(";")
game.interpreter(data)
client.close()
return
def main():
print("Please select if you are a client or a server:\n1.Server\n2.Client\n0.Exit")
x = ""
while (x != "0"):
x = input()
if x == "1":
server()
return
elif x == "2":
client()
return
elif x == "0":
print("Thank you for playing!")
else:
print("Please type a valid number!")
return
if __name__ == "__main__":
main()