day15 面向?qū)ο蟛僮骱蚿ygame

1. 面向?qū)ο?/h2>

1.多繼承.

多繼承:讓一個(gè)類繼承多個(gè)類
對象屬性只能繼承第一個(gè)類的對象屬性,實(shí)際開發(fā)中不用

class Aianmal:
    num = 00000
    def __init__(self,name,age,color):
        self.name = name
        self.age = age
        self.color = color
    def show_info(self):
        print("=====")
        print("名字:%s,年齡:%s,顏色:%s"%(self.name,self.age,self.color))

class Fly:
    info= 00
    def __init__(self,distance = 0,speed = 0):
        self.distance = distance
        self.speed = speed

    @staticmethod
    def show():
        print("會(huì)飛")

class Bird(Aianmal,Fly):
    pass
print(Bird.num,Bird.info)
Bird.show()
bird1 = Bird("lorry",20,"yellow")
print(bird1.age)
bird1.show_info()
bird1.show()

2.多態(tài):封裝,繼承,多態(tài)

類的特點(diǎn):封裝,繼承,多態(tài)

  • a封裝:可以用多條數(shù)據(jù)和多個(gè)功能進(jìn)行封裝
  • b繼承:可以讓一個(gè)類擁有另外一個(gè)類的屬性和方法
  • c多態(tài):有繼承就會(huì)有多態(tài)(一個(gè)事物的多種形態(tài))

3.重載

1.別的語言重載
c++/java聲明函數(shù)的語法

返回值類型 函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2){
            函數(shù)體
            }
int func1{  
}
void func1(int a){
}
void func1(chart a){
}
void func1(int a,int b){
}

上面這四個(gè)函數(shù)是不同的函數(shù)(可以同時(shí)存在)

def func1()
    pass
def func2()
    pass
def func3()
    pass

python中最終只保留最后一個(gè)func1,前面的會(huì)覆蓋
2.運(yùn)算符重載
python中使用運(yùn)算符的時(shí)候,實(shí)質(zhì)是在調(diào)用相應(yīng)的魔法方法(python中每個(gè)運(yùn)算符都對應(yīng)一個(gè)魔法方法)
運(yùn)算符重載:在不同的數(shù)據(jù)類中,實(shí)現(xiàn)同一個(gè)運(yùn)算符對應(yīng)的魔法方法,來讓相應(yīng)的類的對象支持相應(yīng)的運(yùn)算
注意>和<一般只是需要重載一個(gè),另外一個(gè)會(huì)自動(dòng)取反

class Student:
    def __init__(self,name,score,age):
        self.name = name
        self.score = score
        self.age = age
        # 加法云算法的重載
    def __add__(self, other):
        # self + other
        return self.score+other.score
    def __sub__(self, other):
        return self.age - other.age
    def __lt__(self, other):
        return self.score < other.score
    def __gt__(self, other):
        return self.age < other.age
    def __repr__(self):
        return ">"+str(self.__dict__)[1:-1] +"<"
    
stu1 = Student("小花",90,218)
stu2 = Student("小狗",50,22)
stu3 = Student("啊啊啊啊",72,23)
stu4 = Student("mlxg",00,22)
print(stu1+stu2)
print(stu1-stu2)
all_student = [stu1,stu2,stu3,stu4]   #比較大小
all_student2 = [stu1,stu2,stu3,stu4]
print(all_student)
print(all_student2)

4.內(nèi)存管理

1.堆和棧

內(nèi)存區(qū)中分堆區(qū)間和棧區(qū)間:棧區(qū)間的內(nèi)存的開辟和釋放是自動(dòng)的,堆區(qū)間的內(nèi)存是手動(dòng)釋放和開辟。內(nèi)存管理是堆區(qū)間的內(nèi)存

2.數(shù)據(jù)的存儲
  • a.python中所有的數(shù)據(jù)都是對象,都是保存在堆中的
  • b.python中所有的變量存儲的都是存儲堆中的數(shù)據(jù)的地址,存了對象的地址的變量又叫對象引用
  • c.默認(rèn)情況下,創(chuàng)建對象就會(huì)在堆中去開辟空間存儲數(shù)據(jù),并且將地址返回,如果對象是數(shù)字,字符串,不會(huì)直接開辟空間會(huì)做緩存,每次使用的時(shí)候,會(huì)先去緩存區(qū)中看,之前有沒有存儲過,如果有就直接返回之前存儲的地址,如果沒有才會(huì)開辟新的空間存儲數(shù)據(jù)。
3.數(shù)據(jù)的銷毀

