Pygame简单入门学习笔记

Posted 轩Scott

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pygame简单入门学习笔记相关的知识,希望对你有一定的参考价值。

首先先放出我的第一个使用Pygame写的程序“菜虚鲲大战蔡徐坤”。 

import random
import pygame
import sys
import time
pygame.init()#初始化
#主窗口
screen_image = pygame.display.set_mode((800,600))#设置分辨率
screen_rect = screen_image.get_rect()

#标题栏
pygame.display.set_caption('人工智能2x0xXXX2021xxxxxx')#设置文件名

#飞船
ship_image = pygame.image.load('image/cai1.bmp')
ship_rect = ship_image.get_rect()
ship_rect.center = screen_rect.center#居中对齐

#子弹1
bullet_rect = pygame.Rect(0,0,3,15)
bullet_rect.midbottom = ship_rect.midtop
bullet_rect.x=0
bullet_rect.y=0

#散弹枪
grape_rect = pygame.Rect(0,0,3,15)
grape_rect.midbottom=ship_rect.midtop
grape_rect.x=bullet_rect.x+5
grape_rect.x=0
grape_rect.y=0

#怪物

monster_image = pygame.image.load('image/cai2.bmp')
monster_rect = ship_image.get_rect()
monster_rect.x = 360

#文字
txt_font = pygame.font.SysFont(None,48)
txt_image = txt_font.render('caixukun',True,(60,60,60),(255,0,0))
txt_rect = txt_image.get_rect()


while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            sys.exit()
        elif event.type==pygame.KEYDOWN:
            if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                ship_rect.x-=20
            if event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                ship_rect.x+=20
            if event.key == pygame.K_UP or event.key == pygame.K_w:
                ship_rect.y-=20
            if event.key == pygame.K_DOWN or event.key == pygame.K_s:
                ship_rect.y+=20
            if event.key == pygame.K_j:
                bullet_rect.midbottom = ship_rect.midtop
            if event.key == pygame.K_k:
                #bullet_rect.midbottom = ship_rect.midtop
                grape_rect.midbottom = ship_rect.midtop
                grape_rect.x+=10

    # if monster_rect.x == bullet_rect.x or monster_rect.y == bullet_rect.y:
    #     monster_rect.y = 0
    #     monster_rect.x +=10
    #     pass
    # if monster_rect.y-bullet_rect.y<=10:
    #     if bullet_rect.x <= monster_rect.x:
    #         monster_rect.x+=1
    #         pass
    #     elif bullet_rect.x > monster_rect.x:
    #         monster_rect.x-=1
    #     pass
    if abs(monster_rect.x-bullet_rect.x)<=100 and abs(monster_rect.y-bullet_rect.y)<=100:
        bullet_rect.y = 0
        monster_rect.y=0
        monster_rect.x = random.randint(0,600)
        pass

    monster_rect.y+=1
    bullet_rect.y-=20
    grape_rect.y-=1
    time.sleep(0.05)
    #绘制图像
    screen_image.fill((0,128,128))#设置背景颜色
    screen_image.blit(ship_image,ship_rect)#设置飞船
    screen_image.blit(monster_image,monster_rect)
    pygame.draw.rect(screen_image,(60,60,60),bullet_rect)
    pygame.draw.rect(screen_image,(80,80,80),grape_rect)
    screen_image.blit(txt_image,txt_rect)
    pygame.display.flip()#刷新

我在学习python的时候,学习的方向以及顺序都跟去年学习C++差不多,大致就是先从输入输出开始,然后是基本的语句,字典、列表、元组等等,然后是文件输入输出以及类与对象、继承多态等等。

这其中有很多知识我都是早早学完了,python我在去年就把基础的知识学的差不多了,Scott自学python——字符串学习笔记_轩Scott的博客-CSDN博客

Scott自学python——字典学习笔记_轩Scott的博客-CSDN博客

Scott自学python——元组学习笔记_轩Scott的博客-CSDN博客

Scott自学python——列表学习笔记_轩Scott的博客-CSDN博客

这些都是我以前学习python的博客笔记。

暑假期间我主要是学习了pygame和python的文件输入输出以及类与对象、继承多态等等,以下是我在练习中写的核酸检测登记系统

import datetime
import csv
class Nuclear_Test():#核酸检测结果
    def __init__(self,id):
        self.time = datetime.datetime.now()
        self.result = False
        self.id = id
        pass

    def Output(self):
        print('Nuclear test time is',self.time,',result=',self.result)
    pass

