修改线条端点风格和拐弯样式_joinstyle和capstyle

李兴球Python capstyle 和joinstyle端点风格

"""
  修改线条端点风格和拐弯样多_joinstyle和capstyle,
  有人问我如何修改线条的端点风格,这就是一个tkinter的问题,
  不过,还是要研究turtle模块才能把代码写出来,
  下面的代码演示了如何修改,顺便还有连接风格,
  所有代码如下所示:
"""
import turtle

turtle.pensize(10)
cv = turtle.getcanvas()
t = turtle.getturtle()
lid = t.currentLineItem
cv.itemconfig(lid,capstyle=turtle.TK.BUTT,
              joinstyle=turtle.TK.MITER)
t.fd(100)

t.goto(100,100)
for _ in range(4):
    turtle.fd(100)
    turtle.right(90)

参考文章: https://www.pythonstudio.us/tkinter-reference/cap-and-join-styles.html

发表在 python, tkinter, turtle | 留下评论

会员谜题_为什么加上gui=t.Turtle()这行代码后,单击radiobutton失效了呢?

"""
  会员谜题_为什么加上gui=t.Turtle()这行代码后,单击radiobutton失效了呢?

"""
import tkinter as tk
import turtle as t
import time


def start():
    root.destroy()
  
def select():
    print(btn.get())
    
    
gui = t.Turtle()
     

root=tk.Tk()

root.title("五子棋游戏开始")
root.geometry("200x180+580+300")


label=tk.Label(root,text="请选择开局方",font=("微软雅黑",18))

label.pack()

frame=tk.Frame(root)

frame.pack()

btn=tk.IntVar()

btn.set(1)

btn_red=tk.Radiobutton(frame,text="红方",variable=btn,value=1,font=("微软雅黑",16),command=select)

btn_red.grid(column=0,row=0,sticky="w")

btn_black=tk.Radiobutton(frame,text="黑方",variable=btn,value=-1,font=("微软雅黑",16),command=select)

btn_black.grid(column=1,row=0,sticky="e")


btn_ok=tk.Button(root,text="确定",font=("微软雅黑",16),command=start)

btn_ok.pack(pady=20)


root.mainloop()

发表在 python, tkinter | 留下评论

tkinter的radiobutton单选扭一例

import tkinter

# 定义单击按钮的回调函数
def selected():
    print(var.get())

root = tkinter.Tk()

var = tkinter.StringVar() # 给单选钮的variable参数设定值

# 下面两个单选纽在单击时都调用同一个函数selected
rb1 = tkinter.Radiobutton(text='Radio Button 1', variable=var, 
                          value="Radio 1", command=selected)
rb1.pack()
rb2 = tkinter.Radiobutton(text='Radio Button 2', variable=var, 
                          value="Radio 2", command=selected)
rb2.pack()

root.mainloop()

发表在 python, tkinter | 留下评论

列表来了新客人(白雪公主入列表)

李兴球Python_列表来了新客人(白雪公主入列表)

风火轮编程培训list.append教学演示程序,以下是所有源代码:

"""
列表来了新客人(白雪公主入列表).py
list.append命令演示程序
"""
from sprites import *

w = Sprite('blank')
w.sety(200)
w.write('list.append命令演示程序',align='center',font=('',32))
w.sety(150)
w.write('请按空格键',align='center',font=('',18))

lis = list('abcdefg')
princess = '\'白雪公主\''
txt2image(princess,f'res/{princess}.png',fontsize=32)
p = Sprite(f'res/{princess}.png')
p.sety(100)

screen = Screen()
screen.listen()

listr = str(lis)
txt2image(listr,'res/guest_list.png',fontsize=32)
biao = Sprite('res/guest_list.png')

space = Key('space')
while not space.downup():screen.update() # 按空格键开始

for i in range(18):
    s = listr[:-1] + "," + ' ' * (i+1) + "]"
    name = f'res/{i+1}_guest_list.png'
    txt2image(s,name,fontsize=32)
    biao.shape(name)
    biao.wait(0.1)

p.slide((174,0))

w.clear()
w.sety(180)
w.write('请再按空格键',align='center',font=('',28))
while not space.downup():screen.update() # 按空格键开始
p.shape('白雪公主.png')
p.say('Hello,你好')

screen.mainloop()

发表在 python, sprites | 留下评论

列表弹弹弹_lis.pop命令演示程序

李兴球创意Python列表弹弹弹
列表教学中的演示pop命令的小程序,以下是所有代码:

"""
   列表弹弹弹.py
   列表的pop命令演示程序,本程序需要sprites模块支持,安装方法:
   用cmd命令打开管理员窗口输入pip install sprites
"""
import random
from sprites import *

lis = [random.randint(-100,100) for _ in range(10)]

txt2image('lis='+str(lis),'res/lis_biao.png',fontsize=32)#单行文本转png
d = Sprite('res/lis_biao.png')                           #png转角色
screen = d.getscreen()

space = Key('space')            # 新键空格按键

screen.listen()                 # 监听按键检测

x_sprite = Sprite('blank')      # 新建无造型角色
x_sprite.sety(100)
x_sprite.write('请按空格键',align='center',font=('',32))
x_sprite.home()

while lis:
    if space.downup():          # 如果空格键按下并弹起
        for _ in range(10):
            d.addx(random.randint(-10,10))
            d.addy(random.randint(-10,10))
        d.home()
        x = lis.pop()
        txt2image('lis='+str(lis),f'res/{x}_lis_biao.png',fontsize=32)
        d.shape(f'res/{x}_lis_biao.png')
        # x向上移动
        txt2image('lis.pop()返回:' + str(x),f'res/poped_{x}.png',fontsize=32)
        x_sprite.shape(f'res/poped_{x}.png')
        x_sprite.slide((0,250),2000)
        x_sprite.shape('blank')
        x_sprite.home()
    screen.update()
        
            

发表在 python, sprites | 标签为 | 留下评论

字典弹弹弹_Python字典还能这样玩,你没见过吧.

这是Python字典的popitem()方法效果演示程序,收录在我的精灵宝典里。程序运行后会有一个字典显示在窗口内,按空格键它会弹出一对键值对。
这是程序运行结果:
Python字典弹弹弹
讲解网址是: https://www.douyin.com/discover?modal_id=7079023292513914143
下面是所有代码,想捡漏赶快复制代码,万一有一天我改变主意了呢?

"""
   字典弹弹弹.py
   Python字典的popitem()效果演示程序
   本程序需要sprites和gameturtle模块运行,请用cmd打开管理员窗口,
   输入pip install sprites和pip install gameturtle进行安装.
"""
from time import sleep
from random import randint
from gameturtle import single2multitext
from sprites import Sprite,txt3image,Key,Screen

screen = Screen()
screen.setup(660,660)
screen.title('字典弹弹弹_字典的popitem()效果演示程序by李兴球')

ftb = ('黑体',64,'normal')
ftm = ('黑体',34,'normal')
fts = ('黑体',16,'normal')
sleep(1.3)
kv = Sprite('blank')# kv不仅用来写文字,下面还会通过切换造型显示弹出去的键值对
kv.color('orange')
kv.goto(-250,230)
kv.write('字',align='center',font=ftb)
sleep(0.5)
kv.goto(250,230)
kv.write('典',align='center',font=ftb)
sleep(0.5)
kv.goto(0,-200)
kv.write('弹 弹 弹',align='center',font=ftm)
sleep(0.5)
kv.goto(0,-240)
kv.write('字典.popitem()效果演示程序',align='center',font=fts)
sleep(0.5)
kv.goto(0,-270)
kv.write('作者:李兴球',align='center',font=fts)
sleep(0.5)
kv.goto(0,-300)
kv.write('基于Python海龟模块的创作',align='center',font=fts)
sleep(0.5)


colors = {'red':'红','orange':'橙','yellow':'黄','green':'绿', 'cyan':'青',
          'blue':'蓝','purple':'紫','black':'黑','white':'白','gray':'灰'}

s = single2multitext(str(colors),58)         # 单行变多行,每行58字
s = "colors = " + s
txt3image(s,'res/zd.png')                    # s变成图像
zd = Sprite('res/zd.png')   # 把文本转换成的图像,再包装成角色叫zd
# 出场就来一个抖动效果
for _ in range(randint(12,24)):
    zd.addx(randint(-5,5))
    sleep(0.01)
    zd.addy(randint(-5,5))
    sleep(0.01)
zd.home()

spacekey = Key('space')                      # 新建按键,空格键
screen.listen()                              # 监听按键检测

while colors:                                # 当colors非空时
    # 写提示语
    kv.shape('blank')
    kv.sety(150)
    kv.write('请按空格键',align='center',font=('',16)) # 写上提示
    while not spacekey.downup():screen.update()# 没按空格键时不断刷新屏幕
    kv.clear()                            # 按了空格键后清除所写的
    kv.sety(0)                            # 设定它的y坐标为0 
    # 抖动效果
    for _ in range(randint(6,10)):
        zd.addx(randint(-5,5))
        sleep(0.01)
        zd.addy(randint(-5,5))
        sleep(0.01)
    zd.home()
    
    # 按空格键后弹出一对键值对,注意字典数据变少,所以要重新设定zd的造型
    key,value = colors.popitem()                    # 弹出键值对
    s = single2multitext(str(colors),58)            # 字典单行变多行
    s = "colors = " + s
    txt3image(s,f'res/zd{key}_{value}.png')         # 多行文本转图像
    zd.shape(f'res/zd{key}_{value}.png')            # 重设为此造型

    # 弹出去的键值对,组成元组,转换成图像,再包装成角色,滑行出去
    s = "colors.popitem() 返回: ('" + str(key) + "','" + str(value) + "')" # 弹出去的文本
    
    txt3image(s,f'res/poped{key}_{value}.png')   # 把s转成图像
    kv.shape(f'res/poped{key}_{value}.png')      # 把kv的造型设为这个图
    kv.slide((0,150))                            # 滑行到0,150
    kv.wait(2)                                   # 等待2秒
    kv.slide((0,550),1000)                       # 1秒内滑出去

screen.mainloop()


发表在 gameturtle, python, sprites | 标签为 | 留下评论

类似于邻接表的Python图论练习自测

class Node:
    def __init__(self,name):
        self.name = name
        self.nexts = set()
        self.visited = False
                
    def add_next(self,node):
        self.nexts.add(node)

    def add_nexts(self,*n):
        for node in n:
            self.add_next(node)

class Graph:
    def __init__(self,*n):
        """图就是很多节点和边的集合,这里没有传边的集合"""
        self.nodes = set(n)

    def traverse(self,node):
        """从node这个节店遍历图中的每一个节点"""
        node.visited = True
        print(node.name,end='')
        for n in node.nexts:
            if n.visited==False:
                self.traverse(n)
            
    
a = Node('a')
b = Node('b')
c = Node('c')
d = Node('d')
e = Node('e')
f = Node('f')
g = Node('g')

a.add_nexts(b,c,d)
b.add_nexts(a,f)
c.add_nexts(a,e,f)
d.add_nexts(a,e,g)
e.add_nexts(d,c,g)
f.add_nexts(b,c,g)
g.add_nexts(f,e,d)

tu = Graph(a,b,c,d,e,f,g)
tu.traverse(a)

发表在 python | 留下评论

Python海龟画图练习题红黄渐变螺旋圆.py

Python海龟画图练习题红黄渐变螺旋圆

看图编程序,要求如下:

1. 最短线条的长度是20,线条依次增加20。

2. 最小圆的直径是6,圆的直径依次增加3。

3. 圆从小到大,同时颜色从红到黄渐变。

以下是参考答案:

"""

Python海龟画图练习题红黄渐变螺旋圆.py

"""
import turtle

turtle.bgcolor('black')
turtle.color('gray')
turtle.colormode(255)

turtle.speed(0)
for i in range(16):
    turtle.fd((i+1)*20)
    h = hex(i)[2:]
    c = f"#FF{h}{h}00"
    c = (255,i*16,0)
    turtle.dot((i+2)*3,c)
    turtle.bk((i+1)*20)
    turtle.left(360/16)

turtle.penup()
turtle.goto(0,250)
turtle.pencolor('cyan')
turtle.write("练习画以下图形:",align='center',font=('',22))

turtle.goto(-200,190)
turtle.write("1. 最短线条的长度是20,线条依次增加20。",font=('',16))
turtle.goto(-200,160)
turtle.write("2. 最小圆的直径是6,圆的直径依次增加3。",font=('',16))

turtle.goto(-200,130)
turtle.write("3. 圆从小到大,同时颜色从红到黄渐变。",font=('',16))

turtle.done()


发表在 python, turtle | 标签为 | 留下评论

贪吃蛇原理动画演示教学档.py

李兴球按空格键感受贪吃蛇最基本原理动画
为了让同事们能理解贪吃蛇这个游戏的精髓,特编此小程序,以下是所有代码。
Python精灵模块安装方法见最下面。

"""
  贪吃蛇原理动画演示教学档.py
  这个程序是用于萍乡乐学创客教育编程学校师资培训的一个交互演示程序。
"""
import time
from sprites import Sprite,Key

def press_space_continue():
    """按空格键继续"""
    while not space.downup():screen.update()
    
turtle  = Sprite(shape='square')
screen = turtle.getscreen()
screen.setup(800,400)
screen.listen()

space = Key('space')       # 新建空格键
turtle.speed(1)
screen.delay(20)
turtle.bk(360)             # 海龟倒退360个单位
turtle.speed(0)
screen.delay(0) 

for _ in range(10):
    turtle.wait(0.5)
    turtle.stamp()
    turtle.wait(0.5)
    turtle.fd(25)

ft = ('',22,'normal')
w = Sprite(visible=False)
w.sety(100)
w.write('请按空格键',align='center',font=ft)
while True:
    press_space_continue() # 按空格键继续 
    turtle.clearstamps(1)  # 清除最早那个
    w.clear()
    w.write('清除了最早盖的那个图章',align='center',font=ft)
    turtle.update()        # 更新显示
    
    press_space_continue()
    turtle.stamp()         # 在海龟当前位置再盖章,此时海龟和图章重叠
    w.clear()
    w.write('在海龟当前位置再盖章,此时海龟和图章重叠',align='center',font=ft)

    press_space_continue()
    turtle.fd(25)          # 海龟前进25个单位,(移开了)
    w.clear()
    w.write('海龟前进25个单位,海龟移开了',align='center',font=ft)

本程序需要Python精灵模块支持,如果没有安装是无法运行的,安装方法有如下两个:

第1种方法: 用cmd命令打开管理员窗口,输入 pip install sprites –upgrade

第2种方法: 从链接 https://www.lixingqiu.com/pms.rar 下载压缩包,解压后得到 “安装精灵模块等常见模块.bat”批处理文件,
双击这个批处理文件即可安装,在pip命令正确安装及联网的情况下能安装一些常见的模块。

发表在 python, sprites | 标签为 | 留下评论

HTML入门之随机生成网页链接.py

这是萍乡乐学创客教育培训学校的一节Python编程课的源代码。

"""
  HTML入门之随机生成网页链接.py
"""
import random

def makestr3_6():
    s = 'abcdefghijklmnopqrstuvwxyz0123456789'   # random.choice(s)
    z = ''            # 用于保存要返回的字符串
    for x in range( random.randint(3,6) ):       # 
       z +=  random.choice(s)
    return  z
    # ''.join([random.choice(s) for _ in range(random.randint(3,6)])

f = open("index.html",mode='r')  #read
c = f.read()
f.close()

b = c.split("\n")               # 以换行分隔c,返回列表

for x in range(100):
    a = makestr3_6()
    b.insert(-3,"" + a + "")


c  = "\n".join(b)               # 以换行连接b,返回字符串
 
f = open("index.html",mode='w')  #write
f.write(c)
f.close()

发表在 python | 留下评论

寻找最短距离的点.py

"""
  寻找最短距离的点.py
  本程序寻找一个点到多个点最小距离,然后到最小距离的点的索引号返回。  最后用turtle进行可视化。
"""
import random
import turtle
import numpy as np

def shortest_distance_index(onepoint,others):
    """
       onepoint:一个点,如[(0,0)]
       others:另一些点,如[(10,10),(20,33),(12,48)]
       返回到距离最近的点的others中的索引号
    """
    others = np.array(others)                                                         # 换成numpy数组
    distances = np.sqrt(np.sum(np.asarray(onepoint - others) ** 2, axis=1))
    # distances即为输入的数组;axis默认为None,即输入的数组为平坦数组(即reshape为一维数组),
    # axis=0为列向量输入,axis=1为行向量输入;如果提供out参数,则会插入输入数组当中。
    index = np.argmin(distances, axis=None, out=None)
    return index

point = np.array([(0,0)])                  # 一个点,这里用原点
ps = [(random.randint(-300,300),random.randint(-300,300) ) for _ in range(10)]# 生成10个点
print(ps)
i = shortest_distance_index(point,ps)
print(i)

turtle.setup(640,640)
turtle.speed(0)
turtle.delay(0)
turtle.penup()
for p in ps:
    turtle.goto(p)
    turtle.dot(10)
turtle.goto(0,0)
turtle.dot(10,'red')
turtle.pendown()
turtle.goto(ps[i])
turtle.done()

# 本程序为在Python精灵模块中准备新增find_in_closest的预备测试程序。
# find_in_closest准备用来在下一个版本中寻找一个点到多个角色的最短距离,并且返回那个角色。
# Python精灵模块用最简单的代码创建小游戏小动画,用于教育目的。最新版安装方法:
pip install sprites --upgrade
发表在 numpy, python, turtle | 标签为 | 留下评论

find_in_square与爆炸效果举例2.py

李兴球Python精灵模块find_in_square与角色单击识别

"""
  find_in_square与爆炸效果举例2.py
  本程序演示单击识别角色,采用在while循环中实时进行检测进行。
  本程序需要sprites模块V1.469版本支持。
  请用cmd命令打开管理员,输入以下命令进行更新。
  pip install sprites --upgrade
  
"""
from sprites import *
    
爆炸表 = ['res/explosion0.png','res/explosion1.png']

screen = Screen()
screen.setup(480,360)

bugs = [Sprite(pos='r') for _ in range(4)]
bugs[0].say(bugs[0].turtle._item,delay=1000,wait=False)
bugs[1].say(bugs[1].turtle._item,delay=1000,wait=False)
bugs[2].say(bugs[2].turtle._item,delay=1000,wait=False)
bugs[3].say(bugs[3].turtle._item,delay=1000,wait=False)

print(bugs[0].turtle._item)
print(bugs[1].turtle._item)
print(bugs[2].turtle._item)
print(bugs[3].turtle._item)

leftkey = Mouse()

while True:
    
    if leftkey.downup():
        x,y = leftkey.pos
        sps = find_in_square(x,y) # 在x,y为中心边长为2区域内查找角色
        for t in sps:
            explode(t,爆炸表)
            t.remove()
        
    screen.update()

发表在 python, sprites | 标签为 , | 留下评论

find_in_square与爆炸效果举例1.py

李兴球Python精灵模块find_in_square与爆炸效果举例

"""
  find_in_square与爆炸效果举例1.py
  本程序单击鼠标进行角色查找,采用onclick绑定的方式进行。
  本程序需要sprites模块V1.469版本支持。
  请用cmd命令打开管理员,输入以下命令进行更新。
  pip install sprites --upgrade
"""
from sprites import *

bug = Sprite()
screen = bug.screen
screen.setup(800,600)
w = screen.cv
bug2 = Sprite()
bug2.left(90)
bug3 = Sprite()
bug3.right(90)
bug4 = Sprite()
bug4.right(180)

def baozha(x,y):
    global running
    # 在x,y为中心边长为2区域内查找角色
    sprite = find_in_square(x,y)[0]
    explode(sprite,爆炸表)    
    sprite.hide()
    running = running -1
    
爆炸表 = ['res/explosion0.png','res/explosion1.png']

bugs = [bug,bug2,bug3,bug4]
 
bugs[0].onclick(baozha) 
bugs[1].onclick(baozha) 
bugs[2].onclick(baozha) 
bugs[3].onclick(baozha)

clock = Clock()
running = len(bugs)
while running:
    for bug in bugs:
        bug.fd(1)
    clock.tick(30) 

end = Sprite('blank')
end.write("Game Over") 

发表在 python, sprites | 标签为 | 留下评论

stamponclick图章单击事件.py

李兴球Python图章的单击演示

“””
stamponclick图章单击事件.py
本程序需要sprites模块V1.468版本支持。
安装最新版本请用cmd打开管理员窗口输入以下命令:
pip install sprites –upgrade
“””
from sprites import Sprite

s= Sprite()
s.scale(2)
s1 = s.stamp()
s.fd(200)
# 单击图章s1,让s往右转20度
s.stamponclick(s1,lambda x,y:s.right(20))
# 松开鼠标键后,s则往左转20度
s.stamponrelease(s1,lambda x,y:s.left(20))

s.screen.mainloop()

发表在 python, sprites | 标签为 | 留下评论

2022寒假7天课之跳高台接金币课程源代码

李兴球Python精灵模块弹球跳高台演示

"""
   跳高台接金币.py
   请完善程序,让小球接到金币后会显示游戏结束几个字。
"""
from sprites import Sprite,Key,Clock

ball = Sprite(1,pos=(-150,30))               # 新建球
ball.scale(0.5)                # 球缩小
screen = ball.getscreen()      # 得到屏幕
screen.setup(480,360)          # 设定宽高 
screen.bgpic('res/sky.png')

g1 = Sprite('square',pos=(100,100),tag='ground')# 新建平台,标签为ground
g1.color('brown')
g1.shapesize(0.5,5)                             # 变形 

g2 = Sprite('square',pos=(-50,-50),tag='ground')# 新建平台,标签为ground
g2.color('brown')
g2.shapesize(0.5,5)                             # 变形 

g3 = Sprite('square',pos=(150,-100),tag='ground')
g3.color('brown')
g3.shapesize(0.5,5)

# 这是下面最长的那个地面
g4 = Sprite('square',pos=(0,-165),tag='ground')
g4.color('brown')
g4.shapesize(0.5,24)

g5 = Sprite('square',pos=(-150,45),tag='ground')
g5.color('brown')
g5.shapesize(0.5,4)

# 以下会把'coins'当成一个路径去寻找下面有没有0.png,1.png,然后加载为角色的造型
coin = Sprite('coins',pos=(100,130))
coin.scale(0.2)
 
akey = Key('a')           # 实例化a键
dkey = Key('d')           # 实例化d键
wkey = Key('w')           # 实例化w键
screen.listen()           # 监听按键检测      
dx = 0
dy = -1
clock = Clock()           # 新建时钟对象
while True:
    
    x = ball.xcor() + dx
    y = ball.ycor() + dy
    old_x = ball.xcor()    # 记录先前球的x坐标
    old_y = ball.ycor()    # 记录先前球的y坐标
    ball.goto(x,y)
    if ball.collide_others('ground'): # 如果小球碰到标签为'ground'的平台
        if akey.down():dx=dx - 0.2
        elif dkey.down():dx=dx + 0.2
        else:dx= dx*0.9               # 实现有点滑行的效果
        dy = 0                        # 小球碰到地面那么垂直速度设为0,就不会往下掉了
        ball.goto(old_x,old_y)        # 并且还回到上一次x,y坐标
        if wkey.down():dy = 10        # 如果这个时候按w键,则dy为10,实现起跳
    else:
        dy = dy - 0.5

    coin.nextshape()                  # 金币切换到下一个造型
    if coin.collide(ball):
        coin.play('collect.wav')
        coin.hide()
    screen.update()
    clock.tick(60)

发表在 python, sprites | 标签为 | 留下评论

sprites精灵模块制作的简单重力弹球

Python弹球演示by李兴球
这是为了模拟合金弹头小游戏打僵尸的时候,为了讲解重力效果而临时快速制作的一个小动画。以下是所有源代码:

from sprites import Sprite,Clock

ball = Sprite(1)
screen = ball.getscreen()
screen.setup(480,360)
screen.bgpic('res/sky.png')

clock = Clock()
dy = 0
while True:
    ball.addy(dy)
    if ball.ycor() > -145:
        dy = dy - 1
    else:        
        dy = -dy
        
    screen.update()
    clock.tick(60)

发表在 python, sprites | 留下评论

2022寒假7天课之合金弹头macro角色打僵尸课程源代码

Python合金弹头macro角色打僵尸by李兴球
这是第五个版本的源代码:

"""
  05_合金弹头macro角色_僵尸.py
  1. 请加上macro碰以僵尸会死亡并显示游戏结束的文字.  
"""
import random
from sprites import Sprite,Key,Clock,explode

pics = [f"m/{i}.png" for i in range(24)]
macro = Sprite(pics,pos=(0,100)) # 新建macro角色,采用pics里的造型图
macro.rotatemode(1)              # 设定macro的旋转模式为左右翻转
screen = macro.getscreen()       # 通过macro的getscreen命令得到屏幕对象  
screen.setup(480,360)            # 设定屏幕的宽高为480,360 
screen.bgpic('现代城市.png')     # 设定背景图片

akey = Key("a")              # 新建a键
dkey = Key("d")              # 新建d键 
wkey = Key("w")              # 新建w键
fkey = Key("f")              # 新建f键

zd = Sprite('h1.png',visible=False) # 新建子弹角色

screen.listen()              # 监听按键检测
clock = Clock()              # 新建时钟对象 
wi = 0
status = 0                     # 三种状态0:停,1走,大于1:发射
dy = 0                         # macro的垂直速度

baopic = [f"bz/{i}.png" for i in range(15)] # 爆炸效果要用到的一系列图片
jspic = [f"js/{i}.png" for i in range(16)]  # 僵尸要用到的一系列图片
js = Sprite(jspic,pos=(-240,-130)) # 新建僵尸角色

while True:
    if js.isvisible():         # 如果僵尸是可见的
       js.fd(2)                # 僵尸前进2个单位 
       js.nextshape()          # 僵尸切换到下一个造型
       if js.collide(zd):      # 如果僵尸碰到子弹
          zd.hide()            # 子弹隐藏
          explode(js,baopic)   # 显示爆炸效果
          js.reborn(random.randint(-500,-340),-130)# 僵尸重新出现    
       if js.xcor()>=240:js.setx(-240) # 如果僵尸到了最右边,从最左边重新出现 
    
    macro.addy(dy)
    if macro.ycor()<= -130:    # 如果macro的y坐标小于等于-130
        macro.sety(-130)       # 则认为着地了,把它的y坐标设为-130
        dy = 0                 # dy也设为0,(就不会继续掉了)
        if wkey.down():dy = 15 # 如果此时按了w键,则dy的值设为15
    else:
        dy = dy  - 1
        
    if zd.isvisible():         # 如果子弹是可见的
        zd.fd(10)              # 子弹前进10个单位
        if zd.collide_edge():zd.hide()
    if fkey.downup() and zd.ishide():
        wi = 15                # 按了f键又松开则发射造型从15开始
        status=10
        zd.goto(macro.xcor(),macro.ycor()+8)
        zd.setheading(macro.heading())
        zd.show()
        
    if akey.down():            # 如果按了a键则向左移动
        macro.seth(180)
        status = 1
        macro.addx(-5)
        if macro.xcor()<= -240:macro.setx(240)
    elif dkey.down():          # 如果按了d键则向右移动
        macro.seth(0)
        status = 1
        macro.addx(5)
        if macro.xcor()>= 240:macro.setx(-240)
    else:                      # 如果没有按键则status减1直到O
        if status>0:status -= 1
    if status == 0:
        macro.shapeindex(0)
    elif status == 1:          # 走路造型切换
       macro.shapeindex(wi)
       wi = wi + 1
       wi = wi % 15
    elif status>1:             # 发射造型切换
       macro.shapeindex(wi)
       wi = wi + 1
       wi = wi % 24       
    
    macro.update()
    clock.tick(60)

发表在 python, sprites | 留下评论

2022寒假7天课之模拟简易CAD制图课程源代码

Python简易CAD制图程序演示gif李兴球
这是我2022年寒假课上的Python课程的一个源代码。用Python制作一个简单的CAD制图软件。以下是第四个版本的源代码。

"""
   简易CAD制图程序.py
"""
from sprites import Sprite,Mouse,Key,showinfo,mouse_pos

d = Sprite(visible=False,shape='blank') # 打算用于绘制青色线条的角色
d.color('cyan')                         # 颜色是青色的

bug = Sprite(shape='blank',visible=False)
bug.color('white')
screen = bug.getscreen()               # 获取屏幕对象
screen.bgcolor('black')                # 背景颜色设为黑
screen.setup(800,600)                  # 宽度高度为800X600

m1 = Mouse()                           # 新建鼠标左键
m3 = Mouse(3)                          # 新建鼠标右键
space = Key("space")                   # 新建空格按键
screen.listen()
x0,y0 = None,None                      # 保存上一次单击的坐标

while True:
    mx,my = mouse_pos()                # 实时地获取鼠标指针坐标
    screen.title(str(mx) + "," + str(my))
    
    # 下面的if语句不断地让d这个角色画从上一个点到鼠标点画青色的线条
    if x0!=None and y0!=None:# 如果不是第一次单击(这个时候x0,y0都有值了)
        d.clear()
        d.goto(x0,y0)                 # 到达上一次单击的点
        d.pendown()                   # 落笔
        d.goto(mx,my)                 # 到达鼠标指针的位置
        d.penup()
        
    if m1.downup():                   # 如果左键按下并松开
        bug.goto(m1.pos)              # bug到达单击的位置
        x0,y0 = m1.pos                # 保留上一次单击的坐标
        bug.dot(3,'red')
        if not bug.isdown():          # 如果没有落笔
            bug.pendown()             # 则落笔
        
    if m3.downup():                   # 如果鼠标右键按下并松开
        bug.penup()                   # bug抬笔
        x0,y0 = None,None             # x0,y0恢复空值
        d.clear()                     # 清空d所画的线条

    if space.downup():                # 如果按下并松开空格键
        screen.save('abcd.png')       # 截图保存到文件'abcd.png' 
        showinfo('恭喜','保存成功')   # 显示保存成功的对话框
        
    screen.update()                   # 刷新显示

    
发表在 python, sprites | 标签为 | 留下评论

2022寒假7天课之屏幕的截屏与gif合成课程2个源代码

Python屏幕的截屏与gif合成
把画图中的第一帧截图下载 ,再编制程序进行gif制作的两个代码。

"""
屏幕的save截屏命令.py

把所有生成的png合成为一个gif图

"""
import os
from sprites import Screen,Sprite

screen = Screen()
screen.setup(480,360)
screen.bgpic('res/sky.png')

bug = Sprite()
bug.pensize(10)
bug.pendown()

if not os.path.exists('test'):os.mkdir('test')

for x in range(360):
    bug.randomcolor()
    bug.fd(1)
    bug.rt(1)
    file = 'test/' + str(x) + ".png"
    screen.save(file) # 截取当前窗口内容保存为图

screen.mainloop()

下面是生成gif图的代码,需要gameturtle模块的运行,安装方法 pip install gameturtle –upgrade:

"""
把test目录下面的0.png,1.png....合成后生成gif图形
"""
import os
from gameturtle import makegif

path = os.getcwd() + os.sep + 'test'
makegif(path,'test.gif')

发表在 gameturtle, python, sprites | 标签为 , , , | 留下评论

2022寒假7天课之迷宫游戏_鼠标牵引课程源代码

Python迷宫游戏鼠标牵引

"""
   04_迷宫游戏_鼠标牵引.py
"""
from sprites import Sprite,mouse_pos

def collision_check():
    laoshu.nextshape()             # 下一个造型
                       
    if laoshu.collidecolor(black): # 如果碰到黑色则倒退4
        laoshu.bk(4)
    elif laoshu.collidecolor(green):# 否则如果碰到绿色则返回真
        return True
    
maze = Sprite('2.png')
maze.ondrag(None)  
screen = maze.getscreen()

laoshu = Sprite(['res/rat1.png','res/rat2.png'])
laoshu.scale(0.4)

screen.listen()
black = (0,0,0)
green = (0,255,85)
while True:
    m = mouse_pos()
    laoshu.heading(m)
    if laoshu.distance(m)>=10:
        laoshu.fd(2)    
        t  = collision_check()  # 调用函数,并且返回t
        if t:break              # 如果t是真,则中断while循环    
    
    screen.update()

w = Sprite(visible=False)
w.color('red')
w.write('Game Over',align='center',font=('',100,'normal'))
screen.mainloop()




    
    

发表在 python, sprites | 留下评论

2022寒假7天课之掉落的文字(文本转图像)课程源代码

python掉落的文字
这是2022寒假Python编程课的一节课,共循序渐地讲解一个交互小动画。程序运行后,单击鼠标左键,就会有文字。当所有文字出现后,它们会往下掉….。接下来就是要你发挥想像力去完善这个程序了。当然,这个程序需要sprites模块支持,请用cmd命令打开管理员输入以下命令进行安装:pip install sprites –upgrade

以下是课程中第二个版本的所有源代码:

"""
   02_文本转图像_往下掉.py
"""
from sprites import Screen,txt2image,Sprite,Mouse,Key

screen = Screen()
txt2image('新','res/新.png',fontsize=50,color='red')
新 = Sprite('res/新.png',visible=False)               # 新建角色

txt2image('年','res/年.png',fontsize=50,color='red')
年 = Sprite('res/年.png',visible=False)

txt2image('快','res/快.png',fontsize=50,color='red')
快 = Sprite('res/快.png',visible=False)

txt2image('乐','res/乐.png',fontsize=50,color='red')
乐 = Sprite('res/乐.png',visible=False)

lis= [新,年,快,乐]                     # 把新建的4个角色放在列表中
m1 = Mouse()                           # 新建鼠标左键

space = Key('space')                   # 新建空格按键
screen.listen()                        # 监听按键检测
i = 0                                  # i是用来做lis列表的索引号(同时用来计数)
dy = 0                                 # dy表示往下移的速度
while True:
    if m1.downup() and i<4:           # 如果鼠标左键接下并松开并且i小于4          
        lis[i].goto(m1.pos)           # 索引为i的角色到达单击点的坐标
        lis[i].show()                 # 索引为i的角色显示出来
        i += 1                        # 索引增加1
    for z in lis:z.addy(dy)                    # 每个字都往下移dy个单位
    if dy==0 and i==4 and space.downup():dy=-1
     
    screen.update()


发表在 python, sprites | 标签为 , | 留下评论

networkx绘图示例:随机产生颜色图

networkx绘图示例:随机产生颜色图

事业繁忙,时间有限,没空对本程序进行解说,看官请看注释或者自行揣摩。

"""
   networkx绘图示例:随机产生颜色图
"""
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

np.random.seed(1234)
p = dict((i, (np.random.uniform(0, 1), np.random.uniform(0, 1))) for i in range(200))
g = nx.random_geometric_graph(200, 0.12, pos=p)   # 根据p产生随机几何图
pos = nx.get_node_attributes(g, 'pos')
print(pos==p)

# 下面查找到中间点(0.5, 0.5)最近的距离
dists = [(x - 0.5)**2 + (y - 0.5)**2 for x, y in list(pos.values())]
print(dists) # 所有节点到中间点的距离
ncenter = np.argmin(dists) # 检索数组中最小位置,返回下标
print('ncenter=',ncenter)

# 渲染图形,颜色靠的是到中间点的距离决定
p = nx.single_source_shortest_path_length(g, ncenter) # 注意重定义了p
plt.figure()
nx.draw_networkx_edges(g, pos, alpha=0.4)
nx.draw_networkx_nodes(g,pos,
nodelist=list(p.keys()),
node_size=120, alpha=0.5,
node_color=list(p.values()),
cmap=plt.cm.jet_r)  # 最后一个参数是将色标逆过来
plt.show()

发表在 python | 标签为 | 留下评论

2022寒假7天课之困虫于田(查找重叠命令)课程源代码

"""
   查找重叠命令.py
   虫子在一个格子中自动前进,碰到线条就反向...
   本程序演示角色的find_overlapping命令,它会查找和角色重叠的项目,
   如果查找到了,则返回一个集合,集合里有这些项目的编号,没有查找到则返回空集。
   一个圆点,文字,线条,图章都是画布上的一个个项目。可用于迷宫等游戏的制作。
"""
from sprites import Sprite,Key,Mouse,Clock

bug = Sprite()           # 新建虫子
screen = bug.getscreen() # 得到屏幕对象
bug.pendown()
for _ in range(4):
    for _ in range(4):
        bug.fd(200)
        bug.left(90)
    bug.left(90)
line = bug.currentLineItem     # 刚才画的田字的线条项目编号
print(line)
bug.penup()
bug.goto(-100,100)

clock = Clock()                 # 建立时钟对象

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

发表在 python, sprites | 标签为 | 留下评论

2022寒假7天课之按键检测课程源代码

"""
   按键检测.py
   增加了按空格键,虫子会瞬移到屏幕任意一个地方的代码。
   增加了按鼠标右键,虫子会在落笔和抬笔之间切换的功能。 
"""
#  从精灵模块导入Sprite,Key,Mouse,Clock命令
from sprites import Sprite,Key,Mouse,Clock

bug = Sprite()           # 新建虫子
screen = bug.getscreen() # 得到屏幕对象
bug.pendown()            # 落笔  
for _ in range(4):
    for _ in range(4):
        bug.fd(200)
        bug.left(90)
    bug.left(90)
line = bug.currentLineItem      # 当前线条项目
print(line)
bug.penup()
bug.goto(-100,100)
upk = Key("Up")                 # 新建向上箭头
downk = Key("Down")             # 新建向下箭头
rightk = Key("Right")           # 新建向右箭头
leftk = Key("Left")             # 新建键盘左箭头
spacek = Key("space")           # 新建空格键 
mk = Mouse()                    # 新建鼠标左键,1:左键,2:中键,3:右键
mk3 = Mouse(3)                  # 新建鼠标右键
screen.listen()                 # 监听键盘按键检测
clock = Clock()                 # 建立时钟对象

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

发表在 python, sprites | 标签为 | 留下评论

海龟高级内容:当前线条项目currentLineItem

currentLineItem当前线条项目演示
“””
海龟高级内容:当前线条项目.
当生成海龟或者抬笔时会生成新的线条项目,
用currentLineItem进行记录。
下面的程序演示了currentLineItem的获取及操作。
“””
import time
from turtle import *

t = Turtle() # 新建海龟(会自动建立一个线条项目)
print(t.currentLineItem) # 输出当前线条编号

t.fd(100)
print(t.currentLineItem) # 输出当前线条编号

for _ in range(4):
t.fd(100)
t.left(90)
line = t.currentLineItem # 当前线条项目取别名为line
for i in range(100):
t.screen.cv.move(line,1,1)# 移动
t.screen.cv.update()
time.sleep(0.01)

t.penup() # 由于抬笔会自动刷新t,所以又会在原位置重画!

print(t.currentLineItem) # 抬笔后会有新的当前线条项目生成
t.screen.mainloop()

发表在 python, sprites, turtle | 标签为 | 留下评论

获取单击处的坐标值_Python精灵模块示范代码

python到达单击处演示

更新sprites模块到最新版

"""
   获取单击处坐标.py
   本程序需要spritesV465版本支持,
   请用pip install sprites  --upgrade更新
"""
from sprites import Mouse,Sprite

w = Sprite(shape='blank',visible=False)
screen = w.getscreen()     # 得到屏幕对象
screen.bgcolor('black')    # 背景颜色为黑

leftk = Mouse(1)           # 新建鼠标左键,通过leftk.pos能获取单击处坐标

while True:
    if leftk.downup():     # 如果单击左键并松开
        w.goto(leftk.pos)  # 到达单击处
        if not w.isdown(): # 如果没落笔
            w.pendown()    # 则落笔            
        w.randomcolor()    # 随机颜色 
        w.dot(10)          # 打圆点
    screen.update()

发表在 python, sprites | 标签为 | 留下评论

星空避障小游戏_看你能坚持几秒!


在太空中,飞船飞速地向前飞行,但小心不要碰到了陨石!如果碰到了则会粉身碎骨。这是为了教学目的而开发的一个小游戏。它采用了Python精灵模块开发。在程序中主要有三个角色,一个是star,其实代表的障碍物。另一个是plane,即玩家操作的飞机。star会盖几十个图章。这些图章不断地向下运动,从而衬托了飞机向上飞的效果。还有一个用于显示秒数的miao角色。当然,本程序需要sprites模块支持,请用cmd命令打开管理员窗口,输入pip install sprites进行安装。以下是星空避障游戏所有代码:


"""
   动态星空_显示秒数.py
   练习: 请把星星改成从右边出来,向左移动,而飞机则在左边,朝右
"""
import time
from sprites import *

star = Sprite('star')
star.scale(0.1)
star.color('white')
screen = star.getscreen()
screen.setup(480,360)
screen.bgcolor('black')
screen.title('星空避障游戏')

for x in range(30):                   # 盖30个图章
    star.gotorandom(-240,240,180,540) # 在这个范围内盖图章   
    star.stamp()                      # 正式盖图章

plane = Sprite('res/thunder.png')     # 新建飞船角色
plane.scale(0.2)                      # 缩小比例 

upk = Key("Up")                       # 向上方向箭头 
downk = Key("Down")
rightk = Key("Right")
leftk = Key("Left")
screen.listen()
exp = ['res/explosion0.png','res/explosion1.png']# 爆炸效果要用到的图片
miao = Sprite(visible=False,pos=(0,100))# 显示时间的miao角色
miao.color('white')
mmm = 0
ft = ('',44,'normal')
start_time = time.time()
miao.write(mmm,align='center',font=ft)
while True:
    # 这一段是显示程序运行的时间的
    if time.time() - start_time>=1:
        miao.clear()
        miao.write(mmm,align='center',font=ft)
        mmm += 1
        start_time = time.time()        
    
    for st in star.stampItems:          # 每一个图章  
        star.movestamp(st,0,-1)         # 移动st这个图章
        x,y = star.stampcors(st)        # 获取st的坐标
        # 如果st的y坐标小于-180则移到最上面
        x = random.randint(-240,240)
        if y<= -180:star.stampgoto(st,x,180)
    if upk.down():plane.addy(1)         # 如果按了向上方向箭头,飞船y坐标增加1
    if downk.down():plane.addy(-1)
    if rightk.down():plane.addx(1)
    if leftk.down():plane.addx(-1)
    item = plane.find_overlapping()     # 查找和飞机有没有重叠的项目
    if item:                            # 如果有,则表示飞机碰到了星星 
        explode(plane,exp)              # 显示爆炸效果 
        plane.hide()                    # 飞机隐藏
        break                           # 中断循环
    screen.update()

发表在 python, sprites | 留下评论

图像热点链接可视化编辑器的测试程序

在做一个小项目,程序运行后可以用鼠标自由选择图像上的区域,生成数据到二进制文件,然后再由其它程序读取这个二进制文件生成一个网页文件,网页文件里的图像就会自动有热点链接了。当然,这个程序需要sprites模块支持,需要测试的同学请用pip install sprites安装好Python精灵模块后,再复制代码去测试研究。别忘了按照程序里说的准备好一张宽度886,高度660的叫a.png的图片。以下是测试版的代码:


"""
   图像热点链接可视化编辑器.py
"""
import pickle
from sprites import *

def draw_rect(rectangle):    
    x1,y1,x2,y2 = rectangle
    screen.cv.create_rectangle(x1,-y1,x2,-y2)

def savedata():
    """把miaolinks存入文件中"""
    f = open('hot.dat',mode='wb')
    pickle.dump(miaolinks,f)
    f.close()
    showinfo('提示','miaolinks数据存入hot.dat成功!')
    
screen_width,screen_height = 900,700
screen = Screen()
screen.setup(900,700)
screen.bgpic('a.png')
screen.addpopup()
# 以下代码修改索引为0的菜单项目
screen.popup. entryconfig(0, label='保存入hot.dat文件:',command=savedata)

imgwidth,imgheight = 886,660            # 图像宽度与高度
w_gap = screen_width/2 - imgwidth/2     # 图像左上角到左边缘的水平间隙
h_gap = screen_height/2 - imgheight/2   # 图像左上角到上边缘的垂直间隙

d = Sprite(visible=False)
if os.path.isfile('hot.dat'):           # 如果存在hot.dat则读取内容
   f = open('hot.dat',mode='rb')
   miaolinks = pickle.load(f)           # 加载所有曾经存储的描点,是一个字典
   f.close()
else:
   miaolinks = {}    # 否则新建这个字典,它是url和热点区域的映射,如 {'www.scratch8.net':[(x1,y1,x2,y2),(a,-b,c,-d)]}
for link in miaolinks:
    r = miaolinks[link]
    draw_rect(r[-1])
leftkey = Mouse()                       # 鼠标左键

click = 0
item = None
stack = []
while True:
    if leftkey.down() and click==0:
        x1,y1 = mouse_pos()             # 记录第一个点
        y1 = -y1
        click = 1
    if leftkey.down():
        x2,y2 = mouse_pos()
        y2 = -y2
        if item!=None:screen.cv.delete(item)
        item = screen.cv.create_rectangle(x1,y1,x2,y2)
    if leftkey.downup():
        click=0
        if abs(x1-x2)<5 or abs(y1-y2)<5:continue
        item = screen.cv.create_rectangle(x1,y1,x2,y2)
##        x1,y1,x2,y2 = x1+screen_width/2,y1+screen_height/2,x2+screen_width/2,y2+screen_height/2  # 转换为相对于左上角为原点的坐标
##        x1,y1,x2,y2 = x1 - w_gap,y1 - h_gap,x2 - w_gap,y2 - h_gap
##        print(x1,y1,x2,y2)
        a,b,c,d = x1,y1,x2,y2       # 原先的保存下
        x1 = x1 + imgwidth/2
        y1 = y1 + imgheight/2
        x2 = x2 + imgwidth/2
        y2 = y2 + imgheight/2
        
        url = screen.textinput('网址','请输入网址:')
        if url:
            print(url,':',x1,y1,x2,y2)
            # x1,y1,x2,y2是在网页图像上的rect矩形区域,而a,-b,c,-d则是在本程序屏幕上为create_rectange画矩形准备的参数
            miaolinks[url] = [(x1,y1,x2,y2),(a,-b,c,-d)]  # 会覆盖以前的键值对            
        
    screen.update()

发表在 python, sprites | 标签为 | 留下评论

拖曳画矩形测试程序.py

python拖曳画矩形测试程序
在做一个自己用的小项目中产生的一个副程序,把create_rectangle换成create_oval就能拖曳画椭圆形了。

"""
   拖曳画矩形测试程序.py
"""
from sprites import *

def draw_every_shape():
    
    for sp in stack:       # stack中的每一个图形
        if sp[0]=='rect':   # 如果是矩形
           screen.cv.create_rectangle(sp[1],sp[2],sp[3],sp[4])
d = Sprite(visible=False)
screen = d.getscreen()
leftkey = Mouse()     # 鼠标左键

click = 0
item = None
stack = []
while True:
    if leftkey.down() and click==0:
        x1,y1 = mouse_pos()  # 记录第一个点
        y1 = -y1
        click = 1
    if leftkey.down():
        x2,y2 = mouse_pos()
        y2 = -y2
        if item!=None:screen.cv.delete(item)
        item = screen.cv.create_rectangle(x1,y1,x2,y2)
    else:
        if item!=None:
          click=0
          item = screen.cv.create_rectangle(x1,y1,x2,y2)
           
    screen.update()

发表在 python, sprites | 标签为 | 留下评论

Python深度搜索可视化迷宫游戏

Python深度搜索可视化迷宫游戏
以下是所有代码:

from sprites import *

def cangoto(i,j):
    """返回是否能到达i,j位置"""
    if i < rows and j < cols:
        if maze[i][j]==0:
            return True
    return False

maze=[[1,1,1,1,1,1,1,1,1,1,1,1,1,1],
      [1,0,0,0,1,1,0,0,0,1,0,0,0,1],
      [1,0,1,0,0,0,0,1,0,1,0,1,0,1],
      [1,0,1,0,1,1,1,1,0,1,0,1,0,1],
      [1,0,1,0,0,0,0,0,0,1,1,1,0,1],
      [1,0,1,1,1,1,1,1,1,1,0,0,0,1],
      [1,0,1,0,0,0,0,0,0,0,0,1,0,1],
      [1,0,0,0,1,1,1,0,1,0,1,1,0,1],
      [1,0,1,0,1,0,1,0,1,0,1,0,0,1],
      [1,0,1,0,1,0,1,0,1,1,1,1,0,1],
      [1,0,1,0,0,0,1,0,0,1,0,0,0,1],
      [1,1,1,1,1,1,1,1,1,1,1,1,1,1]]

cols = 14                           # 列数
rows = 12                           # 行数  

screen = Screen()
screen.tracer(0,0)
screen.setup(800,600)

bug = Sprite(shape='square')        # 新建方形对象
bug.shapesize(2.5)
cors = bug.draw_grid2(rows,cols)    # 画rows行,cols列,宽高各50的格子
bug.clear()                         # 清除所有格子
# 格子标为1的印上黑色正方形
for r in range(rows):
    for c in range(cols):
        if maze[r][c]==1:           # 如果这个位置是1 
            bug.goto(cors[r][c])    # bug到达这个位置的坐标
            bug.stamp()             # 印黑正方形
bug.shape('res/bug.png')            # bug 修改造型 
bug.scale(1)                        # 修正比例
bug.goto(cors[1][1])                # 到达起始点
bug.dest= False                     # 自定义属性
screen.update()
def walk_maze(r,c,endr,endc):       # 递归函数(深度搜索)  
    """r,c:起点,endr,endc:终点"""
    # 寻找所有可用的方向
    for i,j in dirs:
        if cangoto(r+i,c+j):        # 如果前面这一格是空
            r += i
            c += j
            if bug.dest == False:   # 如果没到达目的地
               bug.goto(cors[r][c]);bug.wait(0.2)
            maze[r][c] = 1
            stack.append((r,c))                
            if r==endr and c==endc: # 如果到达目的地了
                bug.dest = True                     
            else:walk_maze(r,c,endr,endc)
    else:       
       if stack:
           r,c = stack.pop()
           if bug.dest == False:   # 如果没到达目的地
               bug.goto(cors[r][c]);bug.wait(0.2)
           walk_maze(r,c,endr,endc)

r,c = 1,1                          # 起点
endr,endc = 10,12                  # 终点
txt2image('起','res/起点.png')     # 文字转图
txt2image('终','res/终点.png')     # 文字转图
dummy = Sprite(visible=False)
dummy.shape('res/起点.png')
dummy.goto(cors[r][c])
dummy.stamp()
dummy.shape('res/终点.png')
dummy.goto(cors[endr][endc])
dummy.stamp()

stack = []
dirs = [(1,0),(0,1),(-1,0),(0,-1)]  # 4个方向
stack.append((r,c))                 # 起点添加到stack中
walk_maze(r,c,endr,endc)

screen.mainloop()          

在bug.goto下面加上代码:
screen.save(f"frames/{counter}.png")
其中counter为变量,每次bug走后会加1,
通过screen.save即可保存bug走过的每一帧图,再用gameturtle中的makegif函数制作成gif图片,以下是代码:

from PIL import Image
from gameturtle import makegif

frames = [f"frames/{i}.png" for i in range(62)]
frames = [Image.open(im) for im in frames]           #  打开每张图片

gif = makegif(frames,'bug走迷宫.gif')                # 把每张图片合成gif图

发表在 gameturtle, python, sprites | 留下评论

血条制作小工具

Python血条制作工具

from PIL import Image,ImageDraw

for y in range(100):
    im = Image.new("RGBA",(10,100))
    d = ImageDraw.Draw(im)
    d.rectangle((0,0,9,99),fill=(0,0,0,0),outline='blue')
    d.rectangle((0,y,9,99),fill='red')
    im.save(f'c:/test/{y}.png')

发表在 pillow, python | 标签为 | 留下评论

Python抛物模拟射猴子小游戏

Python抛物模拟射猴子小游戏

"""
   抛物模块_射猴子.py
   按住鼠标左键,速度会一直增加,松开后发射! 本程序需要Python精灵模块支持,安装方法: pip install sprites
"""
import math
from sprites import *

def shoot():
    global speed
    ball.goto(arrow.pos())            #  到达箭头坐标
    angle = math.radians(ball.towards(mouse_pos()))
    ball.dx = speed * math.cos(angle)
    ball.dy = speed * math.sin(angle)
    ball.show()
    
width,height = 516,389
screen = Screen()
screen.setup(width,height)
screen.bgpic('森林.png')

# 新建造型为'circle'的小球
ball = Sprite(shape='circle',visible=False)

# 新建36只猴子
counter = 0
bossid = random.randint(1,36)           # 随机数
x ,y = -200,150
for i in range(4):                      # 4行
    for j in range(9):                  # 9列
        m = Sprite(shape='monkey.png',tag='monkey')
        m.rotatemode(1)                 # 设定旋转模式为左右翻转
        counter +=1
        if counter == bossid: # 如果生成这只猴子的时候,counter刚好等于bossid
            m.血量 = 1000
        else:
            m.血量 = 1
        m.goto(x,y)
        x = x + 50
    y = y -50
    x = -200
# 新建石头
stone = Sprite('circle',visible=False)
stone.color('cyan')
# 下面新建组,会自动把相应标签的对象都添加到组中
monkey_group = Group("monkey")# 新建由猴子标签组成的猴组

base = Sprite(shape='square',pos=(0,-180)) # 基坐
base.shapesize(1,2)

ak = Key('a')                  # 新建键盘a键
dk = Key('d')                  # 新建键盘d键 
screen.listen()

arrow = Sprite(shape='pointer')
arrow.goto(-220,-150)

speed = 10
mkey = Mouse()                # 实例化鼠标左按键 
clock = Clock()               # 实例化时钟对象 
start_shoot_flag = False      # 开始发射标志,值为False表示没有开始发射
counter = 0                   # 计数器
running = True
while running:
    if stone.isvisible():
        stone.fd(5)
        if stone.collide_edge():stone.hide()
    if random.randint(1,100)==1 and stone.ishide():
        stone.goto(random.choice([m.pos() for m in monkey_group if m.isvisible()]))
        stone.heading(base)
        stone.show()
                   
    if ak.down():base.addx(-2)      # 如果按a键,往左移
    if dk.down():base.addx(2)       # 如果按d键,往右称
    arrow.goto(base.pos())          # 箭头到达base的坐标 
    arrow.heading(mouse_pos())# 箭头朝向鼠标指针的方向
    
    # 按下鼠标指针那么speed,即速度会一直增加
    if mkey.down():
       speed = speed + 0.1
       start_shoot_flag = True  # 值为True,表示已按下鼠标左键,
       screen.title("速度:"+str(speed))

    # 刚才按下子,现在又松开了鼠标按键,那么就会发射
    if start_shoot_flag and not mkey.down():
        shoot()
        start_shoot_flag = False
        speed = 10
    if ball.isvisible():
       ball.move(ball.dx,ball.dy)        
       ball.dy = ball.dy - 1       
       for m in list(monkey_group):
          if m.collide(ball) and m.isvisible():
              m.血量 -= 1
              if m.血量 < 1:m.ht() 
       if ball.collide_edge(): ball.hide() # 隐藏小球
    all_monkeys = [m for m in monkey_group if m.isvisible()] # 所有看得见的猴子
    if len(all_monkeys)==1:                  # 如果只有一只了
        all_monkeys[0].fd(4)                 # 则前进
        all_monkeys[0].bounce_on_edge()      # 碰到边缘就返弹
    screen.update()
    clock.tick(60)

发表在 python, sprites | 标签为 | 留下评论

Python精灵模块小猫射击飞碟.py

Python精灵模块小猫射击飞碟

"""
   本程序实现一个能向前向后跳跃的小猫,按F键发射子弹,飞碟碰到子弹爆炸.
   Python精灵模块小猫射击飞碟.py
   pip install pygame
"""
import pygame
from sprites import *

pygame.mixer.init()          # 初始化混音器
j = pygame.mixer.Sound("jump.wav") # 新建音效对象

width,height = 480,360       # 定义宽高变量
screen = Screen()            # 新建屏幕对象
screen.bgcolor('dodger blue')# 设定屏幕背景
screen.setup(width,height)   # 设定屏幕宽高
screen.title("跳跃的小猫,请按awd键")

# 用来画黑色地面的
t= Turtle(visible=False)     # 新建不可见海龟对象
t.penup()                    # 抬笔  
t.pensize(50)                # 画笔轨迹粗细
t.goto(-240,-150)            # 坐标定位
t.pendown()                  # 落笔
t.goto(240,-150)             # 坐标定位

akey = Key('a')              # a键实例
dkey = Key('d')              # d键实例 
wkey = Key('w')              # w键实例
fkey = Key('f')              # f键实例

images = 'res/cat1.png','res/cat2.png' # 两张猫的造型图
sp = Sprite(shape=images)             # 新建角色,造型序列为images 
sp.dx = 0                    # 水平速度
sp.dy = 0                    # 垂直速度
sp.da = -1                   # 加速度
sp.rotatemode(1)             # 左右翻转模式
screen.listen()

zd = Sprite(1)               # 子弹
zd.ht()
ufo = Sprite('res/ufo.png')
ufo.rotatemode(1)           # 旋转模式为左右翻转
ufo.goto(0,120)
clock = Clock()              # 新建时钟对象
while 1:
  ufo.fd(6)                # ufo前进
  if ufo.collide(zd) and ufo.isvisible():      # 如果ufo碰到子弹
     explode(ufo,['res/explosion0.png','res/explosion1.png'])
     ufo.ht()
  ufo.bounce_on_edge()     # 碰到边缘就反弹
  if zd.isvisible(): zd.addy(5) # y坐标增加5
      
  if fkey.down():            # 如果按了f键,子弹到达sp的坐标
     zd.goto(sp.xcor(),sp.ycor())
     zd.show()
     
  # 按键检测      
  if akey.down():            # 如果按了小写a键
    sp.nextcostume()                  # 下一个造型
    sp.dx = -5
    sp.setheading(180)
  elif dkey.down():          # 如果按了小写d键
    sp.nextcostume()                  # 下一个造型
    sp.dx = 5
    sp.setheading(0)
  else:sp.dx = 0
  
  # 按w键跳跃
  if wkey.down() and sp.ycor()==-100:
      #j.play()  
      sp.dy = 15
      sp.addy(sp.dy)
     
  if sp.ycor() < -100 :
      sp.dy = 0
      sp.sety(-100)
      
  # 坐标更新
  sp.addx(sp.dx)
  if sp.ycor()!= -100:         
     sp.addy(sp.dy)
     sp.dy = sp.dy + sp.da
   
  screen.update()            # 渲染画面显示
  clock.tick(60)
  

发表在 python, sprites | 标签为 | 留下评论

Python精灵模块源代码V1.46版doc文档

"""
   sprites.py
   
   一、简介:
   
       本模块命令名为精灵模块,或叫角色模块。本模块已经上传到了pypi网站,通过在cmd窗口下输入pip install sprites即可安装使用。
       精灵模块主要提供继承自Turtle的Sprite类。重定义了Turtle模块中的一些方法和属性。
   由于要旋转图形,所以需要PIL模块和numpy模块支持。默认的精灵对象是抬笔的,内置16张图片。 分别是:ball.png,bug.png,
   b1.png,b2.png,cat1.png,cat2.png,bee.png,flower.png,explosion0.png,explosion1.png,fighter.png,
   thunder.png,sky.png,ufo.png,rat1.png,rat2.png。它们存在于_built_in_images列表中。在本模块第一次运行后,这些图片会释放
   到当前工作目录的res文件夹。本模块设计为教育目的,可用来做入门动画与游戏。
 
   二、Sprite类主要提供了以下功能:
   
   1、角色可直接拖动(compound造型不支持)。
   2、提供像Scratch中的三种旋转模式。精灵对象的_rotatemode属性值为0,代表可360度旋转,为1时代表可左右翻转,为2时角色不会旋转。
   3、rotatemode:返回或设置旋转模式。   
   4、addx:x坐标增加,方便编程。
   5、addy:y坐标增加,方便编程。
   6、scale:缩放角色造型,只有一个参数。
   7、gotorandom:到随机位置。这个命令提供了5个别名,randompos、randomposition 、random_pos、random_position、goto_random 
   8、heading:重定义了这个方法,不带参数能获取当前朝向值。带参数参让角色朝向某对象或坐标,也就是能设置方向了。
   9、show:显示对象,带参数时让角色显示一定的时间后又会隐藏,异步执行。
   10、hide:隐藏对象,带参数时让角色隐藏一定的时间后又显示,异步执行。
   11、move:在水平和垂直方向上移动角色的命令。
   12、collide:和另一个角色或图章的碰撞方法,采用的是矩形碰撞,可以有scale参数,表示缩放绑定盒子,如scale=0.5时,绑定盒宽高各缩一半。
   13、collidemouse:检测角色有没有碰到鼠标指针,别名是collide_mouse。
   14、collide_edge:检测角色有没有碰到边缘检测。
   15、bounce_on_edge:碰到边缘就反弹,适合于用fd命令让角色前进后再使用。
   16、bbox:获取角色绑定盒,通过指定id号,也可获取图章的绑定盒。
   17、randomcolor:设定角色为随机一种较鲜艳的颜色。
   18、randomheading:设定角色为随机一个方向。
   19、remove:移除方法,把自己从屏幕的_turtles列表中删除,并根据item号删除自己在画布上的形状,清除说话泡泡对象,别名是kill和destroy。
   20、stamp:重定义了Turtle类的图章方法,新增的参数可以让图章在一定时间后自动被清除,异步执行。
   21、stampmove:移动图章的命令,角色可根据图章编号来在水平和垂直方向上移动图章,这样方便了制作动态背景。
   22、stampgoto:可以让图章到指定坐标的命令。
   23、stampcors:根据图章编号,获取图章的坐标。
   24、stampbbox:根据图章编号,获取图章的绑定盒。
   25、stampcollide:图章和另一个图章或精灵对象的碰撞检测。   
   26、play:播放方法,目前只支持播放无损压缩的wav音频文件,支持显示歌词。
   27、setalpha:设置透明度方法。参数为从0到255的数值。0代表完全透明,255代表不透明,128代表半透明。
       对于polygon和compound造型来说,0代表透明,非0代表不透明。对于image来说,设置角色的透明度从0到255的值就会产生从透明到不透明的渐变效果。
   28、getalpha:得到透明度,返回从0到255的整数。
   29、set_tag:设置角色的标签。它是一个字符串,用于分组,方便一些游戏的编程。
   30、get_tag:获取角色的标签。
   31、say:说话方法,会在角色上面显示说话气泡。默认时间为2秒,默认会阻塞进程。
   32、saycolor:返回或设置说话的字的颜色。
   33、saybordercolor:返回或设置说话泡泡的边框颜色。   
   34、write:重定义写方法,增加angle参数,可以写斜字,默认为黑体,12号。
   35、reborn:“重生”方法,让角色隐藏后在另一坐标重新显示。复用角色之用,可加delay参数,意为在一定的时间后才显示,异步执行。
   36、nextcostume:下一个造型,别名是nextshape。
   37、previouscostume:上一个造型,别名是previousshape。
   38、costumeindex:指定造型编号,别名是shapeindex。
   39、update:单独更新(重绘)角色,(屏幕也有这个方法,但会重绘所有角色。)
   40、wait:方法,等待一定的时间,以秒为单位,默认等待0.01秒。在等的过程中会不断刷新屏幕。
   41、slide:滑行命令,在一定时间滑行到某坐标,别名是glide。
   42、draw_grid:指定格子宽度和高度画格子命令,它会在屏幕上铺满格子。
   43、draw_grid2:画格子2命令,指定行数、列数、格子宽度、格子高度画格子。
   44、draw_grid3:画格子3命令,指定行数、列数、格子宽度、格子高度、是否盖图章,并且角色当前方向来画格子的方法。
   45、stampslide:图章滑行命令,别名为stampglide
   46、hidestamp:隐藏图章命令,别名为stamphide。
   47、showstamp:显示图章命令,别名为stampshow。
   48、stampishide:判断图章是否隐藏命令。
   49、wander: 在屏幕内漫游,它是gotorandom的慢版。
   50、ishide:返回角色是否是隐藏的。
   51、write2:用来写有阴影的字,有前景bg和fg参数,默认为中间对齐,宋体16号字。
   52、find_overlapping:查找重叠命令。本命令用来查找有无和角色的矩形重叠的项目(包括画笔线条,圆点,多边形,圆弧,填充区域,图章,其它角色),可以有一个参数,叫排除参数。本命令返回找到的项目编号集合。
   53、overlap_with:重叠命令。本命令有一个参数,它会查找和这个参数对应的项目有无重叠。(包括线条,圆点,多边形,圆弧,图章,填充区域,其它角色)。它的参数可以是序列、整数与角色或字符串,返回重叠的所有项目编号。
   54、topleft:到左上角,返回坐标。
   55、topright:到右上角,返回坐标。
   56、bottomleft:到左下角,返回坐标。
   57、bottomright:到右下角,返回坐标。
   58、arc:画圆弧,实际上是一个派形图。参数为radius半径,start起始角,extent结束角,width线宽,fill填充颜色与outline边框颜色 ,返回项目编号。
   59、polygon:画多边形,以角色所在坐标为第一个点画多边形,参数为其它坐标列表,width线宽,fill填充颜色与outline边框颜色 ,返回项目编号。
   60、contained:返回完全包含在角色最小矩形内的所有项目编号集合。
   61、contain:判断角色完全包括另一个角色或项目编号,返回真或假。
   62、oval:产生椭形的方法,它会根据当前角色的方向而产生,即可产生斜的椭圆。
   63、oval2:产生椭圆的方法,不会根据当前角色的方向产生,即总是“正的”。
   64、setleft:设置角色的最左x坐标。
   65、setright:设置角色的最右x坐标。
   66、settop:设置角色的最上y坐标。
   67、setbottom:设置角色的最下y坐标。
   68、getleft:获取角色或项目编号的最左x坐标。
   69、getright:获取角色或项目编号的最右x坐标。
   70、gettop:获取角色或项目编号的最顶y坐标。
   71、getbottom:获取角色或项目编号的最底y坐标。
   72、pixelcollide:像素碰撞方法。用于两个角色之间的像素级别碰撞。返回碰撞点的坐标及两个角色在这个点的像素值及重叠区域矩形。
   73、draggable:设置角色为可拖放。要取消只要设置ondrag方法的值为None即可。
   74、saveshape:保存当前造型为图片,只支持image类型的角色。
   75、coloroverlap:角色造型图片上的颜色重叠检测命令,属于像素级碰撞命令。
   76、collidecolor:碰到颜色命令
   
   三、screen新增命令:
   
   在海龟画图中,屏幕的本质是继承自框架内的画布和滚动条。sprites模块中也一样,但是把屏幕放在了名为displayframe的框架中。
   当使用Screen()命令时,不加参数或参数1,则窗口还是和原来一样。displayframe组件就是tk组件(即窗口组件)。
   当使用Screen(2)时,新建的窗口会分为左右两大区,名称分别为leftframe和rightframe框架区。displayframe在leftframe区上面。
   当使用Screen(3)时,新建的窗口会分为上下两大区,名称分别为topframe和bottomframe区。displayframe在topframe区的左边。

   在sprites模块中,为了方便横版或竖版游戏的制作,让背景也能移动。
   
   以下是给屏幕增加的方法。   
   1、resizable:sprites模块默认窗口是不可变大小的,用这个命令能让窗口重新可缩放。
   2、onmousemove:即鼠标移动事件,需要定义一个函数绑定这个事件。
   3、onscreenrelease:鼠标松开事件,需要定义一个函数绑定它。
   4、move:在水平和垂直方向上移动背景图片。
   5、setx:设置背景图片的x坐标。
   6、sety:设置背景图片的y坐标。
   7、xcor:获取背景图片的x坐标。
   8、ycor:获取背景图片的y坐标。
   9、goto:设定背景图片的x,y坐标
   10、save:截屏,保存屏幕为图形对象或者为图片,屏幕需在最前面显示(不要最小化)。
   11、titlebar:是否要标题栏的命令,参数为False,不显示标题栏,反之显示。
   12、draggable:让窗口按住鼠标中键时可拖动。在没有标题栏时最好这样,要不然不方便了。
   13、addpopup:绑定右键菜单
   14、removepopup:移除绑定右键菜单
   
   四、给_Root类增加的方法
   1、position:获取窗体在计算机桌面上的x,y坐标,没有参数。
   2、goto:设置窗体在计算机桌面上的坐标,参数为x,y整数值。
   3、move:相对移动窗体,参数为dx,dy整数值,分别为水平与垂直单位移动距离。
   
   五、单独函数:

   1、makecolors:
   默认产生128种鲜艳的颜色,导入本模块后它会运行一次,产生一个_colorlist列表。

   2、mouse_pos:
   获取鼠标指针的坐标,和屏幕的xscale和yscale无关。
   它有5个别名,mouse_position、mouseposition、mousepos、getmousepos、getmouseposition。

   3、pmouse_pos:
   获取先前的鼠标指针的坐标。
   它有5个别名,pmouse_position、pmouseposition、pmousepos、pgetmousepos、pgetmouseposition。

   4、explode:
   产生爆炸效果的函数。需要传递坐标和序列帧图。它的别名是effect。

   5、txt2image:
   方便文字转图像的实用函数,这样就能把角色的造型设置成一个文字了。

   6、txt3image:把多行文本转换成图像文件或图形对象。
   
   7、txt4image:把文本文件转换成图像文件或图形对象。

   8、rect_overlap:返回两个矩形相交区域与面积。

   六、单独类:
   
   1、Key类:用来新建某个按键的实例,用于在循环中进行键盘按键检测。
   2、Mouse类:用来新建鼠标按键的实例,用于在循环中进行鼠标按键检测。
   3、Clock类:用来固定帧的时钟类,有tick方法和getfps方法。前者用来设置帧率,后者获取帧率。
   4、Group类:用来给角色分组的一个类,在实例化时需要加标签为参数。

   七、其它:
   新增屏幕的_focus属性,用来跟踪屏幕是否激活。
   
   注意以下问题:
   1、不支持复合图形的拖动。   
   2、tilt倾斜等变形命令不会对图形进行变形。
   3、如果用屏幕的tracer(0,0)关闭了自动渲染角色,那么在移动角色后要马上刷新屏幕,否则会出现意外效果。  
   原因是绑定盒命令得到的是先前没有刷新的角色的坐标,这样获取的不是最新坐标,当然会导致程序出意外。
   4、屏幕的update命令会重新渲染所有的角色,如果角色较多,反而会让程序运行更慢。
   5、本模块给RawTurtle类增加了update方法,这样能单独渲染一个角色。本模块已经把屏幕的自动绘画延时设为0及速度也设为最快了。
   6、其实Turtle模块可以支持png图片,但要像以下这样写:
   screen.addshape('scratch.png',Shape("image", screen._image('scratch.png')))
"""


发表在 python, sprites | 标签为 | 留下评论

虫子朝向鼠标指针向前进练习题

python虫子朝向鼠标指针向前进
原题代码如下:

"""
   朝向鼠标指针移动.py
"""

from sprites import Sprite,mouse_pos

bug = Sprite()
bug.screen.bgcolor('cyan')

while 1:
    mp = mouse_pos()
    bug.heading(mp)
    if bug.distance(mp) > 10:bug.fd(1)

以上程序运行后会有一只虫子朝几鼠标指针向前进,现提出要求如下:
1. 让虫子移动时留下轨迹。
2. 并且轨迹的颜色是渐变的。

参考答案如下:












from coloradd import coloradd
from sprites import Sprite,mouse_pos,Screen

screen = Screen()
screen.colormode(255)   #  设定颜色模式为RGB255
screen.bgcolor('cyan')

bug = Sprite()
bug.pensize(10)
bug.pendown()

c = (255,0,0)           # 三元组,在此用来表示红色

while 1:
    c = coloradd(c,0.01)
    bug.color(c)    
    mp = mouse_pos() 
    bug.heading(mp)     # 朝向
    if bug.distance(mp) > 10:bug.fd(1)

发表在 python, sprites | 标签为 , , | 留下评论

如何得到变量的名字?

"""
   如何得到变量的名字? 看似很简单的问题其实很难。
   这里提供了一种参考方法。
"""
class TestClass:
    def __init__(self):        
        self.hashcode = id(self)
        self.delete_self_name()
        
    def delete_self_name(self):
       
        weizhi = [k for k, v in globals().items()
                        if hasattr(v,'hashcode') and
                        v.hashcode == self.hashcode]
        if weizhi==[]:                
            weizhi = [k for k, v in locals().items()
                        if hasattr(v,'hashcode') and
                        v.hashcode == self.hashcode]
        name = weizhi[0]
        if name in globals():           
            globals().pop(name)
        elif name in locals():
            locals().pop(name)
        
    def __del__(self):
        print("调用__del__() 销毁对象,释放其空间")
        
ttt = TestClass()
print(ttt.delete_self_name())
print(ttt)                # 对象已经被删除了。


发表在 python | 留下评论

coloradd的lerpcolor线性颜色过渡命令

coloradd颜色增加模块已经更新,新增命令lerpcolor。这个命令返回两个颜色之间的过渡颜色,亦可用于颜色渐变。

颜色渐变lerpcolor命令线性插值颜色

以下是示例代码:

import turtle
from coloradd import *

turtle.delay(0)
turtle.speed(0)

turtle.colormode(255)
fromC = (255,0,0)
toC = (0,0,255)
cs = []
am = 100
for x in range(1,am):
    cs.append(lerpcolor(fromC,toC,x/am))
cs.insert(0,fromC)
cs.append(toC)

for i in range(len(cs)):
    turtle.dot(10,cs[i])
    turtle.fd(2*(i+1))
    turtle.right(60)


发表在 processing, python | 标签为 | 留下评论

processing的Python模式代码:流星

Python流星代码meteor
这是一个动画,在processing的IDE编程,用Python模式,运行后, 流星从左到右划过星空……


x = 0
y = 0
dx = 1
def setup():
    size(600,600)
    background(0)
    noStroke()
    
def draw():
    global dx
    
    dx = dx + 1
    background(0)
    for i in range(256):
       fill(i)
       x = i + dx
       circle(x,100,10)
       i = i + 1
    if x-256 >= width:dx = -256

发表在 processing, python | 标签为 | 留下评论

processing的Python模式代码:向上生长的滕蔓

processing的Python模式向上生长的滕

"""向上生长的绿色藤蔓"""

from random import randint

x = 0
y = 0
g = 0
b = 0

def setup():
    global x,y,g,b
    size(600,300)
    x =width/2
    y = height
    g = randint(0,255)
    b = g
    background(0,0,randint(0,255))

def draw():
    global x,y,g,b
    x += randint(-1,1)
    y -= randint(0,1)
    if x<0:x=width
    if x>width:x=0
    if y<0:y=height
    g += randint(-10,10)
    g = constrain(g,0,255)
    
    b += randint(-10,10)
    b = constrain(b,0,g)
    
    stroke(0,g,b)
    point(x,y)
    
发表在 processing, python | 留下评论

字符画生成网页

绿叶转字符画

from PIL import Image # PIL 是一个 Python 图像处理库

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
# 是我们的字符画所使用的字符集,一共有 70 个字符,字符的种类与数量可以自己根据字符画的效果反复调试的

WIDTH = 50                                           # 字符画的宽
HEIGHT =45                                           # 字符画的高

# 
def get_char(r, g, b, alpha=256):  
   """
      将256灰度映射到70个字符上,也就是RGB值转字符的函数:
    """
   if alpha == 0:
       return ' '
   length = len(ascii_char)
   gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)   # 计算灰度
   unit = (256.0) / length
   return ascii_char[int(gray / unit)]                # 不同的灰度对应着不同的字符
   

im = Image.open('1.png')
im = im.resize((WIDTH, HEIGHT))
txt = ""
for i in range(HEIGHT):
   for j in range(WIDTH):
       txt += get_char(*im.getpixel((j, i)))          # 获得相应的字符
   txt += '\n'
print(txt)                                            # 打印出字符画

# 将字符画 写入网页文件中
html = """字符画

$mytable


"""
table = '''

'''
tr = ''
for line in txt.split("\n"):
   line = line.replace(' ',' ')
   tr += "\n"
table += tr + "
" + line + "
" html = html.replace('$mytable',table) fo = open('output.html','w') fo.write(html) fo.close()
发表在 pillow, python | 留下评论

pygame下落球的轨迹问题?

pygame下落的球
pygame下落球的轨迹问题? 上面的球是素材,背景白色的。

"""
   计算球下落时间.py
   这个是一个会员的程序,说是程序有问题.
   问题就是为什么球下落的时候没有留下轨迹?
   我仔细看了一下,原来是有留下轨迹的,只不过嘛,呵呵呵,
   问我,你就知道啦.
"""
import pygame

pygame.init()
screen=pygame.display.set_mode([800,600])
screen.fill([255,255,255])

img=pygame.image.load("poke-ball1.png")
x=0
time=0
font1=pygame.font.Font(None,50)
my_rect=pygame.Rect(0,0,800,50)

for i in range(120):    
    showtime=str(time)
    f1=font1.render(showtime,1,[255,0,0])
    screen.blit(f1,[0,0])
    screen.blit(img,[400,x])
    pygame.display.update()
    pygame.time.delay(20)
    pygame.draw.rect(screen,[255,255,255],my_rect,0)    
    x+=5
    time+=20

screen.blit(f1,[0,0])
pygame.display.update()
running=True
while running:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            running=False
    pygame.display.update()

pygame.quit()
        

发表在 pygame, python | 标签为 | 留下评论

学生考试代码李*能:Python蓝绿花圈?

Python蓝绿花圈

二. 编程能力测试题:

26. 根据要求编写程序,不能照搬课堂练习与作业及书上的原有代码,胡乱拼凑代码得零分!

1. 程序至少有12行代码,能够运行无错误。(5分)
2. 用到至少一种循环语句。(5分)
3. 程序至少用到列表或元组。(5分)
4. 能够明确实现某种功能。(5分)
5. 给程序写文字说明,介绍程序的每一段的用途,至少100个字。(5分)

以下是额外分,以下几条,有遇到没学过的可以忽略,不能硬凑代码,如,随便找一段代码粘贴上去,和程序并没有半点关系,这样的情况不得分。

6. 程序运行后能画出比较漂亮的图形或动画效果。(加5分) +5
7. 用到了自定义函数。(加5分)
8. 用到了递归的。 (加5分)
9. 用到了class,即类的。(加5分)
10. 用到了读写文件的。(加5分)
11. 用到了命令行参数功能的。(加5分)
如果在程序中正确运用到了以上6到11条则额外加分。程序的文字说明写到最后,程序在IDLE中调试完毕后粘贴到下面。

以下是李*能所答代码:

import turtle
turtle.shape('turtle')
turtle.dot(30)
turtle.speed(0)
turtle.delay(0)
turtle.fillcolor('navy')
turtle.begin_fill()
for x in range(15):
    for x in range(10):
        turtle.bk(20)
        turtle.dot(20)
        turtle.left(37)
        turtle.fd(20)
        turtle.dot(30)
        turtle.color('blue')
        turtle.bk(30)
    turtle.fd(20)
    for x in range(10):
        turtle.bk(10)
        turtle.dot(20)
        turtle.left(90)
        turtle.fd(50)
        turtle.dot(30)
        turtle.color('yellow')
        turtle.bk(30)
    turtle.fd(20)
    for x in range(10):
        turtle.bk(20)
        turtle.dot(20)
        turtle.left(50)
        turtle.fd(10)
        turtle.dot(30)
        turtle.color('green')
        turtle.bk(30)
turtle.end_fill()

发表在 python, turtle | 标签为 | 留下评论

学生考试代码徐*东:4个彩色创意十字架

Python4个彩色十字架
原题:
二. 编程能力测试题:

26. 根据要求编写程序,不能照搬课堂练习与作业及书上的原有代码,胡乱拼凑代码得零分!比如在程序中定义了一个颜色列表,但并没有使用到这个列表。

1. 程序至少有20行代码,能够运行无错误。(5分)
2. 用到至少一种循环语句。(5分)
3. 程序至少用到列表或元组。(5分)
4. 能够明确实现某种功能。(5分)
5. 给程序写文字说明,介绍程序的每一段的用途,至少50个字。(5分)

额外分:
如果程序用到了自定义函数,加5分。如果程序运行后富有创意,加5分。
程序的文字说明写到最后,程序在IDLE中调试完毕后粘贴到下面。

以下是学生徐*东的答案:

import turtle

t = ['red','yellow','orange','green','cyan','blue','purple']

turtle.left(90)

turtle.shape('turtle')
turtle.speed(1)
turtle.pensize(10)
turtle.bgcolor('black')
turtle.begin_fill()
for x in range(4):
    turtle.color(t[x])
    turtle.fd(50)
    turtle.rt(90)
    turtle.fd(50)
    turtle.left(90)
    turtle.fd(50)
    turtle.rt(90)
    turtle.color('white')
turtle.end_fill()
turtle.penup()
turtle.fd(200)
turtle.begin_fill()
turtle.pendown()
for x in range(4):
    turtle.color(t[-x])
    turtle.fd(50)
    turtle.rt(90)
    turtle.fd(50)
    turtle.left(90)
    turtle.fd(50)
    turtle.rt(90)
    turtle.color('dodgerblue')
turtle.end_fill()
turtle.penup()

turtle.rt(90)
turtle.fd(200)
e = ['pink','magenta','gold','lime','tomato',
     'wheat','wheat','navy','plum','gray']
turtle.begin_fill()
turtle.pendown()

for x in range(4):
    turtle.color(e[x])
    turtle.fd(50)
    turtle.rt(90)
    turtle.fd(50)
    turtle.left(90)
    turtle.fd(50)
    turtle.rt(90)
    turtle.color('linen')
turtle.end_fill()
turtle.penup()
turtle.fd(-300)
turtle.begin_fill()
turtle.pendown()
for x in range(4):
    turtle.color(e[-x])
    turtle.fd(50)
    turtle.rt(90)
    turtle.fd(50)
    turtle.left(90)
    turtle.fd(50)
    turtle.rt(90)
    turtle.color('tan')
turtle.end_fill()


以下是徐*东的文字说明:
我的程序叫四个十字,今年三年级。这个程序首先第一步先导入海龟,再创造一个颜色列表。第二部分确定背景颜色为黑色,速度为最慢,造型为海龟,粗细为10。第三部分首先把颜色变成列表里的颜色,然后循环迭代重复的移动,画出一个十字架,最后填充,后面代码继续重复,最终画出四个不同颜色,不同填充颜色的十字架。

发表在 python, turtle | 标签为 | 留下评论

学生邬*梁Python考试代码_颜色渐变圈圈

学生Python绘画代码

学生Python绘画代码


下面的程序需要coloradd模块支持,安装方法:按Ctrl + R键打开运行对话框,输入cmd,按确定。在弹出的管理员窗口中输入pip install coloradd
以下是学生考试时候的代码:

import turtle
from coloradd import *

turtle.pensize(10)
turtle.bgcolor('black')
turtle.colormode(255)
turtle.speed(0)
turtle.delay(0)
turtle.penup()
turtle.sety(250)

c = (0,0,255)

for x in range(18):
    for s in range(45):
        c = coloradd(c,0.01)
        turtle.color(c)
        turtle.fd(12)
        turtle.rt(8)
    for w in range(45):
        turtle.pensize(3)
        c = coloradd(c,0.01)
        turtle.color(c)
        turtle.fd(10)
        turtle.rt(8)
        turtle.pensize(10)
    turtle.penup()
    turtle.fd(100)
    turtle.rt(20)
    turtle.pendown()

发表在 python, turtle | 标签为 | 留下评论

学生徐*博Python turtle代码_旋转的一个几何图画

Python旋转几何图形
本程序还有很多可以改进的地方,请读者自行改进.

import turtle as t
import time

t.speed(0)
t.delay(0)
t.tracer(0,0)

def long2():
    t.penup()
    t.clear()
    t.color('black')
    t.dot(200)
    cs = ['red','blue','yellow']
    t.color('white')
    t.dot(140)
    t.pendown()
    for x in range(3):
        t.color(cs[x%3])
        t.pensize(10)
        t.fd(65)
        t.back(65)
        t.right(120)
    t.penup()
    time.sleep(0)
    co=['red','yellow','orange','green','blue','cyan','purple','pink']
    for x in range(8):
        t.fd(150)
        t.pencolor(co[x%8])
        t.dot(50)
        t.back(150)
        t.right(45)

rr = 0

while True:
    t.color('black')
    t.clear()
    long2()
    t.penup()
    t.color('blue')
    t.goto(-300,-300)
    t.write("loading.....",font=('黑体',33,'normal'))
    t.home()
    t.pendown()
    t.update()          # 刷新屏幕显示 
    t.right(rr)
    rr += 3   

发表在 python, turtle | 标签为 | 留下评论

走出字母迷宫小游戏算法

Python走出字母迷宫算法
以下是所有代码:

"""
   走出字母谜宫_sprites.py
   这个简单的自动走迷宫程序让I 寻找到出口就结束。
   可以加上按键检测,就变成一个小游戏。
   I表示小人,本程序需要安装sprites模块才能正常运行,安装方法:
   用cmd打开管理员窗口,输入pip install sprites
   以下是所有代码。
"""
from sprites import Sprite

def draw_maze(maze,cors):
    """画出迷宫,本函数调用一次,所以在函数内生成角色"""
    t = Sprite(visible=False)
    rows = len(maze)
    cols = len(maze[0])
    for r in range(rows):
        for c in range(cols):
            x,y = cors[r][c]
            t.goto(x,y)
            t.write(maze[r][c])
            
def draw_current(sprite,pos,maze,cors):
    """sprite在pos位置上画字母"""
    sprite.clear()           # 清除所有自己印的
    r,c = pos                # 在迷宫中的行列号
    x,y = cors[r][c]         # 把行列号换成坐标
    letter = maze[r][c]      # 需要印的字母    
    sprite.goto(x,y)
    sprite.write("I")
    sprite.wait(1)
    
maze = [['X','X','X','X','X'],
        ['X',' ',' ',' ','X'],
        ['X',' ','X',' ',' '],
        ['X',' ','X','X',' '],
        ['X',' ','X','X',' ']]

rows = len(maze)
cols = len(maze[0])
turtle = Sprite(visible=False)            # 新建隐藏角色  
cors = turtle.draw_grid2(rows,cols,50,50) # 行数,列数,格子宽,格子高
draw_maze(maze,cors)           # 画迷宫
turtle.wait(5)
bug = Sprite(visible=False)

dirs = [(-1,0),(1,0),(0,-1),(0,1)] # 方向
start = (4,1)                      # 起点
end = (4,4)                        # 终点
i = 0
while True:
    draw_current(bug,start,maze,cors) # 画当前
    if start==end:break
    for fx in dirs:            # 每一个方向
        r,c = start
        dest_row = r + fx[0]   # 目地的行位置
        dest_col = c + fx[1]   # 目地的列位置
        if maze[dest_row][dest_col]==' ': # 如果这个地方是空的则可以前进
           maze[r][c],maze[dest_row][dest_col] = maze[dest_row][dest_col],maze[r][c]
           maze[r][c] = '.'               # 雁过留声
           start = (dest_row,dest_col)
           break
   
        

发表在 python, sprites | 标签为 | 留下评论

信息学竞赛经典题目蛇形填数向量旋转解法

Python蛇形填数向量旋转法
下面是我研究的向量旋转法,又和”海龟”扯上联系了。一只看不见的“小海龟”在数组中通过二维向量旋转90度,让它只能上下左右移动。在程序中设计了一个叫ArrayTurtle的类。它有step方法让对象在array中前进或者倒退一个单位。最关键的是turn方法,让对象旋转90度。数学理论来源于二维向量旋转。如下图所示:

Python信息学竞赛蛇形填数向量旋转法

以下是源代码:

"""Python信息学竞赛蛇形填数向量旋转法.py by 李兴球"""
class ArrayTurtle:
    def __init__(self,i,j,h,array):
        """i:初始行位置,j:初始列位置,
           h:二元组,表示初始方向,array:二维数组"""
        self.i = i
        self.j = j
        self.h = h                # 下(1,0),左(0,-1),上(-1,0),右(0,1)
        self.array = array
        self.rows = len(array)    # 总行数
        self.cols = len(array[0]) # 总列数
        self.mileage = 1          # 用于统计里程(假定在初始位置就有1个里程了)
        self.set_value()
        self.matrix = [(0,-1),(1,0)] # 变换矩形
        
    def step(self,k=1):          # 前进1格或者-1格        
        self.i += int(self.h[0]) * k
        self.j += int(self.h[1]) * k
        self.mileage += k
        
    def set_value(self):
        
        #self.array[self.i][self.j] = self.mileage
        self.array[self.i][self.j] = self.rows*self.cols + 1 - self.mileage
        
    def current_value(self):
        return self.array[self.i][self.j]
    
    def goto_end(self):
        return self.mileage == self.rows*self.cols
    
    def beyond_boundary(self):
        """超出边界"""
        return self.i<0 or self.i>=self.rows or \
               self.j<0 or self.j>=self.cols
        
    def turn(self):                # 左转向90度
        # 矩形乘法
        x = self.h[0] * self.matrix[0][0] + self.h[1] * self.matrix[0][1]
        y = self.h[0] * self.matrix[1][0] + self.h[1] * self.matrix[1][1]
        self.h = (x,y)    

    def display(self):
        for row in self.array:
            for col in row:
                print(f"{col:3d}",end=' ')
            print()
        print()

n = 8
matrix = [ [0 for i in range(n)] for i in range(n)]

i,j = 0,0
t = ArrayTurtle(i,j,(1,0),matrix)
t.set_value()
while True:
    while True:
        t.step(1)              # 在当前方向前进一个单位
        if  not t.beyond_boundary() and t.current_value()==0:   # 没超出边界或没走过,则倒退
           t.set_value()
        else:
           t.step(-1)
           break        
    t.turn()
    if t.goto_end():break

t.display()   
    

Python信息学竞赛蛇形填数向量旋转法.py by李兴球

发表在 python | 标签为 | 留下评论

含金量高的Python考试或认证

Python的用途不言而遇了,这里列出了一些Python的考试或认证:

1. 教育部的Python二级考试。
网址: https://ncre.neea.edu.cn/ 已经有中小学生参加这个考试并获取了证书了哦! 对于中小学生们来说,含金量就高了。

2. 教育部的1+X计划Python程序开发职业等级证书。
教材网址:https://www.zhonghui.vip/teaching-material/4966/

3. 教育部的1+X计划大数据应用开发(Python)工程师。
网址:http://www.tipdm.com/gsxw/2028.jhtml

4. 华为HCIA-AI 人工智能工程师

5. CSDN的C4 Python工程师

6. 微软MTA Python国际认证

7. 谷歌TensorFlow认证

8. 人工智能职业技能等级认证(计算机视觉/自然语言处理等)

发表在 python, 杂谈 | 标签为 | 留下评论

算法竞赛入门经典(第2版)习题2-6排列(permutation)练习题解_Python与C++代码

"""
算法竞赛入门经典(第2版)
习题2-6 排列(permutation)
用1,2,3...9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求
abc:def:ghi = 1:2:3,按照"abc def ghi"的格式输出所有解,每行一个解。

"""
for i in range(123,982):
     if len(set(str(i)))<3:continue
     j = i * 2
     k = i * 3
     if k>999:break
     if len(set(str(i) + str(j) + str(k))) == 9:
         print(i,j,k)

以下是C++代码

#include 
#include 
#include 

using namespace std;

int main()
{
   int i,j,k=0;
   set jihe;                        //新建集合
   for(i=123;i<982 && k<999  ;i++)
   {   jihe.clear();
       jihe.insert(i%10);  jihe.insert(i/10%10);
       jihe.insert(i/100);
       if (jihe.count(0)==1) continue; //发现有0则下一个       
       j = i* 2;
       jihe.insert(j%10);
       jihe.insert(j/10%10);
       jihe.insert(j/100);
       if (jihe.count(0)==1) continue; //发现有0则下一个
       k = i * 3;
       jihe.insert(k%10);
       jihe.insert(k/10%10);
       jihe.insert(k/100);
       if (jihe.count(0)==1) continue; //发现有0则下一个
       if (jihe.size()==9)   printf("%d %d %d \n",i,j,k);
   }
	   	
}
发表在 python | 留下评论