day17-pygame

1.复习(补充)

1.json数据
json数据的要求:
a.一个json对应一个数据
b.json中的数据一定是json支持的数据类型

数字:整数和小数
字符串:双引号引起来的内容
数组:[120, "anc", true, [1, 2], {"a":123}]
字典: {"abc":120, "aa":"abc", "list":[1, 2]}
布尔: true/false
null: 空(None)

json模块:
load(文件对象) --> 将文件中的内容读出来,转换成python对应的数据
dump(内容, 文件对象) --> 将内容以json格式,写入到文件中

loads(字符串) --> 将json格式字符串转换成python数据  '{"a": 12}'
dumps(python数据) --> 将python数据转换成json格式的字符串


2.异常处理
try-except-finally语法捕获异常
raise语法抛出异常

a.
try: 
    代码1
except:
    代码2


try:
    代码1
except (异常类型1,异常类型2...):
    代码2

try:
    代码1
except 异常类型1:
    代码2
except 异常类型2:
    代码3
...


b. raise 错误类型
错误类型:必须是Exception的子类(系统的错误类型和自定义的类型) 
自定义错误类型:写一个类继承Exception,重写__str__方法定制错误提示语

3.类和对象
a.类的声明
class 类名(父类列表):
    类的内容

b.创建对象
对象 = 类名()

c.类的字段和对象的属性
类的字段:
对象的属性:init方法,self.属性=值

d.对象方法,类方法,静态方法
对象方法:
类方法:@classmethod 
静态方法:@staticmethod 

e.对象属性的增删改查
f.私有化:名字前加__
g.getter和setter
h.常用的内置属性: 对象.__dict__, 对象.__class__, 类.__name__
i.继承:所有类都默认继承object,继承哪些东西,重写(super()), 添加对象属性

代码示例

class Perosn(object):
    def __init__(self):
        self._age = 0

    @property
    def age(self):
        return self._age

    @age.setter
    def age(self, value):
        self._age = value

补充1:抛出异常

代码示例

class MyError(Exception):
    def __str__(self):
        return '需要一个偶数,但是给了一个奇数'


number = int(input('请输入一个偶数:'))
if number & 1:
    raise MyError

运行结果

请输入一个偶数:1
Traceback (most recent call last):
  File "E:/Python Study/第一阶段/day17-pygame/01-recode.py", line 98, in <module>
    raise MyError
__main__.MyError: 需要一个偶数,但是给了一个奇数

补充2:多继承

代码示例

class Animal:
    num = 10

    def __init__(self, age):
        self.age = age

    def run(self):
        print('可以跑')


print(Animal.__dict__)


class Fly:
    def __init__(self, height):
        self.height = height

    def can_fly(self):
        print('可以飞')


class Bird(Animal, Fly):
    def __init__(self, color):
        super().__init__(10)
        self.color = color

注意:多继承的时候,只能继承第一个父类的对象属性(创建对象的时候调用的是第一个父类的对象方法)一般在需要继承多个类的功能的时候用

代码示例

b1 = Bird('abc')
# b1.age = 18
# b1.height = 200
print(b1.age)
# print(b1.height)
b1.can_fly()
b1.run()

运行结果

10
可以飞
可以跑

扩展(将对象保存到本地)

代码示例

import json
class Student:
    def __init__(self, name='', age=0, tel=''):
        self.name = name
        self.age = age
        self.tel = tel
        self.sex = '男'

    def show_info(self):
        print(self.__dict__)

    def __repr__(self):
        return '<' + str(self.__dict__)[1:-1] + '>'


all_students = [Student('小明', 18, '1278763'),
                Student('xiaohua', 12, '127723')
                ]


class Dog:
    def __init__(self):
        self.name = ''
        self.age = 0
        self.color = ''
        self.type = ''

    def __repr__(self):
        return '<' + str(self.__dict__)[1:-1] + '>'
# 将对象保存到本地
def object_json(file, content):
    with open('./' + file, 'w', encoding='utf-8') as f:
        new = []
        for stu in content:
            new.append(stu.__dict__)
        json.dump(new, f)


# object_json('test.json', all_students)

扩展(将字典列表转换成对象列表)

代码示例

def json_object(file, type):
    with open('./' + file, 'r', encoding='utf-8') as f:
        list1 = json.load(f)
        all_value = []
        for dict1 in list1:
            object = type()
            for key in dict1:
                setattr(object, key, dict1[key])
            all_value.append(object)
    return all_value


# print(json_object('test.json', Student))
# print(json_object('test2.json', Dog))

扩展(将不同类型的对象添加到不同的json文件中)

代码示例

def add_object_json2(obj: object):
    file_name = obj.__class__.__name__ + '.json'

    # 获取原文中的内容
    try:
        with open('./' + file_name, encoding='utf-8') as f:
            list1 = json.load(f)
    except FileNotFoundError:
        list1 = []

    with open('./' + file_name, 'w', encoding='utf-8') as f:
        list1.append(obj.__dict__)
        json.dump(list1, f)


add_object_json2(stu)
add_object_json2(dog1)


def get_all_info(type):
    file = type.__name__ + '.json'
    with open('./' + file, 'r', encoding='utf-8') as f:
        list1 = json.load(f)
        all_value = []
        for dict1 in list1:
            object = type()
            for key in dict1:
                setattr(object, key, dict1[key])
            all_value.append(object)
    return all_value


print('学生:', get_all_info(Student))
print('狗:', get_all_info(Dog))

运行结果可自行检测

2.抽象类

抽象类:只能被继承不能实例化的类
抽象方法:声明的时候不用实现,在子类中必须去重写的方法

怎么声明抽象类:类继承abc模块中的ABCMeta,继承的时候需要参数metaclass.并且通过
abstractmethod来声明抽象方法

子类继承一个抽象类,必须在子类中实现抽象类中所有的抽象方法

代码示例

import abc


class Shape(metaclass=abc.ABCMeta):  # 不能实例化

    # 声明抽象方法
    @abc.abstractmethod
    def draw(self):
        pass


class Circle(Shape):
    def draw(self):   # 必须实现抽象方法
        print('123')


c1 = Circle()

3.pygame图片的显示

display --> 屏幕相关
event --> 事件
draw --> 图形
image --> 图片
font --> 字体

代码示例

# 1.初始化游戏
pygame.init()

# 2.创建窗口对象
"""
set_mode(size):设置窗口大小  --> size是元组:(长、宽),单位是像素
"""
screen = pygame.display.set_mode((600, 600))
"""
fill(颜色) --> 填充指定的颜色,元组(red,green,blue)
计算机使用的是计算机三原色(红,绿,蓝) ---> rgb颜色,对应的值的范围是0-255

红色:(255,0,0)
绿色:(0,255,0)
白色:(255,255,255)
黑色:(0,0,0)
黄色:(255,255,0)
"""
screen.fill((255, 255, 255))

# 4.显示图片
"""
1.加载图片
load(图片地址) --> 返回图片对象
"""
image = pygame.image.load('image/d.jpg')

"""
a.获取图片的大小
图片.get_size() --> 返回图片的大小,结果是元组
"""
image_width, image_height = image.get_size()

"""
b.对图片进行缩放
transform.scale(图片对象,大小) ---> 将指定的图片缩放成指定大小,
返回一个新的图片
注意:可能会使图片发生形变
"""
new_image = pygame.transform.scale(image, (150, 200))

"""
c.对图片进行缩放旋转
transform.rotozoom(图片对象,角度,比例)
比例:原图的多少倍,  放大:大于1 反之
角度:0-360(逆时针旋转)
"""
new_image1 = pygame.transform.rotozoom(image, 90, 1)

angle = 0
"""
2.渲染图片
blit(渲染对象,渲染位置)
渲染位置 -> 元组,(x坐标,y坐标)
"""
screen.blit(new_image1, (0, 0))

"""
3.展示类容
只要想将内容展示在屏幕 上,都要调用这个方法
"""
pygame.display.flip()

# 3.游戏循环(不断检测是否有事件发生 )
while True:
    # 不断检测事情的产生
    for event in pygame.event.get():
        # 不同类型的事情,event的type属性不同
        if event.type == pygame.QUIT:
            exit()   # 结束
    # angle += 1
    # new_image1 = pygame.transform.rotozoom(image, angle, 0.5)
    # screen.blit(new_image1, (300, 300))
    # pygame.display.flip()

运行结果可自行检测

4.pygame文字显示

代码示例

import pygame

pygame.init()

screen = pygame.display.set_mode((600, 400))
screen.fill((255, 255, 255))  # 填充背景颜色
pygame.display.flip()

"""
显示文字:
1.创建字体对象
font.SysFont(字体名, 字体大小, 是否加粗=False, 是否倾斜=False)
---> 创建系统字体对象
font.Font(字体文件路径,字体大小) ---> 自定义字体
字体文件:后缀就是.ttf文件
"""
# font = pygame.font.SysFont('NewTimes', 20)
font = pygame.font.Font('aa.ttf', 50)

"""
2.根据字体创建文字对象
字体对象.render(文字, 是否抗锯齿, 颜色)
"""
text = font.render('哈罗', True, (0, 255, 0))

"""
3.在窗口上渲染文字
"""
screen.blit(text, (100, 100))

# 展示在屏幕上
pygame.display.flip()

while True:
    for event in pygame.event.get():
        # 不同类型的事情,event的type属性不同
        if event.type == pygame.QUIT:
            exit()  # 结束

