10.22 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('键盘弹起')

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,967评论 3 119
  • 【幸福女孩 糖糖 一年级 坚持原创分享第364天 2018.9.8 星期六】 今天是我的生日,中午爷爷、奶...
    何亚珂阅读 289评论 0 0
  • 这是微信上没法发的一张图 我更强壮了嘿嘿嘿嘿嘿
    嘿37度阅读 80评论 0 0
  • 以前有人问曾志伟,你去过这么多的地方觉得哪里最好玩?曾志伟说:“有朋友的地方最好玩。” 一进大学的时候觉得特别迷茫...
    吾三省s阅读 214评论 0 0