python动态字幕之漂亮的女孩家乡的自我介绍

本程序显示一个动态的文字显示字幕,让女孩进行自我介绍,用的是海龟画图模块

"""本程序显示一个动态的文字显示字幕,让女孩进行自我介绍"""

from turtle import Turtle,Screen
from time import sleep

def init_screen(width,height,title,picture):
    """新建屏幕对象,参数说明:
    width:宽度
    height:高度
    title:标题
    picture:背景图(png)
    """
    screen = Screen()
    screen.title(title)
    screen.setup(width,height)
    screen.bgpic(picture)
    screen.delay(0)
    return screen

def make_sprite(image,x,y):
    """显示角色,参数说明:
    image:角色的造型图片,gif
    x,y:坐标
    """
    t = Turtle(visible=False)
    t.penup()
    t.shape(image)
    t.goto(x,y)
    t.showturtle()

def draw_frame(t,startpos,endpos,thickness,color):
    """画框,参数说明:
    t:海龟对象
    startpos:起始坐标
    endpos:结束坐标
    thickness:比触宽度
    color:颜色
    """
    x1,y1 = startpos
    x2,y2 = endpos


def say_sentence(t,startpos,sentence):
    """写文字,参数说明:
    t:海龟对象
    startpos:起始位置
    info:要写的文字
    """


if __name__ == "__main__":

    all_sentences = ["Hello,我是女黑客。","我也是绿色和平组织的人","我是一个中国人,我的家在江西萍乡。","我家有武功山,孽龙洞等非著名旅游景点。"]
    title = "自我介绍_by_李兴球"
    screen_width,screen_height = 1280,960
    back_image = "古风素材--122_.png"
    sprite_image = "Fate_stay_night.gif"
    screen = init_screen(screen_width,screen_height,title,back_image)
    screen.addshape(sprite_image)
    screen.update()

    sleep(1)
    write_turtle = Turtle(visible=False)                        # 在框内写字的海龟对象
    write_turtle.penup()
    write_turtle.color("brown")
   
    screen.mainloop()   
    

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

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

发表在 python, turtle | python动态字幕之漂亮的女孩家乡的自我介绍已关闭评论

砸蛋小游戏

python的turtle制作的砸蛋游戏原型

以下是部分代码预览:

"""
   砸蛋小游戏.py
   本程序单击蛋蛋后会有道具出现。
"""

import pygame,glob
from turtle import *
from random import choice,randint

class Prop(Turtle):
    """道具类,当砸到蛋蛋时,生成一个它的实例"""
    def __init__(self,image,position):
        """images:造型图,position:坐标"""
        Turtle.__init__(self,visible=False)  # 初始化时不可见
        self.penup()                         # 不需画所以抬笔
        self.shape(image)                    # 设定道具造型
       
        
    def move(self):
        """在屏幕范围内不断移动直到超出范围"""
        self.fd(20)
       
     
class Egg(Turtle):
    def __init__(self,images,position,sound,propimgs):
        """images:造型图,position:坐标,
           sound:音效,propimgs:道具图表"""
       Turtle.__init__(self,visible=False)
        self.propimgs = propimgs             # 道具图形表        
        self.images = images                 # 造型列表
        self.index = 0                       # 造型索引号
        self.sound = sound                   # 音效
        self.penup()                         # 抬笔
        self.goto(position)                  # 定位置
        self.shape(images[0])                # 初始为第一个造型       

        
    def open(self,x,y):
        """切换到打开蛋蛋的造型"""
        self.onclick(None)                   # 取消onclick的绑定
        
    def delay_close(self):
        """延时把蛋蛋关闭,模拟异步执行,防止程序阻塞"""
          

if __name__ == "__main__":

    width,height = 480,360                   # 定义宽高
    propimgs = glob.glob("gif/*.gif")        # 道具列表    
    eggimgs =['images/造型1.gif','images/造型2.gif']
    
    screen = Screen()                        # 新建屏幕
    screen.delay(0)                          # 延时为0
    screen.title("砸蛋小游戏")               # 设置标题
    screen.setup(width,height)               # 设置宽高
    screen.bgpic("images/stage.png") 
    [screen.addshape(im) for im in eggimgs]  # 增加蛋蛋造型
    [screen.addshape(im) for im in propimgs] # 增加道具造型

    pygame.mixer.init()                      # 初始化混音器
    bgmusic = "audio/8-Bit Numa Numa.wav"
    pygame.mixer.music.load(bgmusic)         # 加载背景音乐
    pygame.mixer.music.play(-1,0)            # 循环播放音乐
    thd = "audio/THUNK.wav"
    clickedsnd =pygame.mixer.Sound(thd)      # 生成音效对象

    cors = [(0,0),(-150,-50),(150,-50)]      # 下行是生成仨个蛋
    [Egg(eggimgs,xy,clickedsnd,propimgs) for xy in cors] 
    
    screen.mainloop()    
        

 

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

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

发表在 python, turtle | 砸蛋小游戏已关闭评论

跟着鼠标指针前进的左右造型的鱼

python水波纹模拟和跟着鼠标指针前进的左右造型的鱼
以下是部分代码预览:

'''水波纹模拟和跟着鼠标指针前进的左右造型的鱼.py '''
import math
from turtle import Turtle,Screen     # 导入Turtle类和Screen命令
from random import randint

def follow_mouse(event):
    """本函数让小海龟面朝鼠标指针移动
       由于海龟画图的坐标和tkinter画布原生坐标不一样,所以要进行坐标转换。
    """
    x = event.x - width//2                   # 转换成海龟坐标系中的x坐标
    y = height//2 - event.y                  # 转换成海龟坐标系中的y坐标
    dy = y - fish.ycor()
    dx = x - fish.xcor()
    

def animate_fish():
    """鱼切换造型"""
    
def animate_screen():
    """背景切换"""

if __name__ == "__main__":

    bg_index = 0
    width,height = 800,600
     
    fish_right_images = ["images/fish_right0.gif","images/fish_right1.gif"]
    fish_left_images = ["images/fish_left0.gif","images/fish_left1.gif"]

    fish_right_images = ["fishs/" + "0" * (4-len(str(i))) + str(i) +".gif" for i in range(1,9)]
    fish_left_images = ["fishs/" + "0" * (4-len(str(i))) + str(i) +"-.gif" for i in range(1,9)]
    
    fish_images = [fish_left_images,fish_right_images]
    
    #waveimages = ["waves/" + (4-len(str(i))) * "0" + str(i) + ".png" for i in range(1,21)]
    waveimages = [f"waves/{i:04d}.png" for i in range(1,21)]
    bg_amounts = len(waveimages)
    
    screen = Screen()
    screen.title('跟着鼠标指针移动_by李兴球')     # 写上窗口标题
    screen.setup(width,height)           # 设定窗口大小     
    screen.delay(0)
    [screen.addshape(image) for image in fish_right_images]  
    [screen.addshape(image) for image in fish_left_images]



    fish = Turtle(shape = "turtle")
    fish.penup()     
    fish.speed(0)
    fish.left_right = 0                       # 用左边的图还是右边的图,0左,1右
    fish.images = fish_right_images           # 初始用右边的一系列图
    fish.costume_index = 0                    # 自定义一个属性,用于造型切换索引
    fish.costume_amounts = len(fish_right_images) # 一个方向的造型数量,两个方向是一样的数量
    animate_fish()
    animate_screen()
    screen.cv.bind("<Motion>",follow_mouse)   # 画布绑定鼠标移动事件
    screen.mainloop()

下载完整源代码与素材,本压缩包里面有好多版本及附属程序,请

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

发表在 python, turtle | 跟着鼠标指针前进的左右造型的鱼已关闭评论

python海龟画图制作的漂亮的下雪场景动画效果冰雪奇缘


以下是部分代码预览:

"""本程序模拟雪花下雪效果,有一个漂亮的序幕,窗口会越放越大..."""

from turtle import *
from time import sleep  

def make_snow_shape(length):
    """定义米字型的形状,然后注册到形状列表"""
    turtle = Turtle(visible=False )
    turtle.begin_poly()
    for i in range(8):
        turtle.fd(length)
        turtle.bk(length)
        turtle.right(45)
    turtle.end_poly()
    p = turtle.get_poly()
    turtle.screen.addshape("snow",p)
    turtle.clear()

screen = Screen()
screen.title("冰雪奇缘_雪花飞舞_by_www.lixingqiu.com")
screen.delay(0)
make_snow_shape(5)                   # 定义雪花形状
screen.setup(width,height)
screen.bgcolor("black")

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

发表在 python, turtle | python海龟画图制作的漂亮的下雪场景动画效果冰雪奇缘已关闭评论

重复之美.py 用circle画酷炫的圆环

单击彩圆重复之美.py 用circle画酷炫的圆环

以下是部分代码预览:

'''重复之美.py 用circle画酷炫的圆环'''

from turtle import Turtle     #导入海龟类
from random import randint
from coloradd import * 

def draw(x,y):
    """画一个彩色的圆圈"""
    global color
    t.goto(x,y)

if __name__ == "__main__":
    
    color = (255,0,0)               # RGB红色元组

    t = Turtle(visible=False)       # 新建海龟

    t.screen.title('风火轮编程')   # 写上窗口标题
    t.screen.setup(800,600)         # 设定窗口大小
    t.screen.bgcolor('black')       # 背景颜色为黑
    t.screen.colormode(255)         # 颜色模式为RGB255 

    t.pensize(4)                    # 画笔的笔迹大小为4
    t.screen.onclick(draw)
    t.screen.tracer(0) 
    t.screen.mainloop() 

如需要查看完整代码,请

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

发表在 python, turtle | 重复之美.py 用circle画酷炫的圆环已关闭评论

编程就像搭积木


"""编程就像搭积木,本程序定义若干个函数,演示模块式编程方法"""

from turtle import *

def init_screen():
    """初始化屏幕对象"""
    s = Screen()
    s.setup(480,360)
    s.delay(0)
    s.title("画多边形")
    s.bgcolor("black")
    return s

def generate_turtle():
    """生成海龟对象"""
    t = Turtle()
    t.pensize(2)
    t.color("white","white")
    return t
    
def  draw_polygon(colorlist,海龟,边数,边长):
     """画多边形"""
     if  边数<3 or 边长==0:return
     amounts = len(colorlist)
     angle = 360/边数
     for i in range(边数):
         海龟.color(colorlist[i%amounts])
         海龟.fd(边长)
         海龟.rt(angle)
         
def main():
    """主程序"""
    
    colorlist = ['red','orange','yellow','green','cyan','blue','purple','pink']
    screen = init_screen()                       # 初始化屏幕对象
    g = generate_turtle()                        # 产生海龟对象
   
    for number in range(3,10):
       draw_polygon(colorlist,g,number,50)       # 画正多边形       
        

"如果不是作为模块导入而运行,那么就运行main函数。" 
if __name__ == "__main__":

    main()     
    

 

发表在 python, turtle | 编程就像搭积木已关闭评论

Python游戏编程之Arcade模块介绍之角色类鼠标控制

  • 1、arcade含义

  • 2、Arcade模块简介与安装

  • 3、Arcade简单样本程序介绍

  • 4、Arcade模块中的角色类

  • 5、Arcade鼠标控制角色移动

  • 一、arcade英文含义

  • 英文arcade是游乐中心、商场、拱廊的意思。arcade游戏就是街机游戏的意思。下面是在bing搜索arcade的结果。
  • bing的arcade搜索结果
  • 二、 Arcade模块简介与安装

  • 1、简介: Arcade模块是Paul Vincent Craven 开发的一个用于制作2D街机游戏的模块。开发者是美国爱荷华州一所学院的教授。他已经教了10多年的Pygame编程。他说Pygame很伟大,但在教的过程中总要去解释为什么y坐标是反的。还有诸如事件循环event loop这些其实是不需要的等等。

    (来源https://opensource.com/article/18/4/easy-2d-game-creation-python-and-arcade)

    所以他就开发了Arcade模块,这个模块能非常简单地用Python创建2D游戏。坐标系也和数学中的坐标系一样,并且内置物理引擎。把它应用在少儿编程教学领域尚没见过。

    2、安装方法: pip install arcade

    目前最新版本是2.07。安装完后,如果在IDLE中导入时出现提示缺少pyglet-ffmpeg模块,则需要再次用pip命令安装:pip install pyglet-ffmpeg –user。

  • 三、Arcade简单样本程序介绍1

  • 游戏基本逻辑介绍 Arcade的作者提供了很多实例以供方便学习。在这些实例中,大多数都有一个叫MyGame的类。这个类是继承自arcade.Window类。这个是游戏的最顶层类。

    在MyGame类中,除了__init__方法外还有setup方法。它的存在是对游戏进行设置的。之所以定义这个方法是由于游戏结束后如果要重新开始或者进入下一关的时候可以再次调用setup方法,以对游戏进行再次初始化。

    MyGame类中还有update和on_draw与按键检测等方法。 通常来讲,通过按键检测可以对游戏中角色的坐标与方向进行更新后。然后调用update方法来真实体现这个更新。最后需要重画角色。我们只要在相应的方法中写代码即可。

    游戏的交互体现在按键检测,从而改变坐标,最后重画角色的图片来显示游戏的最新画面。在pygame中通常有一个游戏循环 ,我们需要手工来渲染画面。而在arcade中也有游戏循环。不过它只有一条语句,那就是arcade.run()。这个run会不断地调用按键检测方法们和update方法与on_draw方法,从而实现游戏循环。这就是游戏基本的逻辑。

  • Arcade简单样本程序介绍2
  • 四、 Arcade模块中的角色类1

  • 1arcade.Sprite Arcade模块对角色类进行了封装。角色类是可以直接实例化使用。它不像pygame中的Sprite类一样,必需自己写子类才能实例化一个角色。

    最简单的实例化一个角色只要用以下代码即可:

    bird = arcade.Sprite(“bird.png”)

    当某个事件发生时,比如鼠标移动事件,它的方法名是on_mouse_motion。我们只要写自己的代码即可。如,下面的代码会更新bird的坐标,这样当我们移动鼠标时就能控制它的移动。

    def on_mouse_motion(self, x, y, delta_x, delta_y):

    “”” 当鼠标移动时会自动地调用此方法 “””

    self.bird.center_x = x

    self.bird.center_y = y

  • 角色的坐标被改变,我们需要在update方法调用一次角色的update方法中真实的更新。最后还需要在on_draw方法中把它重画出来。这些都是在相应的方法中写上以下代码即可:def on_draw(self):

    “”” 渲染屏幕  ,帧率为60左右,即每60份之一秒会自动调用此方法  “””

    arcade.start_render()    # 此命令会用背景色填充屏幕,

    self.bird.draw()         # 重画小鸟

    def update(self, delta_time):

    “”” 所有的角色移动等游戏逻辑都在这里编写代码   “””

    self.bird.update()

五、鼠标控制角色移动的arcade样本代码

import arcade

SCREEN_WIDTH = 600                                           # 常量定义,屏幕宽度
SCREEN_HEIGHT = 480                                          # 常量定义,屏幕高度
SCREEN_TITLE = " 控制愤怒的小鸟_Arcade模版程序"              # 常量定义,屏幕标题

class MyGame(arcade.Window):
    """    继承自窗口类的游戏类,在具体的游戏中,重写以下方法,删除不需要重写的方法。    """

    def __init__(self, width, height, title):
        super().__init__(width, height, title)                #  调用父类的初始化方法新建一个窗口
        arcade.set_background_color(arcade.color.AMAZON)      #  设置背景颜色为亚马逊绿
        
    def setup(self):
        """ 这个方法是在实例化Mygame后对游戏进行一些设置。 """
        self.bird = arcade.Sprite("bird.png")        

    def on_draw(self):
        """ 渲染屏幕  ,帧率为60左右,即每60份之一秒会自动调用此方法  """        
        arcade.start_render()    # 此命令会用背景色填充屏幕,
        self.bird.draw()         # 重画小鸟

    def update(self, delta_time):
        """ 所有的角色移动等游戏逻辑都在这里编写代码   """
        self.bird.update()
    
    def on_mouse_motion(self, x, y, delta_x, delta_y):
        """ 当鼠标移动时会自动地调用此方法 """
        self.bird.center_x = x   # 把鼠标指针的x坐标设为角色中心点x坐标
        self.bird.center_y = y   # 把鼠标指针的y坐标设为角色中心点y坐标
        self.bird.scale = (x+y)/1000.0  #  越往右上角,角色越大
         
        

def main():
    """主要的函数"""
    game = MyGame(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)  #  实例化一个游戏
    game.setup()                                              # 对游戏进行设置
    arcade.run()                                              # 进入循环

if __name__ == "__main__":  
      main()

本人编写的更多arcade游戏与动画:http://arcade.academy/sample_games.html#lixingqiu-games

 

 

发表在 arcade | Python游戏编程之Arcade模块介绍之角色类鼠标控制已关闭评论

充满错误的Python海龟画图程序

"""代码除错.py  请去除下列代码中的错误。  
 
from tutrle import *                 
screen = Screen()                  
screen.Setup(800,600)
screen.bjcolor("lightgreen")          
screen.delay(0.1)
  
ta = turtle()                          
ta.shape("tutlre")                   
ta.color("darkcyan")             
ta.width("4")

print = 0                            
while counter < 20                   
   for i in ranger(4):                
   for i in ranger(10):              
         ta.fd(15) 
        ta.left(9)                   
      ta.stamp                       
      ta.right(180)
   ta.rt(18)
   print = print +1

print(print)                          

Screen.mainloop()

 

下面指出了错误

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

"""代码除错.py  请去除下列代码中的错误。 """"  # 多了一双引号
 
from tutrle import *                 # 类名错误

screen = Screen()                  # 小括号错误
screen.Setup(800,600)
screen.bjcolor("lightgreen")         # 方法名错误
screen.delay(0.1)
  
ta = turtle()                        # 类名错误         
ta.shape("tutlre")                   # 没有这个形状
ta.color("darkcyan")             
ta.width("4")

print = 0                            # 用常见命令做变量名
while counter < 20                   # 没有冒号
   for i in ranger(4):               # 应该是range
   for i in ranger(10):              # 应该是range 
         ta.fd(15) 
        ta.left(9)                   # 缩进错误
      ta.stamp                       # 忘了小括号(不会报错)
      ta.right(180)
   ta.rt(18)
   print = print +1

print(print)                         # 由于print被重定义,此处报错

Screen.mainloop()                    # 应该是screen.mainloop()

 

发表在 turtle | 充满错误的Python海龟画图程序已关闭评论

python的pygame制作的2D我的世界

这是本人去年按照一个英文教程制作的一个2D简单版本的Minecraft。代码非本人风格。今天看来,这代码可读性不好。仅以发表出来,以供有需要的人阅读。

"""游戏规则:
按空格键捡东西,按数字键放东西,按数字键同时单击鼠标左键合成物质
"""

import random
import pygame,sys
from pygame.locals import *

BLACK = (0,0,0)
BROWN = (153,76,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
WHITE = (255,255,255)

cloudx = -200
cloudy = 0

DIRT = 0
GRASS = 1
WATER = 2
COAL = 3
CLOUD = 4
WOOD = 5
FIRE = 6
SAND = 7
GLASS = 8
ROCK  = 9
STONE = 10
BRICK = 11
DIAMOND = 12

textures = {
           DIRT : pygame.image.load('dirt.png'),
           GRASS: pygame.image.load('grass.png'),
           WATER: pygame.image.load('water.png'),
           COAL : pygame.image.load('coal.png'),
           CLOUD: pygame.image.load('cloud.png'),
           WOOD : pygame.image.load('wood.png'),
           FIRE : pygame.image.load('fire.png'),
           SAND : pygame.image.load('sand.png'),
           GLASS: pygame.image.load('glass.png'),
           ROCK : pygame.image.load('rock.png'),
           STONE: pygame.image.load('stone.png'),
           BRICK: pygame.image.load('brick.png'),
           DIAMOND:pygame.image.load('diamond.png')
          }

inventory = {
               DIRT : 0,
               GRASS: 0,
               WATER: 0,
               COAL : 0,
               WOOD : 0,
               FIRE : 0,
               SAND : 0,
               GLASS: 0,
               ROCK : 0,
               STONE: 0,
               BRICK: 0,
               DIAMOND:0
            }

TILESIZE = 20
MAPWIDTH = 50
MAPHEIGHT = 20

PLAYER = pygame.image.load("player.png")
playerPos = [0,0]

resource = [DIRT,GRASS,WATER,COAL,WOOD,FIRE,SAND,GLASS,ROCK,STONE,BRICK,DIAMOND]

tilemap = [ [DIRT for w in range(MAPWIDTH)] for h in range(MAPHEIGHT) ]

for rw in range(MAPHEIGHT):
    for cl in range(MAPWIDTH):
        randomNumber = random.randint(0,20)
        if randomNumber == 0:
            tile = COAL
        elif randomNumber ==1 or randomNumber < 5:
            tile = WATER
        elif randomNumber >=5 and randomNumber <=6:
            tile = SAND
        elif randomNumber > 6 and randomNumber <9:
            tile = WOOD            
        elif randomNumber > 9 and randomNumber <11:
            tile = ROCK
        elif randomNumber > 11 and randomNumber <18:
            tile = GRASS          
        else:
            tile = DIRT
        tilemap[rw][cl] = tile
        
controls = {
             DIRT   : 49,           # 1键
             GRASS  : 50,
             WATER  : 51,
             COAL   : 52,
             WOOD   : 53,
             FIRE   : 54,
             SAND   : 55,           # 7键
             GLASS  : 56,           # 8键 
             ROCK   : 57,           # 9键
             STONE  : 48,           # 0键
             BRICK  : 45,           # -键 
             DIAMOND: 61            # =键
            }

"合成规则"
craft = {
           FIRE : { WOOD :2,ROCK : 2 }, # 两块木片和2块岩石合成一把火
           STONE: { ROCK :2},           
           BRICK : { STONE:2,FIRE : 1},
           SAND : { ROCK : 2 },
           GLASS: { FIRE :1,SAND : 2 },
           DIAMOND:{ WOOD:2,COAL : 3,GLASS:2 } 
         }
    
pygame.init()
DISPLAYSURF = pygame.display.set_mode((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE +50 ))

INVFONT = pygame.font.Font('FreeSansBold.ttf',18)
fpsClock = pygame.time.Clock()
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_RIGHT and playerPos[0] < MAPWIDTH  - 1:
                playerPos[0] +=1
            if event.key == K_LEFT and playerPos[0] > 0 :
                playerPos[0] -=1
            if event.key == K_UP and playerPos[1]>0:
                playerPos[1] -=1
            if event.key == K_DOWN and playerPos[1] < MAPHEIGHT -1 :
                playerPos[1] +=1
            if event.key == K_SPACE:                           # 按空格键捡东西
                currentTile = tilemap[playerPos[1]][playerPos[0]]
                inventory[currentTile] +=1
                tilemap[playerPos[1]][playerPos[0]] = DIRT     # 捡到东西后,变成地面了
                
            for key in controls:
                
                if (event.key == controls[key]):                    

                    if pygame.mouse.get_pressed()[0] :
                        print("单击左键")
                        if key not in craft :break             # 按的键代表某物质,不在合成表里则不合成
                        canBeMade = True                       # 假设能被合成
                        for i in craft[key]:
                            if craft[key][i] > inventory[i]:   # 合成所需的数量大于仓库中数量
                                canBeMade = False              # 无法合成
                                break
                        if canBeMade == True:                  # 如果能被合成
                            for i in craft[key]:               # 仓库中的每项都根据规则减去相应的数量
                                inventory[i] -= craft[key][i]  #
                            inventory[key] += 1                # 合成的这种物质数量加1 
                    else:
                        "按数字键放东西在史蒂夫所在的位置"
                        currentTile = tilemap[playerPos[1]][playerPos[0]]
                        if inventory[key] > 0:                 # 如果仓库中这种物质数量大于0
                            inventory[key] -= 1                # 那么数量减去1 
                            tilemap[playerPos[1]][playerPos[0]] = key  # 放到史蒂夫所在的位置
                            inventory[currentTile] += 1                # 仓库中相应数量加1

                    
    DISPLAYSURF.fill(BLACK)           
    for row in range(MAPHEIGHT):
        for column in range(MAPWIDTH):
            DISPLAYSURF.blit(textures[tilemap[row][column]],(column*TILESIZE,row*TILESIZE,TILESIZE,TILESIZE))

    DISPLAYSURF.blit(PLAYER,(playerPos[0]*TILESIZE,playerPos[1]*TILESIZE))
    
    DISPLAYSURF.blit(textures[CLOUD].convert_alpha(),(cloudx,cloudy))
    cloudx +=1
    if cloudx > MAPWIDTH * TILESIZE:
        cloudy = random.randint(0,MAPHEIGHT*TILESIZE)
        cloudx = -200

    placePosition = 10
    for item in resource:
        DISPLAYSURF.blit(textures[item],(placePosition,MAPHEIGHT*TILESIZE + 20))
        placePosition +=30
        textObj = INVFONT.render(str(inventory[item]),True,WHITE,BLACK)
        DISPLAYSURF.blit(textObj,(placePosition,MAPHEIGHT*TILESIZE+20))
        placePosition +=50
        
    pygame.display.update()
    fpsClock.tick(24)

发表在 pygame, python | python的pygame制作的2D我的世界已关闭评论

wxPython做UI的猜数小游戏

wxPython做UI的猜数小游戏
以下是部分代码预览:


import wx
from random import randint

game_title = "猜数小游戏 www.lixingqiu.com"
random_number = randint(1,100)
       
app = wx.App()                                                              
frame = wx.Frame(None,title = game_title ,pos = ( 1000,200),size = (300,240))        # 相对于屏幕左上角坐标

title_text = wx.StaticText(frame,-1,game_title,(80,30))
title_text.SetForegroundColour('blue')
title_text.SetBackgroundColour('gray')
font = wx.Font(16,wx.DECORATIVE, wx.ITALIC, wx.NORMAL)
title_text.SetFont(font)

answer_text = wx.TextCtrl(frame,pos = (30,90),size = (60,24))                        # 创建文本框,文件路径要自己输入

guess_button = wx.Button(frame,label = "猜猜",pos = (110,90),size = (50,24))         # 猜猜按钮
guess_button.Bind(wx.EVT_BUTTON,guess_number)                                        # 猜猜按钮绑定guess_number函数
 
explain_button = wx.Button(frame,label = "说明",pos = (170,90),size = (50,24))       # 说明按钮
explain_button.Bind(wx.EVT_BUTTON,explain_game)                                      # 说明按钮绑定explain_game函数
 
reset_button = wx.Button(frame,label = "重来",pos = (230,90),size = (50,24))         # 重来按钮
reset_button.Bind(wx.EVT_BUTTON,reset )                                              # 重来按钮绑定explain_game函数

tip_text= wx.TextCtrl(frame,pos = (30,140),size = (240,50),style=wx.TE_MULTILINE )
tip_text.SetValue("由计算机随机出一个1到100以内的数,猜猜它是多少?")
 
frame.Show()
app.MainLoop()

如需要查看完整代码,请

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

发表在 python | wxPython做UI的猜数小游戏已关闭评论

海龟画图版漂亮的猜数小游戏

以下是部分代码预览:


"""猜数小游戏.py"""

from random import randint
from turtle import *
from tkinter import messagebox

game_title = "猜数小游戏_作者:李兴球"
max_number = 100
min_number = 1 
number = randint(min_number,max_number)

screen = Screen()
screen.setup(800,533)
screen.bgpic("th.png")
screen.title(game_title)

messagebox.showinfo(game_title, "Hello,我是计算机,欢迎来到猜数小游戏。")
messagebox.showinfo(game_title, "我会生成一个从1到100以内的整数,你猜猜它是多少吧。")

screen.bye()
        

如需要查看完整代码,请

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

发表在 python, turtle | 海龟画图版漂亮的猜数小游戏已关闭评论

tkinter版漂亮的猜数小游戏


以下是部分代码预览:

"""背景图片  背景.png 400x200
   猜猜按钮图片 button_guess.png  100x44
   说明按钮图片 button_explain.png  100x44
   
"""
from tkinter import  messagebox
from tkinter import *
from PIL import ImageTk,Image
from random import randint

        
def explain():
    """单击‘说明’按钮弹出相关字符串。"""
    messagebox.showinfo(game_title, "Hello,我是计算机,欢迎来到猜数小游戏。\n\n我会生成一个从1到100以内的整数,你猜猜它是多少吧。")

def clear_explain(event):
    """文本框的单击鼠标事件会运行这个函数"""
    answer_text.delete(0, END)                          # 清空所有文本
    
    
game_title = "猜数小游戏"

window = Tk()                                           # 新建窗口
window.resizable(width=False,height=False)              # 设置窗口不能变化大小
window.geometry("400x200")                              # 设置窗口的几何尺寸
window.title(game_title)                                # 设置窗口的标题
 
canvas = Canvas(window,width=400,height=200,bg="white") # 创建画布
canvas.pack(expand=True)                                # 放置画布,expand为真

"这是输入数字的文本框"
answer_text = Entry(window,width=12,font=('',13,'normal'),relief=RIDGE,bg= 'orange',fg='black') # 输入数字的文本框
answer_text.insert(0, "在此输入数字")
answer_text.place(x=30,y=120)                           # 放置
answer_text.bind('<Button-1>', clear_explain)
 
tip = canvas.create_text(30,175,text = " ",fill='cyan',font=("Arial", 13, "normal")) # 创建画布上的提示文字

random_number = randint(1,100)                          # 产生随机数         

button_guess = Button(window,width=100 ,command=check,image = button_image_guess)     # 在window上新建 猜猜 按钮,命令为check,图形为button_image_guess
button_guess.place(x=160,y=110)                                                       # 放置

button_explain = Button(window,width=100,command=explain,image = button_image_explain) # 新建说明按钮
button_explain.place(x=280,y=110)

window.mainloop()

如需要查看完整代码,请

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

发表在 python, tkinter | tkinter版漂亮的猜数小游戏已关闭评论

简易加密和简易解密示例程序

可以用来教少年们进行个加密解密启蒙的小程序。

"""加密程序"""
plain_text = "This is a test. ABC abc"

encrypted_text = ""          # 加密后的文本
for c in plain_text:
    x = ord(c)               # 求它的ASCII码
    x = x + 1
    c2 = chr(x)              # 取ASCII码对应的字符
    encrypted_text = encrypted_text + c2
print(encrypted_text)
"""解密程序"""
encrypted_text = "Uijt!jt!b!uftu/!BCD!bcd"

plain_text = ""
for c in encrypted_text:
    x = ord(c)
    x = x - 1
    c2 = chr(x)
    plain_text = plain_text + c2
    
print(plain_text)

 

发表在 python | 简易加密和简易解密示例程序已关闭评论

自然农法之理解篇之重建生态链

前几年接触到自然农法,这几天看了看52菜园网,又翻了翻百度,下载了一个PDF,叫《全息自然农法》,作者叫何以兴农。今天晚上花了两个小时把它浏览了一篇,说说自己对自然农法的理解。

现在所谓的自然农法虽然来自于日本,它其实是古代农业的现代生态农业的升华。运用现代土壤学、环境学、生态链学等相关科学。自然农法最大限度的还原自然状态,让种植、养殖处于越来越像的野生状态,从而不用农药,不用化肥。视杂草和害虫为生态链完整的一个环节,因为自然农法首先就是重建生态链,所以一般不会去除杂草和“害虫”。“害虫“自然有生态链中的天敌等来去除。

完整的生态链需要多种动植物,所以规模化单一种植的大片农作物容易出现害虫,因为它们长期在人类的呵护下长大,就像骄生惯养的孩子,一 旦失去农药和化肥,马上就病虫害缠身。在自然界中,这些其实属于被淘汰的物种。我们常吃的水果蔬菜就属于这一类喝着农药化肥长大的植物。想想都不好受,这也成为我在楼顶种菜的原因之一,或借口吧,呵呵。

自然农法通过重建生态链,改善土壤环境等,让植物回复到野生状态,初期它们是不能适应环境,自然界淘汰一些,会造成大幅减产,这是为什 么农民不能停止使用农药和化肥的原因之一。只有经过一定的时间磨练它们。这可能要好多年。它们才能重新适应野生环境。日本电影《奇迹的苹果》中。主演用了10年的时间,历经磨难,千辛万苦,差点自杀,才摸索出如何种植不打农药的苹果树。而我们只要看个电影2个小时就能知道这个技术。真的要很感谢他了。对此我也有体验了。我自己在楼顶种的西红柿从结果到成熟要几个月,而那些用喷激素的番茄没有红就摘下来了,然后催红。虽然个头大,但是没味。自己种的西红柿虽然个头小,但味道真的很好。长期吃着又大又漂亮的西红柿的朋友们,有阳台或屋顶的城市人可以自己做一个实验。

恢复到野生状态的瓜果蔬菜虽然个头可能小,但口感更好,没有丝毫农药,是非常健康的食材。这满足了部分高端客户的需求。部分家庭对健康关注度高,肯定会买自然农法种植物的瓜果蔬菜。随着人们健康水平不断地提高,这个市场容量会越来越大。不过自然农法无法规模化,这是它的软肋,原生态的东西当然要贵。适合于休闲农业,农庄,到乡下养老也可以自己种菜不打农药不用化肥,吃纯净的自然食材。一个重建生态链的想法在我脑中产生了,我也想实践实践。

发表在 杂谈 | 自然农法之理解篇之重建生态链已关闭评论

RSA加密算法说明

RSA加密算法说明

 

—作者:李兴球

一、rsa加密码过程

rsa加密是一种非对称加密算法,其主要过程如下:

1、乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

2、甲方获取乙方的公钥,然后用它对信息加密,把密文传给乙方。

3、乙方得到加密后的信息,用私钥解密。

 

二、算法过程

 

  1. 随意选择两个大的质数p和q,p不等于q,计算 n = p * q 。n的二进制长度就是密钥的长度。
  2. 根据欧拉函数,不大于n且与n互质的整数的个数为:

φ(n)  =  (p-1) × (q-1) 。

( 欧拉函数φ(n),解决的问题是:小于n的正整数中与n互质整数的数目。

例如φ(8)=4,因为1,3,5,7均和8互质。)

  1. 选择一个整数e与φ(n) 互质,并且e小于 φ(n)。
  2. 用以下这个公式计算d:d × e ≡ 1 (mod  φ(n) )。

上面公式表示的意思为 d×e对φ(n) 的余数与 1对φ(n)的余数相同。由于 1 对φ(n)的余数为1。所以上面的公式可以理解为d×e对φ(n) 的余数为1。公式可化为:  (d×e)  mod  φ(n)  = 1 。 即d×e 对φ(n) 的余数为1。假设φ(n) 的值为20,那么d×e 的值为 21 , 41 , 61 , 81 ,…。即d×e的值为k * φ(n) + 1。k为1, 2,3 ,4 , 5 , 6 , 7…。

  1. 以上内容中,(n ,e) 就是公钥,(n , d) 就是私钥。

总结:生成公钥和私钥就是求n,e,d的过程。

 

三、加密与解密过程

 

加密公式为:C ≡ Mmod  n     (C和Me 对 n的求余结果相同)

 

M为待加密的整数。实际情况是加密文本的,所以先要先把文本转换成整数。如,可以把它先转换成它的ASCII码。C就是加密后的数据。

 

解密公式为:M ≡ Cmod  n

C是密文,M是解密后的明文。

 

 

四、实例描述:


 在这里通过一个简单的例子来理解RSA的工作原理。为了便于计算。在以下实例中只选取小数值的质数p,q,以及e,假设用户A需要将明文“fed”通过RSA加密后传递给用户B,过程如下:
(1)设计公私密钥(e,n)和(d,n)。
令p=3,q=11,得出n=p×q=3×11=33;

φ(n)=(p-1)(q-1)=2×10=20;

取e=3,(3与20互质);

e×d≡1 mod φ(n),即3×d≡1 mod 20。

由于3xd的值对20的余数为1,所以它最小的值为21,可以算出d为7。从而我们可以设计出一对公私密钥,加密密钥(公钥)为:KU =(n,e)=(33,3),解密密钥(私钥)为:KR =(n,d)=(33,7)。

(2)英文数字化。
将明文信息数字化,可以自己设一个字母与数字的对应表。在这里为了简化,让它们和数字一一对应,即a对应1,b对应2,c对应3,d应4,e对应5,f对应6。下面对字符串fed加密,那么对应的明文为:6,5,4。
(3)明文加密 
用户A有公钥 (33,3) 将数字化明文分组信息加密成密文。由C ≡ Me  mod  n公式得:

 

C1 ≡ (M1) mod n  =>  6 3  mod 33   = 18

C2 ≡ (M2) mod n  =>  5 3  mod 33   = 26

C3 ≡ (M3) mod n  =>  4 3  mod 33   = 31

 

因此,得到相应的密文信息为:18,26,31。
4)密文解密。
用户B有私钥(33,7),他收到密文,若将其解密,只需要根据解密公式算出来即可,

即:M ≡ Cd  mod  n。计算过程如下:

 

M1 = (C1) mod n  =>  18 7  mod 33   = 6

M2 = (C1) mod n  =>  26 7  mod 33   = 5

M3 = (C1) mod n  =>  31 7  mod 33   = 4

6,5,4分别对应的就是fed,这样就解密了。 你看,它的原理就可以这么简单地解释!
当然,实际运用要比这复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024位甚至2048位才能保证安全,因此,p、q、e的选取、公钥私钥的生成,加密解密模指数运算都有一定的计算程序,需要仰仗计算机高速完成。

相关数学知识:

一、 什么是素数
素数是这样的整数,它除了能表示为它自己和1的乘积以外,不能表示为任何其它两个整数的乘积。例如,15=3*5,所以15不是素数;又如,12=6*2=4*3,所以12也不是素数。另一方面,13除了等于13*1以外,不能表示为其它任何两个整数的乘积,所以13是一个素数。素数也称为“质数”。

二、什么是互质数(或互素数)?
小学数学教材对互质数是这样定义的:“公约数只有1的两个数,叫做互质数。”这里所说的“两个数”是指自然数。
判别方法主要有以下几种(不限于此):
(1)两个质数一定是互质数。例如,2与7、13与19。
(2)一个质数如果不能整除另一个合数,这两个数为互质数。例如,3与10、5与 26。
(3)1不是质数也不是合数,它和任何一个自然数在一起都是互质数。如1和9908。
(4)相邻的两个自然数是互质数。如 15与 16。
(5)相邻的两个奇数是互质数。如 49与 51。
(6)大数是质数的两个数是互质数。如97与88。
(7)小数是质数,大数不是小数的倍数的两个数是互质数。如 7和 16。
(8)两个数都是合数(二数差又较大),小数所有的质因数,都不是大数的约数,这两个数是互质数。如357与715,357=3×7×17,而3、7和17都不是715的约数,这两个数为互质数。等等。

三、什么是模指数运算? 
指数运算谁都懂,不必说了,先说说模运算。模运算是整数运算,有一个整数m,以n为模做模运算,即m mod n。怎样做呢?让m去被n整除,只取所得的余数作为结果,就叫做模运算。例如,10 mod 3=1;26 mod 6=2;28 mod 2 =0等等。
模指数运算就是先做指数运算,取其结果再做模运算。如

发表在 杂谈 | RSA加密算法说明已关闭评论

rsa加密器海龟画图版

这是用Python海龟画图做界面编写的一个rsa加密器小程序

"""rsa加密器海龟画图版"""

from turtle import *
from tkinter import messagebox
import rsa                               # 通过 pip install rsa 安装rsa模块

title = "rsa加密,作者:李兴球"

(pubkey, privkey) = rsa.newkeys(1024)    # 生成密钥,包括公钥和私钥,

f = open("public.pem",mode='w')
f.write(pubkey.save_pkcs1().decode())    # 保存公钥到文件中,谁都可以用它加密
f.close()

f = open('private.pem',mode= 'w')
f.write(privkey.save_pkcs1().decode())   # 保存私钥到文件中,有私钥的人才能打开加密的文本
f.close()

screen = Screen()
screen.bgcolor("black")
screen.title(title)
message = screen.textinput(title,"请输入一段文字")

if message:
    crypto_text = rsa.encrypt(message.encode(), pubkey) #用公钥加密

    messagebox.showinfo(title,"以下是加密后的文本:")
    print(crypto_text)

    f = open("rsa加密码后文本.dat",mode = 'wb')
    f.write(crypto_text)
    f.close()
else:
    messagebox.showinfo(title,"你没有输入文字。")

screen.exitonclick()
screen.mainloop()
     

"""
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),
公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。
通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。
比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

"""
 

 

发表在 turtle | rsa加密器海龟画图版已关闭评论

rsa加密码器和rsa解密器图形化程序

下面是RSA加密码器源代码:

from tkinter import *
from tkinter import messagebox
from PIL import ImageTk,Image
import rsa                               # 通过 pip install rsa 安装rsa模块

def encrypt():
    """加密函数"""
    filename = "rsa加密码后文本.dat"
    message = txt_editor.get(1.0, END)
    #print("message = ",len(message))
    if message.strip() != "":
        crypto_text = rsa.encrypt(message.encode(), pubkey)  # 用公钥加密
        f = open(filename,mode = 'wb')
        f.write(crypto_text)
        f.close()
        messagebox.showinfo(project_title,"加密成功,加密后的文本存储在以下文件:\n" + filename  + "\n只有拥有私钥的人才能解密!")
    else:
        messagebox.showinfo(project_title,"没有输入文本。")
        

project_title = "rsa加密器_作者:李兴球"
screen_width ,screen_height = 600,600    # canvas长和高
screen_size = str(screen_width) + "x" + str(screen_height)

(pubkey, privkey) = rsa.newkeys(1024)    # 生成密钥,包括公钥和私钥,

f = open("public.pem",mode='w')
f.write(pubkey.save_pkcs1().decode())    # 保存公钥到文件中,谁都可以用它加密
f.close()

f = open('private.pem',mode= 'w')
f.write(privkey.save_pkcs1().decode())   # 保存私钥到文件中,有私钥的人才能打开加密的文本
f.close()

window = Tk()
window.resizable(width=False,height=False)
window.geometry(screen_size)             # 窗口大小 
window.title(project_title)              # 窗口标题

canvas = Canvas(window,width = 600,height= 600,bg='white')    
canvas.pack(expand = True)


im1 = Image.open("背景.png")             # 作为背景图的
background = ImageTk.PhotoImage(im1)     #转换为tkinter能识别的图形对象:取名为 background
canvas.create_image(0,0,anchor=NW,image=background)     #贴背景图,以左上为0,0

canvas.create_text(screen_width//2,50,text = project_title,font = ("黑体",32,"normal"),anchor = "center")
canvas.create_text(50,150,text = "请在下列文本框输入待加密码文本:",font = ("宋体",12,"normal"),fill='blue',anchor = "nw")

txt_editor = Text(window,width = 50,height=20,bg='gray80')
txt_editor.place(x=50,y=180)


im1 = Image.open("加密按钮.png")             # 作为背景图的
button_image_encrypt = ImageTk.PhotoImage(im1)     # 转换为tkinter能识别的图形对象:取名为 background
button_encrypt = Button(window,width=100 ,command=encrypt,image = button_image_encrypt)     #在window上新建 猜猜 按钮,命令为check,图形为button_image_guess
button_encrypt.place(x=50,y=510)                                                            #放置

window.mainloop()


"""
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),
公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。
通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。
比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

"""
 

下面是RSA解密器源代码:

from tkinter import *
from tkinter import messagebox
from PIL import ImageTk,Image
import rsa                               # 通过 pip install rsa 安装rsa模块
import os

def decrypt():
    """解密函数,首先寻找私钥,然后打开加密后文本。"""
    private_file = 'private.pem'
    if not os.path.exists(private_file):                            # 文件不存在,显示提示信息。
        messagebox.showinfo(project_title,"没有找到私钥,无法解密。\n"  + private_file)
        return
        
    f = open(private_file,'r')                                      # 导入私钥,用于解密1
    privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())
    f.close()

    filename = "rsa加密码后文本.dat"
    if not os.path.exists(filename):
        messagebox.showinfo(project_title,"没有找到rsa加密码后文本,无法解密。\n"  + filename)
        return
        
    f = open(filename,mode='rb')
    crypto_text = f.read()
    f.close()    
    message = rsa.decrypt(crypto_text, privkey).decode()             # 解密
     
    txt_editor.insert(END, message)                                  # 放入文本框
        

project_title = "rsa解密器"
screen_width ,screen_height = 600,600    # canvas长和高
screen_size = str(screen_width) + "x" + str(screen_height)

window = Tk()
window.resizable(width=False,height=False)
window.geometry(screen_size)             # 窗口大小 
window.title(project_title)              # 窗口标题

canvas = Canvas(window,width = screen_width,height= screen_height,bg='white')    
canvas.pack(expand = True)


im1 = Image.open("背景.png")             # 作为背景图的
background = ImageTk.PhotoImage(im1)     # 转换为tkinter能识别的图形对象:取名为 background
canvas.create_image(0,0,anchor=NW,image=background)     # 贴背景图,以左上为0,0

canvas.create_text(screen_width//2,50,text = project_title,font = ("黑体",32,"normal"),anchor = "center")
canvas.create_text(50,150,text = "以下是解密后的文本:",font = ("宋体",12,"normal"),fill='blue',anchor = "nw")

txt_editor = Text(window,width = 50,height=20,bg='gray80'  )
txt_editor.place(x=50,y=180)


im1 = Image.open("解密按钮.png")                   # 作为背景图的
button_image_decrypt = ImageTk.PhotoImage(im1)     # 转换为tkinter能识别的图形对象:取名为 background
button_encrypt = Button(window,width=100 ,command=decrypt,image = button_image_decrypt)     #在window上新建 猜猜 按钮,命令为check,图形为button_image_guess
button_encrypt.place(x=50,y=510)                                                            #放置


window.mainloop()


"""
公钥(Public Key)与私钥(Private Key)是通过一种算法得到的一个密钥对(即一个公钥和一个私钥),
公钥是密钥对中公开的部分,私钥则是非公开的部分。公钥通常用于加密会话密钥、验证数字签名,或加密可以用相应的私钥解密的数据。
通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这个密钥对的时候,如果用其中一个密钥加密一段数据,必须用另一个密钥解密。
比如用公钥加密数据就必须用私钥解密,如果用私钥加密也必须用公钥解密,否则解密将不会成功。

"""
 

 

发表在 Uncategorized | rsa加密码器和rsa解密器图形化程序已关闭评论

用python自带winsound模块播放上学歌等歌曲

"""上学歌.py
   用C调,2/4,表示以4分音符为一拍,每小节有2拍。
   本程序假设1拍为400毫秒。
   
   freqs列表保存低,中间,高音的频率
   
   duration列表保存时长
   
   简谱知识:
   全音符为1小节,写法x - - - ,为四拍
   二分音符写法:x - ,为二拍
   四分音符写法:x   ,为一拍
   八分音符写法:x加下划线,为半拍
   
唱名   Do   Re  Mi  Fa    So  La  Si

低音   262  294  330   349    392  440  494    
                       
中音   523  587  659  698    784  880  988  
                         
高音   1046 1175  318  1397  1568  1760  1967

"""

import winsound

freqs = [523,587,659,523,784,880,880,1046,880,784,880,880,1046,784,880,659,880,784,659,784,659,523,587,659,523]
duration= [200,200,200,200,800,200,200,200,200,800,200,200,400,200,200,400,200,200,200,200,200,200,200,200,800]
 
for i in range(len(freqs)):
    freq = freqs[i]
    time = duration[i] 
    print(freq,time)
    winsound.Beep(freq, time)

"""两只老虎.py"""

import winsound

freqs = [523,587,659,523,523,587,659,523,659,698,784,659,698,784,784,880,784,698,659,523,784,880,784,698,659,523,523,784,523,523,784,523]
duration= [400,400,400,400,400,400,400,400,400,400,800,400,400,800,300,100,300,100,400,400,300,100,300,100,400,400,400,400,800,400,400,800]
 
for i in range(len(freqs)):
    freq = freqs[i]
    time = duration[i] 
    print(freq,time)
    winsound.Beep(freq, time)
"""我爱北京天安门.py"""

import winsound

 
"           低音                         中音                        高音 "
"            1   2   3   4   5   6    7  1   2   3   4   5   6   7    1     2     3      4     5    6     7"
freqs = [37,262,294,330,349,392,440,494,523,587,659,698,784,880,988, 1046, 1175, 1318, 1397, 1568, 1760,1967]
"                                        8   9   10  11  12  13  14 "
"                                        C   D    E   F   G            调"


notes = [12,15,12,11,10,9,8,8,8,9,10,10,8,10,11,12,12,15,12,11,10,12,9,11,10,9,13,12,9,0,8]  #保存的是freqs列表索引号
duration = [2,1,2,2,2,2,4,2,2,2,2,2,2,2,2,16,2,1,2,2,2,2,4,2,1,2,2,4,2,2,12]
duration = [ d * 125 for d in duration ]
 
 
for i in range(len(notes)):
    freq = freqs[notes[i]]
    rate = duration[i]  
    winsound.Beep(freq, rate)
"""一闪一闪亮晶晶.py
   C大调,2/4                     四分音符为一拍,每小节两拍。
   freqs列表保存低,中间,高音的频率
   notes列表保存的是freqs中一些频率的索引号
   duration列表保存时长
   简谱知识:
   全音符为1小节,写法x - - - ,为四拍
   二分音符写法:x - ,为二拍
   四分音符写法:x   ,为一拍
   八分音符写法:x加下划线,为半拍
   

"""

import winsound

 
"           低音                         中音                        高音 "
"            1   2   3   4   5   6    7  1   2   3   4   5   6   7    1     2     3      4     5    6     7"
freqs = [37,262,294,330,349,392,440,494,523,587,659,698,784,880,988, 1046, 1175, 1318, 1397, 1568, 1760,1967]
"                                        8   9   10  11  12  13  14 "
"                                        C   D    E   F   G            调"

notes = [8,8,12,12,13,13,12,11,11,10,10,9,9,8,12,12,11,11,10,10,9,12,12,11,11,10,10,9,8,8,12,12,13,13,12,11,11,10,10,9,9,8]  #保存的是freqs列表索引号
duration = [4,4,4,4,4,4,8,4,4,4,4,4,4,8,4,4,4,4,4,4,8,4,4,4,4,4,4,8,4,4,4,4,4,4,8,4,4,4,4,4,4,8]
duration = [ d * 125 for d in duration ]
 
 
for i in range(len(notes)):
    freq = freqs[notes[i]]
    rate = duration[i]  
    winsound.Beep(freq, rate)


"""数鸭子.py
 

"""

import winsound

 
"           低音                         中音                        高音 "
"            1   2   3   4   5   6    7  1   2   3   4   5   6   7    1     2     3      4     5    6     7"
freqs = [37,262,294,330,349,392,440,494,523,587,659,698,784,880,988, 1046, 1175, 1318, 1397, 1568, 1760,1967]
"                                        8   9   10  11  12  13  14 "
"                                        C   D    E   F   G            调"

notes = [10,8,10,10,8,10,10,12,13,12,0,13,13,13,12,11,11,11,9,10,9,8,9,0,10,8,0,10,8,0,10,10,12,13,13,0,15,12,12,13,10,9,8,9,10,12,15,12,12,13,10,9,8,9,10,8]  #保存的是freqs列表索引号
duration = [4,4,2,2,4,2,2,2,2,4,4,2,2,2,2,2,2,4,2,2,2,2,4,4,4,2,2,4,2,2,2,2,2,2,4,4,4,2,2,4,4,2,2,2,2,8,4,2,2,4,4,2,2,2,2,8]
duration = [ d * 125 for d in duration ]
 
 
for i in range(len(notes)):
    freq = freqs[notes[i]]
    rate = duration[i]  
    winsound.Beep(freq, rate)

 

发表在 python, Uncategorized | 用python自带winsound模块播放上学歌等歌曲已关闭评论

超级玛丽接金币游戏turtle

Python海龟画图制作的超级玛丽接金币游戏_by_李兴球

以下是部分代码预览:
扫码付款后各模块可见。

"""
这是用Python的海龟画图模块制作的接金币小游戏,用了pygame的mixer混音器进行配音
操作方法:使用鼠标指针左右移动超级玛丽,接到一个金币就会加一分,到达了一定的积分游戏就会结束。
本程序定义了一个Coin类和一个Mario类,它们都是继承自海龟的子类。
coin有goto_top方法和move方法,当coin到了最底下时,它就会自动回到最顶上的某个位置以便重新下落。
Mario类有alt_costume方法,这是让它不断地切换造型的方法。
Mario类还有一个follow_mouse方法,这是让玛丽跟随鼠标移动的方法。
本游戏配了音乐,可以用来教授类的继承,列表推导式,pygame混音器等的应用。
"""
from turtle import *
from coin import *
from mario import *
from pygame import mixer
     
title = "Python海龟画图制作的超级玛丽接金币游戏_by_李兴球"
width,height = 480,360
coin_image = "素材/Gold-coin.gif"
bgmusic = "素材/超级玛丽第二关背景音乐.wav"
mario_images = ["素材/马里奥-" + str(i) + ".gif" for i in range(1,8)]

screen = Screen()
screen.delay(0)
screen.setup(width,height)
screen.bgpic("素材/school2.png")
screen.addshape(coin_image)
[screen.addshape(image) for image in mario_images]

mixer.init()
sound = mixer.Sound("素材/接金币.wav")
mixer.music.load(bgmusic)
mixer.music.play(0,-1)

position = 0,60 - height//2
mary = Mario(position,mario_images)  # 新建马丽角色

coins = [Coin(coin_image,mary,sound) for i in range(10)] # 新建10个金币
Coin.title = title
while Coin.score < 50: [coin.move(-1) for coin in coins]

[coin.ht() for coin in coins]      # 所有金币都隐藏
Turtle(visible=False).write("游戏结束",align='center',font=('黑体',32,'normal'))
           

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

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

发表在 python, turtle | 超级玛丽接金币游戏turtle已关闭评论

pygame像素级碰撞检测示例程序_pygame_pixel_collision_check

"""pygame像素级碰撞检测示例程序

采用mask的碰撞检测,提取像素后可用于像素级撞检测,pygame_pixel_collision_check by lixingqiu
"""


import pygame, time
from pygame.locals import *


class Sprite(pygame.sprite.Sprite):

    def __init__(self, imagefile, screen, pos):
        """
          初始化角色,imagefile:图像文件名,screen:所在屏幕,pos:左上角坐标
        """
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(imagefile)
        self.rect = self.image.get_rect()
        self.rect.topleft = pos
        self.screen = screen         
        self.speed = [0 ,0]    # 水平和垂直方向位移向量
       

    def update(self):
        """原地更新矩形坐标"""
        self.rect.move_ip(self.speed[0],self.speed[1])
    
    pass

if __name__ == '__main__':
    main()

如需要下载完整源代码及素材,请

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

发表在 pygame, python | pygame像素级碰撞检测示例程序_pygame_pixel_collision_check已关闭评论

Python海龟画图旋转的彩色方块之类的继承教学源代码

Python海龟画图旋转的彩色方块之类的继承教学源代码作者李兴球

"""Block类,继承自Turtle类,实例化后会自动旋转。

请将以下的每一句写上注释,和文档字符串。本程序可用于类的继承之教学。


"""

from turtle import *
from random import randint

class Block(Turtle):
    
    def __init__(self,color):
        
        Turtle.__init__(self,shape='square')
        self.penup()
        self.sw  = self.screen.window_width()
        self.sh = self.screen.window_height()
        x = randint(-self.sw/2,self.sw/2)
        y = randint(-self.sh/2,self.sh/2)
        self.goto(x,y)
        self.color(color)        
        self.ondrag(self.goto)
        self.rotate()
        
    def rotate(self):
        
        self.right(10)
        self.screen.ontimer(self.rotate,10)

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

发表在 turtle | Python海龟画图旋转的彩色方块之类的继承教学源代码已关闭评论

Python猴子穿衣装扮小游戏

猴子穿衣小游戏,这是用python的海龟画图制作的一个小游戏。

编程最重要的是可读性,教小孩的代码,可以用中文,打破常规思维,不要被框框所束缚。本程序新建了一个角色Sprite类,每个道具都是继承自Turtle类。

以下是部分代码预览:


"""猴子穿衣小游戏,这是用python的海龟画图制作的一个小游戏。"""

from turtle import *

screen = Screen()
screen.title("猴子穿衣 by 李兴球")
screen.bgpic("猴子背景.gif")
screen.setup(800,600)
screen.delay(0)


眼镜表=  ["眼镜1.gif","眼镜2.gif","眼镜3.gif"]
上衣表=  ["上衣1.gif","上衣2.gif","上衣3.gif","上衣4.gif"]
帽子表=  ["帽子1.gif","帽子2.gif","帽子3.gif","帽子4.gif"]
连衣裙表 = ["连衣裙子1.gif","连衣裙子2.gif","连衣裙子3.gif"]
裙子表 = ["裙子1.gif","裙子2.gif","裙子3.gif","裙子4.gif"]
头发表 = ["头发1.gif","头发2.gif","头发3.gif","头发4.gif","头发5.gif","头发6.gif"]


class Sprite(Turtle):
    def __init__(self,造型,x,y): # 造型是增加的形状,x,y用来初始定位
        Turtle.__init__(self)
        self.hideturtle()
        self.penup()

screen.mainloop()

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

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

发表在 python, turtle | Python猴子穿衣装扮小游戏已关闭评论

csv文件做为游戏地图的通用Python程序

在研究Arcade模块的过程中,发现Arcade模块能读取由Tiled软件输出的地图文件。这个地图文件可以是csv格式,也可以是tmx格式。用记事本打开tmx文件,发现它是一个xml文档。无论什么格式,地图文件记录的都是图块和数据的映射。首先我们来看一下csv格式,它是以逗号隔开的数据集合。

0,0,0,-1,-1
1,1,2,0,-1
3,3,3,3,2

上面的数据有3行,每行有5个数据。 对应的地图就是3行5列。每个数据代表不同的图形块,实质上记录的是图形块的编号。不过Arcade貌似没有内置相关函数来读取它。我们需要自己编写程序或导入相关模块来解析csv文件。解析完后 返回一个二维阵列。
接下来我们就能根据这份数据表决定加载什么类型的方块图片,最后实例化成角色。示例程序:sprite_csv_map.py.

下面是一个比较通用的读取csv文件格式的,不过数据要能转换成整数。假设左边的csv文件中的数据有三行,每行以逗号隔开有5个数据,那么形成的嵌套列表就像下面左边这样所示:

0,0,0,-1,-1
1,1,2,0,-1
3,3,3,3,2
[[0,0,0,-1,-1],
 [1,1,2,0,-1],
 [3,3,3,3,2]
]

下面的程序读取csv文件,形成嵌套列表:

def get_map(filename):
    """
    加载逗号隔开csv文件,解析成嵌套列表。
    """
    map_file = open(filename)                   # 打开csv文件 
    map_array = [ ]
    for line in map_file:                              # 文件中的每一行
          line = line.strip()                             # 去掉空白字符
          map_row = line.split(“,”)                 # 以逗号分隔数据,返回列表     
          # 执行下列这个推导式是为了把列表中的每项数据转换成整数 
          map_row = [ int(item) for item in map_row ] 
          map_array.append(map_row)

     return map_array

csv文件读取后,形成一个嵌套列表。我们就能遍历这个列表中的每一个数据从而实例化成一个个的角色做为地图使用了。

发表在 arcade | csv文件做为游戏地图的通用Python程序已关闭评论

turtle制作的一种简单的完全矩形碰撞示例程序by lixingqiu

"""
本程序新建一个矩形类,它继承自Turtle。实例化后碰到边缘就会反弹,碰到其它方块后会反向移动。
不过有时候会交叉,这是一个bug,暂时无时间去修复。
"""

from time import sleep
from turtle import *
from random import randint

class Rectangle(Turtle):
    
    def __init__(self,position,width,height,color='navy'):
        
        Turtle.__init__(self,shape='square',visible=False)
        self.penup()
        self.dx = randint(-5,5)/10.0           # 水平方向单位位移
        self.dy = randint(-5,5)/10.0           # 垂直方向单位位移
        self.color(color)                      # 矩形颜色
        self.sw = self.screen.window_width()   # 窗口屏幕宽度
        self.sh = self.screen.window_height()  # 窗口屏幕高度 
        self.set_size(width,height)            # 设置尺寸
        self.goto(position)                    # 定位坐标
        self.st()                              # 显示出来         
        
    def _pointlist(self):
        """获取矩形的顶点坐标列表,这个方法可以在get_rect中用,但是没有使用,留着吧"""
        return  self.screen._pointlist(self.turtle._item)

    def set_size(self,width,height):
        """设置尺寸,能动态的设置矩形的大小"""
        self.width = width                      # 重定义width
        self.height = height                    # 定义height
        self.shapesize(height/20.0,width/20.0)
        
    def get_rect(self):
        """获取矩形上下左右边界的坐标"""
        self.left =  self.xcor() - self.width/2.0     # 最左x坐标
        self.right = self.xcor() + self.width/2.0     # 最右x坐标
        self.top =  self.ycor() + self.height/2.0     # 最上y坐标
        self.bottom = self.ycor() - self.height/2.0   # 最下y坐标

    def move(self):
        """移动矩形"""
        x = self.xcor() + self.dx
        y = self.ycor() + self.dy
        self.goto(x,y) 
        
    def bounce_on_edge(self):
        """碰到边缘就反弹"""
        self.get_rect()                             # 获取上下左右边界坐标
        if self.left <= -self.sw//2 : self.dx = -self.dx
        if self.right >= self.sw//2 : self.dx = -self.dx
        if self.top >= self.sh//2 : self.dy = -self.dy
        if self.bottom <= -self.sh//2 : self.dy = -self.dy        
         
    def collide(self,group):
        """和其它矩形的碰撞"""
        for other in group:
            if self==other:continue
            self.get_rect()
            other.get_rect()
            c1 = self.right < other.left
            c2 = self.left > other.right
            c3 = self.bottom > other.top
            c4 = self.top < other.bottom
            collision =  not(c1 or c2 or c3 or c4)
            if collision:                   # 碰到就把单位位移取反
                self.dx = -self.dx          # 并非真正的碰撞  
                other.dx = -other.dx
                self.dy = -self.dy
                other.dy = -other.dy
                self.move()
                other.move()
                 
                return 
        
        
if __name__ == "__main__":

    screen = Screen()
    screen.delay(0)
    screen.title("turtle制作的一种简单的完全矩形碰撞示例程序by lixingqiu")
    screen.bgcolor("cyan")
    screen.setup(480,360)

    squares = []
    positions = [(100,100),(-100,100),(0,0),(-100,-100),(100,-100)]
    amounts = len(positions)

    # 生成方块
    [squares.append( Rectangle(p,50,50))  for p in positions]
        
    index = 0
    while True:         
        s = squares[index]
        s.move()
        s.bounce_on_edge()       # 碰到边缘就反弹     
        s.collide(squares)
        index = index + 1
        index = index % amounts
            
 
    
        

 

发表在 turtle | turtle制作的一种简单的完全矩形碰撞示例程序by lixingqiu已关闭评论

pygame矩形碰到边缘就反弹示例程序

以下是部分代码预览:

"""
本程序创建一个矩形类,实例化后让它们在屏幕上随机移动,碰到屏幕边缘会反弹。
本程序可不必继承自pygame.sprite.Sprite实现,请自行编写。
"""

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

class Rectangle(pygame.sprite.Sprite):
    
    def __init__(self,position,width,height,screen,color=(0,255,255)):
        """
           实始化,position:中心点坐标元组,width:宽度,height:高度,screen:所在屏幕,color:颜色
        """
        pygame.sprite.Sprite.__init__(self)   # 初始化父类
       

    def update(self):
        """更新坐标"""
        self.rect.move_ip(self.dx,self.dy)     # 移动矩形
        self.bounce_on_edge()                  # 碰到边缘就反弹


def main():
    """主要函数"""
    
    width,height = 480,360
    screen = pygame.display.set_mode((width,height))
    pygame.display.set_caption("pygame矩形碰到边缘就反弹示例程序")
    
    square_group = pygame.sprite.Group()       #  创建组 ,用来对方块进行统一更新与渲染

    # 初始坐标
    positions = [(100,100),(-100,100),(0,0),(-100,-100),(100,-100)]
    positions = [(x+width//2,y+height//2) for (x,y) in positions]
    square_amount = len(positions)

    # 生成矩形
    [square_group.add(Rectangle(pos,50,50,screen)) for pos in positions]

    clock = pygame.time.Clock()               # 时钟对象
    running = True                            # 控制循环的逻辑变量
    
    while running:        
        event = pygame.event.poll()          # 从事件队列中取一个事件
        if event.type == QUIT:running = False # 如果此事件为退出,则逻辑变量为False

        screen.fill((0,0,0))               # 填充屏幕为黑色
        square_group.draw(screen)          # 重画所有方块 

        pygame.display.update()            # 更新屏幕显示
        clock.tick(30)                     # 限制1/30秒后再循环
        
    pygame.quit()
    
    
if __name__ == "__main__":

    main()

如需要查看完整代码,请

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

发表在 pygame, python | pygame矩形碰到边缘就反弹示例程序已关闭评论

昨夜星辰多媒体情景动画

python多媒体动画北斗七星

海王星上全是大海吗?为什么土星竟然有62个月亮,而地球只有一个月亮?据说喜欢仰望天空的是充满好奇心的人….
以下是部分代码预览:

"""本程序实现星空中闪烁烁的星星,然后有七颗星星会连起来,它们是北斗七星,还有启明星。"""
from star import *
from time import sleep

"定义全局变量"
stars_amounts = 49
width ,height = 800,600                                                             #屏幕宽高
beidou_cors = [(-276,110),(-125,135),(-38,88),(76,38),(100,-64),(284,-70),(314,52)] #北斗七星坐标表
beidou_names = ["瑶光","开阳","玉衡","天权","天玑","天旋","天枢"]                   #名称表
images_small = ["star1.gif","star2.gif"]                                            #星星的小造型images_small列表
images_big = ["big_star1.gif","big_star2.gif"]                                      #星星的大造型images_big列表

s1 = "北斗七星,是由天枢、天璇、天玑、天权、玉衡、开阳、瑶光七星组成的。"
s2 = "古代中国人民把这七星联系起来想象成为古代舀酒的斗形。"
s3 = "天枢、天璇、天玑、天权组成为斗身,古曰魁;玉衡、开阳、摇光组成为斗柄,古曰杓。"
s4 = "道教称北斗七星为七元解厄星君,居北斗七宫。以下是它们的名称:"
s5 = "天枢宫贪狼星君、天璇宫巨门星君、天玑宫禄存星君、天权宫文曲星君、"
s6 = "玉衡宫廉贞星君、开阳宫武曲星君、瑶光宫破军星君。"
knowledge = [s1,s2,s3,s4,s5,s6]                  # 放在列表中,方便遍历

"生成屏幕对象"
screen = Screen()
screen.title("昨夜星辰_作者:李兴球")
screen.setup(width,height)
screen.delay(0)                                  # 绘画延时为0
screen.bgpic("北斗定位坐标用.png")
screen.addshape("star1.gif")                     # 注册形状
screen.addshape("star2.gif")
screen.addshape("big_star1.gif")                 # 注册形状
screen.addshape("big_star2.gif")
screen.update()
sleep(1)

"生成星星49颗"
stars = []                                       # 创建stars列表
for i in range(stars_amounts):                   # 重复stars_amounts次
    "Star参数为:图形列表,x坐标,y坐标"
    stars.append(Star(images_small,randint(-width/2,width/2),randint(0,height/2))) #新建Star,并添加到stars列表
    #sleep(randint(1,2)/4)

screen.delay(6)                                  # 绘画延时为6
"以下等待几秒钟,不直接用sleep(5)是防止窗口无响应"
for i in range(5):
    sleep(1)
    screen.update()

"定位前7颗星星到北斗七星的坐标位置"
for i in range(7):       
    star =  stars.pop()                           # 弹出一颗星星
    x,y = beidou_cors[i]                          # 取出x,y坐标
    star.goto(x,y)                                # 定位到此坐标
    star.images = images_big

"准备连线"        
t.pencolor("gray")                                # 画笔颜色为灰
t.pensize(2)                                      # 画笔迹宽为2
t.goto(beidou_cors[0])                            # 定位到北斗第一颗星的坐标
t.write(beidou_names[0],font=("黑体",14,"normal"))# 写第一颗星的名字
t.pendown()                                       # 落笔,准备画连线
for i in range(1,7):                              # 把其它六颗星连线
    t.goto(beidou_cors[i])
    t.write(beidou_names[i],font=("黑体",14,"normal"))
t.goto(beidou_cors[3])
screen.title("北 斗 七 星")

"剩下的都隐藏"
for i in range(stars_amounts-7):
    star = stars.pop()      # 弹出最后的
    star.ht()               # 隐藏

"以下是写字,包括标题和北斗七星的小知识。"
t.penup()
t.pencolor("yellow")
t.goto(0,200)
t.write("北 斗 七 星",align='center',font=("黑体",24,"bold"))
t.pencolor("cyan")
t.goto(-340,-160)
for s in knowledge:                             # 遍历“知识”列表
    t.write(s,font=("宋体",12,"normal"))
    t.sety(t.ycor() - 24)
    
    
screen.mainloop()

下面是star模块,star.py源代码:

from turtle import *
from random import randint
from time import sleep

class Star(Turtle):
    def __init__(self,images,x,y):
        Turtle.__init__(self,visible=False)        # 父类初始化
        self.penup()                               # 抬笔
        self.images = images                       # 图形列表
        self.index = 0                             # 索引号
        self.goto(x,y)                             # 定位坐标
        self.twinkle()                             # 调用闪烁方法
        self.st()                                  # 显示
          
    
if __name__ == "__main__":

    screen = Screen()
    screen.setup(800,600)
    screen.title("一闪一闪亮晶晶")
    screen.delay(0)
    screen.bgpic("bg2.png")
    screen.addshape("star1.gif")
    screen.addshape("star2.gif")
    images = ["star1.gif","star2.gif"]
    
    [Star(images,randint(-400,400),randint(0,400)) for i in range(50)]

    screen.mainloop()    
    

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

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

发表在 python, turtle | 昨夜星辰多媒体情景动画已关闭评论

多个弹球与矩形碰撞示例程序,本程序用海龟画图模块演示基本的矩形碰撞原理

"""多个弹球与矩形碰撞示例程序,本程序用海龟画图模块演示基本的矩形碰撞原理"""

from turtle import Turtle, Screen
from random import choice,randint

class Board(Turtle):
    def __init__(self):
        """初始化不可见的矩形"""
        Turtle.__init__(self, shape='square', visible=False)
        self.penup()
        self.color('yellow')
        self.shapesize(10, 10)
        self.st()
        
    def up_move(self):
        """向上移动10个单位"""
        y = self.ycor() + 10
        self.sety(y)
        
    def down_move(self):
        """向下移动10个单位"""        
        y = self.ycor() - 10
        self.sety(y)
        
    def left_move(self):
        """向左移动10个单位"""
        x = self.xcor() - 10
        self.setx(x)
        
    def right_move(self):
        """向右移动10个单位"""
        x = self.xcor() + 10
        self.setx(x)

class Ball(Turtle):
    def __init__(self,board):
        """初始化不可见圆形,参数为矩形"""
        Turtle.__init__(self, shape='circle', visible=False)
        self.board = board
        rect = self.screen.cv.coords(self.board.turtle._item)
        self.board_width = abs(rect[0] - rect[2])   # 求矩形宽度
        self.board_height = abs(rect[1] - rect[5])  # 求矩形高度        
        self.penup()                                # 抬笔       
        self.color('red')                           # 设置小球颜色  
        self.radius = 10                            # 海龟画图默认圆形的半径为10        
        self.sh = self.screen.window_height()       # 获取屏幕高度
        self.sw = self.screen.window_width()        # 获取屏幕的宽度         
        self.ht()
        self.init_move()

    def init_move(self):
        x = randint(-self.sw // 2, self.sh // 2)
        y = randint(-self.sh // 2, self.sw // 2)
        # 有些小球会生成在矩形内,可以重新调整位置让小球都生成在矩形外面
        self.goto(x, y)
        # 设置小球的单位移动距离
        self.xspeed = choice([-1,-2,-3,-4,-5,1,2,3,4,5])
        self.yspeed = choice([-1,-2,-3,-4,-5,1,2,3,4,5])
        self.st()

    def move(self):
        """移动"""
        x = self.xcor() + self.xspeed
        y = self.ycor() + self.yspeed
        self.goto(x, y)
        
        # 边缘检测
        if abs(self.xcor()) + self.radius >= self.sw // 2:
            self.xspeed = -self.xspeed
        if abs(self.ycor()) + self.radius >= self.sh // 2:
            self.yspeed = -self.yspeed

        # 碰到矩形检测
        self.collide_board_check() 
            
    def collide_board_check(self):
        """矩形碰撞检测"""
        board_left = self.board.xcor() - self.board_width//2
        board_right = self.board.xcor() + self.board_width//2
        board_top = self.board.ycor() + self.board_height//2
        board_bottom = self.board.ycor() - self.board_height//2
        
        ball_left = self.xcor() - self.radius
        ball_right = self.xcor() + self.radius
        ball_top = self.ycor() + self.radius
        ball_bottom = self.ycor() - self.radius

        # 没有碰到矩形的条件
        c1 = ball_right < board_left or ball_left > board_right
        c2 = ball_bottom > board_top or ball_top<board_bottom

        # 如果没有碰到,直接返回
        if c1 or c2 :return

        # 在矩形的左边,向右碰撞过去的 
        if ball_right > board_left and ball_bottom > board_bottom and ball_top<board_top:
            self.xspeed = -self.xspeed
            return

        # 在矩形的右边,向左移动碰撞过去
        if ball_left < board_right and ball_bottom > board_bottom and ball_top<board_top:
            self.xspeed = -self.xspeed
            return
        
        # 在矩形的上边,向下撞过去
        if ball_bottom < board_top and ball_left > board_left and ball_right<board_right:
            self.yspeed = -self.yspeed
            return
        
        # 在矩形的下边,向上撞过去
        if ball_top > board_bottom and ball_left > board_left and ball_right<board_right:
            self.yspeed = -self.yspeed
            return 
 
             

if __name__ == '__main__':
    
    # 声明一个空列表,用于存放小球对象
    ps = []
    # 计数
    count = 0
    # 设置小球总数
    amount = 20

    # 新建一个屏幕
    screen = Screen()
    # 设置屏幕背景色
    screen.bgcolor('white')
    # 设置屏幕宽高
    screen.setup(700, 500)
    # 设置屏幕标题
    screen.title('多个弹球与矩形碰撞示例程序,作者:李兴球')
    screen.delay(0)

    # 创建挡板对象
    d = Board()

    screen.onkeypress(d.up_move, 'Up')
    screen.onkeypress(d.down_move, 'Down')
    screen.onkeypress(d.left_move, 'Left')
    screen.onkeypress(d.right_move, 'Right')
    screen.update()
    screen.listen()


    while True:
        if count < amount:
            p = Ball(d)
            ps.append(p)
            count += 1

        [p.move() for p in ps]
        screen.update()



python矩形碰撞小球示例图

发表在 turtle | 多个弹球与矩形碰撞示例程序,本程序用海龟画图模块演示基本的矩形碰撞原理已关闭评论

Python海龟重复之美彩色图形生成gif图形

Python海龟重复之美彩色图形gif图

以下是部分代码预览:

"""Python海龟重复之美彩色图形"""

from turtle import Turtle,Screen   # 从海龟模块导入Turtle类和Screen命令到全局名字空间
from random import choice          # 从随机模块导入选择命令
from time import sleep             # 从时间模块导入睡眠(延时)命令
import os,io
from PIL import Image

def savepng(canvas,path):
    """把canvas.postscript的内容转换成png写入文件"""     
    
"""把颜色字符串以逗号隔开放在中括号中,取名为color_list,这叫列表"""
color_list = ['red','orange','yellow','green','cyan','blue','purple']
ghostscrpit = 'C:\\Program Files\\gs\\gs9.26\\bin'    
counter = 0
"以下是添加搜索ghostscript的路径"
path = os.environ['path']
path = path.split(";")
path.append(ghostscrpit) 
path = ';'.join(path)
os.environ['path'] = path

screen = Screen()                  # 新建屏幕对象名为screen
screen.setup(800,600)              # 设置屏幕宽高为800和600
screen.delay(0)                    # 设置屏幕绘画延时为0豪秒
screen.bgcolor("black")            # 设置屏幕背景颜色为黑色

下载完整源代码与素材,请扫码付款。
链接:https://pan.baidu.com/s/1Fp_3DoEcqv0IZQfbmm-PrA
提取码:v5qf

发表在 python, turtle | Python海龟重复之美彩色图形生成gif图形已关闭评论

python伪3D多彩重力弹球

3D多彩重力弹球,这是用Python的海龟画图制作的3D多彩重力弹球
以下是部分代码预览:

"""3D多彩重力弹球,这是用Python的海龟画图制作的3D多彩重力弹球。
在程序中新建了Ball类,它继承自Turtle,由于它不需要画画,所以它在初始化的时候就让它抬笔penup。
给Ball设计了xspeed和yspeed属性,这代表每次移动的水平和垂直位移。由于是重力弹球,所以设计了加速度属性。
"""
from turtle import *
from random import randint,choice
from time import sleep
    
class Ball(Turtle):
    def __init__(self,color,size,height):
        Turtle.__init__(self,visible=False,shape='blank')       
        self.penup()                        # 抬笔
        self.xspeed = 0                     # 单位水平位移
        self.yspeed = 0                     # 垂直水平位移
        imagefile = color + "_balls/ball-" + str(size) + ".gif"
        self.shape(imagefile)               # 设定形状
        self.setx(randint(50-self.screen.window_width()//2,self.screen.window_width()//2-50))
        self.sety(height)
        self.accspeed = -0.5 
        self.showturtle()       

if __name__ == "__main__":

    colors = ["cyan",'yellow','green','pink','purple']
    size = list(range(10,101,10))

    yellow_balls = ["yellow_balls/ball-" + str(i) + ".gif" for i in size]
    cyan_balls = ["cyan_balls/ball-" + str(i) + ".gif" for i in size]
    green_balls = ["green_balls/ball-" + str(i) + ".gif" for i in size]
    pink_balls = ["pink_balls/ball-" + str(i) + ".gif" for i in size]
    purple_balls = ["purple_balls/ball-" + str(i) + ".gif" for i in size]
     
    screen = Screen()
    screen.title("3D多彩重力弹球,作者:李兴球")
    screen.delay(0)
    screen.bgcolor("black")
    # screen.bgpic("bg3d.png")
    [screen.addshape(image) for image in yellow_balls]
    [screen.addshape(image) for image in cyan_balls]
    [screen.addshape(image) for image in green_balls]
    [screen.addshape(image) for image in pink_balls]
    [screen.addshape(image) for image in purple_balls]    

    screen.mainloop()  
            

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

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

发表在 python, turtle | python伪3D多彩重力弹球已关闭评论

温度计模拟交互动画

python温度模拟器动画制作

以下是部分代码预览:

"""本程序实现一个温度计模拟,需要thermometer支持,模块在下面
from thermometer import * 

"""自定义形坐标点,不采用内置的square的原因是它以中心点为旋转中心,
   页这个是以最下边中心点为旋转中心,所以伸长的时候不会向两边伸长。"""

width,height  = 300,840

screen = Screen()                     # 新建屏幕对象
screen.colormode(255)                 # 颜色模式为RGB255
screen.setup(width,height)            # 设定屏幕的宽和高
screen.delay(0)                       # 设定绘画延时
screen.addshape("mysquare",p)         # 注册 mysquare 形状
screen.addshape("ball-red.gif")       # 注册gif图
screen.addshape("ball-cyan.gif")
screen.addshape("sun.gif")
screen.addshape("snow.gif")
screen.addshape("button1+.gif")
screen.addshape("button1-.gif")

screen.bgpic("背景短空.png")

"新建温度计对象,参数为初始温度"
temperature = 60
therm = Thermometer(temperature)      # 接受整型参数,-28到80之间
therm.shape("mysquare")               # 设定形状为mysquare

button_add = Button("button1+.gif",100,-350,therm,"+")
button_sub = Button("button1-.gif",-100,-350,therm,"-")

screen.listen()                       # 设置焦点,监听键盘
screen.mainloop()                     # 刷新组件,进入主循环

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

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

发表在 python, turtle | 温度计模拟交互动画已关闭评论

tkinter画线的末端风格BUTT、PROJECTING和ROUND,连接风格ROUND、BEVEL、MITER展示

tkinter画线的末端风格BUTT、PROJECTING和ROUND,连接风格ROUND、BEVEL、MITER展示

在画线条的时候,起笔应该是个什么样式?还有在线条折回的时候又应该是个什么样式呢?
一根线条有两端,起笔或抬笔的样式,我们把它叫末端风格,英文名为Cap style。
tkinter定义了三种,第一种叫BUTT,它是方形的风格,起点详见下图。
第二种叫PROJECTING,也是方形风格,不过起始点不同。
第三种风格叫ROUND,是圆形风格。

在线条折回的时候,也有三种风格可供选择,这叫做连接样式,英文名为:Join style。
第一种是ROUND风格,第二种是BEVEL风格,第三种是MITER风格。详见下图一目了然!

 

tkinter画线的末端风格BUTT、PROJECTING和ROUND,连接风格ROUND、BEVEL、MITER展示

发表在 tkinter | tkinter画线的末端风格BUTT、PROJECTING和ROUND,连接风格ROUND、BEVEL、MITER展示已关闭评论

pygame文字转png图像教程

pygame的surface代表着一张图像。如果要在pygame 的屏幕上显示文字,那么首先要把文字渲染成surface,如果把这个surface直接保存为png图像,那么就实现了文字转png图像了。连续的保存,再合成它们就能制作 gif图了。通过pygame.font.get_default_font()命令能获取缺省的字体文件,它返回一个字符串。通过pygame.font.Font则能新建字体对象。用字体对象就能把具体的文字渲染成surface了,最后就只剩下保存。代码如下所示:

>>> import pygame
>>> pygame.init()
(6, 0)
>>> fnt = pygame.font.get_default_font()
>>> fnt
'freesansbold.ttf'
>>> fntobj = pygame.font.Font(fnt,20)
>>> myword = fntobj.render("I love Python",True,(255,0,0))
>>> pygame.image.save(myword,"c:/myword.png")
>>>

pygame.font.Font的第一个参数是字体文件,第二个参数是字体大小。
在fntobj.render参数中,第一个是要写的字,第二个是反锯齿,第三个是颜色。
surface有get_width和get_height命令,这样就能获取所生成的图像的大小。

下面的函数需要imageio模块支持,它能把一系列png图片合成gif。如果要生成一个按 I love Python 逐字显示的gif动画该如何编程呢?有了下面的函数,结合上面的知识,相信你一定能够编出来。

def make_gif_image(path_image,gif_filename):
   """读取路径下面的所有png文件,形成gif图形"""
   amounts = len([ image for image in os.listdir(path_image) if os.path.splitext(image)[-1] == ".png"])
   images = [ path + os.sep + str(i) + ".png" for i in range(0,amounts)]
   frames = [imageio.imread(image) for image in images]
   imageio.mimsave(gif_filename, frames, 'GIF', duration=0.4)

字符串转gif图像逐字显示动画

发表在 pygame | pygame文字转png图像教程已关闭评论

coloradd颜色增加源代码

"""颜色增加与颜色设定命令,用来在海龟画图中做颜色渐变。
   作者:李兴球 2019/4/13晚更新
   本程序定义了两个函数,coloradd是用来增加颜色的,colorset是把一个整数转换成rgb三元色值。
"""

import colorsys
def coloradd(color,dh):
    """颜色增加
       color是三元组,分别为0-1之间的浮点数。
       此函数把颜色转换成hls模式,对色度h进行增加色度dh的操作
       然后转换回去,dh是小于1的浮点数。       
    """
addcolor = coloradd   #定义别名

def colorset(color):
    """设定颜色,color范围为1到360
       把一个整数转换成三元色值
    """    
    return r,g,b
    
setcolor = colorset    #定义别名

if __name__ == "__main__":
    color = (1,0,0)
    color = coloradd(color,0.001)
    print(color)
    print()
    color = (1,0,0)
    for i in range(256):
        color = coloradd(color,i/255)
        r = int(color[0] * 255) 
        g = int(color[1] * 255) 
        b = int(color[2] * 255)
        print(r,g,b)
        
    input("颜色增加与颜色设定命令,作者:李兴球,请按回车键结束测试.")
    

 

如需要查看完整代码,请

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

发表在 python, turtle | coloradd颜色增加源代码已关闭评论

pymunk物理引擎和turtle结合最简示例

pymunk是为python设计的一个2D物理引擎。一个物理实体是有质量,摩擦力等性质。要模拟物理世界,就要在这个世界中新建很多对象。
通过pymunk.Body能新建这个对象,我们把它叫body。body有坐标,旋转角度等。一旦body进物理学世界,物理引擎就会实时地计算出它的速度,旋转角度等等。但body是没有形状的,如果“碰”到了其它body,如何进行碰撞检测方面的计算呢?所以body要有一个形状,可能是100X100的正方形,或一个圆形。这样才能有进行碰撞检测必要条件。到这里如果新建了很多body并赋予了外形,它们就能遵循物理定律移动碰撞了,但我们却看不见它们。因为它们没有被渲染出来,也就是没有可视化的界面来让我们来看到。在下面的代码中我们用的是海龟画图的海龟对象来显示poly。具体方法请见以下代码:

以下是部分代码预览:

"""最简物理引擎用海龟渲染小球示例.py"""

import pymunk               # 导入pymunk
import turtle

space = pymunk.Space()      # 创建物理空间
space.gravity = 0,-1        # 设置加速度

body = pymunk.Body(1,1666)  # 新建有质量和惯性的刚体
body.position = 0,200       # 设置刚体的坐标

# 下面用海龟画图来做界面
ball = turtle.Turtle(shape='circle')
ball.color("magenta")
ball.screen.delay(0)
ball.penup()

如需要查看完整代码,请

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

发表在 pymunk, turtle | pymunk物理引擎和turtle结合最简示例已关闭评论

pygame图形旋转教程

要学习如何旋转图形,首先要学习一下Rect类。在pygame中有pygame.Rect这个类,它是矩形类。通过它新建一个矩形对象,可以用来代表图形surface对象的坐标,宽度与高度,通常也就是这么做的。
surface有get_rect方法,能获取自己的矩形对象。示例代码如下:

>>> import pygame
>>> pygame.init()
(6, 0)
>>> screen = pygame.display.set_mode((480,360))
>>> square = pygame.Surface((100,100)).convert_alpha()
>>> square.fill((0,0,255))
<rect(0, 0, 100, 100)>
>>> rect = square.get_rect()
>>> rect
<rect(0, 0, 100, 100)>
>>> screen.blit(square,rect)
<rect(0, 0, 100, 100)>
>>> pygame.display.update()    # 刷新屏幕显示出square
>>>

上面新建了screen和square,这是两个surface。运行后,我们能看到一个蓝色的正方形显示在屏幕左上角。
rect有x,y属性,如果把rect.x和rect.y都设为100,我们就能把矩形渲染到坐标为(100,100)的位置了。

>>> rect.x = rect.y = 100
>>> screen.blit(square,rect)
<rect(100, 100, 100, 100)>
>>> pygame.display.update()    # 刷新屏幕显示出square
>>>

运行上面的代码,又有一个蓝色的矩形出现了,原先矩形并没有擦除。这是由于我们没有把screen还原成全黑色所造成的,所以它还保留着左上角蓝色正方形。
我们也可以设定矩形的中心点坐标,如rect.centerx = 100的时候,那么这个矩形的x坐标应该是多少呢?矩形的边长是100,它的左上角x坐标就应该是50。
同理,如果用rect.centery = 100设定矩形的中心点y坐标为100时,它的左上角y坐标也是50。

下在我们来测试一下,这回先把screen给黑掉。

>>> screen.fill((0,0,0))
<rect(0, 0, 480, 360)>
>>> rect.centerx = 100
>>> rect.centery = 100
>>> screen.blit(square,rect)
<rect(50, 50, 100, 100)>
>>> pygame.display.update()
>>>

如果要对正方形进行旋转的话,pygame.transform.rotate的这个方法能对square进行旋转,它会返回一个新的surface。
这个旋转是以图形的中心点为旋转中心的。旋转后,图形的宽度和高度会发生变化,我们对它进行重新渲染,这样好像square就旋转了。
当然,要在同一个位置进行渲染,所以首先要设定好矩形对象的中心点坐标。以下是让图形进行旋转的代码。

 

"""pygame图像旋转教程

 
# 矩形对象有left,right,top,bottom,width,height,centerx,centery等属性,分别对应它的
# 最左x坐标,最右x坐标,最上y坐标,最下y坐标,宽度,高度,中心点x坐标,中心点y坐标值。

"""

import math
import pygame
from pygame.locals import *            # 导入pygame定义的常量

width,height = 480,360

pygame.init()

screen = pygame.display.set_mode((width,height))

square = pygame.Surface((100,100)).convert_alpha()
square.fill((0,255,255))

centerx = width//2                      # 中心点x坐标
centery = height//2                     # 中心点y坐标
angle = 0                               # 旋转角度

running = True

while running:
    event = pygame.event.poll()         # 从事件队列中取一个事件
    if event.type == QUIT:running = False
    s = pygame.transform.rotate(square,math.radians(angle)) # 旋转square   
    s_rect = s.get_rect()               # 获取surface的矩形对象
    s_rect.centerx = centerx            # 设定图形的中心点x坐标
    s_rect.centery = centery            # 设定图形的中心点y坐标
    screen.fill((0,0,0))                # 填充screen为黑色
    screen.blit(s,s_rect)               # 把旋转后的s图形按s_rect之描述贴到screen上
    pygame.display.update()             # 更新屏幕显示 
    angle +=1
    
pygame.quit()




如果要对外部的图形进行旋转,可以用pygame.image.load(图形文件名)加载图像形成surface。

发表在 pygame | pygame图形旋转教程已关闭评论

pygame图像处理之合成图片与缩放演示程序

Pygame有Surface类,它用来实例化存储在内存中的图形。如果要加载外部的图像,可以用pygame.image.load命令,它返回的是surface。
由于Pygame的surface提供了一套方法可以操作surface,如设置透明度,缩放,旋转,甚至对它直接进行像素级操作,所以可以做图形处理。我们加载两张图片,把它们合成,那么新的图片就出来了。以下是把名为“太空.png“的和名为”nezha.png”的图片进行合成的最简单示例,方便理解。

"""pygame最简单的合成与透明度演示程序"""

import pygame                           # 导入pygame模块

pygame.init()

screen = pygame.display.set_mode((1,1)) # 新建屏幕对象

background = pygame.image.load("太空.png").convert()  #转换成透明度图
nezha = pygame.image.load("nezha.png")  # 加载哪吒图
nezha.set_alpha(100)                    # 设置合成图像时,它的alpha值
background.blit(nezha,(100,0))          # 把nezha贴到(100,0)坐标

pygame.image.save(background,"bg.png")  # 保存图形
pygame.quit()

当两张图像合成一张图片时,每个像素是由每张图片的像素合成的。上面的程序中nezha的alpha值为100,这表示它和另一个图像合成时,它贡献100/256比例的像素值,而另一个图像将使用155/256的比例。如果它的alpha值是0,它合成到另一个图像上,它将是透明的。如果它的alpha值是255,则它是不透明的,完全覆盖在另一张图片上。为了理解,我们来估个试验。

下面的screen 由 pygame.display.set_mode((100,100))建立。我们把它填充为红色。image1是一个蓝色的图形。通过image1.set_alpha能设置它在合成时所贡献的像素比值。如果它的值是0,它将不贡献一点像素,这时屏幕会显示纯红色,如果它的值在0到255之间,它会贡献相应比例的像素值。如果它是255,它所占的比例就是100%。这时就是纯蓝色了。运行下面的程序,屏幕会从红色快速地过度到蓝色。也即image1会从完全透明过度到不透明。

"""pygame的surface设置alpha试验"""

import pygame

pygame.init()

screen = pygame.display.set_mode((100,100))
screen.fill((255,0,0))       # screen是红色的 

image1 = pygame.Surface((100,100))
image1.fill((0,0,255))

# 下面让屏幕从红色显示到蓝色
for a in range(0,256):         # 值从0到255变化
    image1.set_alpha(a)        # 设置合成时的alpha值
    screen.blit(image1,(0,0))  # 合成到screen
    print(screen.get_at((0,0)))# 打印screen左上角像素值
    pygame.display.update()    # 刷新显示
    screen.fill((255,0,0))     # 让screen的颜色回到红色

刚才说了Surface类提供了方法可以对图像进行缩放,下面的例子对图像进行了缩放。

 

"""
pygame合成图片与缩放演示程序。

 

"""
nezhas = []

import pygame                           # 导入pygame模块

pygame.init()                           # pygame初始化

screen = pygame.display.set_mode((1,1)) # 新建屏幕对象

background = pygame.image.load("太空.png").convert_alpha()
bgheight = background.get_height()      # 获取背景高度
nezha = pygame.image.load("nezha.png")  # 加载哪吒图
    
nezha_width = nezha.get_width()         # 获取宽度
nezha_height = nezha.get_height()       # 获取高度
k = nezha_height / nezha_width          # 高度和宽度的比值
background.blit(nezha,(0,bgheight-nezha_height)) # 把nezha图放在background左下角