class Person():#核酸检测人员信息
    def __init__(self,name,id):
        self.name = name#名
        self.id = id#身份证号
        self.Nuclear = []#
        self.Nuclear_Number = 0#次数
        pass
    def Add_Nuclear_Test(self,result = False):#
        index = Nuclear_Test(self.id)
        index.result=result
        self.Nuclear.append(index)
        self.Nuclear_Number+=1
        pass

    def Output(self):
        print('Chinaman name',self.name.title(),'Chinaman id',self.id)
        for i in range(self.Nuclear_Number):
            self.Nuclear[i].Output()
            pass
        pass
    pass
class System():
    def __init__(self):
        print('Initializing the system.')
        self.Person_Data = []
        self.number=int(0)
        pass
    def Add_Data(self,data):
        self.Person_Data.append(data)
        self.number+=1
        pass
    def Find_Data(self,id):
        index = False
        for i in range(self.number):
            if self.Person_Data[i].id == id:
                print('Found the monster data.',end=' ')
                self.Person_Data[i].Output()
                index = True
                pass
            pass
        if index == False:
            print('The Chinaman data was not found.')
        pass
    def Be_Infected(self,id):#强制阳性
        for i in range(self.number):
            if self.Person_Data[i].id == id:
                self.Person_Data[i].Add_Nuclear_Test(True)
                pass
            pass
        pass
    def Do_Nuclear_Test(self,id):#默认阴性
        for i in range(self.number):
            if self.Person_Data[i].id == id:
                self.Person_Data[i].Add_Nuclear_Test()
                pass
            pass
        pass

    def Load_Data(self):
        with open("Person_Data.csv", mode='r', encoding='utf-8-sig', newline='') as f:
            reader = csv.reader(f)
            for i,j in enumerate(reader):
                index = Person(j[0],j[1])
                index.Nuclear_Number = j[2]
                self.Add_Data(index)
                pass
            pass
        # with open("Nuclear_Test.csv", mode='r', encoding='utf-8-sig', newline='') as f:
        #     reader = csv.reader(f)
        #     for i,j in enumerate(reader):
        #         print(j[0],j[1],j[2])
        pass
    def Save_Data(self):
        Person_Data_Index = []
        for i in range(self.number):
            index = [self.Person_Data[i].name, self.Person_Data[i].id, self.Person_Data[i].Nuclear_Number]
            Person_Data_Index.append(index)
            pass
        with open("Person_Data.csv", mode='w', encoding='utf-8-sig', newline='') as f:
            f.truncate()
            writer = csv.writer(f)
            writer.writerows(Person_Data_Index)
            pass
        # Nuclear_Test_Index = []
        # for i in range(self.number):
        #     for j in range(int(self.Person_Data[i].Nuclear_Number)):
        #         # index = [self.Person_Data[i].Nuclear[j].id,self.Person_Data[i].Nuclear[j].time,self.Person_Data[i].Nuclear[j].result]
        #         print(self.Person_Data[i].Nuclear[j].id)
        #         # Nuclear_Test_Index.append(index)
        #         pass
        # with open("Nuclear_Test.csv", mode='w', encoding='utf-8-sig', newline='')as f:
        #     f.truncate()
        #     writer = csv.writer(f)
        #     writer.writerows(Nuclear_Test_Index)
        #     pass
        # pass
    def Output(self):
        for i in range(self.number):
            self.Person_Data[i].Output()
            pass
        pass
    def __del__(self):
        print('The system is shut down.')

    pass
People1 = Person('Hu',114514)
People2 = Person('Xi',114515)
A = System()
A.Load_Data()
A.Add_Data(People1)#增
A.Add_Data(People2)#增
A.Be_Infected(114514)#改
A.Do_Nuclear_Test(114514)#查
A.Be_Infected(114515)
A.Do_Nuclear_Test(114515)
A.Find_Data(114514)#查
A.Find_Data(114516)#查
#A.Save_Data()

 知识不用罗列,全部呈现在代码中了。

现在我们有一组从2006年到2016年1000部最流行的电影数据,
数据来源:https://www.kaggle.com/damianpanek/sunday-eda/data
(数据是本文件下的 IMDB-Movie-Data)
·问题1:我们想知道这些电影数据中评分的平均分,导演的人数等信息,我们应该怎么获
取?
·问题2∶对于这一组电影数据,如果我们想rating,runtime的分布情况,应该如何呈现数
据?
·问题3∶对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?

 问题1

import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

imdb = pd.DataFrame(pd.read_csv('IMDB-Movie-Data.csv'))
rating = imdb['Rating'].values
print('电影数据中评分的平均分 ' , rating.mean())

dir=imdb['Director'].values
director = list(set(dir))
print('导演的人数 ',len(director))

问题2

import IMDB
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

