zoukankan      html  css  js  c++  java
  • Python练手项目实例汇总(附源码下载)

    今天给大家分享几个有趣的Python练手项目实例,希望对Python初学者有帮助哈~

    一、经典的俄罗斯方块

     
    1. 绑定功能
     1 # 绑定功能
     2 class App(Frame):
     3     def __init__(self,master):
     4         Frame.__init__(self)
     5         master.bind('<Up>',self.Up)
     6         master.bind('<Left>',self.Left)
     7         master.bind('<Right>',self.Right)
     8         master.bind('<Down>',self.Down)
     9         
    10         master.bind('<space>',self.Space)
    11         master.bind('<Control-Shift-Key-F12>',self.Play)
    12         master.bind('<Key-P>',self.Pause)
    13         master.bind('<Key-S>',self.StartByS)
    14         
    15         # rgb颜色值
    16         self.backg="#%02x%02x%02x" % (120,150,30)    #大背景
    17         self.frontg="#%02x%02x%02x" % (40,120,150)    #下一个形状颜色
    18         self.nextg="#%02x%02x%02x" % (150,100,100)    #小背景
    19         self.flashg="#%02x%02x%02x" % (210,130,100)    #炸的颜色
    20         
    21         self.LineDisplay=Label(master,text='Lines: ',bg='black',fg='red')
    22         self.Line=Label(master,text='0',bg='black',fg='red')
    23         self.ScoreDisplay=Label(master,text='Score: ',bg='black',fg='red')
    24         self.Score=Label(master,text='0',bg='black',fg='red')
    25         self.SpendTimeDisplay=Label(master,text='Time: ',bg='black',fg='red')
    26         self.SpendTime=Label(master,text='0.0',bg='black',fg='red')
    27         
    28         self.LineDisplay.grid(row=HEIGHT-2,column=WIDTH,columnspan=2)
    29         self.Line.grid(row=HEIGHT-2,column=WIDTH+2,columnspan=3)
    30         self.ScoreDisplay.grid(row=HEIGHT-1,column=WIDTH,columnspan=2)
    31         self.Score.grid(row=HEIGHT-1,column=WIDTH+2,columnspan=3)
    32         self.SpendTimeDisplay.grid(row=HEIGHT-4,column=WIDTH,columnspan=2)
    33         self.SpendTime.grid(row=HEIGHT-4,column=WIDTH+2,columnspan=3)
    34         
    35         self.TotalTime=0.0
    36         self.TotalLine=0
    37         self.TotalScore=0
    38         
    39         #游戏结束
    40         self.isgameover=FALSE
    41         #暂停
    42         self.isPause=FALSE
    43         #开始
    44         self.isStart=FALSE
    45         self.NextList=[]        #整个小背景
    46         self.NextRowList=[]     #一行小背景
    47         
    48         self.px=0
    49         self.py=0       #记录方块参考点
    50         
    51         #渲染小背景
    52         r=0;c=0
    53         for k in range(4*4):
    54             LN=Label(master,text='    ',bg=str(self.nextg),fg='white',relief=FLAT,bd=3)
    55             LN.grid(row=r,column=WIDTH+c,sticky=N+E+S+W)
    56             self.NextRowList.append(LN)
    57             c=c+1
    58             if c>=4:
    59                 r=r+1;c=0
    60                 self.NextList.append(self.NextRowList)
    61                 self.NextRowList=[]
    62                 
    63         #渲染大背景
    64         self.BlockList=[]
    65         self.BlockRowList=[]
    66         self.LabelList=[]
    67         self.LabelRowList=[]
    68         row=0;col=0
    69         for i in range(HEIGHT*WIDTH):
    70             L=Label(master,text='    ',bg=str(self.backg),fg='white',relief=FLAT,bd=4)
    71             L.grid(row=row,column=col,sticky=N+E+S+W)
    72             L.row=row;L.col=col;L.isactive=PASSIVE
    73             self.BlockRowList.append(0);    #大背景每个格子初始化为0值
    74             self.LabelRowList.append(L)
    75             col=col+1
    76             if col>=WIDTH:
    77                 row=row+1;col=0
    78                 self.BlockList.append(self.BlockRowList)
    79                 self.LabelList.append(self.LabelRowList)
    80                 self.BlockRowList=[]
    81                 self.LabelRowList=[]
    82                 
    83         #file
    84         fw=open('text.txt','a')
    85         fw.close()
    86         hasHead=FALSE
    87         f=open('text.txt','r')
    88         if f.read(5)=='score':
    89             hasHead=TRUE
    90         f.close()
    91         self.file=open('text.txt','a')
    92         if hasHead==FALSE:
    93             self.file.write('score    line    time    scorePtime    linePtime    scorePline    date/n')
    94             self.file.flush()
    95             
    96         self.time=1000
    97         self.OnTimer()

    2. 实现俄罗斯方块的翻转

     1 # 俄罗斯方块的翻转
     2 def Up(self,event):
     3         BL=self.BlockList   #格子的值
     4         LL=self.LabelList   #格子Label
     5         
     6         Moveable=TRUE       #是否可旋转
     7         
     8         #代码编写开始
     9         nowStyle = style[self.xnow][(self.ynow)]
    10         newStyle = style[self.xnow][(self.ynow+1)%4]  #算出下一俄罗斯方块
    11         self.ynow = (self.ynow+1)%4 #此行代码非常重要,否则响应UP时,只能变第一次
    12         
    13         print("nowStyle:"+str(nowStyle)+"=====>>newStyle:"+str(newStyle))
    14         
    15         #根据现有形状中每个label的坐标计算出旋转后目标坐标(x,y)
    16         SourceList=[];DestList=[]
    17         
    18         for i in range(4):
    19             SourceList.append([ nowStyle[i][0]+self.px, nowStyle[i][1]+self.py])
    20             x = newStyle[i][0]+self.px
    21             y = newStyle[i][1]+self.py
    22             DestList.append([x, y])
    23             
    24             if x<0 or x>=HEIGHT or y<0 or y>=WIDTH : #or BL[x][y]==1 or LL[x][y].isactive==PASSIVE
    25                 Moveable=FALSE
    26             
    27         if Moveable==TRUE:
    28             for i in range(len(SourceList)):
    29                 self.Empty(SourceList[i][0],SourceList[i][1])
    30             for i in range(len(DestList)):
    31                 self.Fill(DestList[i][0],DestList[i][1])
    32                 
    33     def Left(self,event):
    34         BL=self.BlockList;LL=self.LabelList
    35         Moveable=TRUE
    36         for i in range(HEIGHT):
    37             for j in range(WIDTH):
    38                 if LL[i][j].isactive==ACTIVE and j-1<0:Moveable=FALSE
    39                 if LL[i][j].isactive==ACTIVE and j-1>=0 and BL[i][j-1]==1 and LL[i][j-1].isactive==PASSIVE:Moveable=FALSE
    40         if Moveable==TRUE:
    41             self.py-=1
    42             for i in range(HEIGHT):
    43                 for j in range(WIDTH):
    44                     if j-1>=0 and LL[i][j].isactive==ACTIVE and BL[i][j-1]==0:
    45                         self.Fill(i,j-1);self.Empty(i,j)
    46                         
    47     def Right(self,event):
    48         BL=self.BlockList;LL=self.LabelList
    49         Moveable=TRUE
    50         for i in range(HEIGHT):
    51             for j in range(WIDTH):
    52                 if LL[i][j].isactive==ACTIVE and j+1>=WIDTH:Moveable=FALSE
    53                 if LL[i][j].isactive==ACTIVE and j+1<WIDTH and BL[i][j+1]==1 and LL[i][j+1].isactive==PASSIVE:Moveable=FALSE
    54         if Moveable==TRUE:
    55             self.py+=1
    56             for i in range(HEIGHT-1,-1,-1):
    57                 for j in range(WIDTH-1,-1,-1):
    58                     if j+1<WIDTH and LL[i][j].isactive==ACTIVE and BL[i][j+1]==0:
    59                         self.Fill(i,j+1);self.Empty(i,j)
    60                         
    61     def Down(self,event):
    62         BL=self.BlockList;LL=self.LabelList
    63         Moveable=TRUE
    64         for i in range(HEIGHT):
    65             for j in range(WIDTH):
    66                 if LL[i][j].isactive==ACTIVE and i+1>=HEIGHT:Moveable=FALSE
    67                 if LL[i][j].isactive==ACTIVE and i+1<HEIGHT and BL[i+1][j]==1 and LL[i+1][j].isactive==PASSIVE:Moveable=FALSE
    68         if Moveable==TRUE and self.isStart :
    69             self.px+=1
    70             for i in range(HEIGHT-1,-1,-1):
    71                 for j in range(WIDTH-1,-1,-1):
    72                     if i+1<HEIGHT and LL[i][j].isactive==ACTIVE and BL[i+1][j]==0:
    73                         self.Fill(i+1,j);self.Empty(i,j);
    74         if Moveable==FALSE:
    75             for i in range(HEIGHT):
    76                 for j in range(WIDTH):
    77                     LL[i][j].isactive=PASSIVE
    78             self.JudgeLineFill()
    79             self.Start()
    80             if self.isgameover==TRUE:showinfo('T_T','The game is over!');self.Distroy();return FALSE
    81             for i in range(4):
    82                 for j in range(4):
    83                     self.NextEmpty(i,j)
    84             self.Rnd()
    85         return Moveable
    86                         
    87     def Space(self,event):
    88         while 1:
    89             if self.Down(0)==FALSE:break

    3. 项目完整代码

      1 #_*_ coding:utf-8 _*_
      2 from tkinter import *
      3 import random
      4 import time
      5 import tkinter.messagebox
      6 
      7 
      8 #俄罗斯方块界面的高度
      9 HEIGHT  = 20
     10 
     11 #俄罗斯方块界面的宽度
     12 WIDTH   = 10
     13 
     14 ACTIVE  = 1
     15 PASSIVE = 0
     16 TRUE    = 1
     17 FALSE   = 0
     18 
     19 style = [
     20             [[(0,0),(0,1),(1,1),(2,1)],[(1,0),(1,1),(1,2),(0,2)],[(0,1),(1,1),(2,1),(2,2)],[(1,0),(2,0),(1,1),(1,2)]],#j
     21             [[(1,0),(1,1),(1,2),(2,1)],[(1,0),(0,1),(1,1),(2,1)],[(1,0),(1,1),(1,2),(0,1)],[(0,1),(1,1),(2,1),(1,2)]],#T
     22             [[(0,1),(1,1),(2,1),(2,0)],[(0,0),(1,0),(1,1),(1,2)],[(0,1),(1,1),(2,1),(0,2)],[(1,0),(1,1),(1,2),(2,2)]],#反L
     23             [[(0,0),(0,1),(1,1),(1,2)],[(2,1),(1,1),(1,2),(0,2)],[(0,0),(0,1),(1,1),(1,2)],[(2,1),(1,1),(1,2),(0,2)]],#Z
     24             [[(1,0),(1,1),(0,1),(0,2)],[(0,1),(1,1),(1,2),(2,2)],[(1,0),(1,1),(0,1),(0,2)],[(0,1),(1,1),(1,2),(2,2)]],#反Z
     25             [[(0,0),(0,1),(1,1),(1,0)],[(0,0),(0,1),(1,1),(1,0)],[(0,0),(0,1),(1,1),(1,0)],[(0,0),(0,1),(1,1),(1,0)]],#
     26             [[(1,0),(1,1),(1,2),(1,3)],[(0,1),(1,1),(2,1),(3,1)],[(1,0),(1,1),(1,2),(1,3)],[(0,1),(1,1),(2,1),(3,1)]]#长条
     27     ]
     28 
     29 root=Tk();
     30 root.title('俄罗斯方块')
     31 
     32 class App(Frame):
     33     def __init__(self,master):
     34         Frame.__init__(self)
     35         master.bind('<Up>',self.Up)
     36         master.bind('<Left>',self.Left)
     37         master.bind('<Right>',self.Right)
     38         master.bind('<Down>',self.Down)
     39         
     40         master.bind('<space>',self.Space)
     41         master.bind('<Control-Shift-Key-F12>',self.Play)
     42         master.bind('<Key-P>',self.Pause)
     43         master.bind('<Key-S>',self.StartByS)
     44         
     45         # rgb颜色值
     46         self.backg="#%02x%02x%02x" % (120,150,30)    #大背景
     47         self.frontg="#%02x%02x%02x" % (40,120,150)    #下一个形状颜色
     48         self.nextg="#%02x%02x%02x" % (150,100,100)    #小背景
     49         self.flashg="#%02x%02x%02x" % (210,130,100)    #炸的颜色
     50         
     51         self.LineDisplay=Label(master,text='Lines: ',bg='black',fg='red')
     52         self.Line=Label(master,text='0',bg='black',fg='red')
     53         self.ScoreDisplay=Label(master,text='Score: ',bg='black',fg='red')
     54         self.Score=Label(master,text='0',bg='black',fg='red')
     55         self.SpendTimeDisplay=Label(master,text='Time: ',bg='black',fg='red')
     56         self.SpendTime=Label(master,text='0.0',bg='black',fg='red')
     57         
     58         self.LineDisplay.grid(row=HEIGHT-2,column=WIDTH,columnspan=2)
     59         self.Line.grid(row=HEIGHT-2,column=WIDTH+2,columnspan=3)
     60         self.ScoreDisplay.grid(row=HEIGHT-1,column=WIDTH,columnspan=2)
     61         self.Score.grid(row=HEIGHT-1,column=WIDTH+2,columnspan=3)
     62         self.SpendTimeDisplay.grid(row=HEIGHT-4,column=WIDTH,columnspan=2)
     63         self.SpendTime.grid(row=HEIGHT-4,column=WIDTH+2,columnspan=3)
     64         
     65         self.TotalTime=0.0
     66         self.TotalLine=0
     67         self.TotalScore=0
     68         
     69         #游戏结束
     70         self.isgameover=FALSE
     71         #暂停
     72         self.isPause=FALSE
     73         #开始
     74         self.isStart=FALSE
     75         self.NextList=[]        #整个小背景
     76         self.NextRowList=[]     #一行小背景
     77         
     78         self.px=0
     79         self.py=0       #记录方块参考点
     80         
     81         #渲染小背景
     82         r=0;c=0
     83         for k in range(4*4):
     84             LN=Label(master,text='    ',bg=str(self.nextg),fg='white',relief=FLAT,bd=3)
     85             LN.grid(row=r,column=WIDTH+c,sticky=N+E+S+W)
     86             self.NextRowList.append(LN)
     87             c=c+1
     88             if c>=4:
     89                 r=r+1;c=0
     90                 self.NextList.append(self.NextRowList)
     91                 self.NextRowList=[]
     92                 
     93         #渲染大背景
     94         self.BlockList=[]
     95         self.BlockRowList=[]
     96         self.LabelList=[]
     97         self.LabelRowList=[]
     98         row=0;col=0
     99         for i in range(HEIGHT*WIDTH):
    100             L=Label(master,text='    ',bg=str(self.backg),fg='white',relief=FLAT,bd=4)
    101             L.grid(row=row,column=col,sticky=N+E+S+W)
    102             L.row=row;L.col=col;L.isactive=PASSIVE
    103             self.BlockRowList.append(0);    #大背景每个格子初始化为0值
    104             self.LabelRowList.append(L)
    105             col=col+1
    106             if col>=WIDTH:
    107                 row=row+1;col=0
    108                 self.BlockList.append(self.BlockRowList)
    109                 self.LabelList.append(self.LabelRowList)
    110                 self.BlockRowList=[]
    111                 self.LabelRowList=[]
    112                 
    113         #file
    114         fw=open('text.txt','a')
    115         fw.close()
    116         hasHead=FALSE
    117         f=open('text.txt','r')
    118         if f.read(5)=='score':
    119             hasHead=TRUE
    120         f.close()
    121         self.file=open('text.txt','a')
    122         if hasHead==FALSE:
    123             self.file.write('score    line    time    scorePtime    linePtime    scorePline    date/n')
    124             self.file.flush()
    125             
    126         self.time=1000
    127         self.OnTimer()
    128         
    129     def __del__(self):
    130         #self.file.close()
    131         pass
    132         
    133     def Pause(self,event):
    134         self.isPause=1-self.isPause
    135         
    136     def Up(self,event):
    137         BL=self.BlockList   #格子的值
    138         LL=self.LabelList   #格子Label
    139         
    140         Moveable=TRUE       #是否可旋转
    141         
    142         #代码编写开始
    143         nowStyle = style[self.xnow][(self.ynow)]
    144         newStyle = style[self.xnow][(self.ynow+1)%4]  #算出下一俄罗斯方块
    145         self.ynow = (self.ynow+1)%4 #此行代码非常重要,否则响应UP时,只能变第一次
    146         
    147         print("nowStyle:"+str(nowStyle)+"=====>>newStyle:"+str(newStyle))
    148         
    149         #根据现有形状中每个label的坐标计算出旋转后目标坐标(x,y)
    150         SourceList=[];DestList=[]
    151         
    152         for i in range(4):
    153             SourceList.append([ nowStyle[i][0]+self.px, nowStyle[i][1]+self.py])
    154             x = newStyle[i][0]+self.px
    155             y = newStyle[i][1]+self.py
    156             DestList.append([x, y])
    157             
    158             if x<0 or x>=HEIGHT or y<0 or y>=WIDTH : #or BL[x][y]==1 or LL[x][y].isactive==PASSIVE
    159                 Moveable=FALSE
    160             
    161         if Moveable==TRUE:
    162             for i in range(len(SourceList)):
    163                 self.Empty(SourceList[i][0],SourceList[i][1])
    164             for i in range(len(DestList)):
    165                 self.Fill(DestList[i][0],DestList[i][1])
    166                 
    167     def Left(self,event):
    168         BL=self.BlockList;LL=self.LabelList
    169         Moveable=TRUE
    170         for i in range(HEIGHT):
    171             for j in range(WIDTH):
    172                 if LL[i][j].isactive==ACTIVE and j-1<0:Moveable=FALSE
    173                 if LL[i][j].isactive==ACTIVE and j-1>=0 and BL[i][j-1]==1 and LL[i][j-1].isactive==PASSIVE:Moveable=FALSE
    174         if Moveable==TRUE:
    175             self.py-=1
    176             for i in range(HEIGHT):
    177                 for j in range(WIDTH):
    178                     if j-1>=0 and LL[i][j].isactive==ACTIVE and BL[i][j-1]==0:
    179                         self.Fill(i,j-1);self.Empty(i,j)
    180                         
    181     def Right(self,event):
    182         BL=self.BlockList;LL=self.LabelList
    183         Moveable=TRUE
    184         for i in range(HEIGHT):
    185             for j in range(WIDTH):
    186                 if LL[i][j].isactive==ACTIVE and j+1>=WIDTH:Moveable=FALSE
    187                 if LL[i][j].isactive==ACTIVE and j+1<WIDTH and BL[i][j+1]==1 and LL[i][j+1].isactive==PASSIVE:Moveable=FALSE
    188         if Moveable==TRUE:
    189             self.py+=1
    190             for i in range(HEIGHT-1,-1,-1):
    191                 for j in range(WIDTH-1,-1,-1):
    192                     if j+1<WIDTH and LL[i][j].isactive==ACTIVE and BL[i][j+1]==0:
    193                         self.Fill(i,j+1);self.Empty(i,j)
    194                         
    195     def Down(self,event):
    196         BL=self.BlockList;LL=self.LabelList
    197         Moveable=TRUE
    198         for i in range(HEIGHT):
    199             for j in range(WIDTH):
    200                 if LL[i][j].isactive==ACTIVE and i+1>=HEIGHT:Moveable=FALSE
    201                 if LL[i][j].isactive==ACTIVE and i+1<HEIGHT and BL[i+1][j]==1 and LL[i+1][j].isactive==PASSIVE:Moveable=FALSE
    202         if Moveable==TRUE and self.isStart :
    203             self.px+=1
    204             for i in range(HEIGHT-1,-1,-1):
    205                 for j in range(WIDTH-1,-1,-1):
    206                     if i+1<HEIGHT and LL[i][j].isactive==ACTIVE and BL[i+1][j]==0:
    207                         self.Fill(i+1,j);self.Empty(i,j);
    208         if Moveable==FALSE:
    209             for i in range(HEIGHT):
    210                 for j in range(WIDTH):
    211                     LL[i][j].isactive=PASSIVE
    212             self.JudgeLineFill()
    213             self.Start()
    214             if self.isgameover==TRUE:showinfo('T_T','The game is over!');self.Distroy();return FALSE
    215             for i in range(4):
    216                 for j in range(4):
    217                     self.NextEmpty(i,j)
    218             self.Rnd()
    219         return Moveable
    220                         
    221     def Space(self,event):
    222         while 1:
    223             if self.Down(0)==FALSE:break
    224             
    225     def OnTimer(self):
    226         if self.isStart==TRUE and self.isPause==FALSE:
    227             self.TotalTime = self.TotalTime + float(self.time)/1000
    228             self.SpendTime.config(text=str(self.TotalTime))
    229         
    230         if self.isPause==FALSE:
    231             self.Down(0)
    232         if self.TotalScore>=1000:self.time=900
    233         if self.TotalScore>=2000:self.time=750
    234         if self.TotalScore>=3000:self.time=600
    235         if self.TotalScore>=4000:self.time=400
    236         self.after(self.time,self.OnTimer)      #随着分数增大,俄罗斯方块下降速度加快
    237     
    238     def JudgeLineFill(self):
    239         BL=self.BlockList;LL=self.LabelList
    240         count=0;LineList=[]
    241         for i in range(WIDTH):LineList.append(1)
    242         #display flash
    243         for i in range(HEIGHT):
    244             if BL[i]==LineList:
    245                 count=count+1
    246                 for k in range(WIDTH):
    247                     LL[i][k].config(bg=str(self.flashg))
    248                     LL[i][k].update()
    249         if count!=0:self.after(100)
    250         #delete block
    251         for i in range(HEIGHT):
    252             if BL[i]==LineList:
    253                 #count=count+1
    254                 for j in range(i,0,-1):
    255                     for k in range(WIDTH):
    256                         BL[j][k]=BL[j-1][k]
    257                         LL[j][k]['relief']=LL[j-1][k].cget('relief')
    258                         LL[j][k]['bg']=LL[j-1][k].cget('bg')
    259                 for l in range(WIDTH):
    260                     BL[0][l]=0
    261                     LL[0][l].config(relief=FLAT,bg=str(self.backg))
    262         self.TotalLine=self.TotalLine+count
    263         if count==1:self.TotalScore=self.TotalScore+1*WIDTH
    264         if count==2:self.TotalScore=self.TotalScore+3*WIDTH
    265         if count==3:self.TotalScore=self.TotalScore+6*WIDTH
    266         if count==4:self.TotalScore=self.TotalScore+10*WIDTH
    267         self.Line.config(text=str(self.TotalLine))
    268         self.Score.config(text=str(self.TotalScore))
    269         
    270     def Fill(self,i,j):
    271         if j<0:return
    272         if self.BlockList[i][j]==1:self.isgameover=TRUE
    273         self.BlockList[i][j]=1
    274         self.LabelList[i][j].isactive=ACTIVE
    275         self.LabelList[i][j].config(relief=RAISED,bg=str(self.frontg))
    276         
    277     def Empty(self,i,j):
    278         self.BlockList[i][j]=0
    279         self.LabelList[i][j].isactive=PASSIVE
    280         self.LabelList[i][j].config(relief=FLAT,bg=str(self.backg))
    281         
    282     def Play(self,event):
    283         showinfo('Made in China','^_^')
    284         
    285     def NextFill(self,i,j):
    286         self.NextList[i][j].config(relief=RAISED,bg=str(self.frontg))
    287         
    288     def NextEmpty(self,i,j):
    289         self.NextList[i][j].config(relief=FLAT,bg=str(self.nextg))
    290         
    291     def Distroy(self):
    292         #save
    293         if self.TotalScore!=0:
    294             #cehkongfu
    295             savestr='%-9u%-8u%-8.2f%-14.2f%-13.2f%-14.2f%s/n' % (
    296                 self.TotalScore,self.TotalLine,self.TotalTime
    297                ,self.TotalScore/self.TotalTime
    298                ,self.TotalLine/self.TotalTime
    299                ,float(self.TotalScore)/self.TotalLine
    300                ,time.strftime('%Y-%m-%d %H:%M:%S',time.localtime()))
    301             self.file.seek(0,2)
    302             self.file.write(savestr)
    303             self.file.flush()
    304         
    305         for i in range(HEIGHT):
    306             for j in range(WIDTH):
    307                 self.Empty(i,j)
    308         self.TotalLine=0;self.TotalScore=0;self.TotalTime=0.0
    309         self.Line.config(text=str(self.TotalLine))
    310         self.Score.config(text=str(self.TotalScore))
    311         self.SpendTime.config(text=str(self.TotalTime))
    312         self.isgameover=FALSE
    313         self.isStart=FALSE
    314         self.time=1000
    315         for i in range(4):
    316             for j in range(4):
    317                 self.NextEmpty(i,j)
    318                 
    319     #游戏开始方块
    320     def Start(self):
    321         nextStyle = style[self.x][self.y]   #下一形状
    322         self.xnow = self.x
    323         self.ynow = self.y          #记录大背景中的方块
    324         self.py = random.randint(0,6)
    325         print("给py赋任意值:"+str(self.py))
    326         self.px = 0
    327         for ii in range(4):
    328             self.Fill(int(nextStyle[ii][0]),int(nextStyle[ii][1])+self.py)
    329         self.isStart=TRUE   #游戏开始
    330         
    331     #预处理方块
    332     def Rnd(self):
    333         self.x=random.randint(0,6)
    334         self.y=random.randint(0,3)
    335         nextStyle = style[self.x][self.y]   #下一形状
    336         for ii in range(4):
    337             self.NextFill(int(nextStyle[ii][0]),int(nextStyle[ii][1]))
    338         
    339     #游戏开始给出一次任意形状的方块
    340     def RndFirst(self):
    341         self.x=random.randint(0,6)  #选择第一个方块style
    342         self.y=random.randint(0,3)
    343         
    344     def Show(self):
    345         self.file.seek(0)
    346         strHeadLine=self.file.readline()
    347         dictLine={}
    348         strTotalLine=''
    349         for OneLine in self.file.readlines():
    350             temp=int(OneLine[:5])
    351             dictLine[temp]=OneLine
    352             
    353         list=sorted(dictLine.items(),key=lambda d:d[0])
    354         ii=0        
    355         for onerecord in reversed(list):
    356             ii=ii+1
    357             if ii<11:
    358                 strTotalLine+=onerecord[1]
    359         showinfo('Ranking', strHeadLine+strTotalLine)
    360         
    361     def StartByS(self,event):
    362         self.RndFirst()
    363         self.Start()
    364         self.Rnd()
    365         
    366 def Start():
    367     app.RndFirst()
    368     app.Start()
    369     app.Rnd()
    370      
    371 def End():
    372     app.Distroy()
    373     
    374 def Set():
    375     print("设置功能待完善...")
    376     
    377 def Show():
    378     app.Show()
    379 
    380 #主菜单
    381 mainmenu=Menu(root)
    382 root['menu']=mainmenu
    383 
    384 #二级菜单:game
    385 gamemenu=Menu(mainmenu)
    386 mainmenu.add_cascade(label='游戏',menu=gamemenu)
    387 gamemenu.add_command(label='开始',command=Start)
    388 gamemenu.add_command(label='结束',command=End)
    389 gamemenu.add_separator()
    390 gamemenu.add_command(label='退出',command=root.quit)
    391 
    392 #二级菜单:set
    393 setmenu=Menu(mainmenu)
    394 mainmenu.add_cascade(label='设置',menu=setmenu)
    395 setmenu.add_command(label='设置',command=Set)
    396 
    397 #二级菜单:show
    398 showmenu=Menu(mainmenu)
    399 mainmenu.add_cascade(label='展示',menu=showmenu)
    400 showmenu.add_command(label='展示',command=Show)
    401 
    402 #绑定功能
    403 
    404 app=App(root)
    405 #程序入口
    406 root.mainloop()

    二、经典的贪吃蛇游戏

    1. 项目源码

      1 import random
      2 import pygame
      3 import sys
      4 from pygame.locals import *
      5 
      6 Snakespeed = 9
      7 Window_Width = 800
      8 Window_Height = 500
      9 Cell_Size = 20  # Width and height of the cells
     10 # Ensuring that the cells fit perfectly in the window. eg if cell size was
     11 # 10     and window width or window height were 15 only 1.5 cells would
     12 # fit.
     13 assert Window_Width % Cell_Size == 0, "Window width must be a multiple of cell size."
     14 # Ensuring that only whole integer number of cells fit perfectly in the window.
     15 assert Window_Height % Cell_Size == 0, "Window height must be a multiple of cell size."
     16 Cell_W = int(Window_Width / Cell_Size)  # Cell Width
     17 Cell_H = int(Window_Height / Cell_Size)  # Cell Height
     18 
     19 White = (255, 255, 255)
     20 Black = (0, 0, 0)
     21 Red = (255, 0, 0)  # Defining element colors for the program.
     22 Green = (0, 255, 0)
     23 DARKGreen = (0, 155, 0)
     24 DARKGRAY = (40, 40, 40)
     25 YELLOW = (255, 255, 0)
     26 Red_DARK = (150, 0, 0)
     27 BLUE = (0, 0, 255)
     28 BLUE_DARK = (0, 0, 150)
     29 
     30 BGCOLOR = Black  # Background color
     31 
     32 UP = 'up'
     33 DOWN = 'down'  # Defining keyboard keys.
     34 LEFT = 'left'
     35 RIGHT = 'right'
     36 
     37 HEAD = 0  # Syntactic sugar: index of the snake's head
     38 
     39 
     40 def main():
     41     global SnakespeedCLOCK, DISPLAYSURF, BASICFONT
     42 
     43     pygame.init()
     44     SnakespeedCLOCK = pygame.time.Clock()
     45     DISPLAYSURF = pygame.display.set_mode((Window_Width, Window_Height))
     46     BASICFONT = pygame.font.Font('freesansbold.ttf', 18)
     47     pygame.display.set_caption('Snake')
     48 
     49     showStartScreen()
     50     while True:
     51         runGame()
     52         showGameOverScreen()
     53 
     54 
     55 def runGame():
     56     # Set a random start point.
     57     startx = random.randint(5, Cell_W - 6)
     58     starty = random.randint(5, Cell_H - 6)
     59     wormCoords = [{'x': startx, 'y': starty},
     60                   {'x': startx - 1, 'y': starty},
     61                   {'x': startx - 2, 'y': starty}]
     62     direction = RIGHT
     63 
     64     # Start the apple in a random place.
     65     apple = getRandomLocation()
     66 
     67     while True:  # main game loop
     68         for event in pygame.event.get():  # event handling loop
     69             if event.type == QUIT:
     70                 terminate()
     71             elif event.type == KEYDOWN:
     72                 if (event.key == K_LEFT) and direction != RIGHT:
     73                     direction = LEFT
     74                 elif (event.key == K_RIGHT) and direction != LEFT:
     75                     direction = RIGHT
     76                 elif (event.key == K_UP) and direction != DOWN:
     77                     direction = UP
     78                 elif (event.key == K_DOWN) and direction != UP:
     79                     direction = DOWN
     80                 elif event.key == K_ESCAPE:
     81                     terminate()
     82 
     83         # check if the Snake has hit itself or the edge
     84         if wormCoords[HEAD]['x'] == -1 or wormCoords[HEAD]['x'] == Cell_W or wormCoords[HEAD]['y'] == -1 or 
     85                 wormCoords[HEAD]['y'] == Cell_H:
     86             return  # game over
     87         for wormBody in wormCoords[1:]:
     88             if wormBody['x'] == wormCoords[HEAD]['x'] and wormBody['y'] == wormCoords[HEAD]['y']:
     89                 return  # game over
     90 
     91         # check if Snake has eaten an apply
     92         if wormCoords[HEAD]['x'] == apple['x'] and wormCoords[HEAD]['y'] == apple['y']:
     93             # don't remove worm's tail segment
     94             apple = getRandomLocation()  # set a new apple somewhere
     95         else:
     96             del wormCoords[-1]  # remove worm's tail segment
     97 
     98         # move the worm by adding a segment in the direction it is moving
     99         if direction == UP:
    100             newHead = {'x': wormCoords[HEAD]['x'],
    101                        'y': wormCoords[HEAD]['y'] - 1}
    102         elif direction == DOWN:
    103             newHead = {'x': wormCoords[HEAD]['x'],
    104                        'y': wormCoords[HEAD]['y'] + 1}
    105         elif direction == LEFT:
    106             newHead = {'x': wormCoords[HEAD][
    107                                 'x'] - 1, 'y': wormCoords[HEAD]['y']}
    108         elif direction == RIGHT:
    109             newHead = {'x': wormCoords[HEAD][
    110                                 'x'] + 1, 'y': wormCoords[HEAD]['y']}
    111         wormCoords.insert(0, newHead)
    112         DISPLAYSURF.fill(BGCOLOR)
    113         drawGrid()
    114         drawWorm(wormCoords)
    115         drawApple(apple)
    116         drawScore(len(wormCoords) - 3)
    117         pygame.display.update()
    118         SnakespeedCLOCK.tick(Snakespeed)
    119 
    120 
    121 def drawPressKeyMsg():
    122     pressKeySurf = BASICFONT.render('Press a key to play.', True, White)
    123     pressKeyRect = pressKeySurf.get_rect()
    124     pressKeyRect.topleft = (Window_Width - 200, Window_Height - 30)
    125     DISPLAYSURF.blit(pressKeySurf, pressKeyRect)
    126 
    127 
    128 def checkForKeyPress():
    129     if len(pygame.event.get(QUIT)) > 0:
    130         terminate()
    131     keyUpEvents = pygame.event.get(KEYUP)
    132     if len(keyUpEvents) == 0:
    133         return None
    134     if keyUpEvents[0].key == K_ESCAPE:
    135         terminate()
    136     return keyUpEvents[0].key
    137 
    138 
    139 def showStartScreen():
    140     titleFont = pygame.font.Font('freesansbold.ttf', 100)
    141     titleSurf1 = titleFont.render('Snake!', True, White, DARKGreen)
    142     degrees1 = 0
    143     degrees2 = 0
    144     while True:
    145         DISPLAYSURF.fill(BGCOLOR)
    146         rotatedSurf1 = pygame.transform.rotate(titleSurf1, degrees1)
    147         rotatedRect1 = rotatedSurf1.get_rect()
    148         rotatedRect1.center = (Window_Width / 2, Window_Height / 2)
    149         DISPLAYSURF.blit(rotatedSurf1, rotatedRect1)
    150 
    151         drawPressKeyMsg()
    152 
    153         if checkForKeyPress():
    154             pygame.event.get()  # clear event queue
    155             return
    156         pygame.display.update()
    157         SnakespeedCLOCK.tick(Snakespeed)
    158         degrees1 += 3  # rotate by 3 degrees each frame
    159         degrees2 += 7  # rotate by 7 degrees each frame
    160 
    161 
    162 def terminate():
    163     pygame.quit()
    164     sys.exit()
    165 
    166 
    167 def getRandomLocation():
    168     return {'x': random.randint(0, Cell_W - 1), 'y': random.randint(0, Cell_H - 1)}
    169 
    170 
    171 def showGameOverScreen():
    172     gameOverFont = pygame.font.Font('freesansbold.ttf', 100)
    173     gameSurf = gameOverFont.render('Game', True, White)
    174     overSurf = gameOverFont.render('Over', True, White)
    175     gameRect = gameSurf.get_rect()
    176     overRect = overSurf.get_rect()
    177     gameRect.midtop = (Window_Width / 2, 10)
    178     overRect.midtop = (Window_Width / 2, gameRect.height + 10 + 25)
    179 
    180     DISPLAYSURF.blit(gameSurf, gameRect)
    181     DISPLAYSURF.blit(overSurf, overRect)
    182     drawPressKeyMsg()
    183     pygame.display.update()
    184     pygame.time.wait(500)
    185     checkForKeyPress()  # clear out any key presses in the event queue
    186 
    187     while True:
    188         if checkForKeyPress():
    189             pygame.event.get()  # clear event queue
    190             return
    191 
    192 
    193 def drawScore(score):
    194     scoreSurf = BASICFONT.render('Score: %s' % (score), True, White)
    195     scoreRect = scoreSurf.get_rect()
    196     scoreRect.topleft = (Window_Width - 120, 10)
    197     DISPLAYSURF.blit(scoreSurf, scoreRect)
    198 
    199 
    200 def drawWorm(wormCoords):
    201     for coord in wormCoords:
    202         x = coord['x'] * Cell_Size
    203         y = coord['y'] * Cell_Size
    204         wormSegmentRect = pygame.Rect(x, y, Cell_Size, Cell_Size)
    205         pygame.draw.rect(DISPLAYSURF, DARKGreen, wormSegmentRect)
    206         wormInnerSegmentRect = pygame.Rect(
    207             x + 4, y + 4, Cell_Size - 8, Cell_Size - 8)
    208         pygame.draw.rect(DISPLAYSURF, Green, wormInnerSegmentRect)
    209 
    210 
    211 def drawApple(coord):
    212     x = coord['x'] * Cell_Size
    213 
    214 
    215     y = coord['y'] * Cell_Size
    216     appleRect = pygame.Rect(x, y, Cell_Size, Cell_Size)
    217     pygame.draw.rect(DISPLAYSURF, Red, appleRect)
    218 
    219 
    220 def drawGrid():
    221     for x in range(0, Window_Width, Cell_Size):  # draw vertical lines
    222         pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, Window_Height))
    223     for y in range(0, Window_Height, Cell_Size):  # draw horizontal lines
    224         pygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (Window_Width, y))
    225 
    226 
    227 if __name__ == '__main__':
    228     try:
    229         main()
    230     except SystemExit:
    231         pass

    预览效果:

    三、关不掉的窗口

    1.项目源码

     1 from tkinter import * 
     2 class YouLikeMe:
     3     def __init__(self):
     4         window=Tk()
     5         label=Label(window,text='你是不是喜欢我?')
     6         self.btyes=Button(window,text='不是',height=1,width=6)
     7         self.btno=Button(window,text='是的',height=1,width=6)
     8         label.place(x=60,y=70)
     9         self.btyes.place(x=40,y=130)
    10         self.btno.place(x=120,y=130)
    11         self.btyes.bind('<Enter>',self.event1)#将按钮与鼠标事件绑定,<Enter>是指鼠标光标进入按钮区域
    12         self.btno.bind('<Enter>',self.event2)
    13         window.mainloop()
    14     def event1(self,event):#切换按钮文字
    15         self.btyes['text']='是的'
    16         self.btno['text']='不是'
    17     def event2(self,event):
    18         self.btyes['text']='不是'
    19         self.btno['text']='是的'
    20         
    21 YouLikeMe()
    22 window=Tk()
    23 label=Label(window,text='关闭窗口也改变不了你喜欢我的事实')
    24 label.place(x=2,y=80)
    25 button=Button(window,text='确定',command=window.destroy)
    26 button.place(x=80,y=150)
    27 window.mainloop()

    预览效果:


    在这里插入图片描述
    在这里插入图片描述

    四、画玫瑰花

      1 import turtle
      2 import time
      3 turtle.speed(5) #画笔移动的速度
      4 
      5   
      6 
      7 # 设置初始位置  
      8 
      9 turtle.penup()  #提起画笔,移动画笔但并不会绘制图形
     10 turtle.left(90)  #逆时针转动画笔90度
     11 turtle.fd(200)  
     12 turtle.pendown()  #放下画笔,移动画笔即开始绘制
     13 turtle.right(90)  
     14 #设置画笔的大小
     15 turtle.pensize(2)
     16 
     17 # 花蕊  
     18 
     19 turtle.fillcolor("red")  #填充颜色
     20 turtle.begin_fill()  #开始填充
     21 turtle.circle(10,180)  
     22 turtle.circle(25,110)  
     23 turtle.left(50)  
     24 turtle.circle(60,45)  
     25 turtle.circle(20,170)  
     26 turtle.right(24)  
     27 turtle.fd(30)  
     28 turtle.left(10)  
     29 turtle.circle(30,110)  
     30 turtle.fd(20)  
     31 turtle.left(40)  
     32 turtle.circle(90,70)  
     33 turtle.circle(30,150)  
     34 turtle.right(30)  
     35 turtle.fd(15)  
     36 turtle.circle(80,90)  
     37 turtle.left(15)  
     38 turtle.fd(45)  
     39 turtle.right(165)  
     40 turtle.fd(20)  
     41 turtle.left(155)  
     42 turtle.circle(150,80)  
     43 turtle.left(50)  
     44 turtle.circle(150,90)  
     45 turtle.end_fill()  #结束填充
     46    
     47 # 花瓣1  
     48 
     49 turtle.left(150)  
     50 turtle.circle(-90,70)  
     51 turtle.left(20)  
     52 turtle.circle(75,105)  
     53 turtle.setheading(60)  
     54 turtle.circle(80,98)  
     55 turtle.circle(-90,40)  
     56 
     57   
     58 
     59 # 花瓣2  
     60 turtle.left(180)  
     61 turtle.circle(90,40)  
     62 turtle.circle(-80,98)  
     63 turtle.setheading(-83)  
     64   
     65 # 叶子1  
     66 turtle.fd(30)  
     67 turtle.left(90)  
     68 turtle.fd(25)  
     69 turtle.left(45)  
     70 turtle.fillcolor("green")  
     71 turtle.begin_fill()  
     72 turtle.circle(-80,90)  
     73 turtle.right(90)  
     74 turtle.circle(-80,90)  
     75 turtle.end_fill()  
     76 
     77    
     78 
     79 turtle.right(135)  
     80 turtle.fd(60)  
     81 turtle.left(180)  
     82 turtle.fd(85)  
     83 turtle.left(90)  
     84 turtle.fd(80)  
     85 
     86    
     87 # 叶子2  
     88 turtle.right(90)  
     89 turtle.right(45)  
     90 turtle.fillcolor("green")  
     91 turtle.begin_fill()  
     92 turtle.circle(80,90)  
     93 turtle.left(90)  
     94 turtle.circle(80,90)  
     95 turtle.end_fill()  
     96    
     97 
     98 turtle.left(135)  
     99 turtle.fd(60)  
    100 turtle.left(180)  
    101 turtle.fd(60)  
    102 turtle.right(90)  
    103 turtle.circle(200,50)  #画一个圆 200 是半径,50 是弧度
    104 
    105 #不让自动退出,放在程序的最后一行
    106 #不然画画结束后会自动退出
    107 turtle.done()

    预览效果:
    在这里插入图片描述

    五、优美的彩虹线条

     1 import turtle
     2 q = turtle.Pen()
     3 turtle.bgcolor("black")
     4 sides = 7
     5 colors =["red","orange","yellow","green","cyan","blue","blue","purple"]
     6 for x in range(360):
     7     q.pencolor(colors[x%sides])
     8     q.forward(x*3/sides+x)
     9     q.left(360/sides+1)
    10     q.width(x*sides/200)

    预览效果

    在这里插入图片描述

    六、实时钟表

     1 # -*- coding:utf-8 –*-
     2 # 用turtlr画时钟
     3 # 以自定义shape的方式实现
     4 import turtle as t
     5 import datetime as d
     6 def skip(step):  # 抬笔,跳到一个地方
     7     t.penup()
     8     t.forward(step)
     9     t.pendown()
    10 def drawClock(radius):  # 画表盘
    11     t.speed(0)
    12     t.mode("logo")  # 以Logo坐标、角度方式
    13     t.hideturtle()
    14     t.pensize(7)
    15     t.home()  # 回到圆点
    16     for j in range(60):
    17         skip(radius)
    18         if (j % 5 == 0):
    19             t.forward(20)
    20             skip(-radius - 20)
    21         else:
    22             t.dot(5)
    23             skip(-radius)
    24         t.right(6)
    25 def makePoint(pointName, len):  # 钟的指针,时针、分针、秒针
    26     t.penup()
    27     t.home()
    28     t.begin_poly()
    29     t.back(0.1 * len)
    30     t.forward(len * 1.1)
    31     t.end_poly()
    32     poly = t.get_poly()
    33     t.register_shape(pointName, poly)  # 注册为一个shape
    34 def drawPoint():  # 画指针
    35     global hourPoint, minPoint, secPoint, fontWriter
    36     makePoint("hourPoint", 100)
    37     makePoint("minPoint", 120)
    38     makePoint("secPoint", 140)
    39     hourPoint = t.Pen()  # 每个指针是一只新turtle
    40     hourPoint.shape("hourPoint")
    41     hourPoint.shapesize(1, 1, 6)
    42     minPoint = t.Pen()
    43     minPoint.shape("minPoint")
    44     minPoint.shapesize(1, 1, 4)
    45     secPoint = t.Pen()
    46     secPoint.shape("secPoint")
    47     secPoint.pencolor('red')
    48     fontWriter = t.Pen()
    49     fontWriter.pencolor('gray')
    50     fontWriter.hideturtle()
    51 def getWeekName(weekday):
    52     weekName = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
    53     return weekName[weekday]
    54 def getDate(year, month, day):
    55     return "%s-%s-%s" % (year, month, day)
    56 def realTime():
    57     curr = d.datetime.now()
    58     curr_year = curr.year
    59     curr_month = curr.month
    60     curr_day = curr.day
    61     curr_hour = curr.hour
    62     curr_minute = curr.minute
    63     curr_second = curr.second
    64     curr_weekday = curr.weekday()
    65     t.tracer(False)
    66     secPoint.setheading(360 / 60 * curr_second)
    67     minPoint.setheading(360 / 60 * curr_minute)
    68     hourPoint.setheading(360 / 12 * curr_hour + 30 / 60 * curr_minute)
    69     fontWriter.clear()
    70     fontWriter.home()
    71     fontWriter.penup()
    72     fontWriter.forward(80)
    73     # 用turtle写文字
    74     fontWriter.write(getWeekName(curr_weekday), align="center", font=("Courier", 14, "bold"))
    75     fontWriter.forward(-160)
    76     fontWriter.write(getDate(curr_year, curr_month, curr_day), align="center", font=("Courier", 14, "bold"))
    77     t.tracer(True)
    78     print(curr_second)
    79     t.ontimer(realTime, 100)  # 每隔100毫秒调用一次realTime()
    80 def main():
    81     t.tracer(False)
    82     drawClock(160)
    83     drawPoint()
    84     realTime()
    85     t.tracer(True)
    86     t.mainloop()
    87 if __name__ == '__main__':
    88     main()

    预览效果:
    在这里插入图片描述

    七、画佩奇

      1 # coding: utf-8
      2 
      3 import turtle as t
      4 
      5 t.screensize(400, 300)
      6 t.pensize(4)  # 设置画笔的大小
      7 t.colormode(255)  # 设置GBK颜色范围为0-255
      8 t.color((255, 155, 192), "pink")  # 设置画笔颜色和填充颜色(pink)
      9 t.setup(840, 500)  # 设置主窗口的大小为840*500
     10 t.speed(10)  # 设置画笔速度为10
     11 # 鼻子
     12 t.pu()  # 提笔
     13 t.goto(-100, 100)  # 画笔前往坐标(-100,100)
     14 t.pd()  # 下笔
     15 t.seth(-30)  # 笔的角度为-30°
     16 t.begin_fill()  # 外形填充的开始标志
     17 a = 0.4
     18 for i in range(120):
     19     if 0 <= i < 30 or 60 <= i < 90:
     20         a = a + 0.08
     21         t.lt(3)  # 向左转3度
     22         t.fd(a)  # 向前走a的步长
     23     else:
     24         a = a - 0.08
     25         t.lt(3)
     26         t.fd(a)
     27 t.end_fill()  # 依据轮廓填充
     28 t.pu()  # 提笔
     29 t.seth(90)  # 笔的角度为90度
     30 t.fd(25)  # 向前移动25
     31 t.seth(0)  # 转换画笔的角度为0
     32 t.fd(10)
     33 t.pd()
     34 t.pencolor(255, 155, 192)  # 设置画笔颜色
     35 t.seth(10)
     36 t.begin_fill()
     37 t.circle(5)  # 画一个半径为5的圆
     38 t.color(160, 82, 45)  # 设置画笔和填充颜色
     39 t.end_fill()
     40 t.pu()
     41 t.seth(0)
     42 t.fd(20)
     43 t.pd()
     44 t.pencolor(255, 155, 192)
     45 t.seth(10)
     46 t.begin_fill()
     47 t.circle(5)
     48 t.color(160, 82, 45)
     49 t.end_fill()
     50 #
     51 t.color((255, 155, 192), "pink")
     52 t.pu()
     53 t.seth(90)
     54 t.fd(41)
     55 t.seth(0)
     56 t.fd(0)
     57 t.pd()
     58 t.begin_fill()
     59 t.seth(180)
     60 t.circle(300, -30)  # 顺时针画一个半径为300,圆心角为30°的园
     61 t.circle(100, -60)
     62 t.circle(80, -100)
     63 t.circle(150, -20)
     64 t.circle(60, -95)
     65 t.seth(161)
     66 t.circle(-300, 15)
     67 t.pu()
     68 t.goto(-100, 100)
     69 t.pd()
     70 t.seth(-30)
     71 a = 0.4
     72 for i in range(60):
     73     if 0 <= i < 30 or 60 <= i < 90:
     74         a = a + 0.08
     75         t.lt(3)  # 向左转3度
     76         t.fd(a)  # 向前走a的步长
     77     else:
     78         a = a - 0.08
     79         t.lt(3)
     80         t.fd(a)
     81 t.end_fill()
     82 # 耳朵
     83 t.color((255, 155, 192), "pink")
     84 t.pu()
     85 t.seth(90)
     86 t.fd(-7)
     87 t.seth(0)
     88 t.fd(70)
     89 t.pd()
     90 t.begin_fill()
     91 t.seth(100)
     92 t.circle(-50, 50)
     93 t.circle(-10, 120)
     94 t.circle(-50, 54)
     95 t.end_fill()
     96 t.pu()
     97 t.seth(90)
     98 t.fd(-12)
     99 t.seth(0)
    100 t.fd(30)
    101 t.pd()
    102 t.begin_fill()
    103 t.seth(100)
    104 t.circle(-50, 50)
    105 t.circle(-10, 120)
    106 t.circle(-50, 56)
    107 t.end_fill()
    108 # 眼睛
    109 t.color((255, 155, 192), "white")
    110 t.pu()
    111 t.seth(90)
    112 t.fd(-20)
    113 t.seth(0)
    114 t.fd(-95)
    115 t.pd()
    116 t.begin_fill()
    117 t.circle(15)
    118 t.end_fill()
    119 t.color("black")
    120 t.pu()
    121 t.seth(90)
    122 t.fd(12)
    123 t.seth(0)
    124 t.fd(-3)
    125 t.pd()
    126 t.begin_fill()
    127 t.circle(3)
    128 t.end_fill()
    129 t.color((255, 155, 192), "white")
    130 t.pu()
    131 t.seth(90)
    132 t.fd(-25)
    133 t.seth(0)
    134 t.fd(40)
    135 t.pd()
    136 t.begin_fill()
    137 t.circle(15)
    138 t.end_fill()
    139 t.color("black")
    140 t.pu()
    141 t.seth(90)
    142 t.fd(12)
    143 t.seth(0)
    144 t.fd(-3)
    145 t.pd()
    146 t.begin_fill()
    147 t.circle(3)
    148 t.end_fill()
    149 #
    150 t.color((255, 155, 192))
    151 t.pu()
    152 t.seth(90)
    153 t.fd(-95)
    154 t.seth(0)
    155 t.fd(65)
    156 t.pd()
    157 t.begin_fill()
    158 t.circle(30)
    159 t.end_fill()
    160 #
    161 t.color(239, 69, 19)
    162 t.pu()
    163 t.seth(90)
    164 t.fd(15)
    165 t.seth(0)
    166 t.fd(-100)
    167 t.pd()
    168 t.seth(-80)
    169 t.circle(30, 40)
    170 t.circle(40, 80)
    171 # 身体
    172 t.color("red", (255, 99, 71))
    173 t.pu()
    174 t.seth(90)
    175 t.fd(-20)
    176 t.seth(0)
    177 t.fd(-78)
    178 t.pd()
    179 t.begin_fill()
    180 t.seth(-130)
    181 t.circle(100, 10)
    182 t.circle(300, 30)
    183 t.seth(0)
    184 t.fd(230)
    185 t.seth(90)
    186 t.circle(300, 30)
    187 t.circle(100, 3)
    188 t.color((255, 155, 192), (255, 100, 100))
    189 t.seth(-135)
    190 t.circle(-80, 63)
    191 t.circle(-150, 24)
    192 t.end_fill()
    193 #
    194 t.color((255, 155, 192))
    195 t.pu()
    196 t.seth(90)
    197 t.fd(-40)
    198 t.seth(0)
    199 t.fd(-27)
    200 t.pd()
    201 t.seth(-160)
    202 t.circle(300, 15)
    203 t.pu()
    204 t.seth(90)
    205 t.fd(15)
    206 t.seth(0)
    207 t.fd(0)
    208 t.pd()
    209 t.seth(-10)
    210 t.circle(-20, 90)
    211 t.pu()
    212 t.seth(90)
    213 t.fd(30)
    214 t.seth(0)
    215 t.fd(237)
    216 t.pd()
    217 t.seth(-20)
    218 t.circle(-300, 15)
    219 t.pu()
    220 t.seth(90)
    221 t.fd(20)
    222 t.seth(0)
    223 t.fd(0)
    224 t.pd()
    225 t.seth(-170)
    226 t.circle(20, 90)
    227 #
    228 t.pensize(10)
    229 t.color((240, 128, 128))
    230 t.pu()
    231 t.seth(90)
    232 t.fd(-75)
    233 t.seth(0)
    234 t.fd(-180)
    235 t.pd()
    236 t.seth(-90)
    237 t.fd(40)
    238 t.seth(-180)
    239 t.color("black")
    240 t.pensize(15)
    241 t.fd(20)
    242 t.pensize(10)
    243 t.color((240, 128, 128))
    244 t.pu()
    245 t.seth(90)
    246 t.fd(40)
    247 t.seth(0)
    248 t.fd(90)
    249 t.pd()
    250 t.seth(-90)
    251 t.fd(40)
    252 t.seth(-180)
    253 t.color("black")
    254 t.pensize(15)
    255 t.fd(20)
    256 # 尾巴
    257 t.pensize(4)
    258 t.color((255, 155, 192))
    259 t.pu()
    260 t.seth(90)
    261 t.fd(70)
    262 t.seth(0)
    263 t.fd(95)
    264 t.pd()
    265 t.seth(0)
    266 t.circle(70, 20)
    267 t.circle(10, 330)
    268 t.circle(70, 30)
    269 t.done()

    预览效果:
    在这里插入图片描述

    八、表白程序

     1 from tkinter import *   #_all_ = [a,b]
     2 from tkinter import  messagebox
     3 from PIL import ImageTk
     4 def closeWindow():
     5     messagebox.showinfo(title="警告",message = "不许关闭,好好回答")
     6     return
     7  
     8 #点击喜欢触发的方法
     9 def Love():
    10     #Toplevel独立的顶级窗口,和父级标题一样
    11     love = Toplevel(window)
    12     love.geometry("360x200+540+360")
    13     love.title("好巧,我也是")
    14     label = Label(love,text="巧了,我也喜欢你",font =("微软雅黑",20))
    15     label.pack()
    16     label1 = Label(love,text="认识一下,加个微信呗",font =("微软雅黑",20))
    17     label1.pack()
    18     entry = Entry(love,font = ("微软雅黑",15))
    19     entry.pack()
    20     btn = Button(love,text = "确定",width = 10 , height = 1,command = close_all)
    21     btn.pack()
    22     love.protocol("WM_DELETE_WINDOW",closelove)
    23  
    24 def closelove():
    25     return
    26  
    27 #关闭所有的窗口   注意,如果父级窗口关了,下面的所有窗口均会关闭
    28 def close_all():
    29     #destory 销毁
    30     window.destroy()
    31 #关闭不喜欢框的X时
    32 def closenolove():
    33     messagebox.showinfo("再考虑一下","再考虑一下呗")
    34     return
    35     disLove()
    36  
    37 #点击不喜欢触发的事件
    38 def disLove():
    39     no_love = Toplevel(window)
    40     no_love.geometry("300x90+540+360")
    41     no_love.title("再考虑考虑")
    42     label =  Label(no_love,text = "再考虑考虑呗!",font = ("微软雅黑",25))
    43     label.pack()
    44     btn = Button(no_love,text = "好的",width = 10 , height = 1,command = no_love.destroy)
    45     btn.pack()
    46     no_love.protocol("WM_DELETE_WINDOW",closenolove)
    47  
    48  
    49  
    50 # 创建窗口
    51 window =Tk() #类的实例化,创建窗口,window仅仅是个变量
    52  
    53 # 窗口标题
    54 window.title("你喜欢我吗?")
    55  
    56 # 窗口的大小   运用小写的x来连接
    57 window.geometry("380x400")
    58  
    59 #窗口位置(距离屏幕左上角)      运用+来连接
    60 window.geometry("+500+240")  # geometry意为几何
    61 #上述可以写成window.geometry("380x200+500+245"),其中+是用来连接的
    62  
    63 #用户关闭窗口触发的事件
    64 window.protocol("WM_DELETE_WINDOW",closeWindow)
    65  
    66 # 标签控件,一般第一个参数均是父级窗口         ,这里传参为window           fg设置颜色
    67 label = Label(window, text = "Hey,小姐姐", font = ("微软雅黑",15), fg="black")
    68  
    69 # 定位  grid(网格式) pack(包的方式) place(用的最少的一种,根据位置)
    70 label.grid(row=0,column =0)      #默认值为 0  0
    71  
    72 label_1 = Label(window,text = "喜欢我吗?",font = ("微软雅黑",25))
    73 label_1.grid(row=1,column = 1,sticky = E) #sticky为对齐方式  N上S下W左E右
    74  
    75 #  显示图片
    76 photo = ImageTk.PhotoImage(file='Rose.jpg')
    77 imageLable = Label(window,image = photo)
    78 #column 组件所跨越的列数
    79 imageLable.grid(row=2,columnspan =2)  #跨列操作
    80  
    81 
    82 # ques_image = ImageTk.PhotoImage(file='./Image/cache/{}'.format(image_name.group()))
    83 
    84 
    85 
    86  #按钮控件           点击触发command事件
    87 btn = Button(window,text="喜欢",width = 15,height=1,command  = Love)
    88 btn.grid(row = 3,column = 0,sticky = W)
    89  
    90 btn1 =Button(window,text="不喜欢",command = disLove)
    91 btn1 .grid(row = 3,column = 1,sticky = E)
    92 #显示窗口 消息循环
    93 window .mainloop()

    预览效果:

    在这里插入图片描述

    上图的素材贴在这里啦

    在这里插入图片描述

    九、黑客代码雨

     1 #  -*- coding:utf-8 -*-
     2 
     3 #导入系统文件库
     4 import pygame
     5 import random
     6 from pygame.locals import *
     7 from random import randint
     8 
     9 
    10 #定义一些窗体参数及加载字体文件
    11 SCREEN_WIDTH  = 900         # 窗体宽度
    12 SCREEN_HEIGHT = 600         # 窗体宽度
    13 LOW_SPEED  = 4              # 字体移动最低速度
    14 HIGH_SPEED = 10             # 字体移动最快速度
    15 FONT_COLOR = (00,150,00)    # 字体颜色
    16 FONT_SIZE = 5               # 字体尺寸
    17 FONT_NOM  = 20              # 显示字体数量  从0开始
    18 FONT_NAME = "calibrii.ttf"  # 注意字体的文件名必须与真实文件完全相同(注意ttf的大小写),且文件名不能是中文
    19 FREQUENCE = 10              # 时间频度
    20 times = 0                   # 初始化时间
    21 
    22 
    23 # 定义随机参数
    24 def randomspeed() :
    25     return randint(LOW_SPEED,HIGH_SPEED)
    26 def randomposition() :
    27     return randint(0,SCREEN_WIDTH),randint(0,SCREEN_HEIGHT)
    28 def randomoname() :
    29     return randint(0,100000)
    30 def randomvalue() :
    31     return randint(0,100)              # this is your own display number range
    32 
    33 
    34 #class of sprite
    35 class Word(pygame.sprite.Sprite) :
    36     def __init__(self,bornposition) :
    37         pygame.sprite.Sprite.__init__(self)
    38         self.value = randomvalue()
    39         self.font = pygame.font.Font(None,FONT_SIZE)
    40         self.image = self.font.render(str(self.value),True,FONT_COLOR)
    41         self.speed = randomspeed()
    42         self.rect = self.image.get_rect()
    43         self.rect.topleft = bornposition
    44 
    45     def update(self) :
    46         self.rect = self.rect.move(0,self.speed)
    47         if self.rect.top > SCREEN_HEIGHT :
    48             self.kill()
    49 
    50 
    51 #init the available modules
    52 pygame.init()
    53 screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
    54 pygame.display.set_caption("ViatorSun CodeRain")
    55 clock = pygame.time.Clock()
    56 group = pygame.sprite.Group()
    57 group_count = int(SCREEN_WIDTH / FONT_NOM)
    58 
    59 
    60 #mainloop
    61 while True :
    62     time = clock.tick(FREQUENCE)
    63     for event in pygame.event.get() :
    64         if event.type == QUIT :
    65             pygame.quit()
    66             exit()
    67 
    68     screen.fill((0,0,0))
    69     for i in range(0,group_count) :
    70         group.add(Word((i * FONT_NOM,-FONT_NOM)))
    71 
    72     group.update()
    73     group.draw(screen)
    74     pygame.display.update()
    75     

    预览效果:

    在这里插入图片描述

    十、飞机大战游戏

    在这里只展示部分代码,需要的可以下载

      1 # 英雄子弹类
      2 class HeroBullet(Bullet):
      3     def __init__(self, screen, x, y):
      4         super().__init__(screen, x, y)
      5 
      6     def move(self):
      7         self.y -= settings.bullet_hero_v
      8         # 判断子弹是否出界
      9         if self.y <= -20:
     10             return True
     11 
     12 
     13 # 敌机子弹类
     14 class EnemyBullet(Bullet):
     15     def __init__(self, screen, x, y):
     16         super().__init__(screen, x, y)
     17 
     18     def move(self):
     19         self.y += settings.bullet_enemy_v
     20         # 判断子弹是否出界
     21         if self.y >= settings.screen_height:
     22             return True
     23 
     24 
     25 # 飞机基类
     26 class Plane:
     27     def __init__(self, screen, style, geo):
     28         self.screen = screen
     29         self.image = pygame.image.load(style)
     30         self.bullet_list = []
     31         self.x = geo[0]
     32         self.y = geo[1]
     33         self.is_dead = False
     34         self.finished = False
     35         self.bomb_seq = ['4','4','3','3','2','2','1','1']
     36 
     37     def __del__(self):
     38         pass
     39 
     40     def display(self):
     41         for b in self.bullet_list:
     42             b.display()
     43             # 回收子弹
     44             if b.move(): self.bullet_list.remove(b)
     45 
     46         # 爆炸效果
     47         if self.is_dead:
     48             death_x = self.x
     49             death_y = self.y
     50             death_w = self.image.get_width()
     51             death_h = self.image.get_height()
     52             try:
     53                 bomb_image = './images/bomb'+self.bomb_seq.pop()+'.png'
     54                 self.image = pygame.image.load(bomb_image)
     55             except:
     56                 self.image = pygame.image.load('./images/bomb4.png')
     57                 self.finished = True
     58             finally:
     59                 x = death_x + (death_w - self.image.get_width())/2
     60                 y = death_y + (death_h - self.image.get_height())/2
     61                 self.screen.blit(self.image, (x, y))
     62 
     63         else:
     64             # 重新绘制飞机
     65             self.screen.blit(self.image, (self.x, self.y))
     66 
     67     def fire(self):
     68         self.bullet_list.append(Bullet(self.screen, self.x, self.y))
     69         print(len(self.bullet_list))
     70 
     71     def over(self):
     72         #print("Oops: plane over ...")
     73         #del self
     74         return self.finished
     75 
     76 
     77 # 英雄飞机
     78 class HeroPlane(Plane):
     79     def __init__(self, screen):
     80         # 英雄机初始位置
     81         geo = (200, 600)
     82         super().__init__(screen, settings.hero_style, geo)
     83 
     84         self.step = settings.move_step
     85         # 英雄机移动范围
     86         self.limit_left = -(self.image.get_width()/2)+10
     87         self.limit_right = settings.screen_width-self.image.get_width()/2-10
     88         self.limit_top = 5
     89         self.limit_bottom = settings.screen_height-self.image.get_height()
     90 
     91     def fire(self):
     92         self.bullet_list.append(HeroBullet(self.screen, self.x+53, self.y))
     93 
     94     def move_left(self):
     95         if self.x <= self.limit_left:
     96             pass
     97         else:
     98             self.x -= self.step
     99 
    100     def move_right(self):
    101         if self.x >= self.limit_right:
    102             pass
    103         else:
    104             self.x += self.step
    105 
    106     def move_up(self):
    107         if self.y <= self.limit_top:
    108             pass
    109         else:
    110             self.y -= self.step
    111 
    112     def move_down(self):
    113         if self.y >= self.limit_bottom:
    114             pass
    115         else:
    116             self.y += self.step

    预览效果:

    在这里插入图片描述

    后期我会把这个太空飞机大战的源码地址分享到这里,感谢各位支持!

  • 相关阅读:
    js,jQuery 排序的实现,网页标签排序的实现,标签排序
    SQL不规则排序,ORDER BY 不规则排序,case的使用
    XML methods are not allowed in a GROUP BY clause.XML不允许使用排序方法的处理
    DropDownList设置选定项,设置选择项,最安全的方法
    js 字符串转成货币格式, js转货币
    排名进入20000纪念
    jQuery对象和Dom对象互相转换
    屏蔽页面JS错误,拦截页面JS错误的代码,js禁止跳出错误提示
    枚举,以及中文对应解释
    insert into插入表,插入多条数据,sql插入表,插入多条数据,数据库插入表,插入多条数据
  • 原文地址:https://www.cnblogs.com/lyck/p/12840461.html
Copyright © 2011-2022 走看看