使用python怎么写一个五子棋游戏?
Admin 2021-05-19 群英技术资讯 935 次浏览
五子棋应该很多朋友都有玩过,这是一款比较简单的棋类游戏。那么我们如果使用python,怎么写一个网络五子棋游戏呢?下面就给大家分享使用Python实现网络五子棋代码,感兴趣的朋友可以参考学习。
import os import socket import threading from tkinter import * from tkinter.messagebox import * def drawQiPan(): for i in range(0, 15): cv.create_line(20, 20 + 40 * i, 580, 20 + 40 * i, width=2) for i in range(0, 15): cv.create_line(20 + 40 * i, 20, 20 + 40 * i, 580, width=2) cv.pack() # 走棋函数 def callPos(event): global turn global MyTurn if MyTurn == -1: # 第一次确认自己的角色 MyTurn = turn else: if MyTurn != turn: showinfo(title="提示", message="还没轮到自己下棋") return # print("clicked at",event.x,event.y,true) x = event.x // 40 y = event.y // 40 print("clicked at", x, y, turn) if maps[x][y] != " ": showinfo(title="提示", message="已有棋子") else: img1 = images[turn] cv.create_image((x * 40 + 20, y * 40 + 20), image=img1) cv.pack() maps[x][y] = str(turn) pos = str(x) + "," + str(y) sendMessage("move|" + pos) print("服务器走的位置", pos) label1["text"] = "服务器走的位置" + pos # 输出输赢信息 if win_lose(): if turn == 0: showinfo(title="提示", message="黑方你赢了") sendMessage("over|黑方你赢了") else: showinfo(title="提示", message="白方你赢了") sendMessage("over|白方你赢了") # 换下一方走棋 if turn == 0: turn = 1 else: turn = 0 # 发送消息 def sendMessage(pos): global s global addr s.sendto(pos.encode(), addr) # 退出函数 def callExit(event): pos = "exit|" sendMessage(pos) os.exit() # 画对方棋子 def drawOtherChess(x, y): global turn img1 = images[turn] cv.create_image((x * 40 + 20, y * 40 + 20), image=img1) cv.pack() maps[x][y] = str(turn) # 换下一方走棋 if turn == 0: turn = 1 else: turn = 0 # 判断整个棋盘的输赢 def win_lose(): a = str(turn) print("a=", a) for i in range(0, 11): for j in range(0, 11): if maps[i][j] == a and maps[i + 1][j + 1] == a and maps[i + 2][j + 2] == a and maps[i + 3][j + 3] == a and \ maps[i + 4][j + 4] == a: print("x=y轴上形成五子连珠") return True for i in range(4, 15): for j in range(0, 11): if maps[i][j] == a and maps[i - 1][j + 1] == a and maps[i - 2][j + 2] == a and maps[i - 3][j + 3] == a and \ maps[i - 4][j + 4] == a: print("x=-y轴上形成五子连珠") return True for i in range(0, 15): for j in range(4, 15): if maps[i][j] == a and maps[i][j - 1] == a and maps[i][j - 2] == a and maps[i][j - 2] == a and maps[i][ j - 4] == a: print("Y轴上形成了五子连珠") return True for i in range(0, 11): for j in range(0, 15): if maps[i][j] == a and maps[i + 1][j] == a and maps[i + 2][j] == a and maps[i + 3][j] == a and maps[i + 4][ j] == a: print("X轴形成五子连珠") return True return False # 输出map地图 def print_map(): for j in range(0, 15): for i in range(0, 15): print(maps[i][j], end=' ') print('w') # 接受消息 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")[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() def startNewThread(): # 启动新线程来接受客户端消息 thread = threading.Thread(target=receiveMessage, args=()) thread.setDaemon(True) thread.start() if __name__ == '__main__': root = Tk() root.title("网络五子棋v2.0-服务器端") images = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')] turn = 0 MyTurn = -1 maps = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] for y in range(15)] cv = Canvas(root, bg='green', width=610, height=610) drawQiPan() cv.bind("<Button-1>", callPos) cv.pack() label1 = Label(root, text="服务器端...") label1.pack() button1 = Button(root, text="退出游戏") button1.bind("<Button-1>", callExit) button1.pack() # 创建UDP SOCKET s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('localhost', 8000)) addr = ('localhost', 8000) startNewThread() root.mainloop()
from tkinter import * from tkinter.messagebox import * import socket import threading import os # 主程序 root = Tk() root.title("网络五子棋v2.0--UDP客户端") imgs = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')] 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() maps[x][y] = str(turn) # 换下一方走棋 if turn == 0: turn = 1 else: turn = 0 # 发送消息 def sendMessage(position): global s s.sendto(position.encode(), (host, port)) # 退出函数 def callExit(event): position = "exit|" sendMessage(position) os.exit() # 走棋函数 def callback(event): global turn global MyTurn if MyTurn == -1: MyTurn = turn else: if MyTurn != turn: showinfo(title="提示", message="还没轮到自己走棋") return # print("clicked at",event.x,event.y) x = event.x // 40 y = event.y // 40 print("clicked at", x, y, turn) if maps[x][y] != " ": showinfo(title="提示", message="已有棋子") else: img1 = imgs[turn] cv.create_image((x * 40 + 20, y * 40 + 20), image=img1) cv.pack() maps[x][y] = str(turn) position = str(x) + ',' + str(y) sendMessage("move|" + position) print("客户端走的位置", position) label1["text"] = "客户端走的位置" + position # 输出输赢信息 if win_lose(): if turn == 0: showinfo(title="提示", message="黑方你赢了") sendMessage("over|黑方你赢了!") else: showinfo(title="提示", message="白方你赢了!") sendMessage("over|白方你赢了!") # 换下一方走棋: if turn == 0: turn = 1 else: turn = 0 # 画棋盘 def drawQiPan(): # 画棋盘 for i in range(0, 15): cv.create_line(20, 20 + 40 * i, 580, 20 + 40 * i, width=2) for i in range(0, 15): cv.create_line(20 + 40 * i, 20, 20 + 40 * i, 580, width=2) cv.pack() # 输赢判断 def win_lose(): a = str(turn) print("a=", a) for i in range(0, 11): for j in range(0, 11): if maps[i][j] == a and maps[i + 1][j + 1] == a and maps[i + 2][j + 2] == a and maps[i + 3][j + 3] == a and \ maps[i + 4][j + 4] == a: print("x=y轴上形成五子连珠") return True for i in range(4, 15): for j in range(0, 11): if maps[i][j] == a and maps[i - 1][j + 1] == a and maps[i - 2][j + 2] == a and maps[i - 3][j + 3] == a and \ maps[i - 4][j + 4] == a: print("x=-y轴上形成五子连珠") return True for i in range(0, 15): for j in range(4, 15): if maps[i][j] == a and maps[i][j - 1] == a and maps[i][j - 2] == a and maps[i][j - 2] == a and maps[i][ j - 4] == a: print("Y轴上形成了五子连珠") return True for i in range(0, 11): for j in range(0, 15): if maps[i][j] == a and maps[i + 1][j] == a and maps[i + 2][j] == a and maps[i + 3][j] == a and maps[i + 4][ j] == a: print("X轴形成五子连珠") return True return False # 接受消息 def receiveMessage(): # 接受消息 global s while True: data = s.recv(1024).decode('utf-8') a = data.split("|") if not data: print('server has exited!') break elif a[0] == 'exit': print('对方退出!') label1["text"] = '对方退出!游戏结束!' elif a[0] == 'over': print('对方赢信息!') label1["text"] = data.split("|")[0] showinfo(title="提示", message=data.split("|")[1]) elif a[0] == 'move': print('received:', data) 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() # 启动线程接受客户端消息 def startNewThread(): thread = threading.Thread(target=receiveMessage, args=()) thread.setDaemon(True) thread.start() if __name__ == '__main__': # 主程序 maps = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] for y in range(15)] cv = Canvas(root, bg='green', width=610, height=610) drawQiPan() cv.bind("<Button-1>", callback) cv.pack() label1 = Label(root, text="客户端...") label1.pack() button1 = Button(root, text="退出游戏") button1.bind("<Button-1>", callExit) button1.pack() # 创建UDP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) port = 8000 host = 'localhost' pos = 'join|' sendMessage(pos) startNewThread() root.mainloop()
游戏执行页面:
以上就是python实现五子棋的代码介绍,是不是很有意思?感兴趣的朋友可以参考上述代码实现一下哦,望大家阅读完这篇文章能有所收获。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
什么是树表查询,基于Python怎样实现二叉排序树?一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
这篇文章主要介绍了Python pluggy模块的用法,pluggy提供了一个简易便捷的插件系统,可以做到插件与主题功能松耦合,pluggy 是pytest,tox,devpi的核心框架文中通过代码示例演示给大家详细介绍,需要的朋友参考下吧
flask是python web开发的常用框架之一。本文将讲述flask如何实现修改密码和免密登录功能
问题在写代码是遇到了一个奇怪的问题,local variable & 39;siteName& 39; referenced before assignment, 特此记录一下,这里其实
这篇文章主要介绍了OpenMV与JSON编码,JSON是一种简洁高效的交换数据的格式,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008