パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

クライアントで出題、クライアントで解答のプログラム

2018-10-10 | python 謎解き
なかなか動かすまでに時間がかかる。想定していないエラーがいろいろと発生しました。

未解決のもの、しばらくして動かすと動く、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()



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。