基于python的socket实现单机五子棋到双人对战

本次实验使用python语言。通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSocket和Socket;2.打开链接到Socket的输入/输出流;3.按照协议对Socket进行读/写操作;4.关闭输入输出流、关闭Socket。
由于是双人对战,服务器必须应对多人及以上的客户端的连接,因此本实验还引入了python的threading多线程模块,通过监听实时监控网络状态,同时利用socket.listen(2)引入排队等待机制。

chess类

#五子棋类
import os
class chessboard(object):def __init__(self):self.size = 16#初始化棋盘self.__board=[['  ' for n in range(self.size)] for m in range(self.size)]n = 0#添加桌面标签while n < self.size:ntr=str(n)self.__board[0][n] = ntr.zfill(2)self.__board[n][0] = ntr.zfill(2)n=n+1self.id=0#胜利条件def is_end(self):ch_stack=[]#行检查for i in range(self.size):for j in range(self.size):#判断是否结束chess=self.__board[i][j]if len(ch_stack)==5 and ch_stack[-1]=='* ':print('winner=id 1')return 1elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':print('winner=id 2')return 2if chess=='  ':ch_stack.clear()else:if (not ch_stack) or ch_stack[-1] == chess:ch_stack.append(chess)else:ch_stack.clear()ch_stack.append(chess)ch_stack.clear()ch_stack.clear()#列检查for j in range(self.size):for i in range(self.size):#判断是否结束if len(ch_stack)==5 and ch_stack[-1]=='* ':print('winner=id 1')return 1elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':print('winner=id 2')return 2chess=self.__board[i][j]if chess=='  ':ch_stack.clear()else:if (not ch_stack) or ch_stack[-1] == chess:ch_stack.append(chess)else:ch_stack.clear()ch_stack.append(chess)ch_stack.clear()ch_stack.clear()#左斜检查#下三角for i in range(self.size):for j in range(1,self.size):#判断是否结束if len(ch_stack)==5 and ch_stack[-1]=='* ':print('winner=id 1')return 1elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':print('winner=id 2')return 2if i+j<self.size:chess=self.__board[i+j][j]if chess=='  ':ch_stack.clear()else:if (not ch_stack) or ch_stack[-1] == chess:ch_stack.append(chess)else:ch_stack.clear()ch_stack.append(chess)else:breakch_stack.clear()ch_stack.clear()#上三角for i in range(self.size):for j in range(1,self.size):#判断是否结束if len(ch_stack)==5 and ch_stack[-1]=='* ':print('winner=id 1')return 1elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':print('winner=id 2')return 2if i+j<self.size:chess=self.__board[j][j+i]if chess=='  ':ch_stack.clear()else:if (not ch_stack) or ch_stack[-1] == chess:ch_stack.append(chess)else:ch_stack.clear()ch_stack.append(chess)else:breakch_stack.clear()ch_stack.clear()#右斜检查#上三角for i in range(self.size):for j in range(1,self.size):#判断是否结束if len(ch_stack)==5 and ch_stack[-1]=='* ':print('winner=id 1')return 1elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':print('winner=id 2')return 2if self.size-i-j+1>0:chess=self.__board[self.size-i-j][j]if chess=='  ':ch_stack.clear()elif not chess:breakelse:if (not ch_stack) or ch_stack[-1] == chess:ch_stack.append(chess)else:ch_stack.clear()ch_stack.append(chess)else:breakch_stack.clear()ch_stack.clear()#下三角for i in range(self.size):for j in range(1,self.size):# 判断是否结束if len(ch_stack) == 5 and ch_stack[-1] == '* ':print('winner=id 1')return 1elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':print('winner=id 2')return 2if self.size-i-j> 0:chess = self.__board[j][self.size-i-j]if chess == '  ':ch_stack.clear()elif not chess:breakelse:if (not ch_stack) or ch_stack[-1] == chess:ch_stack.append(chess)else:ch_stack.clear()ch_stack.append(chess)else:breakch_stack.clear()ch_stack.clear()return 0def draw(self):#clear()for x in self.__board:print(x)return 0def drop_chess(self,x,y,id):if id==1 and self.__board[x][y]=='  ':self.__board[x][y]='* 'return 1elif id==2 and self.__board[x][y]=='  ':self.__board[x][y]='@ 'return 1else:return 0

