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],
    [0,0,0,1,1,1,2,0,0,0],[0,0,0,2,0,0,0,2,0,0],[0,0,1,2,0,2,2,0,1,0],[0,0,0,2,0,0,0,1,0,0],[0,0,0,0,0,0,1,1,0,0],
    [0,0,0,0,0,0,0,0,0,0]]
sqipan(qipan) #显示初始化的棋盘

who=True
while True:
  t=input("请输入棋子的位置(x,y),现在由"+("O" if who else "X")+"方下子:").split(",")
  #输入坐标
  if len(t)==2:
    x=int(t[0])
    y=int(t[1])
    if qipan[x][y]==0:
      qipan[x][y]=1 if who else 2
      who=not who

      sqipan(qipan) #显示当前棋盘

      win_not(qipan,x,y) #判断有没有人赢
    else:
      print("当前位置已有棋子,请重新下子")
  else :
    print("输入位置有误,请输入要下的位置,如1,1")

show_qipan.py

def sqipan(qipan):
  maxx=10
  maxy=10
  print("  O 一 二 三 四  五 六 七 八 九")
  for i in range(maxx):
    print(i, " ", end="")
    for j in range(maxy):
      if qipan[i][j] == 0:
        print("+", " ", end="") # 无棋子
      elif qipan[i][j] == 1:
        print("O", " ", end="") # 白色
      elif qipan[i][j] == 2:
        print("X", " ", end="") # 黑色
    print("\n")

win_notwin.py

def win_not(qipan,x,y):
  maxx=10
  maxy=10
  flag=qipan[x][y]
  xPoint = x
  yPoint = y
  # 横向
  count = 0
  # x=xPoint
  # y=yPoint
  while (x >= 0 and flag == qipan[x][y]): # 向左统计连续棋子数
    count += 1
    x -= 1
  x = xPoint
  y = yPoint
  while (x >= 0 and flag == qipan[x][y]):
    count += 1
    x += 1
  if (count > 5): print("纵向五子棋相连,胜利!")

  count = 0
  x = xPoint
  y = yPoint
  while (y >= 0 and flag == qipan[x][y]):
    count += 1
    y -= 1
  y = yPoint
  while (y <= maxy and flag == qipan[x][y]):
    count += 1
    y += 1
  if (count > 5): print("横向五子相连,胜利")

  # 斜向
  # 左下
  count = 0
  x = xPoint
  y = yPoint
  while (x >= 0 and y < maxy and flag == qipan[x][y]):
    count += 1
    x -= 1
    y += 1
  x = xPoint
  y = yPoint
  # 右上
  while (x < maxx and y >= 0 and flag == qipan[x][y]):
    count += 1
    x += 1
    y -= 1
  if (count > 5): print("斜向五子棋相连,胜利")

  # 斜上
  count = 0
  x = xPoint
  y = yPoint
  # 左上
  while (x >= 0 and y >= 0 and flag == qipan[x][y]):
    count += 1
    x -= 1
    y -= 1
  x = xPoint
  y = yPoint
  while (x < maxx and y < maxy and flag == qipan[x][y]):
    count += 1
    x += 1
    y += 1
  if (count > 5):
    print("斜向五子相连,胜利")

二、下面的代码没有验证

#coding:utf-8
import os
import pdb
import pickle

class Player(object):
  number=0
  def __init__(self,name=''):
    """
     玩家类构造方法
     """
    if not name:
      Player.number+=1
      name='Player%d'% Player.number
    self.name=name
  def play(self):
    """
     玩家输入下一步落子位置
     """
    t=input('Please input(x,y),now is'+self.name+':')

    return t

