You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
7.4 KiB
185 lines
7.4 KiB
import socket
|
|
import threading
|
|
import random
|
|
import time
|
|
|
|
class OcaAOcaGame:
|
|
def __init__(self):
|
|
self.current_turn = 1
|
|
self.player1 = None
|
|
self.player2 = {}
|
|
self.player1_pos = 1
|
|
self.player2_pos = 1
|
|
self.oca_positions = [5, 9, 14, 18, 23, 27, 32, 36, 41, 45, 50, 54, 59]
|
|
|
|
# Asigns player1 and player2 to sockets
|
|
def add_player(self, player):
|
|
if self.player1 == None:
|
|
self.player1 = player
|
|
print("ADDED PLAYER 1")
|
|
return
|
|
else:
|
|
self.player2 = player
|
|
print("ADDED PLAYER 2")
|
|
return
|
|
|
|
def start_game(self):
|
|
msg_turn = "your_turn"
|
|
msg_started = "The game has started!"
|
|
msg_player1_oca = "Player 1 has landed on an Oca!"
|
|
msg_player1_win = "Player 1 is the Winner!"
|
|
msg_player2_oca = "Player 2 has landed on an Oca!"
|
|
msg_player2_win = "Player 2 is the Winner!"
|
|
self.player1[0].sendall(msg_started.encode('utf-8'))
|
|
self.player2[0].sendall(msg_started.encode('utf-8'))
|
|
# Used to prevent the game from locking up
|
|
sleep_time = 1
|
|
|
|
while True:
|
|
# Determine player turn
|
|
if self.current_turn % 2 != 0:
|
|
|
|
# Player 1 turn
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_turn.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
player1_turn = True
|
|
while player1_turn == True:
|
|
|
|
# Player rolls dice
|
|
data = self.player1[0].recv(1024)
|
|
print(data.decode('utf-8'))
|
|
if data.decode('utf-8') == "roll":
|
|
roll = random.randint(1, 6)
|
|
print(f"Player 1 Roll: {roll}")
|
|
self.player1_pos += roll
|
|
|
|
# Check position of player, if lands on oca -> go to next oca
|
|
if self.player1_pos != self.check_next_oca(self.player1_pos):
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_player1_oca.encode('utf-8'))
|
|
self.player2[0].sendall(msg_player1_oca.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
self.player1_pos = self.check_next_oca(self.player1_pos)
|
|
|
|
# Checks if player is over 63, if so -> return position after going back the required spaces
|
|
self.player1_pos = self.check_if_over_63(self.player1_pos)
|
|
|
|
# Checks position of player, if lands of 63 -> win
|
|
if self.player1_pos == 63:
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_player1_win.encode('utf-8'))
|
|
self.player2[0].sendall(msg_player1_win.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
|
|
# Updates player position message
|
|
msg_player1_pos = "Player 1 Position: " + str(self.player1_pos)
|
|
print(msg_player1_pos)
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_player1_pos.encode('utf-8'))
|
|
self.player2[0].sendall(msg_player1_pos.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
|
|
self.current_turn += 1
|
|
player1_turn = False
|
|
else:
|
|
continue
|
|
else:
|
|
|
|
# Player 2 turn
|
|
time.sleep(sleep_time)
|
|
self.player2[0].sendall(msg_turn.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
player2_turn = True
|
|
while player2_turn == True:
|
|
|
|
# Player rolls dice
|
|
data = self.player2[0].recv(1024)
|
|
print(data.decode('utf-8'))
|
|
if data.decode('utf-8') == "roll":
|
|
roll = random.randint(1, 6)
|
|
print(f"Player 2 Roll: {roll}")
|
|
self.player2_pos += roll
|
|
|
|
# Check position of player, if lands on oca -> go to next oca
|
|
if self.player2_pos != self.check_next_oca(self.player2_pos):
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_player2_oca.encode('utf-8'))
|
|
self.player2[0].sendall(msg_player2_oca.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
self.player2_pos = self.check_next_oca(self.player2_pos)
|
|
|
|
# Checks if player is over 63, if so -> return position after going back the required spaces
|
|
self.player2_pos = self.check_if_over_63(self.player2_pos)
|
|
|
|
# Checks position of player, if lands of 63 -> win
|
|
if self.player2_pos == 63:
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_player2_win.encode('utf-8'))
|
|
self.player2[0].sendall(msg_player2_win.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
|
|
# Updates player position message
|
|
msg_player2_pos = "Player 2 Position: " + str(self.player2_pos)
|
|
print(msg_player2_pos)
|
|
time.sleep(sleep_time)
|
|
self.player1[0].sendall(msg_player2_pos.encode('utf-8'))
|
|
self.player2[0].sendall(msg_player2_pos.encode('utf-8'))
|
|
time.sleep(sleep_time)
|
|
|
|
self.current_turn += 1
|
|
player2_turn = False
|
|
else:
|
|
continue
|
|
|
|
# Check what oca is the next one in the array
|
|
def check_next_oca(self, pos):
|
|
if pos in self.oca_positions:
|
|
index = self.oca_positions.index(pos)
|
|
if index < len(self.oca_positions) - 1:
|
|
return self.oca_positions[index + 1]
|
|
else:
|
|
return pos
|
|
|
|
def check_if_over_63(self, pos):
|
|
if pos >= 63:
|
|
# Returns the pos the player should be after getting more than the max
|
|
return 63 - (pos - 63)
|
|
else:
|
|
return pos
|
|
|
|
class OcaAOcaServer:
|
|
def __init__(self, host, port):
|
|
self.host = host
|
|
self.port = port
|
|
self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
self.game = OcaAOcaGame()
|
|
self.clients = []
|
|
self.player1 = {}
|
|
self.player2 = {}
|
|
|
|
# Waits for players to join and starts the game when 2 have joined
|
|
def start(self):
|
|
self.server_socket.bind((self.host, self.port))
|
|
self.server_socket.listen(2)
|
|
print(f"Server is listening on {self.host}:{self.port}")
|
|
|
|
self.player1 = self.server_socket.accept()
|
|
self.game.add_player(self.player1)
|
|
print(f"Connection from {self.player1} has been established for Player 1.")
|
|
|
|
self.player2 = self.server_socket.accept()
|
|
self.game.add_player(self.player2)
|
|
print(f"Connection from {self.player2} has been established for Player 2.")
|
|
|
|
self.game.start_game()
|
|
|
|
if __name__ == "__main__":
|
|
HOST = '192.168.100.252'
|
|
PORT = 2000
|
|
|
|
server = OcaAOcaServer(HOST, PORT)
|
|
server.start()
|
|
|
|
|
|
|