r1=r2=r3=r4=r5=r6=r7=r8=r9=int(0)
for i in range(IMDB.rating.size):
    if IMDB.rating[i] >= 1 and IMDB.rating[i] < 2:
        r1 = r1 + 1
    elif IMDB.rating[i] >= 2 and IMDB.rating[i] < 3:
        r2 = r2 + 1
    elif IMDB.rating[i] >= 3 and IMDB.rating[i] < 4:
        r3 = r3 + 1
    elif IMDB.rating[i] >= 4 and IMDB.rating[i] < 5:
        r4 = r4 + 1
    elif IMDB.rating[i] >= 5 and IMDB.rating[i] < 6:
        r5 = r5 + 1
    elif IMDB.rating[i] >= 6 and IMDB.rating[i] < 7:
        r6 = r6 + 1
    elif IMDB.rating[i] >= 7 and IMDB.rating[i] < 8:
        r7 = r7 + 1
    elif IMDB.rating[i] >= 8 and IMDB.rating[i] < 9:
        r8 = r8 + 1
    elif IMDB.rating[i] >= 9 and IMDB.rating[i] < 10:
        r9 = r9 + 1

rat = list(range(1,10))
rating_distribution = [r1,r2,r3,r4,r5,r6,r7,r8,r9]
plt.xlabel('分数',fontproperties='simhei')
plt.ylabel('Rating_Number')
plt.title('rating分布情况',fontproperties='simhei',fontsize=14)
plt.xticks(rat)
plt.bar(rat,rating_distribution)
plt.show()

import IMDB
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm

Runtime = IMDB.imdb['Runtime (Minutes)'].values
runtime = 
for i in range(Runtime.min(),Runtime.max()+1):
    runtime[i]=0
    pass
for i in range(Runtime.size):
    runtime[Runtime[i]]+=1
    pass
plt.xlabel('Runtime (Minutes)',fontproperties='simhei')
plt.ylabel('Runtime_Number')
plt.title('Runtime分布情况',fontproperties='simhei',fontsize=14)
plt.bar(runtime.keys(),runtime.values())
plt.show()

 

 

 

 

Python可视化物理随机过程---pygame学习笔记2

Python可视化物理随机过程—pygame学习笔记2

一、扩散现象的简单的介绍

在物理中有很多的随机过程,我们可以利用pygame中不错的可视化方法来进行物理随机过程的展示。

在此处,我们展示一下,物理之中的热学里面的扩算现象的可视化呈现。

所谓的热学里面的扩散现象就是说:原本分子或者原子在某一个封闭体系内部,但是,一旦打开这个封闭体系,那么分子或者原子就是会向外部进行扩散,而且,可以说根本不可能返回到最初的状态了。
第一个随机现象:
液体中的扩散:
在这里插入图片描述

第二个随机现象:
粒子的随机运动过程:
在这里插入图片描述

以上这个图片是最常见的液体内部的扩散的例子了。

当然,我们在此处所写的是小球的扩散代码了啦。

二、代码实现

此处给出代码以及代码的详细注释解说:

import pygame
# 导入游戏库

import pygame.locals
# 导入游戏库中的所有常量

import sys
# 导入系统交互模式的库

import time
# 导入时间的模块

import random
# 导入随机模块

import math
# 导入数学库模块

color_of_ball = 138, 43, 226
# 设置球的颜色

color_of_screen = 72, 209, 204
# 设置屏幕的颜色

color_of_rect = 25, 25, 112
# 设置矩形框框的颜色

RADIUS = 10
# 设置半径

N = 100
# 设置球的个数


