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中将字典转换成其json字符串
Jul 16 Python
简单学习Python time模块
Apr 29 Python
python交互式图形编程实例(二)
Nov 17 Python
Python实现的维尼吉亚密码算法示例
Apr 12 Python
基于数据归一化以及Python实现方式
Jul 11 Python
便捷提取python导入包的属性方法
Oct 15 Python
python用pandas数据加载、存储与文件格式的实例
Dec 07 Python
Django如何开发简单的查询接口详解
May 17 Python
Python爬取视频(其实是一篇福利)过程解析
Aug 01 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
无需压缩软件,用python帮你操作压缩包
Aug 17 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
第十四节 命名空间 [14]
2006/10/09 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
常见的5个PHP编码小陋习以及优化实例讲解
2021/02/27 PHP
用于自动添加Digg This!按钮的JavaScript
2006/12/23 Javascript
jquery上传插件fineuploader上传文件使用方法(jquery图片上传插件)
2013/12/05 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
JavaScript编写推箱子游戏
2015/07/07 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
js实现返回顶部效果
2017/03/10 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
Node.js在图片模板上生成二维码图片并附带底部文字说明实现详解
2019/08/07 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
2019/09/27 Javascript
全面解析JavaScript Module模式
2020/07/24 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
Python学习笔记之os模块使用总结
2014/11/03 Python
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
python的继承知识点总结
2018/12/10 Python
windows下python虚拟环境virtualenv安装和使用详解
2019/07/16 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
Staples美国官方网站:办公用品一站式采购
2016/07/28 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
市场营销专业个人自荐信格式
2013/09/21 职场文书
教师对学生的寄语
2014/04/03 职场文书
中班幼儿评语大全
2014/04/30 职场文书
2014年小学国庆节活动方案
2014/09/16 职场文书
2015年清明节活动总结
2015/02/09 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
《秋天的怀念》教学反思
2016/02/17 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL