なかなか動かすまでに時間がかかる。想定していないエラーがいろいろと発生しました。
未解決のもの、しばらくして動かすと動く、IPアドレスの解放がうまくいっていない時があるらしい。たまに発生
sock.bind(("localhost", 8080))
OSError: [Errno 98] Address already in use
これもハッキリしていない。tcpでのencodeとstrの間に違いがあるらしい。今はなんとなく回避できている。
Traceback (most recent call last):
ValueError: invalid literal for int() with base 10: ''
この辺の文字コード周りでひっかかることがよくあります。python2系の頃のほうがまとまってなかったみたいです。
とりあえず動いたものです。
問題の答えを頭でやってしまったので趣旨とは違いますが、いろいろ外側でハマってしまってやる気が…
<サーバ側>
最初に起動します。
クライアントが接続するとマップデータを送信します。
クライアント側から解答を受信します。
解答をマップデータと照らし合わせてゴールしていれば"STAGE CLEAR"、ゴールできていなければ"GAME OVER"を返します。
<クライアント側>
サーバと接続できるとまずデータを取得します。
それをマップのデータにします。
解答を送信します。
解答の結果を受信します。
未解決のもの、しばらくして動かすと動く、IPアドレスの解放がうまくいっていない時があるらしい。たまに発生
sock.bind(("localhost", 8080))
OSError: [Errno 98] Address already in use
これもハッキリしていない。tcpでのencodeとstrの間に違いがあるらしい。今はなんとなく回避できている。
Traceback (most recent call last):
ValueError: invalid literal for int() with base 10: ''
この辺の文字コード周りでひっかかることがよくあります。python2系の頃のほうがまとまってなかったみたいです。
とりあえず動いたものです。
問題の答えを頭でやってしまったので趣旨とは違いますが、いろいろ外側でハマってしまってやる気が…
<サーバ側>
最初に起動します。
クライアントが接続するとマップデータを送信します。
クライアント側から解答を受信します。
解答をマップデータと照らし合わせてゴールしていれば"STAGE CLEAR"、ゴールできていなければ"GAME OVER"を返します。
<クライアント側>
サーバと接続できるとまずデータを取得します。
それをマップのデータにします。
解答を送信します。
解答の結果を受信します。
#server import socket sendstr="" sendline=0 mp=[] def prin(s): global sendstr,sendline sendstr+=str(s)+"¥n" sendline+=1 def send(client): global sendstr,sendline sendstr=str(sendline)+"¥n"+sendstr[:-2] client.send(sendstr.encode()) def get(x,y): if 0>x or 0>y or x>9 or y>6:return"#" return mp[y][x] def clearCk(data): global mp px=3 py=1 for i in data: if i=="U":py-=1 if i=="L":px-=1 if i=="D":py+=1 if i=="R":px+=1 if get(px,py)=="#":return False if get(px,py)=="E":return True return False def main(): global sendstr,sendline,mp sendstr="" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setblocking(True) sock.bind(("localhost", 8080)) sock.listen(1) client, addr = sock.accept() #print("connection_by" + str(client)) mp+=["##########"] mp+=["# #S# #"] mp+=["# # # #"] mp+=["# ### # #"] mp+=["# # # ##"] mp+=["# # # E#"] mp+=["##########"] while True: for i in mp: prin(i) send(client) data = client.recv(1024).decode() if clearCk(data): client.send("STAGE CLEAR".encode()) else: client.send("GAME OVER".encode()) break client.close() sock.close() main()
#client import socket data=[] datacount=0 def input(): global data,datacount if len(data)>datacount-1:return "" datacount+=1 return data[datacount] def main(): global data,datacount sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(("localhost", 8080)) while True: recvdata = sock.recv(1024).decode() if not recvdata: sock.close() break data=recvdata.split("¥n") datacount=len(data) ###↓make program n=int(data[0]) mp=[] for i in range(n+1): mp+=[data[i]] #mapのSの位置からEの位置へ壁に当たらないように動かす #移動はUDRLで上下右左でつなげて返す sock.send("DLLDDDRRURRUUURRRDDLDDR".encode()) #sock.send("DLLDDDRRURRUUURRRDDLDD".encode()) ###↑make program #クリアしていればSTAGE CLEAR #到達していない、または壁にぶつかっていたらGAME OVERが返ってくる print(sock.recv(1024).decode()) sock.close() break main()