Client can waiting for the next game. Server can show user list

This commit is contained in:
snsd0805 2020-06-28 22:16:33 +08:00
parent 4c77d25632
commit 62fc412e95
2 changed files with 85 additions and 27 deletions

46
draw.py
View File

@ -1,7 +1,28 @@
import pygame, sys,threading
import json
def sendDraw(sock):
def drawUserList(nowUserList,screen):
listSTR = nowUserList[7:]
listJSON = json.loads(listSTR)
#[['127.0.0.1', 52362], ['127.0.0.1', 52370]]
y = 100
cross = 20
pygame.draw.rect(screen,(255,255,255),[900,100,200,380])
for sockName in listJSON:
pygame.draw.rect(screen,(171, 254, 250),[900,y,200,30],0) # 輸入匡的矩形
pgStringVar = pygame.font.Font(None,25).render(str(sockName),False,(0,0,0))# 文字物件
screen.blit(pgStringVar,(910,y+10))# draw font
pygame.display.update()
y = y+30+cross
def drawerReceive(sock,screen):
while True:
data = sock.recv(1024).decode('utf-8')
if data[0:6] == "[list]":
drawUserList(data,screen)
def sendDraw(sock,nowUserList):
white= (255, 255, 255)
black= (0, 0, 0)
@ -10,14 +31,21 @@ def sendDraw(sock):
size= [1080, 480]
screen= pygame.display.set_mode(size)
clock= pygame.time.Clock()
screen.fill((255, 255, 255))
# 開始話user list
drawUserList(nowUserList,screen)
drawerRecvThreading = threading.Thread(target=drawerReceive,args=(sock,screen))
drawerRecvThreading.start()
# 使系統滑鼠圖標不可見
#pygame.mouse.set_visible(False)
dotPos = []
mouseFlag = False
screen.fill((255, 255, 255))
pygame.display.update()
tempPos = ()
while True:
@ -112,18 +140,8 @@ def receiveDraw(sock):
pygame.quit()
sys.exit()
elif data[0:6] == "[list]":
listSTR = data[7:]
listJSON = json.loads(listSTR)
#[['127.0.0.1', 52362], ['127.0.0.1', 52370]]
y = 100
cross = 20
for sockName in listJSON:
pygame.draw.rect(screen,(171, 254, 250),[900,y,200,30],0) # 輸入匡的矩形
pgStringVar = pygame.font.Font(None,25).render(str(sockName),False,(0,0,0))# 文字物件
screen.blit(pgStringVar,(910,y+10))# draw font
pygame.display.update()
y = y+30+cross
drawUserList(data,screen)
continue
#print(data)

66
main.py
View File

@ -99,12 +99,15 @@ class Room:
listensock.bind((self.ip,self.portNum))
print("\t{}:{}".format(self.ip,self.portNum))
listensock.listen(5)
emptyFlag = True
while True:
sock,sockname = listensock.accept()
print("[ {} ]{} has connected.".format(self.portNum,sockname))
self.sockList.append(sock) # 把sock放入list
allPeerName = []
self.sockList.append(sock) # 把sock放入list
# Send socket list to client to build a user list and put it beside picture.
for i in self.sockList:
allPeerName.append(i.getpeername())
for sock in self.sockList:
@ -112,7 +115,18 @@ class Room:
receiveDataThread = threading.Thread(target=self.receiveData,args=(sock,))
# 負責與client通信傳輸遊戲所必須的指令
receiveDataThread.start()
if emptyFlag:
self.game()
emptyFlag = False
def game(self):
mainSocket = random.choice(self.sockList)
for sock in self.sockList:
if sock == mainSocket:
sock.send('[prob] {}'.format(self.problem).encode('utf-8'))
else:
sock.send('[gues]'.encode('utf-8'))
def connect(self):
time.sleep(0.5)
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
@ -143,6 +157,13 @@ class Room:
elif data == 'exit':
sock.send('exitok'.encode('utf-8'))
self.sockList.remove(sock)
allPeerName = []
# Send socket list to client to build a user list and put it beside picture.
for i in self.sockList:
allPeerName.append(i.getpeername())
for sock in self.sockList:
sock.send("[list] {}".format(json.dumps(allPeerName)).encode('utf-8'))
else:
sock.send('n'.encode('utf-8'))
@ -174,7 +195,6 @@ class Client:
# receiveDataThread.start()
# sendDataThread = threading.Thread(target=self.sendData,args=(sock,))
# sendDataThread.start()
draw.sendDraw(sock) # 開始繪圖
elif receiveMsg=="OK.CLIENT":
roomNum = input("Room Number> ")
@ -188,19 +208,39 @@ class Client:
# receiveDataThread.start()
# sendDataThread = threading.Thread(target=self.sendData,args=(sock,))
# sendDataThread.start()
draw.receiveDraw(sock) # Start to receive mouse position to draw picture what MAIN client draw.
else:
print("ERROR TYPE")
exit
def receiveData(self,sock):
while True:
data = sock.recv(MAX).decode('utf-8')
if data:
print(data)
def sendData(self,sock):
while True:
data = input("> ")
sock.send(data.encode('utf-8'))
userList = sock.recv(1024).decode('utf-8')
print("List: ",userList)
continueFlag = False
while not continueFlag:
data = sock.recv(1024).decode('utf-8')
role = data[1:5]
#print("Role: ",role)
if role == "prob":
draw.sendDraw(sock,userList)
elif role == "gues":
draw.receiveDraw(sock)
continueFlag = True
elif role == "list":
userList = data
print("List: ",userList)
continueFlag = False
else: #useless position
continueFlag = False
# def receiveData(self,sock):
# while True:
# data = sock.recv(MAX).decode('utf-8')
# if data:
# print(data)
# def sendData(self,sock):
# while True:
# data = input("> ")
# sock.send(data.encode('utf-8'))
def main():
ip = sys.argv[2]
port = sys.argv[3]