python pygame实现五子棋小游戏


Posted in Python onOctober 26, 2020

今天学习了如何使用pygame来制作小游戏,下面是五子棋的代码,我的理解都写在注释里了

import pygame
# 导入pygame模块
print(pygame.ver)
# 检查pygame的版本,检查pygame有没有导入成功

EMPTY = 0
BLACK = 1
WHITE = 2
# 定义三个常量函数,用来表示白棋,黑棋,以及 空

black_color = [0, 0, 0]
# 定义黑色(黑棋用,画棋盘)
white_color = [255, 255, 255]
# 定义白色(白棋用)

# 定义棋盘这个类
class RenjuBoard(object):

 def __init__(self):
 # self._board = board = [[EMPTY] * 15 for _ in range(15)]
 # 将棋盘每一个交叉点都看作列表的一个元素位,一共有15*15共225个元素
 self._board = [[]] * 15
 self.reset()
 #重置棋盘
 def reset(self):
 for row in range(len(self._board)):
 self._board[row] = [EMPTY] * 15
 #定义棋盘上的下棋函数,row表示行,col表示列,is_black表示判断当前点位该下黑棋,还是白棋
 def move(self, row, col, is_black):
 if self._board[row][col] == EMPTY:
 self._board[row][col] = BLACK if is_black else WHITE
 return True
 return False
 # 给棋盘定义一个函数将自己在screen上面画出来,使用pygame.draw()函数。并且顺便将下了的棋子也画出来
 def draw(self, screen):
 for h in range(1, 16):
 pygame.draw.line(screen, black_color,
  [40, h * 40], [600, h * 40], 1)
 pygame.draw.line(screen, black_color,
 # 给棋盘加一个外框,使美观
 pygame.draw.rect(screen, black_color, [36, 36, 568, 568], 3)
 # 在棋盘上标出,天元以及另外4个特殊点位
 pygame.draw.circle(screen, black_color, [320, 320], 5, 0)
 pygame.draw.circle(screen, black_color, [160, 160], 3, 0)
 pygame.draw.circle(screen, black_color, [160, 480], 3, 0)
 pygame.draw.circle(screen, black_color, [480, 160], 3, 0)
 pygame.draw.circle(screen, black_color, [480, 480], 3, 0)
 #做2次for循环取得棋盘上所有交叉点的坐标
 for row in range(len(self._board)):
 for col in range(len(self._board[row])):
 # 将下在棋盘上的棋子画出来
 if self._board[row][col] != EMPTY:
  ccolor = black_color \
  if self._board[row][col] == BLACK else white_color
  # 取得这个交叉点下的棋子的颜色,并将棋子画出来
  pos = [40 * (col + 1), 40 * (row + 1)]
  # 画出棋子
  pygame.draw.circle(screen, ccolor, pos, 18, 0)

# 定义函数,传入当前棋盘上的棋子列表,输出结果,不管黑棋白棋胜,都是传回False,未出结果则为True
def is_win(board):
 for n in range(15):
 # 判断垂直方向胜利
 flag = 0
 # flag是一个标签,表示是否有连续以上五个相同颜色的棋子
 for b in board._board:
 if b[n] == 1:
 flag += 1
 if flag == 5:
  print('黑棋胜')
  return False
 else:
 # else表示此时没有连续相同的棋子,标签flag重置为0
 flag = 0

 flag = 0
 for b in board._board:
 if b[n] == 2:
 flag += 1
 if flag == 5:
  print('白棋胜')
  return False
 else:
 flag = 0

 # 判断水平方向胜利
 flag = 0
 for b in board._board[n]:
 if b == 1:
 flag += 1
 if flag == 5:
  print('黑棋胜')
  return False
 else:
 flag = 0

 flag = 0
 for b in board._board[n]:
 if b == 2:
 flag += 1
 if flag == 5:
  print('白棋胜')
  return False
 else:
 flag = 0

 # 判断正斜方向胜利

 for x in range(4, 25):
 flag = 0
 for i,b in enumerate(board._board):
 if 14 >= x - i >= 0 and b[x - i] == 1:
  flag += 1
  if flag == 5:
  print('黑棋胜')
  return False
 else:
  flag = 0

 for x in range(4, 25):
 flag = 0
 for i,b in enumerate(board._board):
 if 14 >= x - i >= 0 and b[x - i] == 2:
  flag += 1
  if flag == 5:
  print('白棋胜')
  return False
 else:
  flag = 0

 #判断反斜方向胜利
 for x in range(11, -11, -1):
 flag = 0
 for i,b in enumerate(board._board):
 if 0 <= x + i <= 14 and b[x + i] == 1:
  flag += 1
  if flag == 5:
  print('黑棋胜')
  return False
 else:
  flag = 0

 for x in range(11, -11, -1):
 flag = 0
 for i,b in enumerate(board._board):
 if 0 <= x + i <= 14 and b[x + i] == 2:
  flag += 1
  if flag == 5:
  print('白棋胜')
  return False
 else:
  flag = 0

 return True


def main():
 # 创建棋盘对象
 board = RenjuBoard()
 # 用于判断是下黑棋还是白棋
 is_black = True
 # pygame初始化函数,固定写法
 pygame.init()
 pygame.display.set_caption('五子棋') # 改标题
 # pygame.display.set_mode()表示建立个窗口,左上角为坐标原点,往右为x正向,往下为y轴正向
 screen = pygame.display.set_mode((640,640))
 # 给窗口填充颜色,颜色用三原色数字列表表示
 screen.fill([125,95,24])
 board.draw(screen) # 给棋盘类发命令,调用draw()函数将棋盘画出来
 pygame.display.flip() # 刷新窗口显示

 running = True
 # while 主循环的标签,以便跳出循环
 while running:
 # 遍历建立窗口后发生的所有事件,固定写法
 for event in pygame.event.get():
 # 根据事件的类型,进行判断
 if event.type == pygame.QUIT:
 running = False

 elif event.type == pygame.KEYUP:
 pass
 # pygame.MOUSEBUTTONDOWN表示鼠标的键被按下
 elif event.type == pygame.MOUSEBUTTONDOWN and \
  event.button == 1:# button表示鼠标左键
 x, y = event.pos # 拿到鼠标当前在窗口上的位置坐标
 # 将鼠标的(x, y)窗口坐标,转化换为棋盘上的坐标
 row = round((y - 40) / 40) 
 col = round((x - 40) / 40)
 if board.move(row, col, is_black):
  is_black = not is_black
  screen.fill([125, 95, 24])
  board.draw(screen)
  pygame.display.flip()
  # 调用判断胜负函数
  if not is_win(board):
  #break
  running = False
  # 这里我有个bug没找到解决办法,就是判断出胜负后,使用break跳出事件遍历的for循环,但是老是不能跳出来,导致胜负分出来了还可以继续下,这里我采用判断胜负后就将running标签赋值为False,跳出主循环,但是这样棋盘的窗口也没了。明天再找找bug在哪

 pygame.quit()

if __name__ == '__main__':
 main()

更多关于python游戏的精彩文章请点击查看以下专题:

更多有趣的经典小游戏实现专题,分享给大家:

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

Python 相关文章推荐
Python的Django框架中模板碎片缓存简介
Jul 24 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
Apr 23 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
学生信息管理系统python版
Oct 17 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
解决Keras 与 Tensorflow 版本之间的兼容性问题
Feb 07 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
Django如何使用jwt获取用户信息
Apr 21 Python
python为什么会环境变量设置不成功
Jun 23 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 #Python
python制作简单五子棋游戏
Jun 18 #Python
Python利用pandas处理Excel数据的应用详解
Jun 18 #Python
PyQt5固定窗口大小的方法
Jun 18 #Python
Python格式化字符串f-string概览(小结)
Jun 18 #Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
Jun 18 #Python
PyQt编程之如何在屏幕中央显示窗体的实例
Jun 18 #Python
You might like
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
php使用google地图应用实例
2014/12/31 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHP执行SQL文件并将SQL文件导入到数据库
2015/09/17 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
js对象关系图 方便dom操作
2012/03/18 Javascript
js call方法详细介绍(js 的继承)
2013/11/18 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
基于Koa2写个脚手架模拟接口服务的方法
2018/11/27 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
Python常用列表数据结构小结
2014/08/06 Python
Python生成随机验证码的两种方法
2015/12/22 Python
python 实现敏感词过滤的方法
2019/01/21 Python
python进程和线程用法知识点总结
2019/05/28 Python
python logging 日志的级别调整方式
2020/02/21 Python
html5桌面通知(Web Notifications)实例解析
2014/07/07 HTML / CSS
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
广州迈达威.net面试题目
2012/03/10 面试题
机械设计及其自动化专业推荐信
2013/10/31 职场文书
宿舍违规用电检讨书
2014/02/16 职场文书
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
学生上课看漫画的检讨书
2014/09/26 职场文书
先进个人申报材料
2014/12/30 职场文书
行政前台岗位职责
2015/04/16 职场文书
2016年党风廉政建设承诺书
2016/03/25 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL