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

基于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坐标开始游戏。

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

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

(0)

相关推荐

  • python五子棋游戏的设计与实现

    这个python的小案例是五子棋游戏的实现,在这个案例中,我们可以实现五子棋游戏的两个玩家在指定的位置落子,画出落子后的棋盘,并且根据函数判断出输赢的功能. 这个案例的思路如下所示: 首先,根据棋盘的样子画出棋盘 然后,对棋盘进行初始化,将可以落子的位置进行统一化处理 接下来,就是进入游戏的环节,双方轮流落子,落子后,并将棋盘画出 最后,根据落子的位置判断选手的的输赢情况,游戏结束 五子棋游戏的设计和实现 代码如下: def main(): print("五子棋游戏".center(5

  • python实现五子棋小程序

    本文实例为大家分享了python实现五子棋小程序的具体代码,供大家参考,具体内容如下 一.结合书上例子,分三段编写: wuziqi.py #coding:utf-8 from win_notwin import * from show_qipan import * maxx=10 #10行10列 maxy=10 qipan=[[0,0,0,0,1,0,0,2,0,0],[0,1,2,1,1,0,2,0,0,0],[0,0,0,0,1,1,0,2,0,0],[0,0,0,0,2,0,0,1,0,0

  • 使用python实现简单五子棋游戏

    用python实现五子棋简单人机模式的练习过程,供大家参考,具体内容如下 第一次写博客,我尽力把它写好. 最近在初学python,今天就用自己的一些粗浅理解,来记录一下这几天的python简单人机五子棋游戏的练习,下面是实现过程的理解(是在cmd中运行的): 主要流程: *重点内容* - 首先是模块及类的划分 - 棋子类和棋盘类的方法 - 对策略类里的功能进行细分,调用棋子类和棋盘类 - 写出判断输赢的方法 - 用main函数进行整个游戏进度的控制 模块及类的划分 类的划分涉及到了面向对象的内容

  • python实现五子棋人机对战游戏

    本文代码基于 python3.6 和 pygame1.9.4. 五子棋比起我之前写的几款游戏来说,难度提高了不少.如果是人与人对战,那么,电脑只需要判断是否赢了就可以.如果是人机对战,那你还得让电脑知道怎么下. 我们先从简单的问题来看. 开端 画棋盘 首先肯定是要画出棋盘来,用 pygame 画出一个 19 × 19 或 15 × 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了. 画棋子 需要说一下的是画棋子,因为没找到什么合适的棋子图片,所以只要自己来画棋子. 我们用 p

  • python实现五子棋游戏

    本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下 话不多说,直接上代码: 全部工程文件,在GitHub:五子棋 效果预览: #!/usr/bin/env python3 #-*- coding:utf-8 -*- import pygame from pygame.locals import * from sys import exit import numpy background_image = 'qipan.png' white_image = 'whit

  • python版本五子棋的实现代码

    正文之前 前阵子做了个<人工智能> 的课程作业,然后写了个人工智障...大概就是个可以跟你下五子棋的傻儿子...下面是代码和效果 正文 1. 摘要 机器博弈是人工智能领域的重要分支,它的研究对象多以复杂的棋牌类智力游戏为主,已经得到解决的棋类游戏,几乎全部都应归功于机器博弈近半个世纪的发展.计算机解决问题的优势在于能把不易解析的问题,借助于现代计算机的运算速度优势枚举出所有的合理情形而得解;然而,博弈问题的复杂程度决定了它不能过度依赖机器的计算能力.许多待解决的或已经解决的棋类,其状态空间复杂

  • python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy as np def ai(): """ AI计算落子位置 """ maxmin(True, DEPTH, -99999999, 99999999) return next_point[0], next_point[1] def maxmin(is_ai

  • python实现五子棋小游戏

    本文实例为大家分享了python实现五子棋小游戏的具体代码,供大家参考,具体内容如下 暑假学了十几天python,然后用pygame模块写了一个五子棋的小游戏,代码跟有缘人分享一下. import numpy as np import pygame import sys import traceback import copy from pygame.locals import * pygame.init() pygame.mixer.init() #颜色 background=(201,202

  • python使用tkinter库实现五子棋游戏

    本文实例为大家分享了python实现五子棋游戏的具体代码,供大家参考,具体内容如下 一.运行截图: 二.代码 # 用数组定义一个棋盘,棋盘大小为 15×15 # 数组索引代表位置, # 元素值代表该位置的状态:0代表没有棋子,1代表有黑棋,-1代表有白棋. from tkinter import * from tkinter.messagebox import * class Chess(object): def __init__(self): ############# # param # #

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

    基于python的socket实现单机五子棋到双人对战,供大家参考,具体内容如下 本次实验使用python语言.通过socket进行不同机器见的通信,具体可以分为以下四步:1.创建ServerSocket和Socket:2.打开链接到Socket的输入/输出流:3.按照协议对Socket进行读/写操作:4.关闭输入输出流.关闭Socket. 由于是双人对战,服务器必须应对多人及以上的客户端的连接,因此本实验还引入了python的threading多线程模块,通过监听实时监控网络状态,同时利用so

  • 基于Python socket的端口扫描程序实例代码

    本文研究的主要是Python的端口扫描程序,具体实例代码如下. 先来看看第一个端口扫描程序代码,获取本机的IP和端口号: import socket def get_my_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr,port

  • Python tkinter制作单机五子棋游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python家庭,作者Python家庭 实战项目:使用Python编写一个能够完成基本对战的五子棋游戏.面向新手. 程序主要包括两个部分,图形创建与逻辑编写两部分. 程序的运行结果: 样式创建 老规矩,先把用到的包导入进来. from tkinter import * import math 然后建立一个样式的类,类名称chessBoard.这里加了很多注释,避免

  • python单机五子棋的代码实现示例

    五子棋相信大家都玩过,那么你们有没有试过自己动手编写过五子棋呢?今天来带着大家实现以下五子棋. def initChessSquare(x,y): #初始化棋盘 for i in range(15): # 每一行的交叉点坐标 rowlist = [] for j in range(15): # 每一列的交叉点坐标 pointX = x+ j*40 pointY = y+ i*40 sp = StornPoint(pointX,pointY,0) rowlist.append(sp) initCh

  • python实现单机五子棋对战游戏

    本文实例为大家分享了python实现单机五子棋对战的具体代码,供大家参考,具体内容如下 引入pygame模块  # 1.引入pygame 和 pygame.locals import pygame from pygame.locals import * import time import sys   initChessList = [] initRole = 1 # 代表白子下 2:代表当前是黑子下 resultFlag  = 0 userFlag = True   class StornPo

  • 基于Python实现五子棋-(人机对战)

    目录 前言 人人对战 动态演示 源码分享 人机对战 前言 快520了,咱们来玩玩五子棋陶冶情操.快拿这个和你女朋友去对线.(分了别来找我哇).多的不说直接进入正题 人人对战 游戏规则:p1为黑子,p2为白子,黑子先手,一方达到五子相连即为获胜. 动态演示 源码分享 cheackboard.py 定义黑白子,落子位置以及获胜规则. from collections import namedtuple Chessman = namedtuple('Chessman', 'Name Value Col

  • 基于Python socket实现简易网络聊天室

    目录 1.socket_ui.py 服务端 1-1. 依赖引用 1-2. 实现过程 1-3. 实现效果 2.client_ui.py 客户端 2-1. 依赖引用 2-2. 实现过程 2-3. 实现效果 在这个周末刚刚写出来的python桌面应用--网络聊天室,主要通过pyqt5作为桌面应用框架,socket作为网络编程的框架,从而实现包括客户端和服务端的网络聊天室的GUI应用,希望可以一起学习.一起进步! 应用包括服务端server_ui.py.客户端client_ui.py两个python模块

  • python使用socket实现的传输demo示例【基于TCP协议】

    本文实例讲述了python使用socket实现的传输demo.分享给大家供大家参考,具体如下: socket传输,客户端代码 import socket def main(): tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 服务器位于本机 9999 tcp_client_socket.connect( ("192.168.27.72", 9999) ) # 告诉服务器,我要下载哪一个文件

  • 基于python中的TCP及UDP(详解)

    python中是通过套接字即socket来实现UDP及TCP通信的.有两种套接字面向连接的及无连接的,也就是TCP套接字及UDP套接字. TCP通信模型 创建TCP服务器 伪代码: ss = socket() # 创建服务器套接字 ss.bind() # 套接字与地址绑定 ss.listen() # 监听连接 inf_loop: # 服务器无限循环 cs = ss.accept() # 接受客户端连接 comm_loop: # 通信循环 cs.recv()/cs.send() # 对话(接收/发

  • 基于Python 的进程管理工具supervisor使用指南

    Supervisor 是基于 Python 的进程管理工具,只能运行在 Unix-Like 的系统上,也就是无法运行在 Windows 上.Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k. 什么情况下我们需要进程管理呢?就是执行一些需要以守护进程方式执行的程序,比如一个后台任务,我最常用的是用来启动和管理基于 Tornado 写的 Web 程序. 除此之

随机推荐