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实现对PDF文件的OCR识别
Aug 05 Python
python读取文本绘制动态速度曲线
Jun 21 Python
Python构建图像分类识别器的方法
Jan 12 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
详解django中Template语言
Feb 22 Python
python通过对字典的排序,对json字段进行排序的实例
Feb 27 Python
浅谈Python中os模块及shutil模块的常规操作
Apr 03 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
pandas提升计算效率的一些方法汇总
May 30 Python
Python实现机器学习算法的分类
Jun 03 Python
Python实现简繁体转换
Jun 07 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
php目录管理函数小结
2008/09/10 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
javascritp实现input输入框相关限制用法
2007/06/29 Javascript
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
js实时监听文本框状态的方法
2011/04/26 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
2012/10/18 Javascript
JS实现控制表格行内容垂直对齐的方法
2015/03/30 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
JavaScript&quot;模拟事件&quot;的注意要点详解
2019/02/13 Javascript
Element-ui自定义table表头、修改列标题样式、添加tooltip、:render-header使用
2019/04/11 Javascript
JavaScript+HTML5 canvas实现放大镜效果完整示例
2019/05/15 Javascript
微信小程序实现点击生成随机验证码
2020/09/09 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
[01:01:51]EG vs VG Supermajor小组赛B组 BO3 第二场 6.2
2018/06/03 DOTA
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
Python实现分割文件及合并文件的方法
2015/07/10 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python Socket使用实例
2017/12/18 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python实现广度优先搜索过程解析
2019/10/19 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
HTML5 CSS3打造相册效果附源码下载
2014/06/16 HTML / CSS
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
房产代理公证处委托书
2014/04/04 职场文书
单位工作证明书格式
2014/10/04 职场文书
早恋主题班会
2015/08/14 职场文书
儿童诗两首教学反思
2016/02/23 职场文书