Python基于pygame实现单机版五子棋对战


Posted in Python onDecember 26, 2019

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 StornPoint():
 def __init__(self, x, y, value = 0):
  '''
  :param x: 代表x轴坐标
  :param y: 代表y轴坐标
  :param value: 当前坐标点的棋子:0:没有棋子 1:白子 2:黑子
  '''
  self.x = x
  self.y = y
  self.value = value
  pass
 
 
def initChessSquare(x, y):
 '''
 初始化棋盘的坐标
 :param x:
 :param y:
 :return:
 '''
 # 使用二维列表保存了棋盘是的坐标系,和每个落子点的数值
 for i in range(15):  # 每一行的交叉点坐标
  rowList = []
  for j in range(15): # 每一列的交叉点坐标
   pointX = x + j*40
   pointY = y + i*40
   # value = 0
   sp = StornPoint(pointX, pointY, 0)
   rowList.append(sp)
   pass
  initChessList.append(rowList)
 pass
 
# 处理事件
def eventHandler():
 global userFlag
 '''
 监听各种事件
 :return:
 '''
 for event in pygame.event.get():
 
  global initRole
  # 监听点积退出按钮事件
  if event.type == QUIT:
   pygame.quit()
   sys.exit()
   pass
  # 监听鼠标点积事件
  if event.type == MOUSEBUTTONDOWN:
   x, y = pygame.mouse.get_pos() #
   print((x, y))
   i = j = 0
   for temp in initChessList:
    for point in temp:
     if x >= point.x - 15 and x <= point.x + 15 \
      and y >= point.y - 15 and y <= point.y + 15:
      # 当前区域没有棋子,并且是白子下
      if point.value == 0 and initRole == 1 and userFlag:
       point.value = 1
       judgeResult(i, j, 1)
       initRole = 2 # 切换棋子颜色
       pass
      elif point.value == 0 and initRole == 2 and userFlag:
       point.value = 2
       judgeResult(i, j, 2)
       initRole = 1 # 切换棋子颜色
       pass
      break
      pass
     j += 1
     pass
    i += 1
    j = 0
   pass
  pass
 
 pass
 
# 判断输赢函数
def judgeResult(i, j, value):
 global resultFlag
 
 flag = False # 用于判断是否已经判决出输赢
 for x in range(j - 4, j + 5): # 水平方向有没有出现5连
  if x >= 0 and x + 4 < 15 :
   if initChessList[i][x].value == value and \
    initChessList[i][x + 1].value == value and \
    initChessList[i][x + 2].value == value and \
    initChessList[i][x + 3].value == value and \
    initChessList[i][x + 4].value == value :
    flag = True
    break
    pass
 for x in range(i - 4, i + 5): # 垂直方向有没有出现5连
  if x >= 0 and x + 4 < 15:
   if initChessList[x][j].value == value and \
     initChessList[x + 1][j].value == value and \
     initChessList[x + 2][j].value == value and \
     initChessList[x + 3][j].value == value and \
     initChessList[x + 4][j].value == value:
    flag = True
    break
    pass
 
 # 判断东北方向的对角线是否出现了5连
 for x, y in zip(range(j + 4, j - 5, -1), range(i - 4, i + 5)):
  if x >= 0 and x+4 < 15 and y + 4 >= 0 and y < 15:
   if initChessList[y][x].value == value and \
     initChessList[y - 1][x + 1].value == value and \
     initChessList[y - 2][x + 2].value == value and \
     initChessList[y - 3][x + 3].value == value and \
     initChessList[y - 4][x + 4].value == value:
    flag = True
    break
    pass
   pass
  pass
 
 # 判断西北方向的对角是否出现了五连
 for x, y in zip(range(j - 4, j + 5), range(i - 4, i + 5)):
  if x >= 0 and x + 4 < 15 and y >= 0 and y + 4 < 15:
   if initChessList[y][x].value == value and \
     initChessList[y + 1][x + 1].value == value and \
     initChessList[y + 2][x + 2].value == value and \
     initChessList[y + 3][x + 3].value == value and \
     initChessList[y + 4][x + 4].value == value:
    flag = True
    break
    pass
   pass
  pass
 
 if flag:
  resultFlag = value
  pass
 pass
 
