基于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使用urllib2获取网络资源实例讲解
Dec 02 Python
python实现在每个独立进程中运行一个函数的方法
Apr 23 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
深入理解Python爬虫代理池服务
Feb 28 Python
tensorflow实现KNN识别MNIST
Mar 12 Python
python中类的属性和方法介绍
Nov 27 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
Python实现LR1文法的完整实例代码
Oct 25 Python
python 下载m3u8视频的示例代码
Nov 11 Python
详解pycharm自动import所需的库的操作方法
Nov 30 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
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
CodeIgniter框架过滤HTML危险代码
2014/06/12 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
php中的异常和错误浅析
2017/05/03 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
mouse_on_title.js
2006/08/25 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
JS实现的简洁二级导航菜单雏形效果
2015/10/13 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
基于JavaScript实现图片点击弹出窗口而不是保存
2016/02/06 Javascript
javascript中利用柯里化函数实现bind方法【推荐】
2016/04/29 Javascript
基于JS如何实现给字符加千分符(65,541,694,158)
2016/08/03 Javascript
JS获取中文拼音首字母并通过拼音首字母快速查找页面内对应中文内容的方法【附demo源码】
2016/08/19 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
微信小程序实现左滑动删除效果
2020/03/30 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
JS实现轮播图效果
2020/01/11 Javascript
element el-tree组件的动态加载、新增、更新节点的实现
2020/02/27 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
python 输出一个两行字符的变量
2009/02/05 Python
Python中%r和%s的详解及区别
2017/03/16 Python
Python排序算法实例代码
2017/08/10 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
北京奥运会主题口号
2014/06/13 职场文书
市级绿色学校申报材料
2014/08/25 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
驳回起诉裁定书
2015/05/19 职场文书
css3手动实现pc端横向滚动
2022/06/21 HTML / CSS