#棋盘类
class Board(object):
  class Status(object):
    """
     状态量,提供转态常量
     """
    NONE=0
    WHITE=1
    BLACK=2

  def __init__(self,maxx=10,maxy=10):
    """
     棋盘类构造方法 确定尺寸,以及创建棋盘成员对象
     """
    self.maxx,self.maxy=maxx,maxy
    self.qipan=[[0]*maxy for i in range(maxx)]

  def hasChaessman(self,xPoint,yPoint):
    """
     判断是否有棋子存在
     """
    return self.qipan[xPoint][yPoint]!=Board.Status.NONE
  def downPawn(self,xPoint,yPoint,who):
    """
     玩家在某个位置落子
     """
    if self.hasChaessman(xPoint,yPoint):
      return False
    else:
      self.qipan[xPoint][yPoint]=Board.Status.WHITE if who else Board.Status.BLACK
      return True

  def inRange(self,xPoint,yPoint):
    """
    玩家在某个位置落子
    """
    return xPoint<self.maxx and\
        yPoint<self.maxy and\
        xPoint>=0 and\
        yPoint>=0

  def checkFiveInRow(self,xPoint,yPoint,xDir,yDir):
    """
    判断以(xpoint,ypoiny)点(xDir,yDir)方向上是否五子连珠
    """
    count = 0
    t=self.qipan[xPoint][yPoint]
    x,y=xPoint,yPoint
    while (self.inRange(x,y) and t==self.qipan[x][y]):
      count += 1
      x+=yDir
      y+=yDir
    x, y = xPoint, yPoint
    while (self.inRange(x, y) and t == self.qipan[x][y]):
      count += 1
      x -= yDir
      y -= yDir
    return count>5

  def isWin(self,xPoint,yPoint):
    """
    以(xpoint,ypoiny)点为中心在四个方向分别判断五子连珠
    """
    pdb.set_trace()#####################
    return self.checkFiveInRow(xPoint,yPoint,1,0) or \
        self.checkFiveInRow(xPoint, yPoint, 0,1) or \
        self.checkFiveInRow(xPoint, yPoint, 1,1) or \
        self.checkFiveInRow(xPoint, yPoint, 1,-1)

  def printQp(self):
    """
    打印棋盘
    """
    qiType=["十","O","X"]
    print('  O 一 二 三 四  五 六 七 八 九')
    for i in range(self.maxx):
      print(i," ",end='')
      print(' '.join(qiType[x] for x in self.qipan[i]))

#文件存读档类
class FileStatus(object):
  def save(self):
    """
    存档方法
    """
    fpath=input("请输入保持文件的路径:")
    file=open(fpath,'w')
    pickle.dump(self,file)
    file.close()

  def load(self):
    """
    读档方法
    """
    pass

#游戏类
class GoBang(FileStatus):

  def __init__(self,qipan,white,black):
    """
    游戏类构造方法
    创建成员变量
    """
    self.qipan=qipan
    self.white=white
    self.black=black
    self.who=True

  def start(self):
    """
    游戏主流方法
    """
    os.system('cls')
    self.printQp()
    while True:
      t=(self.white if self.who else self.black).play()
      if t=='S':
        self.save()
        continue
      if t=='L':
        self.load()
        continue
      t.split(',')
      if len(t)==2:
        x,y=int(t[0]).int(t[1])
        if self.qipan.downPawn(x,y,self.who):
          os.system('cls')
          self.printQp()
          if self.qipan.isWin(x,y):#判断游戏是否结束
            print(self.white.name if\
               self.who else self.black.name)+'Win'
            break
          self.who=not self.who #切换游戏角色
    os.system('pause')

  def load(self):
    """
    重写读档方法
    """
    fpath=input("请输入读取文件的路径")
    file=open(fpath,'r')
    status=pickle.load(file)
    file.close()
    #读档 拷贝
    self.qipan=status.qipan
    self.white=status.white
    self.black=status.black
    self.who=status.who
    os.system('cls')
    self.printQp()

  def printQp(self):
    """
    打印
    """
    self.qipan.printQp()
    print("按L读取,S保存")

if __name__=='__main__':
  t=GoBang(Board(),Player(),Player())
  t.start()

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

