2 import math
3 from PodSixNet.Connection import ConnectionListener,connection
4 from time import sleep
5
6 #客户端游戏类7 class BoxesGame(ConnectionListener):
8 def initSound(self):
9 pygame.mixer.music.load("music.wav")
10 self.winSound=pygame.mixer.Sound('win.wav')
11 self.loseSound=pygame.mixer.Sound('lose.wav')
12 self.placeSound=pygame.mixer.Sound('place.wav')
13 pygame.mixer.music.play()
14 #收到来自Server的 action:close指令后调用下面方法15 def Network_close(self,data):
16 exit()
17 def Network_yourturn(self,data):
18 self.turn=data['torf']
19 def Network_startgame(self,data):
20 self.running=True
21 self.num=data["player"]
22 self.gameid=data["gameid"]
23 def Network_place(self,data):
24 self.placeSound.play()
25 x=data["x"]
26 y=data["y"]
27 hv=data["is_horizontal"]
28 if hv:
29 self.boardh[y][x]=True
30 else:
31 self.boardv[y][x]=True
32 #设定某个格子为自己的33 def Network_win(self,data):
34 self.owner[data["x"]][data["y"]]="win"
35 self.boardh[data["y"]][data["x"]]=True
36 self.boardv[data["y"]][data["x"]]=True
37 self.boardh[data["y"]+1][data["x"]]=True
38 self.boardv[data["y"]][data["x"]+1]=True
39 self.winSound.play()
40 self.me+=1
41 def Network_lose(self,data):
42 self.owner[data["x"]][data["y"]]="lose"
43 self.boardh[data["y"]][data["x"]]=True
44 self.boardv[data["y"]][data["x"]]=True
45 self.boardh[data["y"]+1][data["x"]]=True
46 self.boardv[data["y"]][data["x"]+1]=True
47 self.loseSound.play()
48 self.otherplayer+=1
49
50 def __init__(self):
51 self.justplaced=10
52 pygame.init()
53 pygame.font.init()
54 width, height = 389, 489
55 self.me = 0
56 self.otherplayer = 0
57 self.didwin = False
58 self.gameid=None
59 self.num=None
60 self.num=0
61 self.screen = pygame.display.set_mode((width, height))
62 self.owner=[[0 for x in range(6)] for y in range(6)]
63 self.clock = pygame.time.Clock()
64 self.turn = True
65 self.running=False
66 self.boardh = [[False for x in range(6)] for y in range(7)]
67 self.boardv = [[False for x in range(7)] for y in range(6)]
68 print(self.boardh)
69 print(self.boardv)
70 self.initGraphics()
71 self.initSound()
72 self.drawHUD()
73 pygame.display.set_caption("Boxes")
74
75 #address=raw_input("Host:Port(localhost:8080):")76 #try:77 #if not address:78 #host,port="localhost",372179 #else:80 #host,port=address.split(":")81 #self.Connect((host,port))82 #except:83 #print("Error Connecting to Server")84 #print("Usage: host:port")85 #print("eg 127.0.0.1;3721")86 #exit()87 self.Connect()
88 print("Boxes client started")
89 while not self.running:
90 self.Pump()
91 connection.Pump()
92 self.running=True
93 sleep(0.01)
94 print("not running ,connecting...")
95 if self.num==0:
96 #self.turn=True97 self.marker=self.greenplayer
98 self.othermarker=self.blueplayer
99 else:
100 self.turn=False
101 self.marker=self.blueplayer
102 self.othermarker=self.greenplayer
103
104
105 def initGraphics(self):
106 self.normallinev = pygame.image.load("normalline.png")
107 self.normallineh = pygame.transform.rotate(self.normallinev, -90)
108 self.bar_donev = pygame.image.load("bar_done.png")
109 self.bar_doneh = pygame.transform.rotate(self.bar_donev, -90)
110 self.hoverlinev = pygame.image.load("hoverline.png")
111 self.hoverlineh = pygame.transform.rotate(self.hoverlinev, -90)
112 #self.boardh[5][4]=True113 #self.boardv[5][5]=True114 self.separators = pygame.image.load("separators.png")
115 self.score_panel = pygame.image.load("score_panel.png")
116 self.redindicator = pygame.image.load("redindicator.png")
117 self.greenindicator = pygame.image.load("greenindicator.png")
118 self.greenplayer = pygame.image.load("greenplayer.png")
119 self.blueplayer = pygame.image.load("blueplayer.png")
120 self.winningscreen = pygame.image.load("youwin.png")
121 self.gameover = pygame.image.load("gameover.png")
122
123 def drawBoard(self):
124 for x in range(6):
125 for y in range(7):
126 if not self.boardh[y][x]:
127 self.screen.blit(self.normallineh, [(x) * 64 + 5, (y) * 64])
128 else:
129 self.screen.blit(self.bar_doneh, [(x) * 64 + 5, (y) * 64])
130 for x in range(7):
131 for y in range(6):
132 if not self.boardv[y][x]:
133 self.screen.blit(self.normallinev, [(x) * 64, (y) * 64 + 5])
134 else:
135 self.screen.blit(self.bar_donev, [(x) * 64, (y) * 64 + 5])
136
137 def update(self):
138 #判断方格是否已经都有归属139 if self.me+self.otherplayer==36:
140 self.didwin=True if self.me>self.otherplayer else False
141 return 1
142 self.justplaced-=1
143 #print('pump connect info')144 connection.Pump()
145 self.Pump()
146 #print('pump connect info finish')147 self.clock.tick(60)
148 self.screen.fill(0)
149 self.drawBoard()
150 self.drawHUD()
151 self.drawOwnermap()
152 for event in pygame.event.get():
153 if event.type == pygame.QUIT:
154 exit()
155
156 mouse = pygame.mouse.get_pos()
157 xpos = int(math.ceil((mouse[0] - 32) / 64.0))
158 ypos = int(math.ceil((mouse[1] - 32) / 64.0))
159 #判断鼠标位置更接近与那条线160 is_horizontal = abs(mouse[1] - ypos * 64) < abs(mouse[0] - xpos * 64)
161 ypos = ypos - 1 if mouse[1] - ypos * 64 < 0 and not is_horizontal else ypos
162 xpos = xpos - 1 if mouse[0] - ypos * 64 < 0 and is_horizontal else xpos
163
164 board = self.boardh if is_horizontal else self.boardv
165 isoutofbounds = False
166
167 try:
168 if not board[ypos][xpos]: self.screen.blit(self.hoverlineh if is_horizontal else self.hoverlinev,
169 [xpos * 64 + 5 if is_horizontal else xpos * 64,
170 ypos * 64 if is_horizontal else ypos * 64 + 5])
171 except:
172 isoutofbounds = True
173 pass
174 if not isoutofbounds:
175 alreadyplaced = board[ypos][xpos]
176 else:
177 alreadyplaced = False
178 #鼠标点击时,发送place信号给自己划线179 if pygame.mouse.get_pressed()[0] and not alreadyplaced and not isoutofbounds and self.turn==True and self.justplaced<=10:
180 self.justplaced=10
181 if is_horizontal:
182 self.boardh[ypos][xpos] = True
183 self.Send({"action":"place","x":xpos,"y":ypos,"is_horizontal":is_horizontal,"gameid":self.gameid,"num":self.num})
184 else:
185 self.boardv[ypos][xpos] = True
186 self.Send({"action":"place","x":xpos,"y":ypos,"is_horizontal":is_horizontal,"gameid":self.gameid,"num":self.num})
187 pygame.display.flip()
188 #画记分区域189 def drawHUD(self):
190 self.screen.blit(self.score_panel, [0, 389])
191 myfont = pygame.font.SysFont(None, 32)
192 label = myfont.render("Your turn", 1, (255, 255, 255))
193 self.screen.blit(label, (10, 400))
194 self.screen.blit(self.greenindicator if self.turn else self.redindicator ,(130, 395))
195 myfont64 = pygame.font.SysFont(None, 64)
196 myfont20 = pygame.font.SysFont(None, 20)
197
198 scoreme = myfont64.render(str(self.me), 1, (255, 255, 255))
199 scoreother = myfont64.render(str(self.otherplayer), 1, (255, 255, 255))
200 scoretextme = myfont20.render("You", 1, (255, 255, 255))
201 scoretextother = myfont20.render("Other Player", 1, (255, 255, 255))
202
203 self.screen.blit(scoretextme, (10, 425))
204 self.screen.blit(scoreme, (10, 435))
205 self.screen.blit(scoretextother, (280, 425))
206 self.screen.blit(scoreother, (280, 435))
207 #给占领与被占领格子着色208 def drawOwnermap(self):
209 for x in range(6):
210 for y in range(6):
211 if self.owner[x][y]!=0:
212 if self.owner[x][y]=="win":
213 self.screen.blit(self.marker,(x*64+5,y*64+5))
214 if self.owner[x][y]=="lose":
215 self.screen.blit(self.othermarker,(x*64+5,y*64+5))
216 #游戏结束后显示gameover或winning的图案217 def finished(self):
218 self.screen.blit(self.gameover if not self.didwin else self.winningscreen,(0,0))
219 while 1:
220 for event in pygame.event.get():
221 if event.type==pygame.QUIT:
222 exit()
223 pygame.display.flip()
224
225
226 bg = BoxesGame()
227 while 1:
228 if bg.update()==1:
229 break
230 bg.finished()