封装
先安装一个pygame的包
做一个赛猫游戏
主程序
import pygame
import time
pygame.init()
screen=pygame.display.set_mode((800,600))
#建立一个游戏窗口
img_bg=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\bg.png')
img_cat=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png')
#读入背景和猫的图片
screen.blit(img_bg,(0,0))
#确定画的图和画的坐标
pygame.display.update()
#全部画好了再刷新,而不能每画一个就刷新
i=0
while i<800:
screen.blit(img_bg,(0,0))
#重新画背景,这样才能显示出猫的变化,不然猫前一时刻的状态还是在图上
screen.blit(img_cat,(i,200))
pygame.display.update()
i+=100
time.sleep(0.5)
pygame.time.delay(200)
#自带的延时功能
pygame.quit()
类程序
import random
import pygame
class cat:
def __init__(self,n,s,img_file,y):
self.name=n
self.speed=s
self.__image=py.game.image.load(img_file)
def run(self,scr):
self.__x+=round(self.speed*random.random())
迭代了下一个版本
主函数
import pygame
import time
from cat_class import cat
pygame.init()
screen=pygame.display.set_mode((800,600))
#建立一个游戏窗口
img_bg=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\bg.png')
#读入背景和猫的图片
c_list=[cat('锦到黑',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png',200),
cat('我很帅',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_green.png',300),
cat('黑得很', 5, r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_purple.png', 400)]
#把各个对象建立成一个列表
while True:
screen.blit(img_bg,(0,0))
#重新画背景,这样才能显示出猫的变化,不然猫前一时刻的状态还是在图上
# 确定画的图和画的坐标
for c in c_list:
screen.blit(c.get_image(), c.get_loc())
c.run()
pygame.display.update()
pygame.time.delay(200)
#自带的延时功能
pygame.quit()
类函数
import random
import pygame
class cat:
def __init__(self,n,s,img_file,y):
self.name=n
self.speed=s
self.__image=pygame.image.load(img_file)
self.__y=y
self.__x=0
def run(self):
self.__x+=round(self.speed*random.random())
def get_image(self):
return self.__image
def get_loc(self):
return(self.__x,self.__y)
多态
主程序
import pygame
import time
from cat_class import cat
from dancer_class import dancer
pygame.init()
screen=pygame.display.set_mode((800,600))
#建立一个游戏窗口
img_bg=pygame.image.load(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\bg.png')
#读入背景和猫的图片
c_list=[cat('锦到黑',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png',200),
cat('我很帅',5,r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_green.png',300),
cat('黑得很', 5, r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_purple.png', 400),
dancer(r'E:\拷贝过来的文件\全民一起玩Python\MyProject\Test2\提高篇第三十六课\python02_36_01\pygame\cat_blue.png',200,500)]
#dancer也放入这个列表,扫描的时候能够扫描出来
while True:
screen.blit(img_bg,(0,0))
#重新画背景,这样才能显示出猫的变化,不然猫前一时刻的状态还是在图上
# 确定画的图和画的坐标
for c in c_list:
screen.blit(c.get_image(), c.get_loc())
c.run()
#两类对象,但是拥有相同的方法,就可以一起调用
#只看能力不看出身,代码复用率高
#python中讨论多态,不需要父类和子类的继承关系
pygame.display.update()
pygame.time.delay(50)
#自带的延时功能
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
类程序
import random
import pygame
class dancer:
def __init__(self, img_file, x,y):
self.__image = pygame.image.load(img_file)
self.__y = y
self.__x = x
def run(self):
self.__y+=random.randint(-10,10)
#上下摆动
def get_image(self):
return self.__image
def get_loc(self):
return (self.__x, self.__y)
import random
import pygame
class cat:
def __init__(self,n,s,img_file,y):
self.name=n
self.speed=s
self.__image=pygame.image.load(img_file)
self.__y=y
self.__x=0
def run(self):
self.__x+=round(self.speed*random.random())
def get_image(self):
return self.__image
def get_loc(self):
return(self.__x,self.__y)
题目:多态基本练习
在国际学校中同一个班级中拥有不同国籍的学生,请你分别定义中国人类Chinese、英国人类English和日本人类Japanese。
每个学生类都有一个speak方法进行发言,当中国人发言时,打印“我是中国同学,使用中文发言”,其他学生也是类似的。
定义一个函数 ask ,该函数接收一个对象作为参数,并调用该对象的 speak 方法让其发言。然后在主程序中,先创建若干个不同国籍学生的对象,再反复调用函数ask,每次传递给它一个不同的学生对象,观察结果。
主程序
from 学生类 import Chinese
from 学生类 import Japanese
from 学生类 import English
def ask(stu):
stu.speak()
if __name__=='__main__':
stu1=Chinese()
stu2=Japanese()
stu3=English()
ask(stu1)
ask(stu2)
ask(stu3)
学生类
class Chinese:
def speak(self):
print('我是中国同学,我用中文发言')
class Japanese:
def speak(self):
print('我是日本同学,但我用中文发言')
class English:
def speak(self):
print('I am English student, so I speak in English')
定义圆形,长方形和正方形三个类,圆类在init时会自动添加一个属性 r,代表半径;长方形会添加 a 和 b 两个属性,代表其长和宽;正方形会添加一个属性 a,代表其边长。
然后给每个类都编写两个用于计算自己周长和面积的方法 get_perimeter 和 get_area。
接下来定义一个函数tools,只要传给他一个图形对象(即圆、长方形、或正方形),它就可以调用该对象的方法,计算并输出对应的周长和面积。
请在主程序中创建若干个这些图形类的对象,然后分别把它们交给函数 tools,观测结果。
主程序
from 几何图形类 import circle
from 几何图形类 import square
from 几何图形类 import rectangle
def tools(shape):
print(type(shape),'周长是:',round(shape.get_perimeter()))
print(type(shape),'面积是:',round(shape.get_area()))
if __name__=='__main__':
s1=circle(5)
s2=square(3)
s3=rectangle(4,3)
tools(s1)
tools(s2)
tools(s3)
类定义
class circle:
def __init__(self,radius):
self.__r=radius
def get_perimeter(self):
return 3.14*self.__r*2
def get_area(self):
return 3.14 * self.__r*self.__r
class square:
def __init__(self,length):
self.__a=length
def get_perimeter(self):
return 4*self.__a
def get_area(self):
return self.__a^2
class rectangle:
def __init__(self,length,width):
self.__a=length
self.__b=width
def get_perimeter(self):
return 2*(self.__a+self.__b)
def get_area(self):
return self.__a*self.__b
某代工厂生产两种电脑。笔记本电脑的信息有:品牌、cpu、内存大小、硬盘大小等;台式机电脑的信息有:品牌、cpu、内存大小、硬盘大小、耗电功率等。
要求:请定义两个类,分别代表笔记本和台式机两种电脑,并包含其各自的全部信息。接下来在主程序中创建3台笔记本电脑和2台台式机电脑,然后放入一个列表中,并使用一个循环即可打印所有电脑的信息。请使用鸭子模型的思想实现该任务。
主程序
from 电脑类定义 import laptop
from 电脑类定义 import computer
computers=[laptop('联想','IBM','32G','2048G'),
laptop('华硕','Intel','16G','2048G'),
laptop('戴尔','Intel','8G','1024G'),
computer('外星人','IBM','32G','2048G','100KW'),
computer('外星人','IBM','64G','2048G','100KW')]
#存放信息
for c in computers:
c.print_info()
类定义
class laptop():
def __init__(self,brand,cpu,memory,disk):
self.__b=brand
self.__c=cpu
self.__m=memory
self.__d=disk
def print_info(self):
print(self.__b,self.__c,self.__m,self.__d)
class computer():
def __init__(self,brand,cpu,memory,disk,power):
self.__b=brand
self.__c=cpu
self.__m=memory
self.__d=disk
self.__p=power
def print_info(self):
print(self.__b,self.__c,self.__m,self.__d,self.__p)
简单游戏
游戏中的玩家类的属性有:血量、攻击力、防御力;敌人类的属性有:血量、攻击力、防御力。
玩家和敌人都有攻击方法attack和防御方法defense。
当玩家攻击时显示玩家的攻击力信息,当敌人攻击时显示敌人的攻击力信息。
当玩家防御时显示玩家的防御力信息, 当敌人防御时显示敌人的防御力信息。
使用Game类的play方法控制玩家攻击,敌人进行防御。
玩家攻击1次,另外两个敌人分别防御1次,总共三轮攻击。
主程序
from 游戏对象 import player
from 游戏对象 import enemy
from 游戏对象 import game
obj_list = [ player(1000, 500, 300),
enemy(800, 300, 200),
enemy(800, 300, 200)]
game = game()
for i in range(3):
#执行三次
game.attack(obj_list[0])
game.defend(obj_list[1])
game.defend(obj_list[2])
类定义
class player:
def __init__(self,blood,attack,defend):
self.__b=blood
self.__a=attack
self.__d=defend
def attack(self):
print(self.__a)
def defense(self):
print(self.__d)
class enemy:
def __init__(self,blood,attack,defend):
self.__b=blood
self.__a=attack
self.__d=defend
def attack(self):
print(self.__a)
def defense(self):
print(self.__d)
class game:
def attack(self,obj):
obj.attack()
def defend(self, obj):
obj.defense()
创建狮子类和羊类,狮子拥有eat和run方法,分别打印吃喝跑的信息;羊拥有eat和play方法,分别打印吃喝玩的信息。
创建饲养员类,饲养员可以给狮子和羊喂食,判断传入对象的类型,执行跑或者玩的行为。
主程序
from animal_class import Monkey
from animal_class import Lion
from animal_class import Feeder
feeder=Feeder()
animals=[Monkey(),Monkey(),Lion(),Monkey()]
#for a in animals:
# b=type(a)
# print(type(a))
#判断好数据类型
for a in animals:
feeder.Feed(a)
类定义
class Lion():
def Eat(self):
print('狮子吃东西')
def Run(self):
print('狮子跑')
class Monkey():
def Eat(self):
print('猴子吃东西')
def Play(self):
print('猴子玩')
class Feeder():
def Feed(self,animal):
animal.Eat()
if type(animal) is Lion:
#判断类型用is
animal.Run()
elif type(animal) is Monkey:
animal.Play()