python通過垃圾回收機(jī)制來管理內(nèi)存的釋放,java,c++等語言也是使用的垃圾回收機(jī)制
原理:看一個(gè)對象是否銷毀,就看這個(gè)對象的引用計(jì)數(shù)是否為0,為0就銷毀,不為0就不銷毀。
引用計(jì)數(shù):對象引用的引用個(gè)數(shù)(幾個(gè)變量在村)
導(dǎo)入模塊:from sys impot getrefcount
注意:垃圾回收其實(shí)就是回收引用計(jì)數(shù)為0的對象,但是系統(tǒng)不會(huì)時(shí)時(shí)刻刻的檢測對象的引用計(jì)數(shù)是否為0,而是每隔一段時(shí)間檢測一次,如果檢測到垃圾就回收

from sys import getrefcount
# 1.增加引用計(jì)數(shù):使用變量存對象的地址
list1 = [1]  #對象[1]引用計(jì)數(shù)是1.
print(getrefcount(list1))
list2 = list1  #對象[1]引用計(jì)數(shù)是2
print(getrefcount(list1))
list3= [list1,100] #對象[1]引用計(jì)數(shù)是3
print(getrefcount(list1))
# 2.減少引用計(jì)數(shù):
"""
a.刪除引用
b.讓當(dāng)前對象的引用成為別的對象引用
"""
del list3[0]
print(getrefcount(list1))
list2 = 100
print(getrefcount(list1))
print(getrefcount(100))

2.pygame

1.pygame最小系統(tǒng)

import pygame
# 1.游戲初始化
pygame.init()

# 2.創(chuàng)建游戲窗口
"""
set_model(窗口的大?。?- 值是元組 (分別是寬度和高度的)
寬度和高度的單位是像素(px)
"""
window = pygame.display.set_mode((400,600))
#將窗口填充成顏色fill(顏色)
window.fill((255,199,206))
pygame.display.flip()  #將窗口展示到屏幕上
"""
計(jì)算機(jī)的三原色:紅綠藍(lán)(rgb)(r,g,b)
顏色值就是三個(gè)數(shù)字組成(0-255)
python中的顏色是一個(gè)元組,元組中是有三個(gè)顏色,分別是r,g,b
白色:(255,255,255)
黑色:(0,0,0)
紅色  (255,0,0)
綠色  (0,255,0)
"""
# 3.創(chuàng)建循環(huán)
while True:
    #4.不斷的檢測事件的發(fā)生
    for event in pygame.event.get():
        #區(qū)分不同的事件,做出不一樣的反應(yīng)
        #判斷關(guān)閉按鈕是否被關(guān)機(jī)
        if event.type == pygame.QUIT:
            exit()

2.pygame圖片操作

操作方法:
1.pygame.image.load("1407836432.jpg")
2.inmage_obj.get_size() 獲取圖片像素
3.pygame.transform.scale(inmage_obj,(200,350)) 調(diào)整圖片大小
4.pygame.transform.rotozoom(inmage_obj,180,1.1)
a.縮放
pygame.transform.scale(圖片對象,大小) - 將指定的圖片縮放到指定的大小
返回新的圖片對象
b.pygame.transform.rotozoom(圖片對象,旋轉(zhuǎn)角度,縮放比例)

import pygame
pygame.init()
window = pygame.display.set_mode((600,900))
window.fill((255,199,206))

#顯示圖片
#1.加載圖片
inmage_obj = pygame.image.load("1407836432.jpg")
inmage_obj2 = pygame.image.load("1470198196.jpg")
# 打開指定位置的圖片

#2.渲染圖片
"""
blit(渲染對象,位置)
渲染對象 - 圖片對象(顯示什么)
"""
#3.獲取圖片代銷
"""
圖片對象。get_size - 獲取圖片大小
"""
image_w,image_h = inmage_obj.get_size()
inmage_obj = pygame.transform.rotozoom(inmage_obj,180,1.1)
window.blit(inmage_obj,((400-image_w)/2,(600-image_h)/2))
inmage_obj = pygame.transform.scale(inmage_obj,(200,350))
window.blit(inmage_obj,(100,200))

#4.圖片縮放
"""
a.縮放
pygame.transform.scale(圖片對象,大小) - 將指定的圖片縮放到指定的大小
返回新的圖片對象
b.pygame.transform.rotozoom(圖片對象,旋轉(zhuǎn)角度,縮放比例)
"""
pygame.display.flip()
while True:
    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

3.圖形顯示