(0)

相关推荐

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

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

  • 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实现五子棋小游戏

    本文实例为大家分享了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实现五子棋小程序

    本文实例为大家分享了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

  • javascript 初学教程及五子棋小程序的简单实现

    一.JavaScript简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 二.hbulider工具的使用 1) hbulider的特点: 1.飞快的编码速度 2.HBuilder直接创建移动App,打包为ios或Android原生安装包 3.HTML5语法.HTML5+

  • python实现聊天小程序

    本文实例为大家分享了python实现聊天小程序的具体代码,供大家参考,具体内容如下 我这里实现的是客户端与服务端进行通信的功能,比较简单,与上一篇文章的群聊不太一样. 服务端server.py #-*- coding:utf-8 -*- import socket, traceback, sys host = '' port = 51423 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_

  • python实现抽奖小程序

    本文实例为大家分享了python实现抽奖小程序的具体代码,供大家参考,具体内容如下 设计一个抽奖服务  背景:有x个奖品,要求在y天内发完:每天至少发放z个奖品:每天抽奖人数不定,事先会假设一个范围是m-n 举例:有100个奖品,要求5天内发完,每天至少发15个奖品:每天来抽奖的人估计是 2000-3000 人,希望奖品能够比较均匀,但随机的抽取出来. 接口要求:服务监听一个端口,测试程序不断连接,发送一个数字代表是第几天,比如第1-2000个请求发送1(模拟第一天来了2000人),第2001到

  • Python简单基础小程序的实例代码

    1 九九乘法表 for i in range(9):#从0循环到8 i += 1#等价于 i = i+1 for j in range(i):#从0循环到i j += 1 print(j,'*',i,'=',i*j,end = ' ',sep='') # end默认在结尾输出换行,将它改成空格 sep 默认 j,'*',i,'=',i*j 各元素输出中间会有空格 print()#这里作用是输出换行符 i = 1 while i <= 9: j = 1 while j <= i: print(&

  • Python实现微信小程序支付功能

    正文 由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程.当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程. 1.支付交互流程 当然具体的参数配置可以参考官方文档https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_3&index=1 2.获取openid(微信用户标识) import requests from config import APPID, SECRET c

  • python实现微信小程序用户登录、模板推送

    Python 实现微信小程序的用户登录 小程序可以通过官方提供的登录邓丽来获取用户身份的标示, 具体文档可以参考 官方文档, 通过流程时序可以看到, 对于需要和前端配合的服务端开发, 主要实现的就是通过小程序提供的 code 换取用户的 openid 和 session_key, 并用换取到的 openid 和 secret_key 作为自定义的登录态. 分析后得知, 作为小程序后端的开发, 主要实现以下几部分内容: 提供一个 HTTP 接口, 供小程序方使用, 传递code; 换取用户身份标识

  • python获取微信小程序手机号并绑定遇到的坑

    最近在做小程序开发,在其中也遇到了很多的坑,获取小程序的手机号并绑定就遇到了一个很傻的坑. 流程介绍 官方流程图 小程序使用方法 需要将 <button> 组件 open-type 的值设置为 getPhoneNumber,当用户点击并同意之后,可以通过 bindgetphonenumber 事件回调获取到微信服务器返回的加密数据, 然后在第三方服务端结合 session_key 以及 app_id 进行解密获取手机号. <button open-type="getPhoneN

  • python实现录音小程序

    本文为大家分享了python实现录音小程序的具体代码,供大家参考,具体内容如下 学习目标:掌握python的pyaudio扩展包和Wave模块录制语音的方法 Wav音频:声道数,采样频率,量化位数 python Wav包是自带的,pyaudio需要下载 pip3 install pyaudio python读Wav文件: fp=wave.open('','rb') nf=fp.getnframes()#获取文件的采样点数量 print('sampwidth:',fp.getsampwidth()

随机推荐