From f3f2f60df3b497c7bc8d9d8611feac61cbd71df3 Mon Sep 17 00:00:00 2001 From: DoubleQ <1243026909@qq.com> Date: Thu, 15 Sep 2022 18:55:22 +0800 Subject: [PATCH] =?UTF-8?q?9/15TZY=20=E4=B8=8B=E5=8D=88=E8=BF=9B=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 2 +- SafariChess_Gamev1.0.py | 33 +++++-------- SafariChess_backend.py | 45 +++++++++++++----- .../SafariChess_backend.cpython-39.pyc | Bin 11311 -> 12075 bytes 4 files changed, 48 insertions(+), 32 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index a42fab7..a85618c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -18,7 +18,7 @@ "type": "python", "request": "launch", "program": "${workspaceFolder}/network/server.py", - "cwd": "${fileDirname}", + "cwd": "${workspaceFolder}/network/", "console": "integratedTerminal", "justMyCode": true }, diff --git a/SafariChess_Gamev1.0.py b/SafariChess_Gamev1.0.py index 98043ae..8ea1d08 100644 --- a/SafariChess_Gamev1.0.py +++ b/SafariChess_Gamev1.0.py @@ -34,21 +34,12 @@ SIZE = 64 IMAGES = {} bias_top = 100 #棋盘的上边距 bias_left = 100 #棋盘的左边距 -#multithreading? -def startNewThread(target): - thread = Thread(target=target) - thread.daemon = True - thread.start() + #网络版更新需要注意多线程的问题? #尝试写一个函数分配一个新线程供监听 #等待敌人移动 -def updateForEnemy(network: backend.Network,game_state: backend.GameState): - print("waiting for the other player to move...") - otherMove = game_state.dnldmv_server() - if otherMove is not None: - game_state.makeMove(otherMove) - + def loadImages():#加载图片,a,b双方分别有象狮豹狼狐鹰鼠七个角色 pieces = ["r7", "r6", "r5", "r4", "r3", "r2", "r1", "b7", "b6", "b5", "b4", "b3", "b2", "b1", @@ -251,7 +242,8 @@ def main(mode,p1,p2,network = None): NewPlayerMessage = '' #来自对手的信息 if mode == 2: network=backend.Network() - player1 = input("Enter your name: ") + #p1 = input("Enter your name: ") + p1 = 'player1' myPlayerData = { 'type': 0, # game state type ? 'msg': { @@ -262,7 +254,7 @@ def main(mode,p1,p2,network = None): print("Waiting for other player...") NewPlayerMessage = network.receive() print() - player2 = NewPlayerMessage['counterpart_name'] + p2 = NewPlayerMessage['counterpart_name'] pg.init() screen = pg.display.set_mode((BOARD_WIDTH + MOVE_LOG_PANEL_WIDTH, BOARD_HEIGHT)) pg.display.set_caption("Safafi Chess Game") @@ -361,18 +353,19 @@ def main(mode,p1,p2,network = None): #设置某些按键用于悔棋,重新开始游戏,机器提示,退出游戏等功能 pass + #* 网络对战局面更新 + #? 考虑将多线程状态更新指令写在backend中。 + #? 但是考虑到ui刷新问题,故仍尝试在main中写 + #ShowGameState(screen,game_state,valid_moves,square_selected) if mademove: - valid_moves = game_state.getAllMoves() - #mademove = False - #* 网络对战局面更新 - if network is not None: - startNewThread(updateForEnemy(network,game_state)) - ShowGameState(screen,game_state,valid_moves,square_selected) - + mademove = False + game_state.updateEnemy()#思路变成:定时对敌方进行扫描,若收到更新相关包则进行局面更新。 + ShowGameState(screen,game_state,valid_moves,square_selected) if game_state.conquer(): showGameOverText(screen,"player "+game_state.win_person+" wins") game_over = True clock.tick(60) + pg.display.flip() if __name__ == '__main__': diff --git a/SafariChess_backend.py b/SafariChess_backend.py index 4a652f5..33e2394 100644 --- a/SafariChess_backend.py +++ b/SafariChess_backend.py @@ -1,7 +1,15 @@ -import socket +import socket +import this import requests import sys import json +from threading import Thread +#multithreading? +def startNewThread(target): + thread = Thread(target=target) + thread.daemon = True + thread.start() + class Network: def __init__(self): self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -28,6 +36,7 @@ class Network: packet = packet.encode('utf-8') #return self.client.recv(2048).encode() self.client.send(packet) + print("send complete") except socket.error as e: print(e) @@ -38,8 +47,9 @@ class Network: def receive(self): try: - msg = json.loads(self.client.recv(2048)) - print(msg) + recvMsg = self.client.recv(2048).decode('utf-8') + msg = json.loads(recvMsg) + print('receiver got: ', msg) return msg except socket.error as e: print(e) @@ -100,6 +110,7 @@ class GameState: self.isNet = isNet self.game_id = game_id self.red_to_move=MySide + self.MySide = MySide self.client = client self.conquered=False self.win_person='' @@ -107,6 +118,8 @@ class GameState: def color(self): return 'r' if self.red_to_move else 'b' + def exchange(self): + self.red_to_move = not self.red_to_move #网络版相关组件 def upldmv_server(self,move): thisMove = { @@ -126,11 +139,19 @@ class GameState: } } self.client.send(thisMove) - def dnldmv_server(self): + def __updateOther__(self):#! 注意:考虑使用多线程执行该函数。 + #print('waiting 4 other player 2 act...') thisMovejson = self.client.receive() - thisMove = Move([thisMovejson['src']['x'],thisMovejson['src']['y']],[thisMovejson['dst']['x'],thisMovejson['dst']['y']],self.board) - return thisMove + if not thisMovejson or thisMovejson['side'] == int(self.MySide): + return + print('passing checkpoint') + if 'chessman' in thisMovejson.keys(): #正常移动过程 + thisMove = Move([thisMovejson['src']['x'],thisMovejson['src']['y']],[thisMovejson['dst']['x'],thisMovejson['dst']['y']],self.board) + self.makeMove(thisMove,toUpload=False) + self.exchange() + def updateEnemy(self): + startNewThread(self.__updateOther__)#测试多线程更新…… # 判断特殊位置 def inHome(self,row,col,color): if color=="b": @@ -326,8 +347,9 @@ class GameState: return self.conquered #移动操作 - def makeMove(self,move):#cur是当前位置,nxt是下一个位置,参数传入为元组 + def makeMove(self,move,toUpload = True):#cur是当前位置,nxt是下一个位置,参数传入为元组 # makeMove假设这个move一定是合法的 + # 为什么添加toUpload?防止使用makeMove更新己方棋盘时,把敌方棋盘错误上传,导致“棋子消失”。 if self.board[move.end_row][move.end_col] != '00': nxt_piece = self.board[move.end_row][move.end_col] if nxt_piece[0] == 'r': @@ -336,9 +358,10 @@ class GameState: self.blue_pieces.remove(int(nxt_piece[1])) self.board[move.end_row][move.end_col] = self.board[move.start_row][move.start_col] self.board[move.start_row][move.start_col] = '00' - if not self.isNet: self.red_to_move = not self.red_to_move - else: - #直接在这里完成两步实现看起来不可行…… - #因为界面更新在main中 + self.red_to_move = not self.red_to_move + #由于使用多线程,考虑让另一个线程去更新red_to_move + if self.isNet and toUpload: + #因为界面更新在main中,考虑在main中执行相关指令。 self.upldmv_server(move) + diff --git a/__pycache__/SafariChess_backend.cpython-39.pyc b/__pycache__/SafariChess_backend.cpython-39.pyc index d0a2d269f40d84add3edb875aff6929d37ed28d9..699ae39d066129cdc3be73f18877fddc7328e07d 100644 GIT binary patch delta 4821 zcmai2-E$jP72mtNTCHSRjvd<*IUjZHG|A?}P0}_E`6yvX+|V{IZQLeN(154Ul1T&D20?@cPKNaGcaHn`oKdTfd_^ec!2!}z%xAY!c03%IKQ)!Wy_vH zn*HhAbI(2J-gD1A_pE+#_Tvl5Ys89oLX^PoK~#1Md%-~L|}}L zODAjRgkLo`oY_QNPpOij+v0|>)vCyds+d*h6f&jIK#j+ESvlr-qn0LB8W0$E)+v@t zLBypF&r+qvT#q%+D>CZ;Ok5sJa_@+9EwpHojB5}mA}$OeV?_P()_~}fQKCYCOkid* z`BL7?WRiZLdV16PrCyd}5rby)<+9uBzpcLdXfFxS%#x7n1grzBF^qdtevfw8kR&qm zl>f4}e~TBj^_xN{XOz;Au6X7|Y`P$n8=6pNy1l4>PkXpOGO{RWKp-CbG&1R3-g9uK z-E~TKf394t6dcd-|Ez7h0Q-Rseh{h1e94n-;6xlL%hJ+iH??FJLE5Nfb5|TM5Kha| z<-^q7PmhZwC_*Jqb&0r|5DEW9eRdzK*hW3+=s4}6Bi*zq9k)_0xvNy|AhBKkV8p8F zL?OJsNRMk1%AWPw zOxvmQlrt3ejaX5+2SbMdj{;yMFv^!EoSYZvm&)aWJO+MKc~sd*ZJrV4aflulu|aE! z$-RCiwmJDzYC1|<*h*TpE&rX^o7N-tHp(~M_D*}dz2lZh_t>=8)~+D-bhhZ6_OhNc zJW4r2CjA}p&Ej|daQxn8wW?&+RdvEnJ4x7OcMz^;x_jZX_!7jBGre6`#Y%&M&=ePFfpGFFS~P)~CNO<|d}=A^@UHRVF; zc(`;KE~!QJvcf!Htm{QtH;QcIB!Ep-taDUqZsjbiH@5sTP)qR)cH zt`nW6A9+5cArp=WyPXPXG=8o&>Oi zkdEjog98J-NasB;z45$@lfUdB!+AmbWTjvir!tiJsk2Hfw~s(kRaFB zGMqC*9r7!HYk=zjENYla7Sk)gRKc}C?qoM{u6_+79ALOB0{x0J?MhCt9GGS?d!^>E z=ccH??$van;m--TT#{dfj+IdvbYwD<6`S(f^WL~4GnsFZOn8&1anUQ_+=MtFl42&+ zjFOfyxiCI)_0eZlfTH4>5bSVrJ_jfrP83A)>wvZ5v@M*}iIP*C{s9R!LbazkiDeQw z_j17%$I1QzxMC<{;9TPfQ?#_AR>`D0^2=i#a|&iO*LVQL)xgK{X(IDcy;g7co%`LP_%VX%yo%PVyl>0Xy1?)obWks&#U~y zbD38cAJAt7A5p^Y2p!XO)~o0^4}cfv&2ZN6nEWQ-8vukvU}P&5Drm!F^=;zJ$2*rh z5`ypg|4AK69R#^@O)^KkKQ27e_p&(oT_R}@N|0hhOE%;O;PJVIfp7*t0@b4JBJuvV z@Xw7eXf^EdvPE$$aC9!MjBeDXEd)SwQK5yER#%1x#NP${7%&I;5YSj-XMJwS!!k?o zkA*)x^pU8&hxYdY?*o2FKvB&T12kyt3(@!qc(89pLU$xrzAo>3_S}~dqhsQY@(4cXq8#JHwdYMp{!4IE%l3}_o!;=kVYT?Z5 zinxP?Od68H@Ux)_rqNA&uo`@(>wG9_@R_djp|HVcn$5h(T%_Ms`DsODtPJnnEJG9;daCppuS{Wnh_KC@2B{Su_+jpm0qSz+!LGrcxod0~^#)ZFZ-z&20KK4H+ znDfwxT^psavGC6ts>1j$ov`@eMRF>}__gK~m`93bd$Qm>CHhFj?INJ}$ND#+nvvw5Wb%JI Cy_|di delta 3993 zcma)9-E$jP72mrb(n|i89lK5)l9jiK+^ug2NW5!d42N*iTE5kzvUX~Z&1CJR4 zdb8-wqPLhEr?)u0#auD1Irc7eOzr$a3<`5wlWpojaXo2gGPy#ol*z=@KlJH=77~$d zb!aClh|PPYD@DIuea(2~;ZEW>hKxZZ0k8r4Oykim^>^cZY>`AZCe(mA-g`|ejG9_0 zzG$zzLc3`QZKJ1@PZ!qJ2-k|HINdZ!w*w#Hb&VdAIb3tras zq@T8>=dTnC{(Xv$lGvcqV@?IW!0MCq_%9M{94TpAqO2|ITZSv{(f>_RGRtC92(2ux zY10~oZ7s&uuTt1Lh5Z1H>O87n(_-37noIm!`gHa8w04>(S~h(ur%{fbxI92+0xMt4 zy8bjTKwwI5ZcPplpOYgWB#IWNo)dWpLru#Wr%7IJ&3lN(>KRE1TaCphFLz)<3c!nt z%t=Hoj{zc0Od*|8C$Q-8VbvD4Z5wvnPTH2#)jiRpK8ycLbgNJ7oM=^t6Nh^u9XuTd z$JEut?U55i$uk6w9!78$jJ@JPER*qWWHRTJl{`Fk90EfC#3G?8h!tlSy}43g&K8S# z`55?-ipXmiJ57&o5|Gykc>><{;dK)H9}sw2TDV$TcaN)|Chznav>HP};;HPiH(kn> zyh}4vj*u~Rx#f`fty*gNS)WS!PxClb*O=x`EZCI@A-*AQu{}MNWr)MRFl^F$`UX zAvLLP2%e=$bwi4rcp%0CF)n-5iH_ryZpxvf?_#MWI)-CV#XLvEZk$Kt70~EQ#J@^E zaweo96V3?bLw;ON6Mq+tW*3DVPGMOnk}!8E(59Ro`3RAL`g6zcbXxXzJ0CjBJIw_* zc6og|N8Q826z+~u+0_gE2^#dzsegAqu7uuBU$|1wbxTM01*ZL2GJcX=&CostHN#PTs)({SgMSjx{A$NS9m&6aY5}=nP=D zkAcBG1glgHAl+J;srtU?7YlL~LVFh`XmbkTr$u5!1UI#d3g&QJ8amYLu#UbaCDs5>9%5N!IN~q z$dpKTvzLjl=5x!r0y+9~b-VvB3v~l*)Ug6fW()IPVC205TMUc$6&SSGU|^vz02yt8ImLR*;69awo?+}Nh4C9S*@H__4 zN4P(2+o3Z^guDqT1F&6#SaxLv*A=eCH;A*HY)lX2Hq{>n&h_K`Y4TKlop_(@bRK#^ zJpC;qDYM)m*iPMq{61#Z^@k3;yN@4(fqXOO9+|S)-Uj z3wy2ZU37?V0^SFF08oHhj9t}8(Kh5u1fT7^H~5jL+`;>|0p9_9mw;-O9Rt*8EDO=R zI#oW?|L1ba??L%K8H&p^jc7u39U9&F&#}K6mD`YPN*23Q&l4AblOT7vI3)wV<-MA8(sJldbuo!AIrV$M#H9pf-J`~pY zOtYD1nOgzY{gfD{_SRS#d#k;<6yKx?PRD)q4z2G2xIFHH`T(E+sF8Hr;_C8BW=(zR z6%|C;R9$!s+E2OS*iPPBvr9ELmk;{c-q!(AD3D zCoBGk#7?%-v6o2}l4WhHrA!|LBD~PkF&6b#4g-tnw1xqU5*;4Ka65=e4?Rx$U~@Fl zxs7{AxMkOfs+|fYO{+xvu3_5+_HuT~Ll1n0GU%shj;8n0mr$$d)qBJdqEhBYDmw3K z;*Lo-U0i>T!{88r@7qWdU%JD*!U_2rpu(Ms3x)g08({JRpuI_SCGG*d`6QNC{t)nE zK-9XK;)Zda1}@O!qvzQ|6WZsx&_8b-p>K_p9kUbsw9;2cyWL@r&e4x!rzED)cN3OS o9s%?L4glD9?w}Cb&uCzOdAaDW=DiE3x7ybY-D+&neyY9we;Y5@IRF3v