幾種形狀的畫法:
1.直線:line(畫在哪兒,線的顏色,起點(diǎn),終點(diǎn),線寬)
pygame.draw.line(window,Color.red,(0,0),(200,200),10)
2.線段:lines(畫在哪兒,線的顏色,是否閉合,點(diǎn)列表,線寬)
point = [(200,300),(150,350),(125,400),(150,450),(190,500)]
pygame.draw.lines(window,Color.black,False,point,20)
依次鏈接點(diǎn)列表中所有的點(diǎn)(是否閉合決定是否連接起點(diǎn)和終點(diǎn))
3.圓:circle(畫在哪兒,顏色,圓心坐標(biāo),半徑,)
注意:線寬為0的時(shí)候畫實(shí)心圓
pygame.draw.circle(window,Color.white,(150,200),80,3)
4.畫弧線:arc(畫在哪兒,顏色,矩形,起始弧度,終止弧度,線寬 = 1)
pygame.draw.arc(window,Color.blue,(150,300,200,350),0,math.pi,10)
矩形 - (x,y,width,heigth)x,y是矩形左上角的坐標(biāo),width,heigth是矩形的長寬
5.橢圓:ellipse(畫在哪兒, 顏色,矩形, width=0)
pygame.draw.ellipse(window,Color.red,(10,250,200,350),10)
矩形 - (x,y,width,heigth)x,y是矩形左上角的坐標(biāo),width,heigth是矩形的長寬

# author_lorry   
# date: 2018/11/23
import pygame
import math
from color import Color
window = pygame.display.set_mode((500,600))
window.fill((255,199,206))
pygame.draw.line(window,Color.red,(0,0),(200,200),10)
point = [(200,300),(150,350),(125,400),(150,450),(190,500)]
pygame.draw.lines(window,Color.black,False,point,20)
pygame.draw.circle(window,Color.white,(150,200),80,3)
pygame.draw.circle(window,Color.red,(250,200),80,3)
pygame.draw.circle(window,Color.green,(350,200),80,3)
pygame.draw.circle(window,Color.white,(200,300),80,3)
pygame.draw.circle(window,Color.white,(300,300),80,3)
pygame.draw.arc(window,Color.blue,(150,300,200,350),0,math.pi,10)
pygame.draw.ellipse(window,Color.red,(10,250,200,350),10)
pygame.display.flip()
while True:
    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

4.顯示文字

a.系統(tǒng)字體pygame.font.SysFont(字體名,字體大小,是否加粗 =False,是否傾斜 = False)``font = pygame.font.SysFont("Times",90)添加文字:font.render(文字內(nèi)容,是否平滑,文字顏色)將文字渲染到窗口上window.blit(text,(300,300))```

b.自定義字體pygame.font.Font(字體文件路徑,字體大小)
font1 = pygame.font.Font("aa.ttf",90)
text1 = font1.render("我愛?你,親愛的菇?jīng)?,True,(255,0,0))
將文字渲染到窗口上
window.blit(text1,(200,400))

import pygame
pygame.init()
window = pygame.display.set_mode((1400,750))
window.fill((255,199,206))
font = pygame.font.SysFont("Times",90)
font1 = pygame.font.Font("aa.ttf",90)
text = font.render("L'O'V U",True,(255,0,0))
window.blit(text,(300,300))
text1 = font1.render("我愛?你,親愛的菇?jīng)?,True,(255,0,0))
window.blit(text1,(200,400))
pygame.display.flip()
while True:
    for event in  pygame.event.get():
        if event.type == pygame.QUIT:
            exit()

5.游戲事件

不同的type值對應(yīng)不同類型的事件
QUIT - 關(guān)閉按鈕被點(diǎn)擊
a.鼠標(biāo)相關(guān)事件
MOUSEMOTION - (鼠標(biāo)移動(dòng))
MOUSEBUTTONUP 鼠標(biāo)彈起
MOUSEBUTTONDOWN - 鼠標(biāo)按下
"鼠標(biāo)彈起",event.pos
b.鍵盤事件 - 按得是哪個(gè)鍵
KEYDOWN 鍵盤按下
KEYUP 鍵盤彈起
event.key - 被按得鍵對應(yīng)的字符的編碼值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 多繼承多繼承:讓一個(gè)類同時(shí)繼承多個(gè)類注意:實(shí)際開發(fā)的時(shí)候。一般不使用多繼承 多態(tài)類的特點(diǎn):封裝、繼承、多態(tài) 封裝:...
    2ez4ddf閱讀 338評論 0 0
  • 回顧 1.靜態(tài)方法和類方法、對象方法 對象方法: a.直接聲明在類中 b.自帶的self參數(shù)c.對象來調(diào)用d.實(shí)現(xiàn)...
    龍神海王閱讀 372評論 0 0
  • 02-類的繼承 python中類支持繼承,并且支持多繼承 1.什么是繼承 父類(超類):被繼承的類子類:去繼承父類...
    兲丅閱讀 254評論 0 0
  • 1.類的繼承 python中支持類的繼承,并且支持多繼承1.什么是繼承父類(超類):被繼承的類子類:去繼承父類的類...
    _墨宇_閱讀 294評論 0 0
  • “安安?!币粋€(gè)熟悉卻又陌生的聲音在我耳邊響起。我轉(zhuǎn)過頭去,看到了一個(gè)年齡與我相仿的男生。我覺得他有點(diǎn)熟悉,仔細(xì)一看...
    夏櫻晴閱讀 265評論 0 2

友情鏈接更多精彩內(nèi)容