运行结果可自行检测

5.pygame图片显示

代码示例

import pygame
import random


def rand_color():
    """随机颜色"""
    return random.randint(0, 255),random.randint(0, 255),random.randint(0, 255)


pygame.init()
screen = pygame.display.set_mode((600, 400))
screen.fill((255, 255, 255))

# 画图
"""
1.画线
draw.line(Surface, color, start_pos, end_pos, width=1)
Surface: 窗口,图片,文字对象
color: 线的颜色
start_pos, end_pos: 起点和终点(坐标)
width: 宽度
"""
pygame.draw.line(screen, (0, 0, 0), (50, 50), (100, 100), 5)

"""
draw.lines(Surface, color, closed, pointlist, width=1)
closed: 是否闭合起点和终点
pointlist: 列表,列表中的元素是点对应的元组
"""
points = [(50, 100), (200, 100), (250, 200), (120, 250), (30, 160)]
pygame.draw.lines(screen, (255, 0, 0), True, points, 5)

"""
2.画图
 draw.circle(Surface, color, pos, radius, width=0)
 pos:圆心的位置
 radius:半径
 width=0:默认0(填充)
"""
pygame.draw.circle(screen, rand_color(), (100, 200), 80)

"""
draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1)
Rect:(x, y, w, h):确定钜形的坐标,高度,宽度
start_angle,stop_angle:起始弧度(0->0, 90->pi/2,.....)
"""
from math import pi
screen.fill((255, 255, 255))  # 将之前画的全部覆盖掉
pygame.draw.arc(screen, rand_color(), (100, 100, 200, 100), 0, pi*2, 5)

pygame.display.flip()
while True:
    for event in pygame.event.get():
        # 不同类型的事情,event的type属性不同
        if event.type == pygame.QUIT:
            exit()  # 结束

运行结果可自行检测

6.pygame事件

代码示例

import pygame
import random


def rand_color():
    """随机颜色"""
    return random.randint(0, 255),random.randint(0, 255),random.randint(0, 255)


"""
鼠标事件
MOUSEBUTTONDOWN:鼠标点击事件
MOUSEBUTTONUP:鼠标弹起事件
MOUSEMOTION:鼠标移动事件
event.pos:获取鼠标坐标

键盘事件
KEYDOWN:键盘按下事件
KEYUP:键盘弹起事件
event.key:获取按键的值(得到的是一个编码值)
chr(event.key):将编码值转换成字符
"""
pygame.init()
screen = pygame.display.set_mode((600, 400))
screen.fill((255, 255, 255))
pygame.display.flip()

while True:
    # 只要有事件产生就会进入for循环
    for event in pygame.event.get():
        # 不同类型的事情,event的type属性不同
        # 根据type来判断是什么事件产生的
        if event.type == pygame.QUIT:
            exit()  # 结束

        elif event.type == pygame.MOUSEBUTTONDOWN:
            # 鼠标按下后要做什么事情
            print('鼠标点击事件', event.pos)
            pygame.draw.circle(screen, rand_color(), event.pos, random.randint(10, 40))
            pygame.display.update()  # 更新屏幕

        elif event.type == pygame.MOUSEBUTTONUP:
            print('鼠标弹起事件')

        elif event.type == pygame.MOUSEMOTION:
            print('鼠标移动事件')
            pygame.draw.circle(screen, rand_color(), event.pos, random.randint(10, 40))
            pygame.display.update()  # 更新屏幕

        # =========================鼠标事件=========================
        elif event.type == pygame.KEYDOWN:
            print('键盘按下', event.key, chr(event.key))
        elif event.type == pygame.KEYUP:
            print('键盘弹起')

运行结果可自行检测

推荐阅读更多精彩内容

  • 在 Mac 上配置 Caffe 大概花了半天多的时间,时间主要是花在解决各种奇怪的 error 上面了。在此记录一...
    MoreThanCode阅读 1,163评论 1 1
  • react-navigation实现页面框架 初始化一个RN项目 page.json 引入react-naviga...
    evanywang阅读 3,544评论 2 3
  • 点击查看:全文目录 上一章:(1)突变 三年后。 在本市最大的夜店里,各色人群纵情狂欢,群魔乱舞。夜店一角,一个平...
    跳刀风杖阅读 92评论 0 0
  • 每当《独家记忆》那轻缓悠扬的旋律、优美柔和的歌词飘进我的耳朵时,你可爱的微笑的脸庞、微胖而灵活的身影便浮现...
    不将就_2377阅读 63评论 0 3
  • 多天未曾露面,翻出一张以前的照片表示我还在,只是最近忙碌着,隐身中.... 这张照片的拍摄源于一位朋友帮忙拍摄课程...
    覃格尔阅读 28评论 0 2