python网络编程案例—五子棋游戏

一.本案例基于UDP的socket编程方法来制作五子棋程序,网络五子棋采用C/S架构,分为服务器端和客户端,游戏时服务端首先启动,当客户端启动连接后,服务器端可以走棋,轮到自己棋才可以在棋盘上落子,同时下方标签会显示对方走起信息,服务器端用户可以通过“退出游戏”按钮可以结束游戏;

1.数据通信协议

网络五子棋游戏设计的难点在于对方进行通信,这里使用面向非连接的Socket编程,Socket编程用于C/S开发,在这类应用中,客户端和服务器端通常需要先建立连接,然后发送和接收数据,交互完成后需要断开连接,本章采用基于UDP的Socket编程实现,这里虽然两台计算机不分主次,但涉及时候假设一台作为服务器端,等待其他方加入,其他想加入必须输入服务器端主机的IP;
下面展示一些 数据通信协议代码

def receiveMessage():
    global s
    while True:
        global addr
        data,addr=s.recvfrom(1024)
        data=data.decode('utf-8')
        a=data.split("|")
        if not data:
            print("client has exited!")
            break
        elif a[0]=='join':  #连接服务器请求
            print('client 连接服务器!')
            label1["text"]='client连接服务器成功,请你走棋!'
        elif a[0]=='exit':
            print('client 对方退出!')
            label1["text"]='client对方退出,游戏结束!'
        elif a[0]=='over':
            print('对方赢信息!')
            label1["text"]=data.split("|")[0]
            showinfo(title="提示",message=data.split("|")[1])
        elif a[0]=='move':
            print('received:',data,'from',addr)
            p=a[1].split(",")
            x=int(p[0])
            y=int(p[1])
            print(p[0],p[1])
            label1["text"]="客户端走的位置"+p[0]+p[1]
            drawOtherChess(x,y)
    s.close()

2.判断输赢的算法

   本游戏关键技术就是判断输赢的算法,对于算法实现大致可以分为以下几个部分:

(1)判断X=Y轴上是否形成五子连珠;

(2)判断X=-Y轴上是否形成五子连珠;

(3)判断X轴上是否形成五子连珠;

(4)判断Y轴上是否形成五子连珠;

#输赢判断
def win_lose():
    a=str(turn)
    print("a=",a)
    for i in range(0,11):
        for j in range(0,11):
            if map[i][j]==a and map[i+1][j+1]==a and map[i+2][j+2]==a and map[i+3][j+3]==a and map[i+4][j+4]==a:
                print("x=y轴上形成五子连珠")
                return True
    for i in range(4,15):
        for j in range(0,11):
            if map[i][j]==a and map[i-1][j+1]==a and map[i-2][j+2]==a and map[i-3][j+3]==a and map[i-4][j+4]==a:
                print("x=-y轴上形成五子连珠")
                return True
    for i in range(0,15):
        for j in range(4,15):
            if map[i][j]==a and map[i][j-1]==a and map[i][j-2]==a and map[i][j-2]==a and map[i][j-4]==a:
                print("Y轴上形成了五子连珠")
                return True
    for i in range(0,11):
        for j in range(0,15):
            if map[i][j]==a and map[i+1][j]==a and map[i+2][j]==a and map[i+3][j]==a and map[i+4][j]==a:
                print("X轴形成五子连珠")
                return True
    return False

二. 源代码:
1.客户端编程代码如下:

from tkinter import *
from tkinter.messagebox import *
import socket
import threading
import os
#主程序
root=Tk()
root.title("网络五子棋v2.0--UDP客户端")
imgs=[PhotoImage(file='E:\\game\\BlackStone.gif'),PhotoImage(file='E:\\game\\WhiteStone.gif')]
turn=0
Myturn=-1
#画对方棋子
def drawOtherChess(x,y):
    global turn
    img1=imgs[turn]
    cv.create_image((x*40+20,y*40+20),image=img1)
    cv.pack()
    map[x][y]=str(turn)
    #换下一方走棋
    if turn==0:
        turn=1
    else:
        turn=0
#发送消息
def sendMessage(pos):
    global s
    s.sendto(pos.encode(),(host,port))
#退出函数
def callexit(event):
    pos="exit|"
    sendMessage(pos)
    os._exit(0)
#走棋函数
def callback(event):
    global turn
    global Myturn
    if Myturn==-1:
        Myturn=turn
    else:
        
  • 61
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鹏鹏写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值