然后是用while循环实现的单机版五子棋

# -*- coding: utf-8 -*-
#单机版五子棋
from chess import chessboard
def changeid(id):if id==1:return 2elif id==2:return 1else:return 0
t=chessboard()
id=1#初始化id
t.draw()
while (not t.is_end()):#end函数print('your id is %d,input your next drop(x,y)'% id)x=input()y=input()x=int(x)y=int(y)if t.drop_chess(x,y,id):t.draw()else:print('_________Illegal Input,Please Check Again_________')continueid=changeid(id)

————————————————————————————分割线————————————————————————————
由于要实现双人对战,所以服务器端必须要用多线程使其服务多个客户端,因此使用threading
服务器端

# -*- coding: utf-8 -*-
#服务器
import os
import socket
import json
import threading
import time
import sys
from chess import chessboard
t=chessboard()
id=1#初始化id
def handle():while (not t.is_end()):for c in socks:global idjson_string0 = json.dumps(t._chessboard__board)c.sendto(json_string0.encode('utf-8'), address)msg1 = 'Your id is %d,input your next drop' % id + "\r\n"c.send(msg1.encode('utf-8'))msg2x = c.recv(1024)msg2y = c.recv(1024)x = int(msg2x.decode('utf-8'))y = int(msg2y.decode('utf-8'))print('processing......\n')if t.drop_chess(x, y, id):json_string = json.dumps(t._chessboard__board)c.sendto(json_string.encode('utf-8'), address)else:msg3 = '_________Illegal Input,Please Check Again_________'c.send(msg3.encode('utf-8'))continueid = changeid(id)
def clear():os.system('cls')
def changeid(id):if id==1:return 2elif id==2:return 1else:return 0
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
host = socket.gethostname()
port = 9999
# 绑定端口号
s.bind((host, port))
address=(host, port)
# 设置最大连接数,超过后排队
s.listen(2)
socks=[]
th = threading.Thread(target=handle)
th.start()
while 1:c, addr = s.accept()print'connected from:', addrsocks.append(c)
s.close()

然后是客户端

# -*- coding: utf-8 -*-
#客户端
import socket
import time# 创建 socket 对象
c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 获取本地主机名
#host = socket.gethostname()
host='10.41.114.198'
# 设置端口号
port = 9999
# 连接服务,指定主机和端口
c.connect((host, port))
address=(host, port)
while 1:#s=c.accept()print('')print('__________________wait__________________')msg0 = c.recv(2048).decode('utf-8')  # 棋盘大于1024for x in msg0:if x == '[':print('')else:print(x, end='')print('')msg1 = c.recv(1024)#接收输入提示print (msg1.decode('utf-8'))time.sleep(1)x = input('x=')y = input('y=')c.send(x.encode('utf-8'))c.send(y.encode('utf-8'))msg3 = c.recv(2048).decode('utf-8')#棋盘大于1024if msg3=='_________Illegal Input,Please Check Again_________':print(msg3)continueelse:#print(msg3)for x in msg3:if x=='[':print('')else:print(x, end='')print('')print('__________________wait__________________')print('')
c.close()

注意socket传输时只能传送bytes,因此list先用json转成str,再encode编码
使用方法:先更改客户端host为自己地址,然后先打开服务端,然后打开多个客户端(大于2个开始排队),然后开始输入X,Y坐标开始游戏。
由于时间紧急,暂时未处理单个客户端退出后的程序初始化问题,可能过几日会补上。

