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


Posted in Python onMarch 24, 2020

基于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+1
  self.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 1
    elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':
     print('winner=id 2')
     return 2

    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 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 1
    elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':
     print('winner=id 2')
     return 2
    chess=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 1
    elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':
     print('winner=id 2')
     return 2

    if 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:
     break
   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 1
    elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':
     print('winner=id 2')
     return 2
    if 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:
     break
   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 1
    elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':
     print('winner=id 2')
     return 2
    if self.size-i-j+1>0:
     chess=self.__board[self.size-i-j][j]
     if chess==' ':
      ch_stack.clear()
     elif not chess:
      break
     else:
      if (not ch_stack) or ch_stack[-1] == chess:
       ch_stack.append(chess)
      else:
       ch_stack.clear()
       ch_stack.append(chess)
    else:
     break
   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 1
    elif len(ch_stack) == 5 and ch_stack[-1] == '@ ':
     print('winner=id 2')
     return 2
    if self.size-i-j> 0:
     chess = self.__board[j][self.size-i-j]
     if chess == ' ':
      ch_stack.clear()
     elif not chess:
      break
     else:
      if (not ch_stack) or ch_stack[-1] == chess:
       ch_stack.append(chess)
      else:
       ch_stack.clear()
       ch_stack.append(chess)
    else:
     break
   ch_stack.clear()
  ch_stack.clear()
  return 0
 def draw(self):
  #clear()
  for x in self.__board:
   print(x)
  return 0
 def drop_chess(self,x,y,id):
  if id==1 and self.__board[x][y]==' ':
   self.__board[x][y]='* '
   return 1
  elif id==2 and self.__board[x][y]==' ':
   self.__board[x][y]='@ '
   return 1
  else:
   return 0

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

# -*- coding: utf-8 -*-
#单机版五子棋
from chess import chessboard
def changeid(id):
 if id==1:
  return 2
 elif id==2:
  return 1
 else:
  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_________')
  continue
 id=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 id
   json_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'))
    continue
   id = changeid(id)
def clear():
 os.system('cls')
def changeid(id):
 if id==1:
  return 2
 elif id==2:
  return 1
 else:
  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:', addr
 socks.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') # 棋盘大于1024
 for 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')#棋盘大于1024
 if msg3=='_________Illegal Input,Please Check Again_________':
  print(msg3)
  continue
 else:
  #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实现单机五子棋到双人对战

由于时间紧急,暂时未处理单个客户端退出后的程序初始化问题,可能过几日会补上。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python实现批量重命名文件的代码
May 25 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
深入理解python try异常处理机制
Jun 01 Python
基于python中的TCP及UDP(详解)
Nov 06 Python
TensorFlow入门使用 tf.train.Saver()保存模型
Apr 24 Python
15行Python代码实现网易云热门歌单实例教程
Mar 10 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
Python远程方法调用实现过程解析
Jul 28 Python
python如何编写类似nmap的扫描工具
Nov 06 Python
python UIAutomator2使用超详细教程
Feb 19 Python
基于PyInstaller各参数的含义说明
Mar 04 Python
pyqt弹出新对话框,以及关闭对话框获取数据的实例
Jun 18 #Python
python五子棋游戏的设计与实现
Jun 18 #Python
Python基础学习之时间转换函数用法详解
Jun 18 #Python
python实现简单五子棋游戏
Jun 18 #Python
Python基础学习之函数方法实例详解
Jun 18 #Python
pyqt5 实现在别的窗口弹出进度条
Jun 18 #Python
Python弹出输入框并获取输入值的实例
Jun 18 #Python
You might like
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
基于jquery编写的横向自适应幻灯片切换特效的实例代码
2013/08/06 Javascript
js判断为空Null与字符串为空简写方法
2014/02/24 Javascript
JavaScript eval() 函数介绍及应用示例
2014/07/29 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
2015/03/04 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
javascript DIV实现跟随鼠标移动
2020/03/19 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
webpack3+React 的配置全解
2017/08/21 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
[00:37]2016完美“圣”典风云人物:rOtk宣传片
2016/12/09 DOTA
Python中使用wxPython开发的一个简易笔记本程序实例
2015/02/08 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
在django admin详情表单显示中添加自定义控件的实现
2020/03/11 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
详解Python 最短匹配模式
2020/07/29 Python
Django返回HTML文件的实现方法
2020/09/17 Python
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
JENNIFER BEHR官网:各种耳环和发饰
2020/06/07 全球购物
乡下人家教学反思
2014/02/01 职场文书
群众路线剖析材料(四风)
2014/11/05 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP