效果图
贪吃蛇是一个很常见的小游戏,我们如何用Python去实现呢。
安装和导入
1
2
3
|
pip install pygame pip install keyboard pip install pickledb |
通过命令提示符安装所需模块。(以上非Python代码)
1
2
|
#导入 import pygame, keyboard, random, threading, time, pickledb |
这个程序用到了pygame作为显示模块,keyboard捕获键盘操,pickledb记录最高纪录。
规则
1
2
3
4
5
6
7
8
9
|
#显示规则 print () print ( '方向键控制方向' ) print ( ''esc'退出' ) print ( ''alt'暂停' ) print ( ''space'继续' ) print ( '每吃掉一个莓果,蛇身长长一格' ) print ( '撞到蛇身或窗口边缘即为死亡' ) print ( '死亡后'esc'退出,'enter'再来一局' ) |
初始化
1
2
3
4
5
6
|
#初始化 pygame.init() #设定窗口 screen = pygame.display.set_mode(( 500 , 500 )) pygame.display.set_caption( 'Greedy Snake' ) |
执行以上代码就设定好了贪吃蛇的窗口。
设定Surface,变量和显示数字的坐标
1
2
3
4
5
6
7
8
9
10
|
#设定蛇身 body = pygame.Surface(( 20 , 20 )) body.fill( 'yellow' ) #设定莓果 berries = pygame.Surface(( 20 , 20 )) berries.fill( 'red' ) #设定数字方块(用于显示数字) block = pygame.Surface(( 4 , 4 )) |
1
2
3
4
5
|
#设定变量 T = 0 db = pickledb.load( 'Mark.db' , False ) HI = db.get( 'HiMark' ) B = False |
函数
1
2
3
4
5
|
def keyname(key) : #键盘捕获 global KEY KEY = key.name keyboard.on_press(keyname) |
用on_press绑定了keyname后,当键盘按下时会执行keyname函数。(key.name是按键的名称)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
def snake() : #显示蛇身 global path for xy in path : screen.blit(body, xy) def food() : #显示食物 global fx, fy screen.blit(berries, (fx, fy)) def eat() : #检测是否吃掉食物 if (x, y) = = (fx, fy) : return True else : return False def crash() : #检测是否碰撞 if path.count((x, y)) ! = 0 : return True elif x < 0 or x > 480 or y < 0 or y > 480 : return True else : return False def count() : #计时线程函数 global T while True : if B : time.sleep( 1 ) T + = 1 def timer() : #显示时间 global T, number a = T / / 100 b = T % 100 / / 10 c = T % 10 a = number[a] b = number[b] c = number[c] X, Y = 6 , 10 block.fill( 'white' ) for n in (a, b, c) : for xy in n : x = X + xy[ 0 ] * 4 y = Y + xy[ 1 ] * 4 screen.blit(block, (x, y)) X + = 32 def mark() : #显示分数 global M, number a = M / / 100 b = M % 100 / / 10 c = M % 10 a = number[a] b = number[b] c = number[c] X, Y = 395 , 10 block.fill( 'white' ) for n in (a, b, c) : for xy in n : x = X + xy[ 0 ] * 4 y = Y + xy[ 1 ] * 4 screen.blit(block, (x, y)) X + = 32 def hi() : #显示最高纪录 global HI, number a = HI / / 100 b = HI % 100 / / 10 c = HI % 10 a = number[a] b = number[b] c = number[c] X, Y = 263 , 10 block.fill( 'grey' ) for n in (a, b, c) : for xy in n : x = X + xy[ 0 ] * 4 y = Y + xy[ 1 ] * 4 screen.blit(block, (x, y)) X + = 32 |
线程
1
2
3
|
#启动计时线程 time_count_thread = threading.Thread(target = count) time_count_thread.start() |
线程可以在主线程的运行过程中运行,起到计时的作用。
主要部分
以下就是程序的主要部分,实现了对按键名称进行判断、蛇的移动、蛇吃掉食物后的生长和判断死亡。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
while True : #变量初始化 KEY = 'up' lKEY = KEY x, y = 240 , 240 path = [] path.append((x, y)) fx, fy = random.randrange( 20 , 460 , 20 ), random.randrange( 20 , 460 , 20 ) while path.count((fx, fy)) ! = 0 : fx, fy = random.randrange( 20 , 460 , 20 ), random.randrange( 20 , 460 , 20 ) T = 0 M = 0 B = True while True : time.sleep( 0.1 ) #检测是否按下退出按钮 for event in pygame.event.get() : if event. type = = pygame.QUIT : pygame.quit() exit() #检测键盘按键 if (KEY = = 'up' and lKEY ! = 'down' ) or (KEY = = 'w' and lKEY ! = 's' ) : y - = 20 lKEY = KEY elif (KEY = = 'down' and lKEY ! = 'up' ) or (KEY = = 's' and lKEY ! = 'w' ) : y + = 20 lKEY = KEY elif (KEY = = 'left' and lKEY ! = 'right' ) or (KEY = = 'a' and lKEY ! = 'd' ) : x - = 20 lKEY = KEY elif (KEY = = 'right' and lKEY ! = 'left' ) or (KEY = = 'd' and lKEY ! = 'a' ) : x + = 20 lKEY = KEY elif KEY = = 'alt' or KEY = = 'right alt' : B = False while True : pygame.event.wait() if KEY = = 'space' : KEY = lKEY B = True break elif KEY = = 'esc' : pygame.quit() if M > HI : HI = M db. set ( 'HiMark' , HI) db.dump() exit() continue elif KEY = = 'esc' : pygame.quit() if M > HI : HI = M db. set ( 'HiMark' , HI) db.dump() exit() else : KEY = lKEY continue #检测是否碰撞或吃掉食物 if crash() : break if eat() : M + = 1 fx, fy = random.randrange( 20 , 460 , 20 ), random.randrange( 20 , 460 , 20 ) while path.count((fx, fy)) ! = 0 : fx, fy = random.randrange( 20 , 460 , 20 ), random.randrange( 20 , 460 , 20 ) else : del path[ 0 ] #更新屏幕内容 path.append((x, y)) screen.fill( 'black' ) snake() food() timer() mark() hi() pygame.display.flip() #保存最高纪录 if M > HI : HI = M db. set ( 'HiMark' , HI) db.dump() B = False #检测是否退出或再来一局 while True : event = pygame.event.wait() if event. type = = pygame.QUIT : pygame.quit() exit() elif KEY = = 'esc' : pygame.quit() exit() elif KEY = = 'return' or KEY = = 'enter' : break |
总结
如果你将以上所有的代码按顺序编写在一些,就可以运行完整的贪吃蛇了。这些代码都很简单,适合初学者学习。
源码下载
到此这篇关于用322行Python代码编写贪吃蛇游戏的文章就介绍到这了,更多相关Python编写贪吃蛇内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/AlexHu2022/article/details/127139815