转眼间就到六月份啦,隔一段时间就来写写博客来总结一下这段时间自己所学的东西。近期还是在学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 syspygame.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 = 1while 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,bpygame.draw.line(screen,color,(x,y),(x1,y1),2)pygame.display.update()n+=1time.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_yr = random.randint(0,255)#获取RGBg = 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_xcolor =  r, g, bif pos_y > 400 or pos_y < 0:vel_y = -vel_ycolor = r, g, bpygame.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...........................................................

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

《Python游戏编程入门》第二章编程挑战相关推荐

  1. Python编程基础 第二章 编程练习 (第2轮开课补充)编写程序实现以下功能:计算beg到end之间的所有水仙花数并输出。如果beg到end之间不存在水仙花数,则输出“not found”。

    9 编写程序实现以下功能:计算beg到end之间的所有水仙花数并输出(水仙花数是一个三位整数,其值与各位数字的立方和相等).如果beg到end之间不存在水仙花数,则输出"not found& ...

  2. C# 编程入门第二课 注释变量,VS2019快捷键,String和string,命名规则,赋值运算符,+号作用占位符,转义字符算术运算符,类型转换

    C# 编程入门第二课 文章目录 C# 编程入门第二课 1. 注释 2 变量 3.VS2019快捷键 4. String和string 5. 命名规则 6. 赋值运算符,+号作用 7. 占位符 8.转义 ...

  3. Java7并发编程指南——第二章:线程同步基础

    Java7并发编程指南--第二章:线程同步基础 @(并发和IO流) Java7并发编程指南第二章线程同步基础 思维导图 项目代码 思维导图 项目代码 GitHub:Java7ConcurrencyCo ...

  4. 3-8《Ruby元编程》第二章对象模型

    <Ruby元编程> 第二章 对象模型 类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法. [].meth ...

  5. C Primer Plus—第二章编程习题

    C Primer Plus 编程习题-第二章-C语言概述 C Primer Plus 2.12 编程练习第一题 /* 题目:编写一个程序,调用一次 printf()函数,把你的名和姓打印在一行. 再调 ...

  6. 《区块链编程》-第二章

    文章目录 椭圆曲线 练习1 代码实现 测试 练习2 代码实现 测试 实现加法恒等元的点加法运算 代码实现 测试 练习3 代码实现 练习4 代码实现 运行结果 练习5 代码实现 运行结果 练习6 代码实 ...

  7. Python游戏开发入门-蔡军生-专题视频课程

    Python游戏开发入门-2302人已学习 课程介绍         随着人工智能的复兴,越来越多AI的架构采用Python语言来开发,因此学会Python语言,就成为当下急需的技能.同时,Pytho ...

  8. webrtc 入门第二章 音视频录制

    webrtc 入门第二章 音视频录制 一.介绍 1.媒体录制原理 ​ 在很多场景中回放音视频资源的需求是非常重要的例如会议,直播授课等.任何媒体形式的表情都可进行录制,如 ,,等.其中内容更加自由用户 ...

  9. Python爬虫核心知识-第二章:2.2 爬虫urllib.parse模块

    Python爬虫核心知识 第二章:2.2 爬虫urllib.parse模块 2.2 爬虫urllib.parse模块 Python中的urllib.parse模块中,提供了很多用来解析和重组URL的函 ...

  10. Python面试宝典(第二章 Python基础)

    Python面试宝典(第二章 Python基础) Python面试宝典(第二章 Python基础) 基础语法 输入输出 问题:代码中要修改不可变数据会出现什么问题? 抛出什么异常? 问题:a=1,b= ...

最新文章

  1. 用matlab读取三角波及其频谱,信号与系统利用MATLAB分析信号频谱作业(第四章)以及结论.doc...
  2. 大角度人脸转正--Towards Large-Pose Face Frontalization in the Wild
  3. java 继承 重载_java – 使用继承的重载方法
  4. linux端口监听命令
  5. java多线程中的异常处理
  6. Day03 javascript详解
  7. 设置UILabel可变高度(根据文本内容自动适应高度)
  8. android websocket封装,Android WebSocket 方案选型OkHttp
  9. linux系统下安装jdk教程
  10. java代码块是对象吗_面向对象(Java中普通代码块,构造代码块,静态代码块区别及代码示例)...
  11. 2017.5.6 子矩阵 思考记录
  12. 【K210】【MaixPy】三、Maix Dock入门之LCD的使用(播放BadApple)
  13. 网页优化系列三:使用压缩后置viewstate
  14. 使用 C++11 编写类似 QT 的信号槽——上篇
  15. Java启动sparksql,spark-sql启动的时候需要制定master吗?
  16. android大智慧安装目录,大智慧数据文件目录解读
  17. WPS调整一页中打印多页的设置使页码顺序正确
  18. Axure RP 9.0 Enterprise 原型设计
  19. 经济基础知识(初级)【13】
  20. 【学习OpenCV4】进度条实现总结

热门文章

  1. 解决Bootstrap模态窗口Modal中使用Kindeditor或UEditor编辑器 点击关闭弹窗 出现第二次无法加载的问题
  2. 牛腩新闻发布--.NET控件FreeTextBox使用方法
  3. 学Java看什么视频好呢?视频经验大总结
  4. 俞敏洪:把眼前的做好,一切就都好了
  5. xp java环境_XP系统怎么安装JAVA编程环境
  6. Android 项目必备(四十一)-->Android 开发实战经验总结
  7. poi实现Excel文件导出【SpringBoot篇】
  8. Java比较器-学习
  9. java做校园一卡通技术_基于jsp的校园一卡通管理系统-JavaEE实现校园一卡通管理系统 - java项目源码...
  10. Java算法-快排序