乒乓球比赛模拟python,python两个乒乓球队进行比赛

  乒乓球比赛模拟python,python两个乒乓球队进行比赛

  Kivy用Python和Cython编写,基于OpenGLES2,支持各种输入设备,有丰富的组件库。这篇文章将教你如何用Kivy写一个乒乓球游戏。有兴趣的可以去试试。

  00-1010前言1。准备2。Kivy3的简单使用。添加简单的图形4。基维-添加乒乓球5。基维-增加乒乓球运动6。基维-球拍运动项目

  

目录

  很久没写游戏系列教程了。今天偶然浏览了开源跨平台Python框架Kivy。可以用来开发多点触控的用户界面程序,允许快速简单的交互设计,非常方便,于是有了制作这个教程的想法。

  本教程将教你如何用Kivy编写一个乒乓球游戏。我们将从一个基本的应用程序开始,描述创建这个游戏的每个步骤。

  Kivy用Python和Cython编写,基于OpenGL ES 2,支持各种输入设备,有丰富的组件库。同样的代码,可以直接实现多平台应用,包括Windows、macOS、Linux、Android、iOS。所有Kivy部件都支持多点触控。

  

前言

  在开始之前,您应该确保Python和pip已经成功安装在您的计算机上。如果没有,可以访问这篇文章:超详细的Python安装指南进行安装。

  (可选1),如果使用Python进行数据分析,可以直接安装Anaconda,它内置了Python和pip。

  (可选2):另外,我们推荐你使用VSCode编辑器,它有很多优点。

  请选择以下任一种方式输入命令安装依赖:

  1.在windows环境下打开Cmd(开始-运行-CMD)。

  2.在Mac OS环境下打开终端(进入终端(命令空间)。

  3.如果使用的是VSCode Editor或者Pycharm,可以直接使用界面底部的终端。

  pip安装kivy[base]kivy_examples

  

1.准备

  本节将简要介绍Kivy的基本用法。首先,为我们的游戏创建一个名为main.py的目录和文件:

  #主页. py

  fromkivy.appimportApp

  from kivy . uix . widgetimportwidget

  classPongGame(小部件):

  及格

  classPongApp(App):

  defbuild(self):

  returnPongGame()

  if__name__==__main__:

  PongApp()。运行()

  在命令行中输入python main.py来运行应用程序。它应该只显示一个黑色窗口。所以我们所做的就是创建一个非常简单的Kivy应用程序,它创建了一个PongGame小部件类的实例,并将其作为应用程序用户界面的根元素返回。

  在这一点上,您应该把它看作是一个小部件层次树。Kivy将这个小部件放在默认窗口中。下一步,我们将通过定义PongGame小部件的外观来绘制Pong的背景和游戏分数。

  

2.简单使用 Kivy

  我们将使用一个. kv文件来定义PongGame类的外观。由于我们的应用程序类名为PongApp,我们可以简单地在同一个目录中创建一个名为pong.kv的文件,该文件将在应用程序运行时自动加载。

  因此,为了定义游戏的外观,我们创建了一个名为pong.kv的新文件,并添加了以下内容:

  # :常春藤

  PongGame:

  canvas:

  矩形:

  pos: self.center_x - 5,0

        size: 10, self.height

      Label:

          font_size: 70

          center_x: root.width / 4

          top: root.top - 50

          text: "0"

      Label:

          font_size: 70

          center_x: root.width * 3 / 4

          top: root.top - 50

          text: "0"

  注意一个常见错误:kv文件的名称,例如 pong.kv,必须与应用程序的名称一致,例如 PongApp(App结尾之前的部分)。

  如果你现在运行这个应用程序,你应该看到中间有一个竖条,还有两个零,那里将显示玩家的分数,如下所示:

  

  可以看到,在第一行,我们有:

  

#:kivy 1.0.9

  每个 kv 文件都需要第一行。它应该以 #:kivy 及一个空格开头,然后是它要使用的 Kivy 版本(因此 Kivy 可以确保您至少拥有所需的版本,或者稍后处理向后兼容性)。

  再往下看 kv 文件里定义了三个元素,一个 canvas 和两个 label。

  先说说两个label,他们代表的是左右两个数字,设定了 font_size(字体大小), center_x(中心位置), top(离顶部距离), text(文本),此外可以看到 root.width 和 root.top 的使用,这样写的好处是能跟跟随窗口宽度和高度的变化而变化。

  另一个元素 canvas,它的下面定义了 Rectangle 参数,意思是我们向画布添加一个矩形。将矩形的 pos 设置为小部件水平中心左侧 5 个像素,y 设置为 0,这就定义了矩形的显示位置。

  矩形的大小 size 设置为宽度为 10 像素,高度为小部件的高度。像这样定义图形的好处是,当值表达式中使用的任何小部件的属性发生变化时,渲染的矩形将自动更新。

  

  

4. Kivy - 增加乒乓球球体

  好了,我们有一个基本的乒乓球场(虽然很简陋),但我们仍然需要球拍和一个球来打球。让我们从球开始。我们将添加一个新的 PongBall 类来创建一个小部件,它将成为我们的球并使它弹跳起来。

  PongBall 类:

  

class PongBall(Widget):

      # velocity of the ball on x and y axis

      velocity_x = NumericProperty(0)

      velocity_y = NumericProperty(0)

      # referencelist property so we can use ball.velocity as

      # a shorthand, just like e.g. w.pos for w.x and w.y

      velocity = ReferenceListProperty(velocity_x, velocity_y)

      # ``move`` function will move the ball one step. This

      # will be called in equal intervals to animate the ball

      def move(self):

          self.pos = Vector(*self.velocity) + self.pos

  白球的 kv 配置如下:

  

<PongBall>:

      size: 50, 50

      canvas:

          Ellipse:

              pos: self.pos

              size: self.size

  为了使这一切顺利进行,你还必须为球体增加所用的Property属性类。下面是这一步更新后的python代码和kv文件。

  

from kivy.app import App

  from kivy.uix.widget import Widget

  from kivy.properties import NumericProperty, ReferenceListProperty

  from kivy.vector import Vector

  class PongBall(Widget):

      velocity_x = NumericProperty(0)

      velocity_y = NumericProperty(0)

      velocity = ReferenceListProperty(velocity_x, velocity_y)

      def move(self):

          self.pos = Vector(*self.velocity) + self.pos

  class PongGame(Widget):

      pass

  class PongApp(App):

      def build(self):

          return PongGame()

  if __name__ == __main__:

      PongApp().run()

  kv文件如下:

  

#:kivy 1.0.9

  <PongBall>:

      size: 50, 50

      canvas:

          Ellipse:

              pos: self.pos

              size: self.size

  <PongGame>:

      canvas:

          Rectangle:

              pos: self.center_x - 5, 0

              size: 10, self.height

      Label:

          font_size: 70

          center_x: root.width / 4

          top: root.top - 50

          text: "0"

      Label:

          font_size: 70

          center_x: root.width * 3 / 4

          top: root.top - 50

          text: "0"

      PongBall:

          center: self.parent.center

  

  

5. kivy - 增加乒乓球体运动

  现在我们的目的是让这个球动起来,因此必须定期调用 move 函数让他动起来。使用 Kivy 提供的 Clock 函数可以轻易地做到这一点:

  

Clock.schedule_interval(game.update, 1.0/60.0)

  这一行将导致游戏对象的更新函数每秒被调用60次。

  不过我们还有一个问题。我们想确保PongBall的移动函数被定期调用,但是在我们的代码中没有任何对球对象的引用,因为我们只是通过 kv 文件在 PongGame 类的 kv 规则中添加了它。

  由于我们要做的不仅仅是移动球(比如把球从墙上弹下来,然后再弹到球员的球拍上),我们可能需要为我们的PongGame类建立一个更新方法。

  

class PongGame(Widget):

      def update(self, dt):

          # call ball.move and other stuff

          pass

  class PongApp(App):

      def build(self):

          game = PongGame()

          Clock.schedule_interval(game.update, 1.0/60.0)

          return game

  然而,这仍然不能改变我们没有对kv规则所创建的 PongBall 进行操作的这一事实。为了解决这个问题,我们可以给PongGame类添加一个ObjectProperty,并将其与kv规则中创建的widget挂钩。

  一旦这样做了,我们就可以很容易地在更新方法中引用球的属性,甚至可以让它从边缘弹起。

  

class PongGame(Widget):

      ball = ObjectProperty(None)

      def update(self, dt):

          self.ball.move()

          # bounce off top and bottom

          if (self.ball.y < 0) or (self.ball.top > self.height):

              self.ball.velocity_y *= -1

          # bounce off left and right

          if (self.ball.x < 0) or (self.ball.right > self.width):

              self.ball.velocity_x *= -1

  在kv文件中将其与代码中设定的 id: ball 映射起来:

  

<PongGame>:

      ball: pong_ball

      # ... (canvas and Labels)

      PongBall:

          id: pong_ball

          center: self.parent.center

  

  

6. Kivy - 球拍移动事件

  现在,我们的球正在弹来弹去。唯一缺少的是可移动的球拍和对分数的跟踪。我们不会再去讨论创建类和kv规则的所有细节,因为这些概念已经在前面的步骤中涵盖了。

  相反,让我们把重点放在如何响应用户的输入而移动球拍上。你可以在Python实用宝典公众号后台回复:乒乓球获得全部代码和kv规则。

  在Kivy中,小部件可以通过实现 on_touch_down、on_touch_move和on_touch_up 方法对输入做出反应。默认情况下,Widget类实现这些方法时,只是在其子部件上调用相应的方法来传递事件,直到其中一个子部件返回True。

  乒乓运动是非常简单的。球拍只需要向上和向下移动。事实上,它是如此简单,我们甚至不需要让球员小部件自己处理事件。我们只需为PongGame类实现on_touch_move函数:

  

def on_touch_move(self, touch):

      if touch.x < self.width/3:

          self.player1.center_y = touch.y

      if touch.x > self.width - self.width/3:

          self.player2.center_y = touch.y

  我们将在NumericProperty中保留每个球员的分数。PongGame的分数标签通过改变 NumericProperty score来保持更新,这反过来又会更新PongGame的子标签文本属性。

  这是如何实现的?因为Kivy属性会自动绑定到其对应的kv文件中的任何引用。当球从两侧逃出时,我们将通过PongGame类中的更新方法来更新分数并再次发球。

  PongPaddle类也实现了一个 bounce_ball 方法,这样球就会根据它击中球拍的位置而产生不同方向的弹跳,非常有意思。下面是PongPaddle类的代码:

  

class PongPaddle(Widget):

      score = NumericProperty(0)

      def bounce_ball(self, ball):

          if self.collide_widget(ball):

              speedup = 1.1

              offset = 0.02 * Vector(0, ball.center_y-self.center_y)

              ball.velocity = speedup * (offset - ball.velocity)

  

  到这一步我们基本就完成了整个游戏的制作,如何,你心动了吗?

  以上就是Python+Kivy编写一个乒乓球游戏的详细内容,更多关于Python Kivy乒乓球游戏的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: