今天给大家分享几个有趣的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

预览效果:

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

Python练手项目实例汇总(附源码下载)的更多相关文章

  1. Web 开发中很实用的10个效果【附源码下载】

    在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.这篇文章给大家推荐10个在 Web 开发中很有用的效果,记 ...

  2. 精选12个时尚的 CSS3 效果【附源码下载】

    这里是精选的12个很炫的 CSS3 效果.CSS3 是对 CSS 规范的一个很大的改善和增强,它使得 Web 开发人员可以很容易的在网站中加入时尚的效果.以前很多需要编写复杂的 JavaScript ...

  3. 让你心动的 HTML5 & CSS3 效果【附源码下载】

    这里集合的这组 HTML5 & CSS3 效果,有的是网站开发中常用的.实用的功能,有的是先进的 Web 技术的应用演示.不管哪一种,这些案例中的技术都值得我们去探究和学习. 超炫的 HTML ...

  4. 8个前沿的 HTML5 & CSS3 效果【附源码下载】

    作为一个前沿的 Web 开发者,对于 HTML5 和 CSS3 技术或多或少都有掌握.前几年这些新技术刚萌芽的时候,开发者们已经使用它们来小试牛刀了,如今这些先进技术已经遍地开发,特别是在移动端大显身 ...

  5. 使用 CSS3 实现 3D 图片滑块效果【附源码下载】

    使用 CSS3 的3D变换特性,我们可以通过让元素在三维空间中变换来实现一些新奇的效果. 这篇文章分享的这款 jQuery 立体图片滑块插件,利用了 3D transforms(变换)属性来实现多种不 ...

  6. 使用 CSS3 动感的图片标题动画效果【附源码下载】

    在网站中,有很多地方会需要在图片上显示图片标题.使用 CSS3 过渡和变换可以实现动感的鼠标悬停显示效果.没有使用 JavaScript,所以只能在支持 CSS3 动画的现代浏览器中才能正常工作.您可 ...

  7. 分享一组很赞的 jQuery 特效【附源码下载】

    作为最优秀的 JavaScript 库之一,jQuery 不仅使用简单灵活,同时还有许多成熟的插件可供选择,它可以帮助你在项目中加入漂亮的效果.这篇文章挑选了8个优秀的 jQuery 实例教程,这些  ...

  8. Android中Canvas绘图基础详解(附源码下载) (转)

    Android中Canvas绘图基础详解(附源码下载) 原文链接  http://blog.csdn.net/iispring/article/details/49770651   AndroidCa ...

  9. arcgis api 3.x for js 入门开发系列批量叠加 zip 压缩 SHP 图层优化篇(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

随机推荐

  1. Magicodes.IE 2.4版本发布

    今天我们发布了2.4版本,这离不开大家对Magicodes.IE的支持,我们也对大家的意见以及需求不断的进行更新迭代,目前我们的发布频率平均在一周一个beta版本,一个月一个正式版本的更新,我们欢迎更 ...

  2. VUE 安装项目

    注意:在cmd中执行的命令 1,前提是安装了node.js 查看 npm 版本号 2,创建项目路径 mkdir vue cd vue 3,安装vue-cli (脚手架) npm install -个v ...

  3. 每日一题 LeetCode 42.接雨水 【双指针】

    题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目说明 题解 主要方法:双指针 + 正反遍历 解释说明: 正向遍历:先确定池子左 ...

  4. dubbo使用问题

    新入职此公司, 发现公司使用的框架原来是传说中的分布式的(原谅我以前在传统公司工作,并远离浪潮久矣), 使用过程中发现各服务之间使用 dubbo 进行通信. 特地总结下遇见的坑,为以后总结经验.   ...

  5. “3D引擎和图形学技术点思路讲解”线上直播培训班报名开始啦(完全免费)

    大家好,我开了一个线上的直播课程培训班,完全免费,欢迎大家报名! 本课程重点教授"光线追踪"方面的实现思路. 我的相关经验 5年3D引擎开发经验 Wonder-WebGL 3D引擎 ...

  6. day67:Vue:es6基本语法&vue.js基本使用&vue指令系统

    目录 Vue前戏:es6的基本语法 1.es6中的let特点 1.1.局部作用域 1.2.不存在变量提升 1.3.不能重复声明 1.4.let声明的全局变量不从属于window对象,var声明的全局变 ...

  7. MeteoInfoLab脚本示例:天气现象符号

    天气现象符号分布图实际就是散点图,可以用scatterm函数绘制,但之前需要创建天气符号图例,用weatherspec函数.如果只需要绘制某些天气现象(比如雾.霾),可以给出相应的天气符号序号列表(可 ...

  8. 第十二章 配置vlan

    一.vlan技术简介 1.广播风暴 广播风暴(broadcast storm)简单的讲是指当广播数据充斥网络无法处理,并占用大量网络带宽,导致正常业务不能运行,甚至彻底瘫痪,这就发生了"广播 ...

  9. 浏览器页面左上角出现undefined

    浏览器页面左上角出现undefined, js文档中: let list; list += html代码; 解决办法: let list = html代码;

  10. day70:Vue:Git&路飞学城页面效果

    目录 1.Git 2.路飞学城项目页面效果 0.安装elements UI 1.顶部导航栏效果 2.轮播图效果 1.Git 什么是git?分布式版本管理工具 1.git操作 # 1 创建git本地仓库 ...