# 加载素材
def main():
 global resultFlag, initChessList
 initChessSquare(27, 27) # 初始化棋牌
 pygame.init()   # 初始化游戏环境
 # 创建游戏窗口
 screen = pygame.display.set_mode((620,620), 0, 0) # 第一个参数是元组:窗口的长和宽
 # 添加游戏标题
 pygame.display.set_caption("五子棋小游戏")
 # 图片的加载
 background = pygame.image.load('images/bg.png')
 blackStorn = pygame.image.load('images/storn_black.png')
 whiteStorn = pygame.image.load('images/storn_white.png')
 winStornW = pygame.image.load('images/white.png')
 winStornB = pygame.image.load('images/black.png')
 rect = blackStorn.get_rect()
 
 while True:
  screen.blit(background, (0, 0))
  # 更新棋盘棋子
  for temp in initChessList:
   for point in temp:
    if point.value == 1:
     screen.blit(whiteStorn, (point.x - 18, point.y - 18))
     pass
    elif point.value == 2:
     screen.blit(blackStorn, (point.x - 18, point.y - 18))
     pass
    pass
   pass
  # 如果已经判决出输赢
  if resultFlag > 0:
   initChessList = []  # 清空棋盘
   initChessSquare(27, 27) # 重新初始化棋盘
   if resultFlag == 1:
    screen.blit(winStornW, (50,100))
   else:
    screen.blit(winStornB, (50,100))
   pass
  pygame.display.update()
 
  if resultFlag >0:
   time.sleep(3)
   resultFlag = 0
   pass
  eventHandler()
  pass
 
 pass
 
if __name__ == "__main__":
 main()
 pass

Python基于pygame实现单机版五子棋对战

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

Python 相关文章推荐
python 限制函数调用次数的实例讲解
Apr 21 Python
Python基于多线程操作数据库相关问题分析
Jul 11 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
解决Opencv+Python cv2.imshow闪退问题
Apr 24 Python
详解python如何引用包package
Jun 07 Python
python利用线程实现多任务
Sep 18 Python
python中如何使用虚拟环境
Oct 14 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
Nov 12 Python
教你利用python实现企业微信发送消息
May 23 Python
Python实现视频中添加音频工具详解
Dec 06 Python
Python+Tkinter制作专属图形化界面
Apr 01 Python
用python3读取python2的pickle数据方式
Dec 25 #Python
python文件绝对路径写法介绍(windows)
Dec 25 #Python
python 实现将list转成字符串,中间用空格隔开
Dec 25 #Python
python 输出列表元素实例(以空格/逗号为分隔符)
Dec 25 #Python
python 定义类时,实现内部方法的互相调用
Dec 25 #Python
Python:type、object、class与内置类型实例
Dec 25 #Python
使用python实现希尔、计数、基数基础排序的代码
Dec 25 #Python
You might like
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
2011/07/12 PHP
PHP中的按位与和按位或操作示例
2014/01/27 PHP
PHP 快速排序算法详解
2014/11/10 PHP
PHP关联数组实现根据元素值删除元素的方法
2015/06/26 PHP
php取出数组单个值的方法
2018/03/12 PHP
ThinkPHP5与单元测试PHPUnit使用详解
2020/02/23 PHP
$()JS小技巧
2007/07/21 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
JSON 教程 json入门学习笔记
2020/09/22 Javascript
javascript中删除指定数组中指定的元素的代码
2011/02/12 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
JS仿百度自动下拉框模糊匹配提示
2016/07/25 Javascript
JavaScript表单验证开发
2016/11/23 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
Vue组件之自定义事件的功能图解
2018/02/01 Javascript
微信小程序实现留言功能
2018/10/31 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
2019/02/18 Javascript
7个好用的JavaScript技巧分享(译)
2019/05/07 Javascript
Vue 一键清空表单的实现方法
2020/02/07 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
python开发之str.format()用法实例分析
2016/02/22 Python
Python基于滑动平均思想实现缺失数据填充的方法
2019/02/21 Python
节日快乐! Python画一棵圣诞树送给你
2019/12/24 Python
python实现连连看游戏
2020/02/14 Python
css3和jquery实现自定义checkbox和radiobox组件
2014/04/22 HTML / CSS
数控专业毕业生求职信范文
2013/09/21 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
软件部经理岗位职责范本
2014/02/25 职场文书
群众路线教育党课主持词
2014/04/01 职场文书
革命英雄事迹演讲稿
2014/09/13 职场文书
竞选纪律委员演讲稿
2014/09/13 职场文书
自查自纠整改报告
2014/11/06 职场文书