if __name__ == '__main__':

    t1 = time.time()
    # 记录一下开始的时间

    pygame.init()
    # 初始化

    screen = pygame.display.set_mode((1000, 800))
    # 屏幕

    pygame.display.set_caption("Knocking Balls")
    # 设置名称

    vx_list = []
    vy_list = []
    # 设置速度的列表来存储不同的球的速度,分别存储 x 方向以及 y 方向

    for i in range(N):
        # 生成速度
        vx_list.append(random.random() * 2 * (- 1) ** random.randint(1, 2))
        vy_list.append(random.random() * 2 * (- 1) ** random.randint(1, 2))

    x_list = []
    y_list = []
    # 存储坐标

    for i in range(N):
        # 生成坐标
        x_list.append(random.randint(400, 600))
        y_list.append(random.randint(300, 500))

    while True:
        for event in pygame.event.get():
            # 设置结束的条件为:按下一个关闭的按钮

            if event.type == pygame.locals.QUIT:
                sys.exit()

        screen.fill(color_of_screen)
        # 设置屏幕的颜色
        for i in range(N):
            t2 = time.time()
            dt = t2 - t1
            if dt > 10:
                # 如果大于了十秒,那么我们就去掉框框,使得小球可以随机的运动,从而会使得小球扩散出去
                for j in range(N):
                    if j != i:
                        # 自己不能和自己进行碰撞
                        # 考虑到会发生碰撞
                        if math.sqrt((x_list[i] - x_list[j]) ** 2 + (y_list[i] - y_list[j]) ** 2) <= RADIUS * 2:
                            # 如果会发生碰撞那么就重新随机的设置速度
                            vx_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                            vx_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                            vy_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                            vy_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                # 不能从边界出去了呦
                if x_list[i] <= RADIUS or x_list[i] >= 1000 - RADIUS:
                    # 如果到了边界,那么就使得相应的方向上的速度反向
                    vx_list[i] = - vx_list[i]
                if y_list[i] <= RADIUS or y_list[i] >= 800 - RADIUS:
                    # 如果到了边界,那么就使得相应的方向上的速度反向
                    vy_list[i] = - vy_list[i]
            else:
                # 在十秒以内的话,我们就使得框框呈现出来,小球不可以出框框
                for j in range(N):
                    if j != i:
                        # 自己不能和自己进行碰撞
                        # 考虑到会发生碰撞
                        if math.sqrt((x_list[i] - x_list[j]) ** 2 + (y_list[i] - y_list[j]) ** 2) <= RADIUS * 2:
                            # 如果会发生碰撞那么就重新随机的设置速度
                            vx_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                            vx_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                            vy_list[i] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                            vy_list[j] = random.random() * 2 * (- 1) ** random.randint(1, 2)
                # 不能从边界出去了呦
                if x_list[i] < RADIUS + 390 or x_list[i] > 610 - RADIUS:
                    # 如果到了边界,那么就使得相应的方向上的速度反向
                    vx_list[i] = - vx_list[i]
                if y_list[i] < RADIUS + 290 or y_list[i] > 510 - RADIUS:
                    # 如果到了边界,那么就使得相应的方向上的速度反向
                    vy_list[i] = - vy_list[i]
                    
                    
                # 绘制一个矩形来框住所有的球,这些球不能抛出框框到框框的外面去
                
                pygame.draw.rect(screen, color_of_rect, (380, 280, 240, 240), width=3)
            
            # 进行移动小球的位置
            x_list[i] += vx_list[i]
            y_list[i] += vy_list[i]
            
            # 绘制小球的位置以及大小颜色等信息
            pygame.draw.circle(screen, color_of_ball, (x_list[i], y_list[i]), RADIUS, width=5)
        
        time.sleep(0.001)
        # 睡眠 0.001 秒钟的时间
        
        pygame.display.update()
        # 更新画面

在这里面,所运用到方法全部都在我的另外一篇博文中有详细地介绍,如果不太清楚可以参考下方链接:
https://blog.csdn.net/m0_54218263/article/details/116898636?spm=1001.2014.3001.5502
里面有对于Pygame入门的简单操作以及一些方法的简单介绍。

三、运行代码的效果展示

这里我的代码实现的是:小球在不断的运动,同时彼此之间会发生一些碰撞以及其他的一些相互作用,这是一个动态的效果,但是,由于目前这里不方便发一个视频,所以,我才用不同的阶段使用不同的图片来表示出来了啦。

图片1、
初始的状态:
在这里插入图片描述

图片2、
框框存在时的装态:
在这里插入图片描述
图片3、
去掉框框以后不久的装态:
在这里插入图片描述

图片4、
在这里插入图片描述
图片5、
较长时间以后的状态:
在这里插入图片描述
图片6、
较长时间以后的状态:
在这里插入图片描述
图片7、
较长时间以后的状态:
在这里插入图片描述

四、总结

综上所述,我们使用Python代码实现了随机扩散现象的可视化处理,我们使用了Pygame这个模块使得扩散过程清晰的呈现了出来。

而且,我们也可以看到在去掉框框以后,小球都会向别的方向随机的扩散,最后的结果是小球几乎会均匀的分布在整个屏幕之上,而且不会回归到最开始的状态的,这是由于熵增原理导致的结果,系统会趋向于无序而不是有序,所以会几乎均匀的分布于屏幕之内。

总之,感谢大家的阅读以及支持了啦。

谢谢大家提出建议或者意见,敬请期待各位大佬的指正。

后续还会继续推出Pygame的学习笔记,希望大家敬请期待。

以上是关于Pygame简单入门学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Python之Pygame学习笔记--1

Python可视化物理随机过程---pygame学习笔记2

Pygame - Python游戏编程入门

14天学习训练营之 初识Pygame

Python_游戏开发库 Pygame 学习笔记

pygame学习笔记