基于python的socket实现单机五子棋到双人对战相关推荐

  1. 用python做双人五子棋_基于python的socket实现单机五子棋到双人对战

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSock ...

  2. #大数据技术#基于python的hadoop(单机)环境搭建及使用

    基于python的hadoop(单机)环境搭建及使用 0.写在前面 1.虚拟机安装centos6.5 1.1安装流程 1.1.1系统安装 1.1.2修改静态ip(超级用户) 1.1.3更换可用源(超级 ...

  3. python调用libpcap_libPcap(基于C)接受基于Python的Socket程序 - python

    亲爱的大家: 我使用基于python的套接字客户端发送字符串数据(即日志数据). 另一方面,我使用libpcap嗅探服务器端的字符串数据. 但是,当我第二次将字符串数据发送到服务器端时,在客户端出现了 ...

  4. 基于Python/Tkinter的拼图单机小游戏

    这是很早之前写的拼图游戏,基于Py/Tk,今天翻出来,然后重新整理,并且发布出来,供大家参考学习,自己看CSDN里有很多了类似的游戏代码,虽然代码逻辑上大同小异,但每个开发者都有自己独特的开发个性和习 ...

  5. 【Python游戏】Python实现一个可以切换单人或双人对战乒乓球小游戏 | 附带源码

    相关文件 想学Python的小伙伴可以关注小编的公众号[Python日志] 有很多的资源可以白嫖的哈,不定时会更新一下Python的小知识的哈!! 需要源码的小伙伴可以在公众号回复 乒乓球 Pytho ...

  6. 基于python的tcp的端口转发程序

    基于python的socket套接字,对tcp数据包进行转发 import socket def main():s = socket.socket()# 本机ip地址和接收端口host = '10.1 ...

  7. 使用EasyX实现简单的五子棋双人对战

    基于Visual Stdio 2017 IDE,利用EasyX图形函数库工具搭建可视化图形操作界面.通过鼠标在图形界面上点击选子,实现了五子棋的双人对战小游戏. 本程序主体框架是从https://bl ...

  8. 利用C++打造双人对战的五子棋游戏,界面新颖「附源码」

    五子棋游戏的历史可谓源远流长,是一款老少皆宜的两人对弈纯策略游戏,讲究的是有攻有守的五子棋技巧,玩法简单易上手,五个棋子连成一线就可获胜.单机五子棋,双人五子棋,好友联机对战模式-你想要的都能在这里找 ...

  9. 基于Python实现五子棋

    基于Python实现五子棋 了解游戏的规则是我们首先需要做的事情,如果不知晓规则,那么我们肯定寸步难行. 五子棋游戏规则: 对局双方各执一色棋子. 空棋盘开局. 黑先.白后,交替下子,每次只能下一子. ...

最新文章

  1. 为WPF和Silverlight的Grid添加边框线(zz)
  2. vs2019安装C#环境并新建窗体项目
  3. 中文Visual Studio 2005 Express Beta2不能安装在英文Longhorn Beta1上吗?
  4. LinearGradient线性渲染
  5. springcloud(五) Hystrix 降级,超时
  6. arouter跨module传递消息_利用ARouter实现组件间通信,解决子模块调用主模块问题...
  7. 【Python CheckiO 题解】Create Intervals
  8. Android 中文 API——android.widget合集(中)(50篇)(chm格式)
  9. java案例代码6-评委打分的模拟程序
  10. ibm watson_IBM Watson Assistant与Web聊天的集成
  11. 软件设计师(中级)历年真题与知识点总结(更新中...)
  12. SSI与Biss、Endat、Hipeface
  13. ◇Windows 7 XP SP3 2in1 集成安装版 2010贺岁版◇
  14. tkinter显示rtf文件
  15. idea 运行vue项目
  16. 条码扫描枪的连接与使用方法
  17. free top 内存泄漏 内存溢出
  18. metrics 指标分析——你不在意的p99和p999
  19. [OHOS ERROR] FileNotFoundError: [Errno 2] No such file or directory: ‘python‘
  20. 解决宝塔面板Nginx反向代理Cloudflare出现502或403错误

热门文章

  1. RFID技术与条码技术比较
  2. 断言(assert)及其作用
  3. CSS —— 背景图片填满DIV、鼠标滑过放大图片
  4. java构造方法的互相调用
  5. 抖音快手如何涨粉的思路整理
  6. 【手绘教程】不同的材质用马克笔如何体现呢?
  7. Mybatis的循环引用
  8. JDBC 关闭数据库连接与自动提交
  9. android 分屏rom,原生ROM都有分屏 为啥MIUI做了那么久?
  10. React Developer Tools Chrome浏览器扩展一直提示“This page doesn’t appear to be using React.“最新解决办法