《Python游戏编程入门》第二章编程挑战

转眼间就到六月份啦,隔一段时间就来写写博客来总结一下这段时间自己所学的东西。近期还是在学Python,Python真是一门神奇的语言,你越用越喜欢。哈哈哈!近期在学校图书馆看到了一本叫《Python游戏编程入门》的书,作者是Jonathan S.Harbour,在图书馆稍微看了一下,发现还是蛮有趣的,所以就果断借走了,嘻嘻嘻。

第一章是简单的介绍了Python的面向对象编程,不是很有意思就略过啦。

第二章就比较有意思了,用Python的Pygame库来话各种图:线段,弧线段,矩形,圆形,椭圆等等。

本次博客主要是记录第二章的挑战题,有兴趣的小伙伴可以去买或者借这本书我们一起学习。

环境:DeepinOS 15.5桌面版 PyCharm2018

Python 版本:3.5 

使用pip3安装最新的Pygame

挑战第一题:

 使用本章的实例作为起点,编写一个程序来绘制一个椭圆,这是我们在本章中没有介绍的形状。

思路:看到这个的第一反应是用上下两段弧线段组合成一个椭圆,因为在第二章前面的样例中有介绍Pygame绘制弧线段。然后试了一下发现有点复杂,然后就想它有没有画椭圆的函数,找了一下还真有!我们要先知道椭圆的英文是Ellipse。

Pygame库中的pygame.draw.ellipse(Surface,color,Rect,width)是用来绘制椭圆的,其中Surface是用来绘制这个椭圆的窗口,color就是椭圆的颜色,Rect是有四个参数的元组,个人推测这个椭圆是放在一个看不见的矩形中的,Rect的第一和第二个参数是这个矩形左上角这个点的位置(x,y),也就是说第一第二参数对应的是这个椭圆在这个Surface中的位置,Rect的第三第四个参数是这个矩形的长和宽,分别对应这个椭圆的长轴长在数学中用a表示,和椭圆的短轴长b,也就是说改变第三第四个参数就能改变椭圆的形状。width是这个这个椭圆边的粗细,0为一个实心的椭圆。

以下是完整代码

from pygame.locals import *
import pygame
import sys

pygame.init()
color = 255,0,0#颜色RGB码
screen = pygame.display.set_mode((600,500))#初始化和设置窗口大小
pygame.display.set_caption("This is ellipse")#设置窗口标题
position = 200,180,200,150#Rect元组
while True:#循环控制窗口一直存在
    for event in pygame.event.get():#刚才的推测可以在这个for循环里加一个print(event)来验证,具体怎么样就不详细说啦
        if event.type in(QUIT,KEYDOWN):#监听鼠标和键盘,点右上角的X或者长按键盘退出
            sys.exit()
    screen.fill((0,0,0))#窗口背景色填充
    pygame.draw.ellipse(screen,color,position,5)
    pygame.display.update()

运行结果

 

挑战第二题

  选取一个示例,例如,绘制线条示例,修改它以便用随机的值绘制1000个线条。了解一下random库和random.randint()函数。

思路:这道题要画一千条线,那我们就先看一下pygame.draw.line(Surface,color,start_pos,end_pos,width)。Surface是窗口就不多说了,颜色也一样,主要是start_pos(起始点)end_pos(结束点),这里我们需要用random库获取四个随机的值,但每一个值都不能超过窗口的长和宽,或者为负数。width表示线段的粗细。

程序代码

import pygame
import random
import sys
import time
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("Random Lines")

n = 1

while n<1000:
    for event in pygame.event.get():
        if event.type in (QUIT,KEYDOWN):
              sys.exit()
    #随机起点和终点,随机颜色r,g,b的计算
    x = random.randint(0,600)
    y = random.randint(0,500)
    x1 = random.randint(0,600)
    y1 = random.randint(0,500)
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    color = r,g,b
    pygame.draw.line(screen,color,(x,y),(x1,y1),2)
    pygame.display.update()
    n+=1
    time.sleep(0.05)#一次做完延迟0.05秒做下一次,不然会一下子跑完。

运行结果


挑战第三题

绘制矩形示例是唯一一个绕着屏幕移动形状的示例,修改程序,以便任何时候,当矩形碰到屏幕边界时,矩形都将改变颜色。

思路:既然是要画矩形,就要用到pygame.draw.rect(Surface,color,rect,width),这个函数和椭圆那个很像,其它的参数都一样,我们主要关注rectrect也是有四个参数,第一第二个参数用pos_x,pos_y表示确定位置,第三第四确定长宽。既然是可移动的,那我们就要去改变pos_x,pos_y,同时我们还需要两个参数(vel_x,vel_y)来确定移动的速度。用pos_x+=vel_x,pos_y+=vel_y来移动矩形。为了保证矩形在这个窗口(Surface)里,当pos_x/pos_y大于窗口长/宽,或者小于0时,速度vel_x/vel_y变成它们的相反数,并且题目要求在碰到边界时改变矩形的颜色,我们就在碰到边界时,还是用random.randint()函数来获取三个值R、G、B来获取一个随机的颜色。

程序代码

import pygame
from pygame.locals import *
import sys
import time
import random
pygame.init()

screen = pygame.display.set_mode((600,500))
pygame.display.set_caption("Moving Rect")

pos_x = 300
pos_y = 250
vel_x = 2
vel_y = 1
color = 0, 255, 0
while True:
  screen.fill((0,0,0))
  pos_x += vel_x#移动矩形
  pos_y += vel_y
  r = random.randint(0,255)#获取RGB
  g = random.randint(0,255)
  b = random.randint(0,255)
  position = pos_x,pos_y,100,100
  #碰到边界改变vel_x,vel_y使矩形保持在窗口内,并且改变颜色
  if pos_x > 500 or pos_x < 0:
      vel_x = -vel_x
      color =  r, g, b
  if pos_y > 400 or pos_y < 0:
      vel_y = -vel_y
      color = r, g, b
  pygame.draw.rect(screen, color, position, 0)
  pygame.display.update()
  for event in pygame.event.get():
      if event.type in (QUIT,K_ESCAPE):
          sys.exit()

  time.sleep(0.01)

运行结果


这里我发现一个有趣的事情,如果代码中不添加screen.fill((0,0,0))窗口填充色的画,程序运行时就是用这个矩形“画”线条,感兴趣的小伙伴可以去试一下。附上一张图:


..................................................ENDING...........................................................

好了本次博客就写到这啦,有什么问题在下方留言。

猜你喜欢

转载自blog.csdn.net/u011648373/article/details/80552229