英雄的黎明_pygame版(给伟人投票的pygame电子投票程序)

pygame电子投票
本程序有turtle版本,以下是部分代码预览:

"""
   英雄的黎明pygame版(给伟人电子投票)
"""

import time
import pygame
from pygame.locals import *

def greenen(image):
    """去掉红色和蓝色,保留绿色像素值"""
    image_3Darray = pygame.surfarray.array3d(image) # 转为矩阵    
    image_3Darray[:,:,:1] = 0
    return pygame.surfarray.make_surface(image_3Darray)
    
class Sprite(pygame.sprite.Sprite):
    """继承自pygame.sprite.Sprite基类的Sprite类"""
    pygame.font.init()
    vfont = pygame.font.Font("msyh.ttf",32)
    
    def __init__(self,image,pos,screen):
        """
           image:图像,pos:坐标,screen:屏幕
        """
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen
        self.image = image
        self.rect = image.get_rect(center=pos)
        self.votes = 0                # 得票数
        self.image2 = greenen(image)
        
    def update(self):
        """更新"""
        mx = pygame.mouse.get_pos()
            
    def make_votes_image(self):
        """生成新的投票数图层"""

    def draw(self):
        """重写draw方法"""

def main():

    width,height = 480,360
    background = pygame.image.load("images/背景1.png")
    毛泽东图 = pygame.image.load("images/毛泽东.png")
    孙中山图 = pygame.image.load("images/孙中山.png")
    蒋介石图 = pygame.image.load("images/蒋介石.png")
    
    screen = pygame.display.set_mode((width,height))
    pygame.display.set_caption("英雄的黎明pygame版(给伟人电子投票)")

    group = pygame.sprite.Group()
    mzd = Sprite(毛泽东图,(100,280),screen)
    szs = Sprite(孙中山图,(250,280),screen)
    jjs = Sprite(蒋介石图,(400,280),screen)
    
    group.add(mzd)
    group.add(szs)
    group.add(jjs)    

    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running = False
        group.update()

        screen.blit(background,(0,0))
        [s.draw() for s in group]
        pygame.display.update()
        
    pygame.quit()        

if __name__== "__main__":

    main()       

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 英雄的黎明_pygame版(给伟人投票的pygame电子投票程序)已关闭评论

红化,绿化,蓝化,黄化,青化,品红化,灰度化图形,pygame.surfarray.array3d像素级numpy操作示例


以下是代码预览:

"""
   红化,绿化,蓝化,黄化,青化,品红化,灰度化图形,pygame.surfarray.array3d像素级操作示例
"""
import pygame
from pygame.locals import * 
import numpy as np

def reden(image):
    """去掉绿色和蓝色,保留红色像素值"""

def greenen(image):
    """去掉红色和蓝色,保留绿色像素值"""

def magentaen(image):
    """去掉绿色,保留红色和蓝色像素值"""

def cyanen(image):
    """去掉红色,保留绿色和蓝色像素值"""
    
def yellowen(image):
    """去掉蓝色,保留红色,绿色,即黄色"""
    image_3Darray = pygame.surfarray.array3d(image) # 转为矩阵
   
def blueen(image):
    """去掉红色和绿色,保留蓝色像素值"""

def revertrgb(image):
    """倒序RGB像素值"""

def revertcolor(image):
    """反转图像"""    


def grayen(image):
    """灰度图像,灰度算法"""

  
def 柔化(image):
    """柔化,这柔化效果"""


image = pygame.image.load("images/背景1.png")
width ,height = image.get_size()
screen = pygame.display.set_mode((width,height))
pygame.display.set_caption('pygame.surfarray.array3d像素级操作by李兴球')

screen.blit(image,(0,0))
pygame.display.update()
pygame.time.wait(1000)

image = 柔化(image)

screen.blit(image,(0,0))
pygame.display.update()
pygame.time.wait(1000)

 
如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 红化,绿化,蓝化,黄化,青化,品红化,灰度化图形,pygame.surfarray.array3d像素级numpy操作示例已关闭评论

python遍历二叉树代码

class Node:  
   def __init__(self,value=None,left=None,right=None):  
       self.value=value  
       self.left=left         #左子树
       self.right=right       #右子树

def preTraverse(root):  
    '''
    前序遍历
    '''
    if root==None:  
        return  
    print(root.value,end = ' ')  
    preTraverse(root.left)  
    preTraverse(root.right)  

def midTraverse(root): 
    '''
    中序遍历
    '''
    if root==None:  
        return  
    midTraverse(root.left)  
    print(root.value,end = ' ')  
    midTraverse(root.right)  
  
def afterTraverse(root):  
    '''
    后序遍历
    '''
    if root==None:  
        return  
    afterTraverse(root.left)  
    afterTraverse(root.right)  
    print(root.value,end = ' ')

if __name__=='__main__':
    
    root=Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'))))
    print('前序遍历:')
    preTraverse(root)
    print('\n')
    print('中序遍历:')
    midTraverse(root)
    print('\n')
    print('后序遍历:')
    afterTraverse(root)
    print('\n')

 

发表在 python | python遍历二叉树代码已关闭评论

Python读取xml示例程序

import time
from xml.dom.minidom import parse

html = """
<!DOCTYPE html>
<html>
  <head>
    <title>Python创意编程_李兴球博客目录2019-8-22版</title>  
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <link rel="stylesheet" type="text/css" href="link.css"></link>
  </head>
<body>\n
"""

d = f"<h1>李兴球Python创意编程目录</h1>\n本网页由python程序于 {time.ctime()} 读取wordpress博客自动生成。"

html = f"{html}\n{d}\n<ol style='line-height:35px'>"

li_list = [html]

DOMTree = parse('_python.wordpress.2019-08-22 (1).xml')

item = DOMTree.documentElement 
titles = item.getElementsByTagName('title')
links =  item.getElementsByTagName('link')

for 标题,链接 in zip(titles[::-1],links[::-1]):
    for title,link in zip(标题.childNodes,链接.childNodes):
        t = title.nodeValue         
        u = link.nodeValue
        if isinstance(t,str) and isinstance(u,str):
          s = f"<li><a target=_blank href='{u}' > {t} </a></li>\n"
          li_list.append(s)

ad = "<li><a target=_blank href='http://www.scratch8.net'>风火轮编程Python课程体系简介。</a></li>\n"
li_list.append(ad)

li_list.append("\n</ol></body></html>")

print('共有',len(li_list),"项数据")

f = open("Python创意编程目录.html",mode='w',encoding='utf-8')
f.write("".join(li_list))
f.close()

 

发表在 python | Python读取xml示例程序已关闭评论

单摆模拟pygame版.py


用pygame模块制作的一个单摆,没有用到复杂的公式,编程比较简单。下面是部分代码预览:

"""
   单摆模拟pygame版.py
"""
__author__ = "李兴球"
__date__ = "2019/8/22"

import math
import pygame
from pygame.locals import *

