热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python怎么做游戏

python使用PyGame库做游戏。它能够让你更容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进的游戏里。
PyGame是一个Python的库,能够让你更容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进你的游戏里。

下面是五子棋的代码,我的理解都写在注释里了(推荐学习:Python视频教程)

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(&#39;黑棋胜&#39;)
            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(&#39;白棋胜&#39;)
            return False
        else:
          flag = 0

  return True


def main():
  # 创建棋盘对象
  board = RenjuBoard()
  # 用于判断是下黑棋还是白棋
  is_black = True
  # pygame初始化函数,固定写法
  pygame.init()
  pygame.display.set_caption(&#39;五子棋&#39;) # 改标题
  # 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__ == &#39;__main__&#39;:
  main()

更多Python相关技术文章,请访问Python教程栏目进行学习!

以上就是python怎么做游戏的详细内容,更多请关注其它相关文章!


推荐阅读
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python异常的捕获、传递与抛出操作,并提供了相关的操作示例。通过异常的捕获和传递,可以有效处理程序中的错误情况。同时,还介绍了如何主动抛出异常。通过本文的学习,读者可以掌握Python中异常处理的基本方法和技巧。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Python字典推导式及循环列表生成字典方法
    本文介绍了Python中使用字典推导式和循环列表生成字典的方法,包括通过循环列表生成相应的字典,并给出了执行结果。详细讲解了代码实现过程。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 本文介绍了如何使用Python正则表达式匹配MATLAB的函数语法,包括多行匹配和跨行签名的处理方法。同时,作者还分享了自己遇到的问题和解决方案。 ... [详细]
  • 本文介绍了Python版Protobuf的安装和使用方法,包括版本选择、编译配置、示例代码等内容。通过学习本教程,您将了解如何在Python中使用Protobuf进行数据序列化和反序列化操作,以及相关的注意事项和技巧。 ... [详细]
author-avatar
手机用户2502891303_279
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有