for width in range(10,420,50):
    print(width)
    height = int(width * k) 
    n  = pygame.transform.scale(nezha,(width,height))  # 缩放图形
    n.set_alpha(width//2)            # 设置透明度 
    background.blit(n,(width*2,250)) # 贴一张图到background上     

pygame.image.save(background,"combine.png") # 保存图像

pygame.quit()                        # 退出pygame

 

哪吒png源图

太空png原图缩放与合成后的图 缩放与合成后的图

发表在 pygame | pygame图像处理之合成图片与缩放演示程序已关闭评论

pygame教程之关于surface

在pygame中有一个Surface概念,它的中文意思为表面。它用来代表图像,当新建了一个surface时,它是一幅黑色的图形。这个图形是以左上角为原点的。
用screen = pygame.display.set_mode((width,height))建立的是一个surface,width和height是surface的宽度和高度。
用type(screen)查看,结果是<class ‘pygame.Surface’>。它通常用于在pygame的游戏主循环中最先被渲染的图形。

当然,只有一个surface,那么在pygame中只会显示一个黑乎乎的界面。通常我们会建立更多的surface,然后把这些surface依次渲染到screen上。

请在IDLE中输入以下命令测试:

>>> import pygame
>>> pygame.init()
(6, 0)
>>> width,height = 800,600
>>> screen = pygame.display.set_mode((width,height))
>>> type(screen)
<class 'pygame.Surface'>
>>>

现在,我们来建立另一个surface,用 square = pygame.Surface((360,360)) 命令,新建一个叫square的,宽度和高度是360和360像素的正方形。
现在,这个正方形是黑色的,如果我们把它渲染到screen上,什么也看不见,还是黑乎乎的一片。通过square.fill((255,0,0))把它的颜色填充为红色。
然后用screen.blit(square,(100,100))就能把square渲染到screen上。如果不能理解渲染的意思,可以理解为把square贴到screen上即可。
贴在屏幕坐标左上角(100,100)的位置。到此为正方形还是没有显示出来,要把它显示出来还有最后一步,就是刷新屏幕显示。调用pygame.display.update()即可。
成功后在分辨率为800×600的黑色屏幕上会显示一个大大的红色正方形。请输入以下命令测试。

>>> square = pygame.Surface((360,360))
>>> square.fill((255,0,0))
<rect(0, 0, 360, 360)>
>>> screen.blit(square,(100,100))
<rect(100, 100, 360, 360)>
>>> pygame.display.update()
>>>

最后,退出pygame可以用pygame.quit()命令。以下是完整的代码,加了一个窗口标题:

"""
pygame教程之surface表面
在pygame中有一个Surface概念,它的中文意思为表面。.
它用来代表图像,当新建了一个surface时,它代表内存中的一幅黑色的图形。

"""


import pygame                      # 导入pygame模块

pygame.init()                      # pygame初始化  
 
width,height = 800,600             # 定义全局变量

screen = pygame.display.set_mode((width,height)) # 新建屏幕,它是一个surface

pygame.display.set_caption("pygame教程之surface表面,作者:李兴球")
 
square = pygame.Surface((360,360)) # 新建square,它是一个surface

square.fill((255,0,0))             # 填充square为红色
 
screen.blit(square,(100,100))      # 把square贴在screen上
 
pygame.display.update()            # 刷新合成后的屏幕显示


#pygame.quit()             # 开了这个会一闪而过

pygame教程之surface表面

要移动这个正方形,那就需要不断地改变它的渲染坐标,并且把以前所渲染的都擦除掉。这就需要一个循环,假设正方形的坐标用x,y表示,它每次水平移动的距离用dx表示,我们把正方形变小,通过for循环500次,不断地填充背景屏幕,不断地渲染正方形,这个速度很快,让它 移动起来。代码如下所示:

"""
移动500次的红色小正方形。

"""

import pygame                      # 导入pygame模块

pygame.init()                      # pygame初始化  
 
width,height = 800,600             # 定义全局变量

screen = pygame.display.set_mode((width,height)) # 新建屏幕,它是一个surface

pygame.display.set_caption("pygame教程之surface表面,作者:李兴球")
 
square = pygame.Surface((36,36)) # 新建square,它是一个surface

square.fill((255,0,0))             # 填充square为红色

x , y = 100,100                    # 代表矩形的渲染坐标 
dx = 1                             # 代表矩形每次移动的水平距离

for n in range(500):
    screen.fill((0,0,0))           # 填充屏幕为黑色
    screen.blit(square,(x,y))      # 把square贴在screen上
    x = x + dx                     # 水平坐标增加dx
    pygame.display.update()        # 刷新合成后的屏幕显示


#pygame.quit()             # 开了这个会窗口会关闭

上面的正方形向右移动,如果要让它斜着移动怎么办呢?如果读懂了上面的代码,那么相信你完全可以编写出代码来。这就当成一个小练习吧,请自行完成。

pygame移动的正方形

发表在 pygame | pygame教程之关于surface已关闭评论

Python画心动画之_怦然心动.py

python画心动画怦然心动 by lixingqiu
以下是部分代码预览:

"""怦然心动.py

形状列表是海龟画图内置形状(造型)的一个列表,存储了海龟的形状,每个形状是一个多边形。
它的所有顶点坐标可以通过海龟的get_shapepoly命令获取。如以下代码获取默认的海龟对象的顶点坐标

>>> import turtle
>>> turtle.get_shapepoly()
((0, 0), (-5, -9), (0, -7), (5, -9))

通过屏幕的addshape命令可以添加新的造型,下面新的造型名称为line,值就是p列表。

例:
 p = [(0,0),(10,10)],通过屏幕的addshape('line',p)就能在形状列表里添加这个名为
line的形状。获取形状列表用屏幕的 getshapes命令。

内置的形状列表为: ['arrow', 'blank', 'circle', 'classic', 'square', 'triangle', 'turtle']

"""

from turtle import *
from time import sleep

screen = Screen()
screen.setup(480,360)
screen.bgcolor("black")
screen.title("怦然心动 by lixingqiu")

t = Turtle(shape="blank")
t.penup()
t.color("magenta")

screen.tracer(False)     # 加这句不会显示画的过程

# 下面是画心的代码
t.begin_poly()           # 开始记录顶点坐标
t.left(140)
t.forward(111.65)
rightmove()
t.left(120)
rightmove()
t.forward(111.65)
t.end_poly()             # 结束记录顶点坐标
p = t.get_poly()         # 得到刚画的多边形的顶点坐标

screen.update()
screen.tracer(True)      # 重新显示来的过程
screen.addshape('heart',p)  # 把画好的形状添加到形状列表
t.shape('heart')            # 设定海龟的造型为心形
t.setheading(90)            # 设置朝向
t.bk(50)                   # 倒退100
t.clear()                   # 清空所画图形
x = 0

如需要查看完整代码,请

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

发表在 python, turtle | Python画心动画之_怦然心动.py已关闭评论

操作矩形上下左右移动的代码

"""操作矩形上下左右移动的代码"""

from turtle import *

def 向上移():

    y = t.ycor() + 10
    t.sety(y)

def 向下移():

    y = t.ycor() - 10
    t.sety(y)

def 向左移():

    x = t.xcor() - 10
    t.setx(x)

def 向右移():

    x = t.xcor() + 10
    t.setx(x)
  
screen = Screen()

t = Turtle(shape='square')
t.penup()
t.color("magenta")
t.shapesize(1,10)

screen.onkeypress(向上移,"Up")
screen.onkeypress(向下移,"Down")

screen.onkeypress(向左移,"Left")

screen.onkeypress(向右移,"Right")

screen.listen()

 

发表在 turtle | 操作矩形上下左右移动的代码已关闭评论

打地鼠小游戏2019/4/9turtle版

https://www.lixingqiu.com/wp-content/uploads/2019/04/Python海龟画图制作的打地鼠小游戏.png

以下是部分代码预览:

"""python的turtle模块制作的打地鼠小游戏,用pygame的混音器配音,此版本为2019/4/9修改。
海龟的图片造型不能旋转,解决方案是用多个造型,但是没有内置的碰撞检测,所以此版本没有加榔头,基本不再更新。
更好的版本应该用pygame或arcade等模块来制作,有需要制作的可以联系我。

"""

__author__ = "李兴球"
__date__ = "2019/4/9"

import os,sys
from turtle import *
from random import *
from time import sleep
import pygame

class Mouse(Turtle):
    clicks = 0                      # 统计单击数量
    def __init__(self,image,position,sound):       
        Turtle.__init__(self,visible=choice([False,True]),shape=image)
        self.penup()         
        self.speed(0)               # 设定速度
        self.goto(position)
        self.sound = sound          # 声音效果
 

def main():
   
   pygame.mixer.init()
   音乐文件= "My Musicfmusic1.wav"
   pygame.mixer.music.load(音乐文件)
   pygame.mixer.music.play(-1,0) 
   拍子声 =pygame.mixer.Sound("HandClap.wav")
   mouse = "地鼠2.gif"

   screen =Screen()                                 # 新建屏幕对象
   screen.delay(0)                                  # 设置延时时间
   screen.addshape(mouse)                           # 添加老鼠造型
   screen.setup(480,360)                            # 设置屏幕宽高
   screen .bgpic("tree.png")                        # 设置背景图片
   screen.title("Python海龟画图制作的打地鼠小游戏") # 设置窗口标题

   screen.mainloop()

if __name__ == "__main__":

   main()

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

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

发表在 python, turtle | 打地鼠小游戏2019/4/9turtle版已关闭评论

未来城市会消失吗

城市也会有一个诞生,发展,消亡的历史过程。那么它消失的理由是什么?首先我们看看城市化的理由是什么。人多聚集在一起生活,方便利于社会发生产与分工,这就是城市化的最简单理由 ,谁都能想得到。

当互联高速发达,快递业高速发达,那个时候人们即使住在山顶也能瞬间与人沟通,并且使用迷你飞行器,比如就叫风火轮吧,以极快地速度到另外一个地方。但是通常不必要这么做,因为那时候的人类通常生活在虚拟世界里。意识说不定与肉体分离了。所以城市也就没有存在的理由了。取而代之的是极度繁荣的各种虚拟世界。

好吧,又扯远了。那就扯近点,现在城市化还在进行中。人们还在努力拼搏买房子,为了种种理由而从农村走向城市,国家一边要城市化,让人流向城市。一边又要搞新农村建设,搞什么特色小镇,好像又要让人流回城市。这是不是矛盾的? 这并不矛盾,乡下生活的人向往城市,在城市的钢筋水泥里生活了几十年的人向往田园生活,人们也需要美好的农村,去旅旅游什么或在乡下住一段时间。所以城市化和新农村建设不矛盾。还有部分职业者的工作不需要在城市,他们通过网络就能获取一切,这些人是设计大师之类的或电商人士等我想不出来的一些职业。互联网速度越来越快,人们进入幻境(逼真的虚拟现实)就能解决一切,如会议,团队合作,游戏等。那么还要大城市干啥,大家挤在一起失去意义了。人们可能有的住在桃花岛,有的住在韶山坡上,都是住在很宜居的地方。我就住在山顶上,没水了就意念一下,水就来了。因为那时候互联网都内置到大脑里了,所以一切只要“意念”一下。

想到一种情况是,高铁速度越来越快,什么超级高铁,可能本世纪30,40年代就1个小时就能从萍乡到北京了。如果是免费的多好,这将是中小城市的福音。人们不必住在大城市,都住在宜居的小城市或农村。这是有可能的吗?免费是不可能,高铁速度越来越快则是必然。现在的人花几百上千万在大城市买房,以后人们花少得多的钱一样能达到同样的目的。所以花这么多钱买房我一直觉得不值,辛辛苦苦挣的钱为什么要给别人。美国富人们都住在偏僻的乡村,更喜欢乡下的宁静。有什么比健康和生命更加重要?相比工业时代的城市化,现在信息化社会,所谓第4代工业革命。城市和乡村的差距被互联网减小了。

最后总结一下,生产力的发展让加速城市化,然而也是由于高科技的发展,会让城市消失或者再次浸在大自然中,不知道我能不能等到那一天。

发表在 杂谈 | 未来城市会消失吗已关闭评论

python简单的图片切换形成动画效果程序

简单事情复杂化了,这个程序实现这个效果还能再度精简很多代码,把类去掉吧,你能自行完成吗?

import turtle

class Window:
    def __init__(self,width,height,bgimages,title="",alt_delay=120,bgcolor="white"):
        self.screen = turtle.Screen()
        self.screen.delay(0)
        self.screen.setup(width,height)
        self.screen.title(title)
        self.screen.bgcolor(bgcolor)
        self.bgimages = bgimages    # 图片列表
        self.amounts = len(bgimages)
        self.index = 0              # 索引列表
        self.alt_delay = alt_delay  # 切换背景图延时
        if self.amounts==1:         # 只有一张背景图则设为背景,不切换
            self.screen.bgpic(bgimages[0])
        elif self.amounts >1:       # 超过一张背景图则不断地换背景图
            self.alt_image()       
        
    def bgcolor(self,color):
        self.screen.bgcolor(color)

    def bgpic(self,pic):
        self.screen.bgpic(pic)

    def alt_image(self):         
        self.bgpic(self.bgimages[self.index])
        self.index = self.index + 1
        self.index = self.index % self.amounts
        self.screen.ontimer(self.alt_image,self.alt_delay)
        
    def run(self):
        self.screen.mainloop()

if __name__== "__main__":

    images = ["girl1/0001.png",
              "girl1/0002.png",
              "girl1/0003.png",
              "girl1/0004.png",
              "girl1/0005.png",
              "girl1/0006.png",
              "girl1/0007.png",
              "girl1/0008.png",
              "girl1/0009.png",
              "girl1/0010.png",
              "girl1/0011.png",
              "girl1/0012.png"
              ]
    
    window  = Window(480,360,images,"女孩跳舞")
    window.run ()
    
 

 

发表在 turtle | python简单的图片切换形成动画效果程序已关闭评论

pygame显示动态gif图片

这是用pygame制作的动态图片显示程序。

"""本程序定义了一个GIFImage类,这个类是Matthew编写,10年前的类,现在运行不了。
修改后可以, modifyed by lixingqiu@2019/4/8"""

import pygame
from PIL import Image
from pygame.locals import *

import time

class GIFImage(object):
    def __init__(self, filename):
        self.filename = filename
        self.image = Image.open(filename)
        self.frames = []
        self.get_frames()

        self.cur = 0
        self.ptime = time.time()

        self.running = True
        self.breakpoint = len(self.frames)-1
        self.startpoint = 0
        self.reversed = False

    def get_rect(self):
        return pygame.rect.Rect((0,0), self.image.size)

    def get_frames(self):
        image = self.image

        pal = image.getpalette()
        base_palette = []
        for i in range(0, len(pal), 3):
            rgb = pal[i:i+3]
            base_palette.append(rgb)

        all_tiles = []
        try:
            while 1:
                if not image.tile:
                    image.seek(0)
                if image.tile:
                    all_tiles.append(image.tile[0][3][0])
                image.seek(image.tell()+1)
        except EOFError:
            image.seek(0)

        all_tiles = tuple(set(all_tiles))

        try:
            while 1:
                try:
                    duration = image.info["duration"]
                except:
                    duration = 100

                duration *= .001 # 转换成毫秒
                cons = False

                x0, y0, x1, y1 = (0, 0) + image.size
                if image.tile:
                    tile = image.tile
                else:
                    image.seek(0)
                    tile = image.tile
                if len(tile) > 0:
                    x0, y0, x1, y1 = tile[0][1]

                if all_tiles:
                    if all_tiles in ((6,), (7,)):
                        cons = True
                        pal = image.getpalette()
                        palette = []
                        for i in range(0, len(pal), 3):
                            rgb = pal[i:i+3]
                            palette.append(rgb)
                    elif all_tiles in ((7, 8), (8, 7)):
                        pal = image.getpalette()
                        palette = []
                        for i in range(0, len(pal), 3):
                            rgb = pal[i:i+3]
                            palette.append(rgb)
                    else:
                        palette = base_palette
                else:
                    palette = base_palette

                pi = pygame.image.fromstring(image.tobytes(), image.size, image.mode)
                pi.set_palette(palette)
                if "transparency" in image.info:
                    pi.set_colorkey(image.info["transparency"])
                pi2 = pygame.Surface(image.size, SRCALPHA)
                if cons:
                    for i in self.frames:
                        pi2.blit(i[0], (0,0))
                pi2.blit(pi, (x0, y0), (x0, y0, x1-x0, y1-y0))

                self.frames.append([pi2, duration])
                image.seek(image.tell()+1)
        except EOFError:
            pass

    def render(self, screen, pos):
        if self.running:
            if time.time() - self.ptime > self.frames[self.cur][1]:
                if self.reversed:
                    self.cur -= 1
                    if self.cur < self.startpoint:
                        self.cur = self.breakpoint
                else:
                    self.cur += 1
                    if self.cur > self.breakpoint:
                        self.cur = self.startpoint

                self.ptime = time.time()

        screen.blit(self.frames[self.cur][0], pos)

    def seek(self, num):
        self.cur = num
        if self.cur < 0:
            self.cur = 0
        if self.cur >= len(self.frames):
            self.cur = len(self.frames)-1

    def set_bounds(self, start, end):
        """设置起始帧和结束帧"""
        if start < 0:
            start = 0
        if start >= len(self.frames):
            start = len(self.frames) - 1
        if end < 0:
            end = 0
        if end >= len(self.frames):
            end = len(self.frames) - 1
        if end < start:
            end = start
        self.startpoint = start
        self.breakpoint = end

    def pause(self):
        self.running = False

    def play(self):
        self.running = True

    def rewind(self):
        self.seek(0)
        
    def fastforward(self):
        self.seek(self.length()-1)

    def get_height(self):
        return self.image.size[1]
    def get_width(self):
        return self.image.size[0]
    def get_size(self):
        return self.image.size
    def length(self):
        return len(self.frames)
    def reverse(self):
        self.reversed = not self.reversed
    def reset(self):
        self.cur = 0
        self.ptime = time.time()
        self.reversed = False

    def copy(self):
        new = GIFImage(self.filename)
        new.running = self.running
        new.breakpoint = self.breakpoint
        new.startpoint = self.startpoint
        new.cur = self.cur
        new.ptime = self.ptime
        new.reversed = self.reversed
        return new
    
def event_check():
    """事件检测函数"""
    for event in pygame.event.get():
        if event.type == QUIT:
           return False
    return True
    
def main():
    
    pygame.init()
    lixingqiu = GIFImage("李兴球/8.gif")
    width,height = lixingqiu.get_size()
    screen = pygame.display.set_mode((width, height))
    
    # 当事件检测返回真则继续while循环
    while event_check():         
        lixingqiu.render(screen, (0, 0)) # 渲染gif图
        pygame.display.flip()       # 刷新显示
        
    pygame.quit()                   # 关闭窗口              
    

if __name__ == "__main__":
    
    main()

 

发表在 pygame | pygame显示动态gif图片已关闭评论

python愤怒的小鸟arcade和pymunk制作by李兴球

以下是部分代码预览:

"""
用arcade+pymunk制作的简单的愤怒的小鸟程序,由于使用了物理引擎并结合arcade,相比用海龟画图模块制作的,它有逼真的物理效果。
由于相对于展示的是基本制作原理,配音封面等都是次要的,所以此版本没有配音,没有设计封面与游戏结束画面,

"""
__author__ = "lixingqiu"
__date__ = "2019/4/6"

import os
import math
import arcade
import pymunk
import timeit
from PIL import Image
 
SCREEN_WIDTH = 1200
SCREEN_HEIGHT = 800
SCREEN_TITLE = "愤怒的小鸟"

class PhysicsSprite(arcade.Sprite):
    def __init__(self, pymunk_shape, filename):
        super().__init__(filename, center_x=pymunk_shape.body.position.x, center_y=pymunk_shape.body.position.y)
        self.pymunk_shape = pymunk_shape


class CircleSprite(PhysicsSprite):
    def __init__(self, pymunk_shape, filename):
        super().__init__(pymunk_shape, filename)
        self.width = pymunk_shape.radius * 2
        self.height = pymunk_shape.radius * 2


class BoxSprite(PhysicsSprite):
    def __init__(self, pymunk_shape, filename, width, height):
        super().__init__(pymunk_shape, filename)
        self.width = width
        self.height = height

 
class MyGame(arcade.Window):
    """ 最顶层的游戏类,继承自窗口 """

    def __init__(self, width, height,title):
        super().__init__(width, height,title)
        
        arcade.set_background_color(arcade.color.DARK_SLATE_GRAY)

        # -- Pymunk的重力空间
        self.space = pymunk.Space()
        self.space.gravity = (0.0, -900.0)

        # 所有角色列表
        self.background = arcade.Sprite("images/background.png")
        self.background.left = self.background.bottom = 0
        self.sprite_list = arcade.SpriteList()
        self.static_lines = []

    def on_mouse_press(self, x, y, button, modifiers): 
        
        if button == arcade.MOUSE_BUTTON_LEFT :  
            self.shape_being_dragged = self.virtual_bird 

    def on_mouse_release(self, x, y, button, modifiers):
        
        physic_bird_position = self.physic_bird.pymunk_shape.body.position 
        distance = (physic_bird_position.get_distance(self.shoot_position)) 
        if distance > 1 :return
        
        if button == arcade.MOUSE_BUTTON_LEFT:
            # 松开
            self.shape_being_dragged = None              
            dx = x - self.shoot_position[0]
            dy = y - self.shoot_position[1]
            self.physic_bird.pymunk_shape.body.force = -dx*10000, -dy*10000
            self.reset_shoot = False            

    def on_mouse_motion(self, x, y, dx, dy):
        if self.shape_being_dragged is not None:
            # 抓住了某个物体,让它跟随鼠标指针 
            self.virtual_bird.center_x = x
            self.virtual_bird.center_y = y
            

    def update(self, delta_time):
         
        start_time = timeit.default_timer()        
        self.virtual_bird.update()
        
        # 检测每一个角色,移除y坐标小于0的
        for sprite in self.sprite_list:
            if self.physic_bird == sprite:continue         # 排除物理小鸟
            if sprite.pymunk_shape.body.position.y < 0:
                # 从重力空间中移除
                self.space.remove(sprite.pymunk_shape, sprite.pymunk_shape.body)
                # 从列表中删除 
                sprite.kill()

        self.space.step(1 / 60.0)
 
        # 把角色统统移到它的物理坐标
        for sprite in self.sprite_list:
            sprite.center_x = sprite.pymunk_shape.body.position.x
            sprite.center_y = sprite.pymunk_shape.body.position.y
            sprite.angle = math.degrees(sprite.pymunk_shape.body.angle)

        # 保存时间
        self.processing_time = timeit.default_timer() - start_time


def main():
    MyGame(SCREEN_WIDTH, SCREEN_HEIGHT,SCREEN_TITLE)

    arcade.run()


if __name__ == "__main__":
    main()

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

发表在 arcade, pymunk, python | python愤怒的小鸟arcade和pymunk制作by李兴球已关闭评论

turtle_pymunk愤怒的小鸟简单版本程序

以下是部分代码预览:

"""   这是用Python的海龟画图模块和pymunk模块制作的愤怒的小鸟简单版本程序。
physicbox是我编写的一个模块,它有PhysicBall类用来生成物理角色。
还设计了StaticPhysicBox类用来生成静止的盒子角色。 
"""
import pymunk                       # 导入pymunk模块
import turtle                       # 导入海龟模块,用它来渲染刚体
import random
import physicbox

def display_xy(event):
        """朝向鼠标指针"""

  
def draw_line(x,y):
    """画线"""
    fixed_dot.clear()
    fixed_dot.pendown()
    fixed_dot.goto(x,y)
    fixed_dot.penup()    
    fixed_dot.goto(fixed_position)
    virtual_ball.goto(x,y)

def shoot(x,y):
    virtual_ball.ondrag(None)                        # 取消虚拟球的拖曳事件
    dx =  (fixed_dot.xcor() - virtual_ball.xcor())/5 # 算出水平位移   
    dy =  (fixed_dot.ycor() - virtual_ball.ycor())/5 # 算出垂直位移                
   
width,height = 1024,800
screen = turtle.Screen()                 # 新建海龟窗口,用于渲染形状的
screen.delay(0)
screen.title("turtle_pymunk愤怒的小鸟原型程序")
screen.setup(width,height)
screen.bgpic("images/bg.png")
screen.addshape("images/bird.gif")       # 50 x 50
 
screen.addshape("images/platform.gif")   # 168 x 166
screen.addshape("images/wood1.gif")      # 406 x 38
screen.addshape("images/wood2.gif")      # 166 x 82
screen.addshape("images/ground.gif")     # 1024x250
screen.addshape("images/verticle1.gif")  # 96x408
screen.addshape("images/verticle2.gif")  # 96x351
screen.addshape("images/verticle3.gif")  # 96x314
screen.addshape("images/verticle4.gif")  # 96x269
screen.addshape("images/verticle5.gif")  # 96x210
screen.addshape("images/verticle6.gif")  # 96x114
screen.addshape("images/pig.gif")        # 102x92


# 新建重力空间
space = pymunk.Space()                   # 设定重力空间
space.gravity = 0,-50                    # 设置重力参数 

# 新建静止的平台,参数为:重力空间,gif图形,图形宽高,坐标,用于放要发射的球
px,py  = -400,-300
ball_platform = physicbox.StaticPhysicBox(space,"images/platform.gif",(168,166),(px,py))

fixed_position = ball_position = (px,  py+166/2+50/2)   # 平台中心点y坐 + 平台高度/2 + 球高度/2,这样球刚好在平台上   
ball = physicbox.PhysicBall(space,"images/bird.gif",ball_position,25)  # 25是半径

# 拉皮筋要用到的固定点对象,它用来画线
fixed_dot = turtle.Turtle(visible=False)
fixed_dot.penup()
fixed_dot.goto(0,300)
fixed_dot.color("gray")
fixed_dot.write("按空格键重置",align='center',font=("黑体",32,"normal"))
fixed_dot.goto(ball_position)
fixed_dot.pensize(5)
fixed_dot.color("orange")

# 虚拟球用来显示拉的时候的球,并不是真正发射的球
virtual_ball = turtle.Turtle("images/bird.gif",visible=False)
virtual_ball.penup()
virtual_ball.goto(fixed_position)
virtual_ball.st()
virtual_ball.ondrag(draw_line)
virtual_ball.onrelease(shoot)


def reset_ball():
    """重置待发射的小球"""
    ball.reborn()
    virtual_ball.goto(fixed_position)
    virtual_ball.ondrag(draw_line)
    virtual_ball.st()

screen.onkey(reset_ball,"space")        # 按空格键重置小球
screen.listen()

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

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

发表在 pymunk, python, turtle | turtle_pymunk愤怒的小鸟简单版本程序已关闭评论

人都要听机器的!

今天登陆自己的CSDN帐号,说我的账号疑似被盗,需要手机验证码,类似的情况发生好多了,QQ换个地方登陆要验证码,严重的也会说疑似被盗。
阿里旺旺换个地方登陆快一年了,要修改淘宝店里的商品还是要验证码。
所谓的大数据不怎么灵诶,无端增加了多余的操作,虽然是为了安全,但也明显判断错误。还有360那傻逼更不用说了,它眼里什么都是木马病毒。
算法都是人编写的,靠收集种种数据来推测而已,关键是我不会轻易的把数据给泄露出去,所以算法就不灵了,这叫不叫反大数据?
有个外国的视频,忘了出自哪里了。就是用非常小的无人机携带非常小的炸弹,实施非常精准的恐怖活动。过程是这样的,这个非常小的无人机会直接穿过头颅把炸弹放到脑子里。
连爆炸的现象都没有,人就直接死亡了,这已经不是科幻了。民用的无人机可以非常容易的改造成军用。现代科技被恐怖份子利用非常危险。
你在线支付,在哪里买东西扫了码,你的一切行为,都在不断地释放自己的数据。想像一下,某个派别为了夺取政权,它对某部分支持另一个派别的人不满。
于是通过某某途径,获取每个人的数据库,进行分析。派出千万个比蚊子还要小的无人机,在晚上把异派份子全部杀害,一夜之间就死了很多人,但表面上却还是很和平。
在所谓的互联网大数据时代,这样的清洗行动变得更加容易了。这一切都是由于每个人的活动和网络紧密相连,从而为精准定位创造了良好条件。
假如又诞生了一个像希特勒这样的人,那他实施种族清洗可能就是用上面的方法。那普通人如何反制?现在大概只想到了扔掉手机,放弃互联网这样的方法,更好的方法我也没有想到。
等我想到了,我就会放在这个博客上。这叫做欲知后事如何,请听下回分解,对么?

发表在 杂谈 | 人都要听机器的!已关闭评论

Scratch3.0直接导入gif动画

最近使用Scratch3.0编程,不过发现它还是不太理想。比如我一个Scratch2.0的作品,用2.0播放,很流畅,可是用3.0播放就卡死。
原来这个作品有一个角色,运行的时候要切换几百个造型。可Scratch3.0在这个方面和我的笔记本电脑上就卡死了。
另外,相比Scratch2.0,少了一些功能,如录视频,直接导入gif等。想想当初scratch1.4是完全的一个本地应用程序,Scratch2.0则是离线版应用,而Scratch3.0则完全是javascript和react等技术架构而成。它天生是一个在线的网络应用程序,而这个Scratch3.0可执行文件要处理或访问本地电脑资源则出现了颈瓶?我想大概是这样的吧。
相比1.4和2.0,这Scratch3.0的积木块太高了,其实学习的时候并不是碎片时间,而是主要在电脑旁边学习,我们并不需要让它适合于手机版本。
在它的代码区有放大镜功能,这个功能就能满足在手机是拖曳。它还不直持gif直接导入,这怎么办呢?很简单,在Scratch2.0中导入好,然后导出扩展名为sprite2的角色文件,再导入Scratch3中。
可见Scratch3.0还是有点功能缺失啊,希望以后的版本中改进。支持中文输入是一大亮点,角色列表太窄及舞台和背景图片选取离太远,还有每次单击分类的时候都要来个动画,这纯属多余,这一招浪费了多少人的时间啊。画笔这么好的功能还给隐藏了,应该直接像2.0和1.4一样显示出来。

发表在 scratch | Scratch3.0直接导入gif动画已关闭评论

迷你地球

现在的人怎么都不知道想呢?房贷?不要买房不就啥事也有了吗?车贷,不要买车或全款买车不就啥事也没有了吗?还有什么这个贷,那个贷,这个世界变成了“贷”世界了?我为什么和贷一点关系也没有呢?
现在的商家都变成鼓励分期付款了,学老美超前消费。消费消费,消了费了,结果就是自己赚来的钱又没了。虽说人生重点在于过程,可这个过程中还是背上个债务,虽然给了发展的动力,可是我觉得还是两手空空更好,潇潇洒洒,人生来也空空,去也空空。
前段时间看到一百家号,上面尽胡扯,说什么存几十万也不够未来养老钱。暗里鼓励人们买养老保险之类的,严重怀疑这是某某托。
昨天我买了半边鸡和和一颗包菜,吃了两天,当然还有花生米,榨菜啥的。算下成本,一天费用,包括水电煤气,最多可以是15块,而如果不买鸡肉,成本最低可降至一天不要10块钱。
一个人的日子可以消费很少,有家了当然远远不止,不过在5线小城市也会过得挺好的。现在什么年代了,有互联网,学习可以直接网上阅读。百度百家号真的不能看,大多数是托,大多数是胡扯,有一些硬写“新闻“的,还有一些什么新闻,全是某企业买的广告文章。还什么口碑网啊,大众啥评啊。打击刷评论是很严厉,不过还是止不住刷评论,道高一尺,魔高一丈。刷,反刷,反反刷,只要存在利益,这个游戏永远也玩不完。商人们不遗余力地宣传着各种理念泡制焦虑,其实都是为了牟利而已。工程师、科学家,技术人员搞创新技术,其实都是为了自己一己之私,出了名就好赚钱。有钱了才可以大公无私,真正一开始就大公无私的人基本没有,因为没有这个资本。正是科学技术,让这个世界变得越来越纷繁复杂。大多数普通人陷入了这张无穷无尽复杂的网。现在地球人类社会的这个运作体系,愈趋于精巧复杂,让人们之间密不可分,一旦分开,人就无法生活了。这是“进步”呢,还是“退步”。地球发展本无所谓进步与退步,只有演变。地球物质交流移动速度越来越快的原因非常简单,有点类似热窝上的蚂蚁。这就是地球一直接受太阳的幅射,太阳对地球不断加热,如此简单而已。地球散热的速度跟不上加热的速度,如果人类不加快地球散热速度,人类的灭亡是一定的!
人类一方面要加快地球散热速度,那就是要大力搞环境,未来可能会架设地球拦板,阻挡部分阳光照射地球。一方面要不断地拓展自己的生存空间,到外星上面去,到宇宙空间里生活!比如,可以发明迷你地球。想像一下在宇宙空间离地球不远处有一个巨型3D打印机。它每天做的事情就是打印巨型迷你地球。暂且认为这个迷你地球是椭圆型的吧。迷你地球能模拟地球重力,它是一个封闭的全自动系统。它能抵挡太阳风暴等,甚至还有未来武器以防外星人等,能自动绕着太阳公转,或许不公转也行。
总之,人类生活在这个迷你地球里一切都可以自给自足,人类这时候就进入了太空时代。多么美好的太空时代啊,人类彼此独立,又能互相依存。“嗨,我们公司的迷你地球只要¥3000元,配有氢弹1000枚,能释放能量10000年。”这样的广告会有吗?到了那个时代,人类经济社会,商业行为早就消失了。
驱动着人类(那时候或许人类已经演变成另外一种智慧体了)演化的动力是什么呢?我一时还真想不出来。现在说地球温度在上升,导致南北级冰雪融化速度加快,影响到某些地方更冷。当融化得差不多了的话,那么地球就从寒纪进入热纪了。这个时候地球会不适合人类生存。如果人类没有掌握在太空或其它星球生存的技术,首先可能是在地下,或在地上建起型大的封闭系统以抵挡强烈的阳光。要建一个系统不容易,但要摧毁一个系统更容易。就像一个软件程序,编写的时候费了不少时间调试,而要让它运行不正常,只需要改个字母即可。人类这几百的来利用科学技术发展起来的这套世界各国紧密分工合作的体系,简单的比喻成不断地在建一个高楼大厦吧。要让它正常运行的所消耗的能量会越来越多。它倒塌崩溃的风险会越来越大,大灾难会降临,这并不是杞人忧天。
人类不要只会快,快,会导致更快地灭亡,正所谓欲速则不达。人类还要学习如何慢,只有慢,才能保证人类社会发展的安全度。我建议,全方位停止大多数科学技术的研究,人类要花一定的时间来研究如何更加安全并且修复现在这套体系的BUG。
马可以让它的儿子小马过河,因为它知道水有多深,所以就能以身试水。而我们人类社会的发展,各种所谓的技术都能改造人类社会。但我们人类并不知道它会给未来带来多么深远的结果。
也即不知道水有多深,以深试水的结果可能就像不会游泳的母鸡让它的儿女们也学马爸爸一样对它的儿子说:“勇敢地去尝试吧”,结果就是全部淹死。
今天是2019年4月5号,刚好是清明节,昨日小雨,今日天晴,又清又明的好日子。文章就写到这里,接下来要做一个幻灯片,教小朋友学习编程的。

发表在 杂谈 | 迷你地球已关闭评论

人类退守计划

近几百年来地球释放出千万年所储存的能量,这些能量让地球升温,驱动着地球上的物质交换速度越来越快,联系也愈发的紧密。过一些年,人们收付款全都得依靠某公司的服务器及无线网络,商家“被迫”服从某大公司的决定,每做一笔生意都要被抽成。虽然有“证据”表明,在人类文明以前可能出现过n个智慧文明。这些智慧文明遵循否定之否定的哲学定律,所以新诞生的智慧文明越来越“文明”。不过,我们现在还是认为,人类社会的发展具有不可逆性。人类发明新技术,用于改善自己的生活并改变人类自身,这是不可逆的。坐高铁,有跟小小的烟头,可能逼停火车,所以高铁是脆弱的。现在的飞机就像一颗炮弹,被发射出去,全自动运行,然后全自动着陆,这一切都只是个程序在运行。二维码“不错”,人类却看不懂,必需借助工具扫码才知道它的用途。人类创造了无数规则,无数知识,正所谓学海无涯。当然,旧的知识被淘汰不少,但人类自身理解社会的成本越来越高。

人类不断地“解放”自己,却又不断地被自己所创造的高科技束缚。当然,或许你不以为然,某某某说过,科学技术是第一生产力啊。是啊,我也同意科学技术是第一生产力啊,并没有否认这一点。我要说的是,你出门能什么都不带吗?古代的人可以,现代人却不行,某些老人或小孩可以。过不了多少年,连老人小孩出门都要带东西,不过那时候是直接植入芯片了,或许人机已经一体化了。说到人机一体化,这就表明,人已经“升级”了。从生物变成了半生物半机器的基因编辑改造人。这时的人类无论行走,饮食,娱乐都是依靠网络。如果没有无线网络,我相信这种人是无法独立生活的,一旦断网,会马上进入休眠状态,什么也干不了,直到网络被重新连上。那个时候,人做为能独立生存的个体已经不复存在了。人只是巨大巨复杂网络上微不足道的一个小节点。并且你这个节点还并没有什么用途!因为那个时代人工智能已经掌控了一切。这就是高科技给人类带来的一种结果,人类作茧自缚而又乐在其中。

人类社会发展的剧情,也可能不是向上成所说的那样。另外一个剧情是,越来越多的人认识到了高科技的双面性。开始越来越限制一些技术的使用。俗话说兔子不吃窝边草,人类当然会“留一手”。

举个例子,就是我要说的人类退守计划。由于人类高科技迅猛发展,人类瞬间灭绝的风险不断地在暗处增长。人类退守计划, 这个词,算我发明的吧。我相信某某国家在某某地方已经存储了人类的植物种子,所有动物的基因与人类所有知识等等。但我说的不是这个,我说的是人类要聪明地利用现在的高科技,发明不依赖于高科技的全自动独立生存系统。每个人只要进入这个系统,只要输入阳光,空气,水,就能自给自足。可能你要说,回归田园不就行了吗?是啊,多少老人们想回归田园生活,但要有电,要有网络,生活还是需要和社会发生联系,否则也是无法独立生活的,对吗?难道自己种田?

我要说的全自动独立生存系统是利用高科技打造的,封闭的系统。当然,它要有自我维护性,它接收阳光,空气,水等等。人进入这个系统能轻松地利用现代科技结晶,在系统内部种植养殖,生产电能,实现内部物质与能量的循环。现在人类应该打造这样的系统,以防高科技系统崩溃,人类能泰然处之。或者满足某些人的需求,比如去山顶生活,甚至去火星生活。或许你还是会说,这就是去乡下生活的升级版本。这当然不是的,目的完全不同。这样的系统可以让人类在很多星球上安家。现在已经有了类似的系统,“月宫一号”志愿者封闭生存就达到了370天。把这个“月宫一号”系统再进行改进,推广,民用化,你说是不是完全可能的?

我认为的人类退守计划,它是一整套计划,全自动独立生存系统是这个计划的一个产品,当然它是主要产品。人类只要进入这个系统,就能一直不断地生活下去。某许某一天,你能看到一个这样的广告:XX牌全自动封闭式独立生活系统,远离一切,高枕无忧!

发表在 杂谈 | 人类退守计划已关闭评论

turtle和pymunk愤怒的小鸟发射准备程序by李兴球

"""为了用python海龟画图模块和pymunk模块制作愤怒的小鸟,
先编写了这个发射程序。操作方法:拖曳绿球,然后松开即可发射。
读者可以根据这个原型作品用海龟作图模块制作很多小游戏哦。
"""

__author__ = "李兴球"
__date__ = "2019/4/4"
__website__ = "www.lixingqiu.com"
from turtle import *

def draw_line(x,y):
    """画线"""
    fixed_dot.clear()
    fixed_dot.pendown()
    fixed_dot.goto(x,y)
    fixed_dot.penup()    
    fixed_dot.goto(fixed_position)
    ball.goto(x,y)    
    
def shoot(x,y):
    ball.ondrag(None)
    dx =  (fixed_dot.xcor() - ball.xcor())/5    
    dy =  (fixed_dot.ycor() - ball.ycor())/5
    fixed_dot.clear()
    def move():
        nonlocal dy
        x = ball.xcor() + dx
        y = ball.ycor() + dy
        dy = dy - 0.5
        ball.goto(x,y)
        if abs(x)>width//2 or abs(y)>height//2:
            ball.ht()
        else:
            screen.ontimer(move,10)
    move() 
     
    
fixed_position = -300,-150          # 固定点
width,height = 1024,600
screen = Screen()
screen.delay(0)
screen.bgcolor("navy")
screen.setup(width,height)
screen.title("turtle和pymunk愤怒的小鸟发射准备程序by李兴球")
screen.addshape("绿球.gif")

fixed_dot = Turtle(visible=False)
fixed_dot.penup()
fixed_dot.goto(fixed_position)
fixed_dot.pensize(5)
fixed_dot.color("cyan")

ball = Turtle("绿球.gif")
ball.penup()
ball.goto(fixed_position)

ball.ondrag(draw_line)
ball.onrelease(shoot)

"""下面是物理引擎要用到的循环 
while True:
    print(10)
    screen.update()
"""
    
screen.mainloop()

发表在 turtle | turtle和pymunk愤怒的小鸟发射准备程序by李兴球已关闭评论