def main():
    """主要函数"""
    width,height = 480,360
    screen = pygame.display.set_mode((width,height))
    pygame.display.set_caption("单摆模拟pygame版,作者:李兴球")
    ball = Pendulum_ball((width//2,100),200,10)

    clock = pygame.time.Clock()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running=False
        ball.update()
        screen.fill((0,0,0))
        ball.draw(screen)
        pygame.display.update()
        clock.tick(60)
    pygame.quit()

class Pendulum_ball:
    def __init__(self,rotate_center,rotate_radius,ball_radius):
        """参数依次为旋转中心,旋转半径,球的半径"""
        self.rc = rotate_center
        self.ra = rotate_radius
        self.r = ball_radius
        self.image = pygame.Surface((self.r*2,self.r*2))
        self.image.set_colorkey((0,0,0))
        p = self.r,self.r
        pygame.draw.circle(self.image,(255,0,0),p,self.r)
        p = self.rc[0] + self.ra , self.rc[1]
        self.rect = self.image.get_rect(center=p)
        self.angle = 0      # 和x轴的角度
        self.da = 0         # 每次增加的角度,角速度
        # 线条属性
        self.line = pygame.Surface((self.ra,2))

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 单摆模拟pygame版.py已关闭评论

单摆模拟_turtle版


turtle模块制作的单摆运动,单摆是画出来的,下面是部分代码预览:

"""
   单摆模拟.py
   本程序用海龟画图来模拟一个单摆
"""

__author__ = "李兴球"
__date__ = "2018年9月"

import turtle

turtle.pensize(5)               # 画笔宽度为5
turtle.left(90)                 # 左转90度
turtle.begin_poly()             # 开始记录顶点
turtle.fd(200)                  # 前进200
turtle.right(90)                # 右转90
turtle.circle(20)               # 画圆
turtle.end_poly()               # 结束记录顶点
p = turtle.get_poly()           # 获取顶点元组

screen = turtle.getscreen()
screen.addshape("db",p)         # 添加形状到字典
screen.mode("logo")             # 设来logo模式
screen.delay(2)                 # 延时为2豪秒
turtle.shape("db")              # 形状为db
turtle.clear()                  # 清掉自己所画的
turtle.seth(90)                 # 设置方向为90度
turtle.color("blue")            # 设颜色为蓝色
angle = 0                       # 初始angle为0


        

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, turtle | 单摆模拟_turtle版已关闭评论

python简单算法定义函数判断的质数和合数

def isprime(n):
    """本函数判断n是否是质数,
       如果n是质数,那么返回True
       否则返回False
    """
    for x in range(2,1+n//2):
        if n//x == n/x:         # n%x==0 也可以
            return False

    return True


def iscomposite(n):
    """本函数判断n是否是合数,
       如果n是合数,那么返回True
       否则返回False
    """
    for x in range(2,1+n//2):
        if n//x == n/x:
            return True

    return False

print("\n以下是100以内的质数:")
for x in range(2,100):
    if isprime(x):print(x,end=' ')

print()
print("\n以下是100以内的合数:")
for x in range(2,100):
    if iscomposite(x):print(x,end=' ')

 

发表在 python | python简单算法定义函数判断的质数和合数已关闭评论

练习: 画这个图形,不定义函数,或定义函数都可以画一下。

少儿python编程海龟画图练习by李兴球

 

参考答案:

 

"""
  定义函数画这个简易图形
"""

import turtle

def draw(t,length):
    """画三角形函数"""
    t.begin_fill()
    for x in range(3):
        t.fd(length)
        t.left(120)
    t.end_fill()

# 设定海龟画笔和填充颜色        
turtle.color('red','blue')

# 迭代x变量4次
for x in range(4):
    draw(turtle,100)
    turtle.fd(100)
    turtle.rt(90)
    

 

发表在 python, turtle | 练习: 画这个图形,不定义函数,或定义函数都可以画一下。已关闭评论

Python创意编程之Pygame教程已定稿!

Python创意编程之Pygame教程已定稿!下面是目 录

第1节:孙悟空的72变
第2节:Pygame简介与RGB三元色
第3节:Pygame的矩形对象与圆弧
第4节:其它draw系列命令
第5节:矩形对象的移动方法
第6节:矩形对象的碰撞原理与方法
第7节:surface与图像处理
第8节:Pygame的事件处理
第9节:键盘与鼠标事件处理
第10节:colorkey与透明度
第11节:颜色渐变探秘
第12节:旋转图形与Sprite类
第13节:缩放翻转与拖动图形
第14节:字体对象与简易封面
第15节:fps与时钟对象
第16节:定时器事件
第17节:遮罩的本质
第18节:迷宫游戏示例
第19节:音乐播放器原理
第20节:Sprite类与Group类
第21节:模块化编程与拦球动画
第22节:完整的碰彩球游戏
第23节:酷酷的爆炸效果
第24节:电子菜单制作
第25节:盒子里的弹球世界
第26节:滚动的背景
第27节:朝向鼠标指针向前进
第28节:行走的角色类
第29节:中途岛海战椭圆阵列敌机
第30节:多关卡示例程序
第31节:刮刮乐趣味小游戏
第32节:灭霸的宝石
第33节:李白与杜甫斗诗
第34节:勇闯黑暗迷宫
第35节:gif动图播放模块
第36节:星汉灿烂

下一本书可能是Pygame创意汇编,也可能是arcade街机实战,待俺细细想来…..

发表在 pygame, python | Python创意编程之Pygame教程已定稿!已关闭评论

整体透明度图像的mask测试程序.py

"""
   整体透明度图像的mask测试程序.py
"""
import pygame
from random import randint
from pygame.locals import *

width,height = 480,360
xy = width//2,height//2

screen = pygame.display.set_mode((width,height))
pygame.display.set_caption("整体透明度图像的mask测试程序.py")

nezha = pygame.image.load('nezha.png').convert()
rect = nezha.get_rect(center=xy)
nezha.set_alpha(40)                 # 设置整体透明度
nezha.set_colorkey((255,255,255))   # 设置白色不渲染,此处mask为0
mask = pygame.mask.from_surface(nezha)
w,h = rect.size

screen.blit(nezha,rect)
pygame.display.update()

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 整体透明度图像的mask测试程序.py已关闭评论

喊至尊宝后显示字幕.py


周星驰电影里的一小段,用pygame显示出来后打上提示信息,下面是部分代码预览:

"""

   喊至尊宝后显示字幕.py
   本程序依次显示一些连续图形后显示提示信息
   《大话西游》至尊宝角色,由周星驰饰演。
"""
import pygame
from pygame.locals import *

fd = "喊至尊宝"
images = [pygame.image.load(f"{fd}/{i:04d}.png") for i in range(1,23)]
width,height = images[0].get_size()
print(width,height)
screen = pygame.display.set_mode((width,height))
pygame.display.set_caption("喊至尊宝后显示字幕")

# 下面轮换显示图片从而播放动画
clock = pygame.time.Clock()
for image in images:
    pygame.event.poll()
    screen.blit(image,(0,0))
............................

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 喊至尊宝后显示字幕.py已关闭评论

pygame控制鼠标坐标不断画一个彩色圆圈演示程序

pygame control mouse draw circle slowly

pygame control mouse draw circle slowly


慢慢地画一个个的圆圈程序。下面是部分代码预览:

"""
   pygame控制鼠标坐标不断画一个彩色圆圈演示程序.py
   结束程序请按任意键。
"""
import math
import pygame
from pygame.locals import *
from random import randint

angle = 0
radius = 100
color = (255,0,0)
width,height = 480,360
wc,hc = width//2,height//2          # 屏幕中心点坐标
screen = pygame.display.set_mode((width,height))
image = pygame.Surface((width,height))

clock = pygame.time.Clock()
running = True
while running:
    .......................    
    angle = angle + 1
    if angle % 360 ==0 :
        image.fill((0,0,0))
        color = randint(0,255),randint(0,255),randint(0,255)
        angle = 0
    clock.tick(60)

pygame.quit()

 
如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame控制鼠标坐标不断画一个彩色圆圈演示程序已关闭评论

星汉灿烂的planet模块最终代码

python pygame star shinning星汉灿烂planet模块

python pygame star shinning星汉灿烂planet模块


下面是部分代码预览:

"""
   宇宙类作品_星汉灿烂的核心程序,
   playnet.py模块。
   ,本程序会显示太阳星空背景,八大行星会出现,等待单击.
   单击后,它们的介绍图片会从右侧出现,再次单击,
   则图片又会从左到右慢慢消失。如果某天本模块由于Python
   或操作系统升级原因导致挂了,请自行修改源码,这里提供
   的是基础思想。
"""

import pygame
from pygame.locals import *

class Intro(pygame.sprite.Sprite):
    """介绍页类,它是行星描述信息的包装,继承自pygame的角色类"""
    def __init__(self,image,screen,group,行星类):
        """image:图像,screen:所在屏幕,
           group:组,行星类:本模块的行星类"""

    def update(self):
        """实时更新,如果visible为真,并且dx是-1,则往左移"""
        
class Planet(pygame.sprite.Sprite):
    """行星类,继承自pygame的角色类"""
    show = False                 # 类变量,控制只能同时显示一个介绍
    def __init__(self,image,pos,intro,group):
        """image:图形,pos:坐标,intro:介绍对象,group:组"""
        
    def update(self):
        """更新,行星碰到鼠标指针并且按下了鼠标左键时,
           就把它的介绍页的可见性设为True。然后把类变量show
           的值也设为True,这样就阻止了再次单击其它行星时把
           其它介绍页也显示出来。
           
        """
def make_planet(intro_group,planet_group,screen):
    """
       加载资源,形成行星介绍页与行星角色,把它们加入到相应的组中去。
       intro_group:介绍组,planet_group:行星组,screen:屏幕

    """
    

def show_planet(screen,background):    
    """显示行星,等待单击各行星"""

    intro_group = pygame.sprite.Group()          # 介绍组
    planet_group = pygame.sprite.Group()         # 行星组

    make_planet(intro_group,planet_group,screen) # 生成若干行星
    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running=False
            
        planet_group.update()                    # 更新每个行星
        intro_group.update()                     # 更新每张介绍页
        
        screen.blit(background,(0,0))
        planet_group.draw(screen)
        # 如果介绍页是可见的才把它渲染出来
        [screen.blit(p.image,p.rect) for p in intro_group if p.visible]
        pygame.display.update()

    pygame.quit()
    
def main():
    """主调用函数"""
    size = width,height = 480,360    
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("星汉灿烂的核心程序by lixingqiu")

    background = pygame.image.load("images/太阳.png")
    show_planet(screen,background)
    
if __name__ == "__main__":

    main()        
        

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 星汉灿烂的planet模块最终代码已关闭评论

gif动态图片播放模块最新版

前面有一个程序也是这个模块, 这个模块不把拆的帧图写入磁盘,然后再读取 ,所以速度更快得多。

这是一个用pygame编写的播放gif动画的模块,还可以给gif配上背景音乐。下面是部分代码预览:

"""

    动态图片播放模块.py
    本程序使用Pygame来播放一个gif动图。
    gif图是通过pillow模块的Image类打开的,
    通过把它转换成bytes,从而让Pygame.image.fromstring
    能读取这个图形到内存,进而一帧一帧地显示在screen上。
"""
import pygame
 
def playgif(imagefile,sw=480,sh=360,bgmusic=None):
    """imagefile:图形文件,sw:屏幕宽度,sh:屏幕高度,bgmusic:背景音乐
       ,本函数加载gif文件,渲染在Pygame的屏幕上不断显示从而播放gif图形。"""
    
    pygame.init()
    screen = pygame.display.set_mode((sw,sh))
    pygame.display.set_caption(imagefile)
    
    gif_image = Image.open(imagefile) # 打开gif文件
    width,height = gif_image.size   
   
    print("读取gif文件中,请稍候...")
    frames = []                       #  帧列表
    ....................................

    # 下面是用Pygame窗口显示每幅帧图
    rect = pygame.Rect(0,0,width,height)
    rect.center = sw//2,sh//2
    clock = pygame.time.Clock()
    for frame in frames:
        pygame.event.get()
        screen.fill((0,0,0))
        screen.blit(frame,rect)
        pygame.display.update()
        clock.tick(10)
    
    return screen

if __name__ == "__main__":        
      
    screen = playgif('序幕.gif')
    if screen:pygame.quit();print(screen)

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | gif动态图片播放模块最新版已关闭评论

星汉灿烂Pygame版

""
   星汉灿烂.py
   本程序是太阳系百科知识集锦,先会有一个序幕,然后会有封面,
   最后是八大行星出现。如果本程序在未来的Python版本中挂了,
   请自行修改程序.
"""

from gifplay import *
from fadeshow import *
from planet import * 

width,height = 480,360
bgmusic = "光田康典_梦的岸边.wav"

print('播放序幕,返回屏幕对象')
screen = playgif('序幕.gif',width,height,bgmusic)

print("淡入封面图形") 
cover = pygame.image.load("封面.png").convert()
fade_in_image(screen,cover)

print("等待任意按键") 
clock = pygame.time.Clock()
while not pygame.event.get(KEYDOWN):clock.tick(30)
   
print("淡出封面")  
fade_out_image(screen,cover)

print("淡入背景")
background = pygame.image.load("images/太阳.png")
fade_in_image(screen,background)

print("显示行星,等待单击各行星")
show_planet(screen,background)

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 星汉灿烂Pygame版已关闭评论

宇宙类作品_星汉灿烂的行星与介绍类测试程序

"""
   宇宙类作品_星汉灿烂的行星与介绍类测试程序,
   playnet.py模块。
   ,本程序单击地球,会从右到左出现一张介绍地球的图片,
   再次单击,则图片又会从左到右慢慢消失。
"""

import pygame
from pygame.locals import *

class Intro(pygame.sprite.Sprite):
    """介绍对象,继承自pygame的角色类"""
    def __init__(self,image,screen):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.sw = screen.get_width()
        self.rect = image.get_rect(topleft=(self.sw,0))
        self.visible = False
        self.dx = -1
        
    def update(self):
        """实时更新"""
        if self.visible and self.dx == -1:
            if self.rect.x > 0 :
               self.rect.move_ip(self.dx,0)
            else:
               clicked = pygame.mouse.get_pressed()
               if clicked[0] : self.dx = 1                  
        else:
            if self.rect.x < self.sw:
                self.rect.move_ip(self.dx,0)
            else:
                print("运行了这")
                self.visible = False
                self.dx = -1 
        
class Planet(pygame.sprite.Sprite):
    """行星类,继承自pygame的角色类"""
    
    def __init__(self,image,pos,intro):
        """image:图形,pos:坐标,intro:介绍对象"""
        pygame.sprite.Sprite.__init__(self)
        self.intro = intro
        self.image = image
        w,h = image.get_size()    # 得到宽度和高度
        self.image_big = pygame.transform.scale(image,(w+10,h+10))
        self.rect = image.get_rect(center=pos)
        self.rect_big = self.image_big.get_rect(center=pos)
        self.mask = pygame.mask.from_surface(self.image)
        self.mask_big = pygame.mask.from_surface(self.image_big)
        self.images = [self.image,self.image_big]
        self.masks = [self.mask,self.mask_big]
        self.rects = [self.rect,self.rect_big]
        
    def update(self):
        mp = pygame.mouse.get_pos()
        dx = mp[0] - self.rect.x
        dy = mp[1] - self.rect.y
        if dx >= 0 and dx < self.rect.width and \
           dy >=0 and dy < self.rect.height:
               flag = self.mask.get_at((dx,dy))
               clicked = pygame.mouse.get_pressed()
               # 如果单击左键,把自己的介绍显示出来
               if clicked[0] : self.intro.visible = True
        else:
            flag = 0
        self.image = self.images[flag]
        self.rect = self.rects[flag]
        self.mask = self.masks[flag]                 

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 宇宙类作品_星汉灿烂的行星与介绍类测试程序已关闭评论

淡入淡出显示图形的两个函数

"""
   淡入淡出显示图形的两个函数,
   注意,在显示的过程中没有进行事件检测
"""

import pygame
from time import sleep
from pygame.locals import * 

def fade_in_image(screen,image):
    """淡入显示图像"""
    
    for a in range(0,256):
        image.set_alpha(a)
        screen.fill((0,0,0))
        screen.blit(image,(0,0))
        pygame.display.update()
        sleep(0.01)
        
def fade_out_image(screen,image):
    """淡出显示图像"""

    for a in range(255,-1,-1):        
        image.set_alpha(a)
        screen.fill((0,0,0))
        screen.blit(image,(0,0))
        pygame.display.update()
        sleep(0.01)

if __name__ == "__main__":
        
    screen = pygame.display.set_mode((480,360))
    cover = pygame.image.load("封面.png").convert()
    fade_in_image(screen,cover)
    fade_out_image(screen,cover)

 

发表在 pygame, python | 淡入淡出显示图形的两个函数已关闭评论

Pygame读取pillow图形文件最简代码,

Pygame读取pillow图形文件最简代码,李兴球

"""
   Pygame读取pillow图形文件最简代码,
   由于要在pygame读取一系列帧,所以需要下面的代码,
   本程序支持jpg,png-24格式,不支持png-8和gif格式,bmp格式没有测试.

   
"""
import pygame
from PIL import Image

cover = "林素婉300.jpg"
im = Image.open(cover)
mode = im.mode
print(mode)
size = im.size
print(size)
im_string = im.tobytes()
cover = pygame.image.fromstring(im_string,size,mode)
screen = pygame.display.set_mode(size)
screen.blit(cover,(0,0))
pygame.display.update()

后记:

细看pillow的帮助英文,原来是没有转换模式.此问题已于8月16日已解决,转换成RGB模式即可

在打开图像文件之后写上代码:

im = im.convert(mode=”RGB”)

发表在 pillow, pygame, python | Pygame读取pillow图形文件最简代码,已关闭评论

宇宙类作品_星汉灿烂的序幕模块_播放gif动画函数

本人用scratch做了一个叫<星汉灿烂>的作品,作品的配音和动画结合得很好,这里是用Pygame做的一个序幕,序幕过后就是显示八大行星等的内容交互动画。

"""
    星汉灿烂的序幕模块.py
    本程序使用Pygame来播放一个gif动图。
"""
import os
import pygame
from time import sleep
from pygame.locals import *
from tempfile import TemporaryDirectory
from PIL import Image, ImageSequence
 
def playgif(imagefile,screen_width,screen_height):
    """加载gif文件,渲染在Pygame的屏幕上不断显示"""
    basename = os.path.basename(imagefile)
    basename = basename.split('.')[0]
    outputlist = []              # 待返回的每一帧
    # 新建临时文件夹
    ffd = TemporaryDirectory(suffix=None, prefix=None, dir=None)     
    im = Image.open(imagefile)   # 载入图片
    width,height = im.size
    index = 0
    for frame in ImageSequence.Iterator(im): # 迭代gif图中的每一帧
        filename = ffd.name + os.sep +  basename +  str(index) + ".png"
        frame.save(filename )
        outputlist.append(filename)
        index += 1
    im.close()                  # 关闭图形对象
    

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 宇宙类作品_星汉灿烂的序幕模块_播放gif动画函数已关闭评论

pygame勇闯黑暗迷宫最新版的原理程序

本人曾经编写个一个饶有趣味的小游戏叫《勇闯黑暗迷宫》,今天翻了一下,把代码进行了再度优化,这里提供没有封面,没有配音的原理程序以肆读者。这个游戏是操作一个角色闯简易迷宫,可是到一半的时候,全部变黑了。你只能依靠记忆让角色走出迷宫。

python brave the dark maze game

python brave the dark maze game


下面是部分代码预览:

"""
   勇闯黑暗迷宫,这是2019/8/11版本的原理程序。
   用鼠标方箭头操作小猫上下左右移动,碰到绿旗就过关了。
   不过每次没有在一定时间内过关的话,会停电,黑乎乎的一片,
   这个时候只能凭记忆过关了。
"""
import time
import pygame
from pygame.locals import *

class Maze(pygame.sprite.Sprite):
    """迷宫类,继承自角色类"""
    def __init__(self,image):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = image.get_rect()
        self.mask = pygame.mask.from_surface(self.image)

    def update(self):
        """更新"""
        if not self.candraw:return

    def draw(self,screen):
       """重画角色"""
           
class Sprite(pygame.sprite.Sprite):
    """角色类,继承自pygame的Sprite类"""
    def __init__(self,image,pos):
        """初始化方法,image:图像,pos:坐标"""
        
    def update(self):
        """更新角色"""
        
    def draw(self,screen):
        """重画角色"""
 
def main():
    """主要调用函数"""
    得分 = 0
    icon = "李兴球.ico"
    width,height = size = 480,360
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("勇闯黑暗迷宫教程版的原理程序by lixingqiu")
    pygame.display.set_icon(pygame.image.load(icon))

    ................................
    maze = Maze(images[index])
    clock = pygame.time.Clock()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running = False            
        cat.update()
        ............................
    pygame.quit()

if __name__ == "__main__":

    main()        

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame勇闯黑暗迷宫最新版的原理程序已关闭评论

李白与杜甫斗诗的一个有趣的pygame小程序

李白与杜甫斗诗的一个有趣的pygame小程序by李兴球
用pygame制作的一个趣味对话小程序。下面是部分代码预览:

"""
   李白与杜甫斗诗的一个有趣的pygame小程序。
   本程序会显示李白和杜甫的图像,他们你一言我一语的说起“诗”来。
"""
import time
import pygame
from pygame.locals import *
        
class Pao(pygame.sprite.Sprite):
    """说话泡泡类,继承自角色类"""
    
        
class Sprite(pygame.sprite.Sprite):
    """定义角色类,继承自pgyame.sprite.Sprite类"""
    def __init__(self,image,pos,group):
        pygame.sprite.Sprite.__init__(self)
        self.image = image
        self.rect = image.get_rect(center=pos)
        
    def render(self):
        """填充背景为白色,显示诗人和说话泡泡"""
        screen.fill((255,255,255))     # 填充白色背景
        
    def speak(self,string,_time):
        """角色的说话功能,在头顶上显示一个说话泡泡"""
        x = self.rect.centerx
        y = self.rect.top - 50         # 在角色顶上50像素处
     
def display_诗人(_time,sp_group):
    """短时间内显示两位诗人"""
    screen.fill((255,255,255))       # 填充白色背景 
    sp_group.draw(screen)            # 画两位诗人
    
def main():
    """主要函数"""
    global screen
    size = 660,520
    center = size[0]//2,size[1]//2
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("李白与杜甫斗诗")
    诗 = [ '杜先生,敢与我斗诗否?','no problem',
           '飞流直下三千尺','我有三千黄花菜',
          '明月何时待我还','借你Q币忘了还',
          '我欲因之梦吴越','一夜回到解放前',
          '床前明月光','杜甫睡得香']
    ...............................
    clock = pygame.time.Clock()
    # 直到按窗口关闭按钮才退出Pygame
    while not pygame.event.get(QUIT):clock.tick(30)
    pygame.quit()

if __name__ == "__main__":

    main()
        

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 李白与杜甫斗诗的一个有趣的pygame小程序已关闭评论

说话泡泡类.py


在角色人物头上面的说话泡泡泡类。下面是部分代码预览:

"""
   说话泡泡.py,这是李白与杜甫斗诗作品中的Pao类。
"""
import pygame
from pygame.locals import *
   
class Pao(pygame.sprite.Sprite):
    """说话泡泡类,继承自角色类"""
    pygame.init()
    fnt = pygame.font.Font("msyh.ttf",18)  # 字体对象
    hmargin = 10     # 垂直间隙
    wmargin = 10     # 水平间隙
    bmargin = 30     # 顶下间隙
    def __init__(self,string,pos):
        """初始化方法,string:要说的话,pos:坐标
           把string转换成surface,贴在泡泡中间
        """
        # 字符串的surface,准备贴在image的(wmargin,hmargin)


def main():
    """主要函数"""
    size = 480,360
    center = size[0]//2,size[1]//2
    screen = pygame.display.set_mode(size)
    p = Pao('飞流直下三千尺',center)
    screen.blit(p.image,p.rect)
    pygame.display.update()

if __name__ == "__main__":

    main()        

 
如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 说话泡泡类.py已关闭评论

灭霸的宝石游戏源代码pygame


这是一个简单的用pygame制作的接宝石小游戏。你需要用鼠标操作灭霸去接宝石。下面是部分代码预览:

"""
   灭霸的宝石,这是一个简单的接物小游戏。
   在这个游戏中,宝石用彩色的圆圈表示,它们会不断地落下来。
   用鼠标指针左右操作灭霸去接这些宝石,当接到一定数量的宝石后,
   游戏就应该结束,请自行设计结束游戏代码。
"""

import pygame
from pygame.locals import *
from random import randint

def random_color():
    """产生随机RGB颜色"""
    r = randint(0,255)
    g = randint(0,255)
    b = randint(0,255)    
    return r,g,b

def random_circle():
    """产生一个圆形图"""
    radius = randint(10,20)                # 随机半径
    image = pygame.Surface((radius*2,radius*2))
    image.set_colorkey((0,0,0))
    # 随机RGB颜色 
    color = random_color()
    pygame.draw.circle(image,color,(radius,radius),radius)
    return image
    
class Gemstone(pygame.sprite.Sprite):
    """宝石类,继承自角色类"""
    def __init__(self,screen,group):
        """
           screen:所在屏幕,group:所在组
        """        
        pygame.sprite.Sprite.__init__(self)    # 初始化父类
       .........................

    def update(self):
        """更新坐标"""
        self.rect.move_ip(self.dx,self.dy)     # 移动矩形
        self.bottom_detect()                   # 碰到底检测
        
    def bottom_detect(self):
        """碰到边缘就从组中移除自己"""
        if self.rect.top>self.sh : self.kill()

class Player(pygame.sprite.Sprite):
    """
       玩家类,继承自角色类
    """
    
    def __init__(self,image,screen):
        """
           image:图像,screen:所在屏幕
        """        
        pygame.sprite.Sprite.__init__(self)    # 初始化父类
        self.sw = screen.get_width()           # 屏幕宽席
        self.sh = screen.get_height()          # 屏幕高度        
        self.image = image                     # 代表它的图形        
        self.rect = self.image.get_rect()      # 获取矩形对象
        position = 0,self.sh - 40              # 初始坐标
        self.rect.center = position            # 定矩形的位置      

    def update(self):
        """更新坐标,用鼠标操作玩家"""
        pos = pygame.mouse.get_pos()          # 获取鼠标指针坐标  
        self.rect.centerx = pos[0]            # 设定矩形中央x坐标 
 
         
def main():
    """主要函数"""
    score = 0                                # 得分
    frame_counter = 0                        # 帧计数器
    width,height = 843,463                   # 定义宽高
    white = (250,250,250)                    # 定义白色 
    background = "星空背景.png"              # 背景图片
    player_image = "灭霸x.png"               # 玩家图片 
    ..................
    
    clock = pygame.time.Clock()            # 时钟对象
    running = True                         # 控制循环的逻辑变量    
    while running :
        # 以下是不定时产生宝石
        frame_counter += 1
        ........................        
                                           
        screen.blit(background,(0,0))            # 画背景图   
        stone_group.draw(screen)                 # 重画所有宝石           
        screen.blit(player.image,player.rect)    # 重画玩家图片
        screen.blit(score_image,(width//2-50,40))# 重画得分

        pygame.display.update()                  # 更新屏幕显示
        clock.tick(30)   
    
    pygame.quit()    
    
if __name__ == "__main__":

    main()       
        

 
main函数简要说明:
main函数设计了一个frame_counter变量,它用来做帧计数器。宝石可以通过自定义事件每隔一定的时间自动生成一个,也可以通过上面while循环里的方法不定时生成。当宝石和玩家的坐标都更新后,我们对它们进行了碰撞检测。其结果可能是碰到了,也可能是没有碰到。碰到了就返回那颗宝石,否则返回None。最后就是重画所有的对象并刷新屏幕显示了。作者是完全可以制作一个精美的有趣得多的接宝石游戏的。为了读者才能的发挥,所以就抛了这块砖,希望能引出玉来。

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 灭霸的宝石游戏源代码pygame已关闭评论

今天上python课一个学生无意中打出的彩点图

from turtle import *
from random import randint,choice

width,height = 600,600
color_list = ['red','orange','yellow','green','cyan','blue','purple']

screen = Screen()
screen.setup(width,height)
screen.bgcolor('white')
screen.delay(0)
screen.title('打点')

t = Turtle()
t.hideturtle()
t.penup()

while True:
    x = randint(-width/2,width/2)
    y = randint(-height/2,height/2)
    if y !=0 : 
        if -50 < x%y < 50: 
            ys = choice(color_list)
            t.pencolor(ys)
            t.goto(x,y)
            t.dot(10)
        
发表在 python, turtle | 今天上python课一个学生无意中打出的彩点图已关闭评论

孙悟空的72变Pygame版和turtle版


大家都知道西游记中的孙悟空。它有72变,能变成各种形状。下面是用python的海龟画图模块制作的一个小动画。它会让孙悟空不断地变换造型。其本质是不断通过设定海龟的造型图片实现的。在程序中用到了glob模块的glob命令,它能获取指定目录下所有的文件,并且支持通配符,返回一个文件列表。在下面的程序中还配了背景音乐,恰好是西游记片头曲。我们用的是winsound模块里的PlaySound进行播放。在这里使用了异步播放和循环播放两个组合的参数。其中的SND_ASYNC是表示异步播放的意思。意思是这个播放命令运行后,马上能运行下面的代码,而不必等待音乐播放完毕。SND_LOOP是让音乐不断重复播放的参数。以下是代码:

"""
    孙悟空的72变turtle版。
    本程会每隔3秒显示一张图片。
    其实本质上是不断地变换海龟的造型图片。
"""
import glob
import turtle
from winsound import * 
from time import sleep

bg = "花果山.png"                      # 背景图
images = glob.glob("images/*.gif")     # 所有的图像

# 新建一个窗口,尺寸为480x360
screen = turtle.Screen()
screen.setup(480,360)
screen.bgpic(bg)

# 异步无限播放背景音乐
PlaySound("西游记片头.wav",SND_ASYNC|SND_LOOP)
        

下面是用pygame模块制作的版本

"""
    孙悟空的72变Pygame版。
    本程序做为Pygame的引入程序。
    它会每隔3秒显示一张图片。
"""
import glob
import pygame
from winsound import * 
from time import sleep

bg = pygame.image.load("花果山.png")   # 加载背景图

........................................
while True:
   for image in images:              # 迭代每张图片
      event = pygame.event.poll()    # 获取一个事件
      screen.blit(bg,(0,0))          # 把背景贴在屏幕上
        

 
如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python, turtle | 孙悟空的72变Pygame版和turtle版已关闭评论

刮刮乐趣味小游戏原理程序


本人开发了一个趣味小程序,叫刮刮乐趣味小程序。这个游戏的原理代码如下所示。
下面是部分代码预览:

"""
   刮刮乐趣味小游戏原理程序。
   本程序运行较慢,这是由于逐像素修改所引起的。
   
   它的原理是把black_mask的像素改为透明像素。
   读者完全可以把它改造成自己的刮刮乐小游戏。
"""
__author__ = "李兴球"
__date__  = "2018/11/26"

def refresh():
    """刷新显示,在这个过程中无法关闭pygame。"""   

import pygame
from pygame.locals import * 

size = width,height= 800,600             # 定义屏幕尺寸变量
pygame.init()                            # 初始化pygame模块
screen = pygame.display.set_mode(size)   # 建立显示屏幕
pygame.display.set_caption("刮刮乐趣游戏小游戏原理程序") # 标题
background = pygame.image.load("图片/鸟.png")  # 加载图像

clock = pygame.time.Clock()
# 建立每像素模式的surface,用来蒙住它下面的图片。
black_mask = pygame.Surface(size).convert_alpha()
refresh()

'''''''''''''''''''''''''''''''''''''''''''''
while not pygame.event.get(QUIT):clock.tick(30)   
pygame.quit()

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 刮刮乐趣味小游戏原理程序已关闭评论

最简无碰撞多关卡示例程序

pygame最简无碰撞多关卡示例程序by李兴球
用pygame实现的一个多关卡示例程序。讲述的是多关卡的基本原因。下面是部分代码预览:

"""
   最简无碰撞多关卡示例程序
"""

import pygame
from pygame.locals import *

width,height = size = 480,360
screen = pygame.display.set_mode(size)
pygame.display.set_caption("最简无碰撞多关卡示例程序by李兴球")

# 背景与其mask代码段
level_index = 0
level_images = [f"levels/level{i}.png" for i in range(5)]
level_images = [pygame.image.load(im) for im in level_images]

# 蓝球角色代码段
sprite = "basketball.png"      # 需要操作的蓝球角色

# 游戏主循环代码段
running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:running=False
        if event.type == KEYDOWN:
            if event.key == K_RIGHT:dx,dy = 1,0
            if event.key == K_LEFT:dx,dy = -1,0
            if event.key == K_UP:dx,dy = 0,-1
            if event.key == K_DOWN:dx,dy = 0,1
        if event.type == KEYUP:dx,dy = 0,0
        
    sprite_rect.move_ip(dx,dy)    # 水平和垂直方向移动矩形对象
    ..........................
    screen.fill((250,250,220))
    screen.blit(bg_image,(0,0))
    screen.blit(sprite,sprite_rect)
    pygame.display.update()
pygame.quit()  

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 最简无碰撞多关卡示例程序已关闭评论

中途岛海战飞行阵列之椭圆

这是本人编写的飞机大战中途岛海战的敌机类模块。这些敌机飞行的阵列为椭圆形。这里单独列出以供给有需要的人士。

下面是部分代码预览:

"""
   中途岛海战飞行阵列之椭圆,
   本程序新建敌机类,然后让敌机绕着椭圆的轨迹不断地移动。
"""
import math
import pygame
from pygame.locals import *

class Enemy(pygame.sprite.Sprite):
    """
       绕椭圆飞行的敌机类
    """
    def __init__(self,image,a,b,rotate_center):
        """
           iamge:图形,a:长半轴,b:短半轴,rotate_center:旋转中心点
        """
        pygame.sprite.Sprite.__init__(self)
        self.rc = rotate_center  # 飞机的旋转中心

    def rotate(self):
        """根据和x轴的角度旋转图形"""
        self.image = pygame.transform.rotate(self.rawimage,self._angle)
        self.rect = self.image.get_rect()
        r = math.radians(self._angle)   # 把角度值转为弧度值
        x = self.a * math.cos(r)        # 根据椭圆参数方程算x值

    def update(self):
        """更新"""
        self._angle += 1

def main():
    """主要函数"""
    bg = 'sea.png'
    image = "Raven_128x128_red.png"
    width,height = size = 800,600
    
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("中途岛海战飞行阵列之椭圆by lixingqiu")
    bg = pygame.image.load(bg)
    
    pygame.time.set_timer(USEREVENT,1000) # 设置自定义事件定时器
    clock = pygame.time.Clock()
    running = True
    while running:
             
        group.update()
        screen.blit(bg,(0,0))
        group.draw(screen)
        pygame.display.update()
        clock.tick(60)
        
    pygame.quit()

if __name__ == "__main__":

    main()    

如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 中途岛海战飞行阵列之椭圆已关闭评论

Pygame简介与RGB三元色

Pygame,我们把它读做“pai game”。安装这个模块的方法很简单,只要在命令提示符里输入pip install pygame –user即可。它是一个用来开发制作电子游戏的模块,基于SDL开发制作的。SDL是Simple DirectMedia Layer前三个字母,意思是“简单直接媒体层”。它是一个跨平台的用来直接访问键盘、鼠标、游戏操作棒和图形(通过OpenGL和Direct3D)的优秀的C语言库。SDL支持Windows, Mac OS X, Linux, iOS, and Android。所以Pygame模块天然支持上述操作系统。

使用Pygame模块,可以用少量的代码快速地开发游戏。然而,你却不一定要用Pygame制作游戏。比如,你可以用它来处理图像,用它来制作一个多媒体视频播放器,或者用它来制作一个演示勾股定律的小程序,甚至制作一个明信片贺卡之类的程序,送给其它人。在这个过程中,首先我们要了解颜色的一些知识。

电脑上的图片都有分辨率,比如一张图片的分辨率为800×600。它的意思是说这张图片的宽度是800,高度是600。即一行有800个点,一列有600个点。那么总共就包括480000个点。这些点叫像素点。我们把最左上角的点的坐标叫原点,即它的坐标为(0,0)。离原点正右言10个像素距离的点的坐标就是(10,0)。离原点正下方10个像素点距离的坐标点就是(0,10)。最右下角的点的坐标为(800,600)。如果我们拿放大镜一看电视机,尤其是以前那种分辨率很低的电视机,我们能很明显地看到“大大”的像素点。一个像素点表示一个单一的颜色。一个单一的颜色由三种颜色合成的,这叫做三元色。它们分别是红,绿,蓝。它们的英文为red,green,blue,简称为RGB。我们把红色分256个等份,把它叫做r值。r值是从0到255的数值。如果r值为0,即红色等份为0,相当于红色份量没有。如果r值为1那么红色份量就有了,不过很少。如果r值为127,那么就有一“半”红了。其它颜色也是一样的。如果一种颜色的r值为255,g值也是255,b值为0,那么这种颜色就是黄色。可以用三元组把黄色写为(255,255,0)。下面我们用海龟画图模块来举个例子。

"""
   显示黄色的背景示例.py
"""

import turtle

color = (255,255,0)         # 黄色三元组

screen = turtle.getscreen()  # 获取屏幕对象
screen.colormode(255)        # 设定屏幕颜色模式
screen.bgcolor(color)        # 设定屏幕背景颜色
screen.mainloop()            # 进入主循环刷新组件

在海龟画图中是有颜色模式的,默认的模式是1.0。在第10行中我们用屏幕的colormode命令把颜色模式改为255。这样海龟像块就能把第7行的元组识别为黄色。我们可以重新设定第7行的代码,如把第7行设计为color = (0,0,255),那么背景将会是蓝色的。在第12行中,海龟画图的整个屏幕进入了一个不断刷新过程,这个过程会对屏幕上的像素不断地重新显示。如果是用Pygame制作游戏,那么我们通常也会新建一个屏幕对象。并且最后显示画面的时候也通常会进入一个主循环中不断地进行刷新。不过这个循环需要我们自己编写代码。但是无论是用turtle模块和Pygame模块,用来制作动画或游戏的原理都是一样的。假设要显示一张gif图形,我们都要把gif图形中的每一张图给拆分出来,然后让程序一张一张地去显示。这样我们就能看到gif图片在播放了。下面让我们来编写第一个Pygame程序。

"""
   第一个Pygame程序.py
"""

import pygame         # 导入Pygame模块

pygame.init()         # 初始化Pygame

screen = pygame.display.set_mode((480,360)) #  新建屏幕

pygame.display.set_caption("我的第一个Pygame程序")

要使用Pygame模块,当然首先要导入这个模块,然后对它进行初始化。上面的程序第9行能新建一个窗口,并且通过参数来设置分辨率。注意参数是一个二元组。当上面的程序运行后,就会有一个黑乎乎的窗口显示出来了。最后第11句就会给窗口加上标题。set_mode是设置模式的意思。set_caption就是设置标题的意思。而pygame.display是Pygame模块中的一个子模块。它用来处理显示相关的事情。screen对象是一个图层对象。它的英文名为surface。你可以把它当成一个在内存里的图像。它也能通过pygame.Surface这个类来新建一个图像。现在这个图像是黑色的,这是因为set_mode命令默认就会把它设为黑色。如果要改这个图像的颜色,可以用screen.fill((255,0,0)),这样图像就填充为红色了。当然,也可以取或设置screen上的像素点的颜色,用get_at或set_at命令即可。接下来为了更好的学习Pygame,我们来学习矩形对象。

发表在 pygame, python | Pygame简介与RGB三元色已关闭评论

NPC多造型角色模拟状态机时走时停的增强型AnimatedSprite类

NPC多造型角色模拟状态机时走时停的增强型AnimatedSprite类by lixingqiu李兴球
小人儿时走时停的。一切都由程序控制。它没有自己的思想。下面是部分代码预览:

"""
 
   NPC多造型角色模拟状态机时走时停的增强型AnimatedSprite类。
   本程序模拟了状态机,会演示一个小人物走来走去,它碰到屏幕边缘会反弹。
   并且角色在走的过程中可能停下来。为了增强代码可读性,
   本程序角色所有造型共享一个矩形对象,不再设置矩形对象列表。
   
"""
import time
import pygame
from pygame.locals import *
from random import randint

class AnimatedSprite(pygame.sprite.Sprite):
    def __init__(self,images,pos,screen):
        """
           images:帧序列,pos:坐标,screen:所在屏幕
        """
        pygame.sprite.Sprite.__init__(self)
        self.sw = screen.get_width()
        self.sh = screen.get_height()
        self.amounts = len(images)        # 造型数量
        self.right_frames = images
        ..........................
           
def main():

    background = "stripes.png"
    width,height = 480,360
    screen = pygame.display.set_mode((width,height))
    pygame.display.set_caption("NPC多造型角色模拟状态机时走时停的增强型AnimatedSprite类")
    background = pygame.image.load(background)
    images = [f"pico/right_{i}.png" for i in range(4)]
    images = [pygame.image.load(im) for im in images]
    .................................................    
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running=False
        group.update()
        screen.blit(background,(0,0))
        group.draw(screen)
        pygame.display.update()
    pygame.quit()

if __name__ == "__main__":

    main()
    

如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | NPC多造型角色模拟状态机时走时停的增强型AnimatedSprite类已关闭评论

NPC多造型角色_可爱的Pico的AnimatedSprite类

NPC多造型角色_可爱的Pico的AnimatedSprite类 by lixingqiu
这是简单的版本,小人左右走来走去,一边切换造型,碰到边缘会反弹。下面是部分代码预览:

"""
   pico.py
   NPC多造型角色_可爱的Pico的AnimatedSprite类。
   本程序会演示一个小人物走来走去,它碰到屏幕边缘会反弹。
   
"""
import time
import pygame
from pygame.locals import *
from random import randint

class AnimatedSprite(pygame.sprite.Sprite):
    """继承自Sprite的角色类""" 
        
def main():
    """主要执行函数"""
    background = "blue sky.png"
    width,height = 480,360
    screen = pygame.display.set_mode((width,height))
    pygame.display.set_caption("NPC多造型角色_可爱的Pico的AnimatedSprite类by lixingqiu")
    ........................................
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == QUIT:running=False
        p.update()
        screen.blit(background,(0,0))
        screen.blit(p.image,p.rect)
        pygame.display.update()
    pygame.quit()

if __name__ == "__main__":

    main()
    

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | NPC多造型角色_可爱的Pico的AnimatedSprite类已关闭评论

Pygame朝向鼠标指针向前进_Arrow类_射箭,坦克,海龟类雏形程序

如果用过Scratch,那么就会知道有一个叫朝向鼠标指针的命令。它能让角色朝着鼠标指针的方向。如果在Pygame中要让一个角色朝向鼠标指针,那么就必需“手动”地去旋转图形了。旋转的角度应该是它和x轴的夹角,我们把它叫angle。 这个夹角可以通过数学函数中的反正角函数求出。在Python对应了math.atan2这个函数。它要求有两个参数,一个是dy,一个是dx。dy就是两点之间的垂直距离,dx就是两点之间的水平距离。以下是求angle的示意图,虽然在接下来的例子中是以箭头的中心点为旋转中心的,但并不影响它示意原理,学过三角函数的都应该知道。

pygame计算夹角示意原理图_朝向鼠标指针向前进ARROW类

不过在Pygame中,y坐标轴是向下,所以计算dy的时候要取反。实时地把angle求出来了,那么就能旋转image了。以下是Arrow类的代码,读者可以把它应用到游戏中的很多地方。比如坦克发射炮弹 ,射箭游戏,甚至自制作一个海龟画图像块等等。代码如下所示:

"""
   朝向鼠标指针的Arrow类
"""
import math
import pygame
from pygame.locals import *

class Arrow(pygame.sprite.Sprite):
    def __init__(self,image,pos):
        """
          image:图形,pos:坐标
        """
        pygame.sprite.Sprite.__init__(self)
        self.rotate_center = pos         # 旋转中心
        self.rawimage = image            # 保留原始图形
        self.angle = 0                   # 和x轴的夹角
        self.rotate()                    # 旋转图形  

    def rotate(self):
        """根据和x轴的角度旋转图形"""
        self.image = pygame.transform.rotate(self.rawimage,self.angle)
        self.rect = self.image.get_rect(center=self.rotate_center)

    def update(self):
        """计算和鼠标指针的方向,更新image和rect"""
        p = pygame.mouse.get_pos()        # 获取鼠标指针坐标
        dy = self.rotate_center[1] -p[1]  # 和箭头的垂直距离
        dx = p[0] - self.rotate_center[0] # 和箭头的水平距离 
        degree = math.atan2(dy,dx)        # 计算夹角,代表方向
        self.angle = math.degrees(degree) # 转换为角度
        self.rotate()                     # 生成旋转后的image

以下内容需要会员才能查看,包含源代码和素材:

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | Pygame朝向鼠标指针向前进_Arrow类_射箭,坦克,海龟类雏形程序已关闭评论

pygame最简单自由落体弹球实验

当一个人从大楼跳下时,他就做着抛物线式的运动。我们可以通过编程模拟这种移动。或许你用Python的海龟画图模块做过类似的动画。现在,我们可以通过Pygame模块来实现这个动画。最简单的情况就是,当游戏中的图形水平速度dx为0的时候,那么它只是在做自由落体运动。当一个物体自由落体时,它的垂直速度是不断地增加的。增加的数量是一定的,这个数量叫做加速度。假设游戏中的角色的垂直速度为dy,不断地通过调用y = y + dy命令,那么角色就会匀速地在竖直方向移动。如果让dy不断地累加a,这个时候角色就呈现加速度下落的运动。不断地在新的坐标渲染,我们就能看到模拟的自由落体效果。下面的代码radius代表小球的半径。x和y代表小球的坐标。dx和dy代表水平和垂直方向单位的位移量,也就是速度。而a的值是1,它代表的是重力加速度。以下是最简单的自由落体弹球小程序,它会演示一个红色的小球掉到屏幕下边缘然后又不断弹起下落的动画。
以下内容需要会员才可见,包含源代码下载网址:

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame最简单自由落体弹球实验已关闭评论

关于少儿编程:我担心孩子学不会,而浪费我的金钱。

        每个父母都希望极少的投资获取最大的收益,这是由经济原理决定的。以前小学编程是很难,那是由于那个时代没有图形化编程,远没有如今这么多丰富多彩的儿童学习编程的方法。曾经的时代,只有极少数的小学生能学习编程。造成了编程是很难学的的印象。自2007年,一个名叫scratch的软件在美国诞生以来,少儿编程做为一个整体的概念才远渡重洋,飘杨过海来到中国。 这个软件让每个儿童学习编程成为了可能。国与国的竞争越趋激烈,放眼国际社会,越来越多的国家政府要在中小学普及编程。而个人已经不得不和“人工智能”竞争了。经实践证明,每个孩子通过拖曳积木的方式学习编程,都是能学会的。但还是有少数孩子学不会,这是为什么呢?这就是多方面的原因造成的。第一,家长要从自身原因找起。比如,自己天天刷抖音,从来不学习以身做则。那你还能期待你的孩子每天认真学习吗? 网上有句话叫:三流的父母做保姆,二流的父母做教练,一流的父母从孩子的角度看问题,教孩子管理时间,教孩子独立思考。先不管这句话正不正确,但应用到孩子学习编程这个案例来说。做为言传身教的家长,首先要让孩子认识到学习编程的重要性吧。比如说说人工智能,它的“智能”从哪里来? 什么样的工作已经或将会被人工智能代替? 让孩子去自己找寻答案,从而得出一定要学习编程,否则在未来的社会中就会无立锥之地。第二,学不会的原因是由于没有认真学习,三天打鱼两天晒网,比如天气太热了,那今天就不去学习了,在家里吹空调避暑吧。这就是少部分家长这样教孩子的!孩子长大后大多也是这样,遇到一点困难就选择退而求其次。这其实也是“家教”不好。第三,十年树木,百年树人,一个人成才要几十年! 举个例子,某城市的小孩甲和小孩乙,甲家长了解国际形势,站得高,看得远,选择在小学的时候就让自己的孩子学习编程,从而为孩子埋下了一颗种子。另一个家长觉得应该长大再学习更合适,所以没有选择让自己的孩子去学习。假设到了初中,这个时候学校开了编程课。可能学习的是Python。甲小孩由于在小学的时候就学过编程,所以学习起来就觉得轻松些,自信心也就更强,从而更加有信心学习编程,正向反馈更多,成才机率更大。这就是正所谓的一步先,步步先。而乙小孩则连打字都不会,从而觉得编程好难,逐渐丧失学习编程的信心,借口就是没有兴趣等等。当然,不排除乙小孩也可能反而会更加努力地学习编程从而超过甲小孩的例子,但这毕竟是少数,只有在特定环境下才能激发,比如家里情况特殊,经济拮据等等。你想想,如果乙小孩家里环境优越,他还会去发奋吗?
        反过来说,孩子不是学习这个,就是学习那个,如果都担心学不会,那么家长还是把钱存起来更加“保险”。 最近,有个新闻标题为:国内首个人工智能“个人绘画展”开幕。就是说画画的人不是人,是“机器人”。 家长可以让孩子去学习美术,画画可以锻练想像力等等。不过终究,未来大多数人画的都比不过人工智能。 家长也可以让孩子学习英语,我不是反对,这个当然要学好。本人的英语就非常好,这就是我目前最大优势之一。不过,未来人即使不懂英语,也完全能和外国人沟通。未来的同声传译,即时翻译相信会比现在的不知道强多少倍。 未来的高科技不需要这么多人了,催生出来的新职业对人的要求会更高。总之,人类自己创造了高科技,也创造了自己最大的竞争对手。从哲学角度来说,否定之否则不断地推动社会的发展。在中小学阶段普及编程这个趋势已经是大势。逆势者终将被淘汰,未来只有等着被国家救济,成为无用阶层中的人下人了。     房子,车子都能快速复制生产,这些都不是最重要的,都不会缺。缺的是有创新力的人才。现在少儿编程教育正从精英教育逐渐走向大众教育。做为家长,从以身做则的角度也是应该学习一下的,毕竟小学生都能学的,家长理论上也能学得会。少部分家长会和孩子一起学习,从而和孩子又多了一种交流“语言”。
        社会的发展总是少数人引领,大部分人跟进。等到大众都学习了,那么学习的价值就没有刚开始时那么大了,但仍还是一定要学习的。在引领阶段,很多人都是怀疑,旁观,这个时候最能体现家长的智慧了。家长要自己收集多方面在信息,综合比较,得出结论。所以至于让不让孩子学习编程,那最终就看家长了,仁者见仁,智者见智。最后,说下我自己,本人从2010年开始探索少儿编程,当初选的是basic语言,2011年左右发现了scratch ,后来发现了Python,到现在已经写了几部关于Python的书籍,也体现了一步先,步步先这个基本道理。现在社会的发展正如我预期的一样。虽然我不是什么预言家,但回顾我的这段历史,再看看这个少儿编程教育趋势,是不是很准。不信自己百度一下?

发表在 杂谈 | 关于少儿编程:我担心孩子学不会,而浪费我的金钱。已关闭评论

pygame盒子里的弹珠世界

pygame盒子里的弹球世界lixingqiu
小小的矩形框内,小珠子弹来弹去。下面是部分代码预览:

"""
   盒子里的弹球小世界
"""
import pygame
from random import randint
from pygame.locals import *

RED = (255,0,0)
BLUE = (0,0,255)

class Ball(pygame.sprite.Sprite):
    """
       球类,继承自角色类,它会在一个矩形范围内受重力移动。
    """
    def __init__(self,radius,box,color):
        """
           radius:半径,box:所在的盒子,color:颜色
        """

    def set_boundary(self):
        """设置反弹的边界"""
        self.left_boundary = self.box.rect.left     # 左边界
        self.right_boundary = self.box.rect.right   # 右边界
        self.top_boundary = self.box.rect.top       # 上边界
        self.bottom_boundary = self.box.rect.bottom # 下边界
        
    def update(self):
        """更新坐标,碰到边缘就反弹。"""


class Box(pygame.sprite.Sprite):
    """
       盒子类,继承自角色类
    """
    def __init__(self,width,height,pos):
        """
           width:宽度,height:高度
        """
    
size = width,height= 640,380
screen = pygame.display.set_mode(size) 
pygame.display.set_caption("盒子里的弹珠世界by lixingqiu")

running = True
while running:
    for event in pygame.event.get():
        if event.type == QUIT:running=False
        
    balls1.update()
    balls2.update()
    screen.fill((20,30,0))
    screen.blit(box1.image,box1.rect)
    screen.blit(box2.image,box2.rect)
    
    balls1.draw(screen)
    balls2.draw(screen)
    
    pygame.display.update()
    clock.tick(30) 

pygame.quit()

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame盒子里的弹珠世界已关闭评论

Python简易游戏菜单教程和源码


一个完整的游戏在它启动的时候,通常设计者还会设计一个电子菜单进行选择。最简单的情况是有一个开始游戏按钮,一个帮助说明按钮,一个退出游戏按钮。每个按钮都有共同的行为,比如能接受单击。当鼠标指针碰到按钮时会换造型。所以在按钮类的设计中就应该给它添加了两个image。在下面的例子中,我们把一个叫image0,另一个叫image1。这两个image放在一个元组中。当鼠标指针在按钮上或移开时,通过设定索引号为0或为1让按钮呈现不同的外观。这个检测是在按钮的update方法中完成的。通过矩形对象的collidepoint方法从而检测鼠标指针的坐标是否在按钮的矩形范围内。

为了能共同刷新及渲染每一个按钮,把它们装到一个容器组中是必然的。在下面的程序中通过pygame.sprite.Group新建了一个名叫menu的角色组。这样,把三个按钮都添加到了menu这个组中,在while循环中就能通过调用menu.update()对所有按钮进行更新,更新后通过调用menu.draw(screen)把所有按钮画在screen上了。

每个按钮都有一个clicked属性。当鼠标指针不在按钮范围内,它的值是False。当鼠标指针在按钮范围内并且单击了时,它的值变成了True。为什么要设计这个属性呢?它能向“外界”表明自己的状态。在同一个时期,只会有一个按钮被选中。这个按钮被单击了应该发生什么行为呢?其实,我们可以给在按钮初始化的时候传递一个回调函数,这样直接执行它的这个回调函数就行了。不过,在本例中,并没有这样做,而只是简单的在while循环中进行判断。如果翻译成汉语大概就是下面的意思:如果帮助按钮被单击了,则在屏幕上渲染帮助信息。如果结束按钮被单击了,则把running设置为False。如果启动游戏的按钮被单击了,那么不仅仅把running设置为False,还会把一个名为start_name的变量的值设为True。这个名为start_name是用来标记是否进入游戏的逻辑变量,以下是电子菜单的代码:

电子菜单制作,下面的程序设计了Button类,菜单则由一个组完成。每个实例化的按钮有两个造型,以便当碰到鼠标指针时会切换造型。

如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | Python简易游戏菜单教程和源码已关闭评论

Python电子试卷1

以下内容为粘贴自word文档, wordpress对排版进行了”变形”, 尤其是程序的缩进!! 有需要原word文档请联系本人。

Python电子试卷1

 

姓名:                             

一、单选题,把正确的答案编号写在问号后面。

 

1python在英文中的本意是?    

 

① 小猪             ② 小猫            ③ 蟒蛇           ④ 编程

 

2、下面哪个命令能将整数转换成字符串?   

 

① bool              ② float            ③ int            ④ str

 

3、旋转一圈要转多少度?     

 

① 90度             ② 180度           ③ 360度         ④ 720度

 

4randint命令的用途是什么?     

 

① 随机取整数       ② 随机取小数       ③ 前进           ④ 旋转

 

5、如果要用海龟画一个正36边形,每次要旋转多少度?     

 

① 36度             ② 12度           ③ 90度           ④ 10度

 

6IndexError是什么意思?     

 

① 列表错误          ② 语法错误        ③ 索引错误       ④ 超出范围

 

7print( type(10 % 8) ) 的运行的结果是?     

 

① 2               ② <class ‘int’>          ③ <class  ‘str’>   ④ 8

 

8、列表是用什么类型的括号括起来的?     

 

① 小括号            ② 中括号          ③ 大括号          ④ 尖括号

 

9、给列表添加数据的命令是哪个?     

 

① setheading          ② add             ③ append          ④ apend

 

10、在Python while是什么意思?       

 

①  时间             ② 莽蛇            ③ 当             ④ 否则

 

11len(str(bool(0))) 的运行结果是?     

 

① 3                ② 4                ③ 5              ④ 6

 

12、假设x = 1,那么运行5x = x + 2后,x 的值是什么

 

① 6                ② 8                 ③ 10            ④ 11

 

13、下面哪段程序会打印 0a1a2a3a4a ?      

 

c = 0

while c < 5:

print(c)

c = c + 1

c = 0

while c < 5:

print(c,end=’a’)

c = c + 1

c = 10

while c < 5:

print(‘a’)

c = c + 1

 

14、下面哪段程序的运行结果是一个田字?     

 

import turtle

while True:

c = 0

while c < 4:

turtle.fd(100)

turtle.right(90)

c = c + 1

turtle.right(90)

import turtle

while True:

c = 0

while c < 8:

turtle.fd(100)

turtle.right(45)

c = c + 1

turtle.right(90)

import turtle

while True:

c = 0

while c > 4:

turtle.fd(100)

turtle.right(90)

c = c – 1

turtle.right(90)

 

15、下面哪段程序运行的结果不是打印一行 0123456789 ?     

 

c = 0

while c < 10:

print(c)

c = c + 1

c = 0

while c < 20:

print(c,end=”)

c = c + 1

if c >9 : break

print(‘0123456789 ‘)

 

 

二、编程题:

 

16、编制程序,发挥想像力,让海龟绘制一幅彩色图案。(把编制的程序取名为“ 姓名.py”,保存在电脑桌面上。

发表在 python | Python电子试卷1已关闭评论

模块化编程概述与拦球游戏源码与教程

pygame ping pong game 拦球游戏

pygame ping pong game 拦球游戏


在上一节中,我们设计了Ball类。如果程序中还要设计其它类,那么程序就会越来越长。我们使用过from turtle import Turtle这样的代码,它是把Turtle类从海龟模块导入进来的意思。那么,我们也可以来一个from ball import Ball命令导入Ball类。这就需要建立ball.py模块。接下来我们还要建一个Board类。它用来生成一个拦板,以便拦球,让小球们反弹。这个Board类也放在一个单独的叫board.py的模块中。最后就是主程序模块了,一般把它叫main.py。不过,在这里为了便于描述,直接把它叫“拦球动画.py”了。

在本节的Ball类,依旧设计speed属性代表球的水平速度和垂直速度,它是一个列表。不同于上一节的Ball类。由于新建了拦板类,为了让每一个球都能访问拦板,所以给球类增加了一个叫board的参数。还增加了当球碰到拦板的方法,名叫bounce_on_board。在每次update球后,都会调用它,判断一次球是否碰到了拦板。如果碰到了,就让它的垂直速度反向。

球碰到拦板的原理,我们这里不做讨论。我们直接调用了pygame.sprite子模块提供的collide_rect命令判断两个角色是否发生碰撞。很显然,这是通过判断矩形是否重叠实现的。以下是整个拦球游戏的源代码。

如需要查看完整源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 模块化编程概述与拦球游戏源码与教程已关闭评论

酷酷的爆炸效果类_Pygame版

酷酷的爆炸效果类_Pygame版
用pygame实现的爆炸效果,游戏中经常要用到的。下面是部分代码预览:

"""
   酷酷的爆炸效果类
"""
import time
import pygame
from random import randint
from pygame.locals import *

class Explosion(pygame.sprite.Sprite):
    """
       爆炸效果类,继承自Sprite
    """
    def __init__(self,pos,frames,interval,group):
        """
           frames:帧图,interval:帧播放间隔时间
        """
        pygame.sprite.Sprite.__init__(self)
        self.frames = frames

    def set_costume(self):
        """设置造型"""
        self.image = self.frames[self._index]
        self.rect = self.rects[self._index]

    def update(self):
        """
           如果超时了,就切换到下一个造型
        """


def main():
    """
       主调用函数,本函数新建screen,
       每隔一定时间产生一个爆炸效果
    """
    
    width,height = size = 960,720
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("酷酷的爆炸效果类Pygame版 by lixingqiu")

    images = [f"frames/{i}.gif" for i in range(6)]
    images = [pygame.image.load(im) for im in images]

    pygame.time.set_timer(USEREVENT,randint(10,100))
    clock = pygame.time.Clock()

    group = pygame.sprite.Group()    # 爆炸组
    running = True
    while running:
        e = pygame.event.poll()
        if e.type == QUIT:running = False

        group.update()
        screen.fill((60,0,160))
        group.draw(screen)
        pygame.display.update()
        clock.tick(60)
        
    pygame.quit()
    
if __name__ == "__main__":

    main()        

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 酷酷的爆炸效果类_Pygame版已关闭评论

pygame静态封面显示标准示例模块

python pygame cover游戏封面

python pygame cover游戏封面


这是用pygame制作的一个游戏封面。按任意键或单击鼠标会开始游戏。下面是部分代码预览:

"""
   碰彩球游戏的显示函数,本模块定义了display_cover函数和display函数。
"""
import pygame
from pygame.locals import *

def display_cover(cover_image):
    """
      显示封面程序,本程序显示一幅像,
      根据玩家是按窗口的退出按钮,
      还是按任意键来决定是否进入游戏。
      由于只是显示静态图形,所以在while
      循环中并没有必要时刻更新画面。
    """
    cover_image = pygame.image.load(cover_image)
    size = cover_image.get_size()
    screen = pygame.display.set_mode(size)
    pygame.display.set_caption("pygame静态封面显示标准示例模块by lixingqiu")
    clock = pygame.time.Clock()
    screen.blit(cover_image,(0,0)) # 渲染screen上
    pygame.display.update()        # 显示刷新
    enter_game = True              # 进入游戏标志     
    running = True
 
    while running:
        for event in pygame.event.get():
            if event.type == QUIT: # 按关闭按钮将不进入游戏
                running=False
                enter_game = False
            if event.type in (KEYDOWN,MOUSEBUTTONDOWN):
                running=False                
    
def display(screen,image):
    """
       本函数只是显示一个image,
       直到按窗口关闭按钮才会退出Pygame,
       由于显示静态图形,没必要在循环中不断刷新显示。
    """
    ...............................................
    while not pygame.event.get(QUIT): clock.tick(10)
    pygame.quit()
    
if __name__ == "__main__":

    screen = display_cover("images/gingerbread.png")
    print(screen)
    # 下面根据screen的值决定是否进入游戏
    # if screen : main()        

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame静态封面显示标准示例模块已关闭评论

最顶层的游戏框架设计代码_碰彩球游戏

python pygame success shell

python pygame success shell



下面是部分代码预览:

"""
   最顶层的游戏框架设计代码,碰彩球游戏
"""
from ball import *
from cover import *

def start_game(screen):
    """
       screen是屏幕对象
       本函数生成游戏中的各个对象,进入游戏循环,
       返回游戏成功或失败的逻辑值
    """
    
def display(screen,image):
    """
       本函数只是显示一个image,
       直到按窗口关闭按钮才会退出Pygame
    """
    image = pygame.image.load(image)
    screen.blit(image,(0,0))    
    while not pygame.event.get(QUIT):pass
    pygame.quit()

def main():

    cover_image = "images/gingerbread.png"
    screen = display_cover(cover_image)

    if screen == None: return
    
    success = start_game(screen)
    if success:
        image = "images/success.png"
    else:
        image = "image/fail.png"

    display(screen,image)    
        
if __name__ == "__main__":

    main()
        

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 最顶层的游戏框架设计代码_碰彩球游戏已关闭评论

新的文化叫编程_振撼的自我介绍多媒体动画演示_屏幕中央启动center

"""
   这次把上次编写的代码又稍微改进了一下,做成了一个自我介绍的多媒体视频。音效效果可是相当的振撼哟,坚定信念_Python无敌。
   亮点,部分采用了“中文”编程!还有就是每次启动窗口一定在屏幕中央,并且没有边框。
"""
import pygame    
import os
import winsound
from pygame.locals import *

class Dream():
    info =[ '李兴球简介',
            '生于1976年9月',
            '祖籍江西萍乡福田镇双源村',
            '高中时代开始学习编程',
            '2010年开始致力于儿童编程的普及',
            '曾在北京,杭州某教育集团做课程研发',
            '原创近千例编程案例,著有多部Python书籍',
            '有感于一线城市Python教师,亦是严重匮乏',
            '放弃一线城市高薪工作,回到老家萍乡',
            '致力于Python,人工智能语言的普及',
            '新的文化,叫编程! ',
            '新的旅程,已开始',
            '谢谢大家,本视频用Python编程制作。',
            '坚定信念,Python无敌',
            '做学问,我选Python,你呢?'
            ]
    tips = []
    tips_index = 0
    tips_amounts = len(info)
    def __init__(self,size):
        """
           size:屏幕大小
        """
        self.width = size[0]
        self.height = size[1]        
        self.screen = pygame.display.set_mode(size,NOFRAME,0)
        self.clock = pygame.time.Clock()
        self.end = False
        self.title("做学问,我选Python,你呢?")
        self.myfont = pygame.font.Font("msyh.ttf",42)
        for string in Dream.info:
            tip = self.myfont.render(string,True,(0,255,255))
            tip_width = tip.get_width()
            tip_render_pos = (self.width//2  - tip_width//2 ),200
            Dream.tips.append([tip,tip_render_pos])
        
    def title(self,title):
        pygame.display.set_caption(title)
        
    def playmusic(self,wavfile,loop = True):
        """播放背景音乐,loop为非零值表示重复播放,其它为播放一次"""
        try:
           if loop :
              winsound.PlaySound(wavfile,winsound.SND_ASYNC|winsound.SND_LOOP)  # 循环异步播放
           else:            
              winsound.PlaySound(wavfile,winsound.SND_ASYNC)                    # 异步播放一次
        except:
            pass        
        
    def 成真(self):
        self.end = True
        try:
            pygame.quit()
        except:
            pass
    def fadeshow(self,imagefile,speed=1,time=3):
        """淡入淡出显示图像,参数说明:
           imagefile:图像文件
           speed:速度,1-255的值
           time:显示时间,秒为单位
           
        """
        if not os.path.exists(imagefile):return
        extname = os.path.splitext(imagefile)[-1]
        extname =  extname.lower()[1:]
        if not extname in ('jpg','jpeg','png','gif','bmp','pcx','tga','tif','lbm','pbm','pgm','ppm','xpm'):return
        speed = abs(speed)
        time = int(time)
        picture = pygame.image.load(imagefile)

        self.tip = Dream.tips[Dream.tips_index][0]
        self.tip_render_pos = Dream.tips[Dream.tips_index][1]
        
        Dream.tips_index = Dream.tips_index + 1
        Dream.tips_index = Dream.tips_index % Dream.tips_amounts
        
        
        "淡入的代码段,通过设置透明度实现"
        for i in range(0,256,speed):             # 从0到255变化,0 是全透明,255是不透明.
            self.clock.tick(60)
            event = pygame.event.poll()          # 加这个不会有无响应
            if event.type == QUIT:self.成真();return
            picture.set_alpha(i)                 # 设置透明度
            self.screen.fill((0,0,0))            # 渲染screen为黑色
            self.screen.blit(picture,(0,0) )     # 在screen上画picture                              
            self.screen.blit(self.tip,self.tip_render_pos)
            pygame.display.flip()                # 更新显示
        "这个for循环是等待一定的时间"
        for i in range(60 * time):               # 由于fps是60,即1/60秒显示一幅画,所以重复的次数要乘以60
            self.clock.tick(60)
            event = pygame.event.poll()
            if event.type == QUIT:self.成真();return
            self.screen.fill((0,0,0))
            self.screen.blit(picture,(0,0) )
            self.screen.blit(self.tip,self.tip_render_pos)
            pygame.display.flip()
        "淡出的代码段"
        for i in range(255,-1,-speed):           # 从255到0
            self.clock.tick(60)                  # 设置fps为60
            event = pygame.event.poll()          # 获取一个事件
            if event.type == QUIT:self.成真();return # 如果是退出事件,就退出
            picture.set_alpha(i)                 # 设置图像透明度
            self.screen.fill((0,0,0))
            self.screen.blit(picture,(0,0) )     # 把picture画在screen上
            self.screen.blit(self.tip,self.tip_render_pos)
            pygame.display.flip()                # 更新显示
  

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 新的文化叫编程_振撼的自我介绍多媒体动画演示_屏幕中央启动center已关闭评论

Pygame音乐播放器原理_利用音乐结束事件循环播放多首音乐


利用pygame开发音乐播放器的核心代码,下面是部分代码预览:

"""
   利用音乐结束事件循环播放多首音乐.py ,
   本程序在播放完一首音乐后,会自动触发音乐结束事件。
   在下面的代码中会不断地判断是否这一事件发生。
   如果发生了,那么就让列表索引增加1,播放下一首音乐。   
"""

import pygame
from pygame.locals import *

pygame.init()
 
screen = pygame.display.set_mode((100,100))
pygame.display.set_caption("利用音乐结束事件循环播放多首音乐")
 
music_list = ['纯音乐.mp3','凤飞飞 - 玫瑰玫瑰我爱你.mp3','喵.wav']
music_amounts = len(music_list)
music_index = 0

running = True
while running:
     
    for event in pygame.event.get():   # 迭代每个事件
        if event.type == pygame.QUIT:  # 如果单击了关闭按钮
            running = False 
 
    # 由于不需要显示什么,所以显示代码略  
    clock.tick(10)                    # 设置fps为10
 
pygame.quit()

 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | Pygame音乐播放器原理_利用音乐结束事件循环播放多首音乐已关闭评论

Pygame的脏角色类可见性测试

Sprite类是用于在游戏设计中,作为各个对象的基类的。一个继承自Sprite的类一定要有
image和rect属性,rect由image.get_rect命令来获取,用来代表image的坐标和宽高。
另外,如果要实现像素级的更加完美的碰撞检测,那么要加一个mask属性,它通常能过pygame.mask.from_surface 来创建。
一个角色应该在一个组当中,这样便于高效的集体操作角色。
当子类化Sprite时,不要忘了对父类进行初始化。
在官方文档中有一个继承自Sprite的DirtySprite类,字面意思为脏角色类,今天来测试下。
官方文档为:
http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.DirtySprite

"""
   Pygame的脏角色类可见性测试.
   在官方的Pygame说明了,有一个pygame.sprite.DirtySprite类,
   它是继承自Sprite的一个子类,只是多加了一些属性,
   其中有dirty属性,默认值为1,表示被渲染后又会被设置为0
   值为2时,表示每帧都渲染,值为0时不是dirty的,并且不会被渲染.
   还有一个可见性属性叫visible,值为1时,表示会渲染,值为0时表示
   不会渲染,下面的程序设置了相关属性,可是好像并没有什么用.
   难道还是要自己写if来判断要不要渲染,那定义DirtySprite类有什么用?
     
"""
import pygame
from pygame.locals import *

class Block(pygame.sprite.DirtySprite):
     #  方块类,继承自DirtySprite
    def __init__(self, color, pos,width, height):
       # 调用父类的构造方法
       pygame.sprite.Sprite.__init__(self)

       # 创建图形,填充颜色
       # 也可以从磁盘中加载一幅图像
       self.image = pygame.Surface([width, height])
       self.image.fill(color)

       # 获取它的矩形对象,以后就能通过修改rect的属生从而移动方块
       self.rect = self.image.get_rect(topleft=pos)
 
       self.dirty = 0        # 每帧渲染
       self.visible = 0      # 可见

screen = pygame.display.set_mode((480,360))
pygame.display.set_caption("Pygame的脏角色类可见性测试")

g = pygame.sprite.Group()    # 新建组
red = Block((255,0,0),(50,50),100,100)
green = Block((0,255,0),(150,150),50,50)
g.add(red)                   # 在组中添加red方块
green.add(g)                 # 把green方块添加到组

running = True
while running:
     for event in pygame.event.get():
          if event.type == QUIT:running=False

     screen.fill((128,23,133))
     g.draw(screen)           # 渲染组中的方块
     pygame.display.update()

pygame.quit()

 

发表在 pygame, python | Pygame的脏角色类可见性测试已关闭评论

用到了勾股定理的简易圆形图章图形

"""
   用到了勾股定理的简易海龟图章图形
"""

from turtle import *
from random import *

radius = 200
colors = ['red','orange','yellow','green',
          'cyan','blue','purple','pink',
          'brown','magenta','gray']

t = Turtle(shape='turtle')
screen = t.getscreen()
screen.delay(0)
t.penup()

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 python, turtle | 用到了勾股定理的简易圆形图章图形已关闭评论

pygame简易迷宫游戏_mask应用示例程序

Pygame简易迷宫游戏by lixingqiu
用pygame制作的迷宫小游戏。像这类碰撞检测用mask最好。下面是部分代码预览:

"""
   简易迷宫游戏。本程序演示一个非常简单的迷宫游戏原理。
   采用mask进行碰撞检测,并且会打印出碰撞点的像素值。
"""
import pygame
from pygame.locals import *

RED = (255,0,0)
GREEN = (0,255,255)
w,h, = size = 779,765
pygame.init()
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Pygame简易迷宫游戏by lixingqiu")
# 创建迷宫
maze = pygame.image.load("maze.png")
rect1 = maze.get_rect()
mask1 = pygame.mask.from_surface(maze)

# 创建角色
radius2 = 5
width2,height2 = 2 * radius2,2 * radius2
sprite = pygame.Surface((width2,height2),SRCALPHA)
pos = width2//2,height2//2                # 画圆中心坐标
rect2 = sprite.get_rect(center=(w//2,h//2))
pygame.draw.circle(sprite,GREEN,pos,radius2)
mask2 = pygame.mask.from_surface(sprite)
dx = 0
dy = 0
running = True

while running:
    for event in pygame.event.get():
        if event.type == QUIT:running=False
        if event.type == KEYUP:
            dx ,dy = 0, 0
    keys = pygame.key.get_pressed()
    if keys[K_UP]   : dx = 0 ; dy = -2
    if keys[K_DOWN] : dx = 0 ; dy =  2
    if keys[K_LEFT] : dx = -2 ; dy = 0
    if keys[K_RIGHT] : dx = 2 ; dy =  0
    rect2.move_ip(dx,dy)

    offset = rect1.x - rect2.x ,rect1.y - rect2.y # 计算偏移值
    p = mask2.overlap(mask1,offset)               # 计算是否重叠
    
    if p:
        pos = rect2.x + p[0],rect2.y + p[1]       # 碰撞点坐标
        pygame.display.set_caption(str(p) + ",碰撞点坐标:" + str(pos))
        print("碰撞点RGB值:", maze.get_at(pos))# 检测像素值,如果是绿色则结束!
        rect2.move_ip(-dx,-dy)                   # 退回原处,所以不能穿墙
    else:
        pygame.display.set_caption('没有碰撞')
    screen.fill((255,255,255))
    screen.blit(maze,rect1)
    screen.blit(sprite,rect2)    
    pygame.display.update()
pygame.quit()
 

下载完整源代码与素材,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 标签为 , , | pygame简易迷宫游戏_mask应用示例程序已关闭评论

pygame遮罩mask的本质


为了表示一张图片透明度分布情况,每个像素都多加了一个alpha值。所以我们常常看到用4元组表示的像素值。 即,在一个每像素透明度的surface中。像素值表示为(r,g,b,a)。如果a 的值为0,那么这个像素点渲染到其它surface上时将不会渲染。如果值为255,那么这个像素点将完全渲染到另一个surface上。如果介于0到255之间,则按比例进行渲染,从而我们就能看到半透明效果。

在Pygame模块中有遮罩这个概念,它的英文为mask,也可以叫做掩膜。它的设计目的是用来进行像素级别的碰撞检测的。我们把能接受“碰撞”的地方的mask的位设置为True,即1,把不能授受“碰撞”的mask的位设置为0。那么哪些地方能接受碰撞? 我们规定,透明的地方不接受碰撞,不透明的地方才接受碰撞。所以通过分析alpha值就能设置一张图片每个像素的mask值了。如果一张图片不是每像素模式,那么它可能设置了colorkey颜色。如果这个颜色和colorkey颜色相同,那么就把mask位设置为0,否则为1。为了获取每个位置的mask值,Pygame提供了get_at命令来得到位值或set_at命令来设置位值。它们的使用方法和surface几乎一样,在此不再赘述。我们可以把mask想像成蒙在图像上的薄膜,当然,透明的地方是不会蒙的。surface有宽高,所以mask也有宽高。

默认情况下,所谓的透明的地方指的是alpha值小于等于127。不透明的地方指的是alpha值大于127。这个127是一个阈值。在Pygame中有pygame.mask.from_surface命令。它能从一个surface创建一个mask。这个命令有两个参数,第一个就是surface,第二个是threshold,即阈值。如果一个surface所有像素的alpha值都是60,表示了这张图是一张比较透明的图。但由于在使用pygame.mask.frame_surface命令创建mask时把threshold设为了50,所以它的每一个mask位仍会被设置为1。这个“门槛”可真有点低啊。下面我们编个程序,实践一下。

下面还有好长好长好长,如需要查看完整教程及源代码,请

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame遮罩mask的本质已关闭评论

pygame鼠标移动蓝色圆形mask动态碰撞检测示例程序

"""
   鼠标移动蓝色圆形动态碰撞检测示例程序。
   本例是用基于mask的overlape命令,从而检测出两个圆形有没有碰撞的。
"""
import pygame
from pygame.locals import *

red = (255,0,0)
blue = (0,0,255)
w,h, = size = 480,360
pygame.init()
screen = pygame.display.set_mode(size)

# 创建大的圆环
radius1 = 50
width1,height1 = 2*radius1,2*radius1
hollow_circle = pygame.Surface((width1,height1),SRCALPHA)
pos = width1//2,height1//2                # 画圆中心坐标
rect1 = hollow_circle.get_rect(center=(w//2,h//2))
pygame.draw.circle(hollow_circle,red,pos,radius1,10)
mask1 = pygame.mask.from_surface(hollow_circle)

# 创建小的实心圆
radius2 = 10
width2,height2 = 2 * radius2,2 * radius2
solid_circle = pygame.Surface((width2,height2),SRCALPHA)
pos = width2//2,height2//2                # 画圆中心坐标
rect2 = solid_circle.get_rect(center=(w//2,h//2))
pygame.draw.circle(solid_circle,blue,pos,radius2)
mask2 = pygame.mask.from_surface(solid_circle)

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame鼠标移动蓝色圆形mask动态碰撞检测示例程序已关闭评论

最简基于mask的overlap命令检测图形冲突

"""
   创建圆环和实心圆,把它们渲染到screen上的同一个坐标。
   这样,小圆是在大圆里面,它们是没有碰撞在一起的。
   本例是用基于mask的overlape命令,从而检测出它们是没有重叠的。
"""
import pygame
from pygame.locals import *

red = (255,0,0)
blue = (0,0,255)
w,h, = size = 480,360
pygame.init()
screen = pygame.display.set_mode(size)

# 创建大的圆环
radius1 = 50
width1,height1 = 2*radius1,2*radius1
hollow_circle = pygame.Surface((width1,height1),SRCALPHA)
pos = width1//2,height1//2                # 画圆中心坐标
rect1 = hollow_circle.get_rect(center=(w//2,h//2))
pygame.draw.circle(hollow_circle,red,pos,radius1,10)
mask1 = pygame.mask.from_surface(hollow_circle)
screen.blit(hollow_circle,rect1)

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | 最简基于mask的overlap命令检测图形冲突已关闭评论

pygame的mask阈值设定示例程序

"""
   mask阈值设定示例程序
   从surface创建mask的时候能设置阈值,小于等于阈值的像素的mask位将被设定为0。
   表示不接受碰撞检测。
"""
import pygame

pygame.init()
screen = pygame.display.set_mode((480,360))

width,height = 50,50
x1,y1 = 100,100
sur1 = pygame.Surface((width,height)).convert_alpha()
sur1.fill((255,100,100,60))                 # 60是透明度
sur1_rect = sur1.get_rect(topleft=(x1,y1))  # 获取矩形并定位

成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)

发表在 pygame, python | pygame的mask阈值设定示例程序已关闭评论