脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 手把手教你用322行Python代码编写贪吃蛇游戏

手把手教你用322行Python代码编写贪吃蛇游戏

2023-06-02 14:18AlexHu2022 Python

最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法,下面这篇文章主要给大家介绍了关于如何用322行Python代码编写贪吃蛇游戏的相关资料,需要的朋友可

效果图

手把手教你用322行Python代码编写贪吃蛇游戏

贪吃蛇是一个很常见的小游戏,我们如何用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

 

总结

如果你将以上所有的代码按顺序编写在一些,就可以运行完整的贪吃蛇了。这些代码都很简单,适合初学者学习。

 

源码下载 

GitHub源码

到此这篇关于用322行Python代码编写贪吃蛇游戏的文章就介绍到这了,更多相关Python编写贪吃蛇内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/AlexHu2022/article/details/127139815

延伸 · 阅读

精彩推荐
  • PythonPython中ini配置文件读写的实现

    Python中ini配置文件读写的实现

    本文主要介绍了Python中ini配置文件读写的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    彭世瑜psy7752022-10-07
  • Pythonpython交易记录整合交易类详解

    python交易记录整合交易类详解

    这篇文章主要介绍了python交易记录整合交易类详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    charles_lun6242021-07-31
  • Pythonpython实现Thrift服务端的方法

    python实现Thrift服务端的方法

    这篇文章主要介绍了python实现Thrift服务端的方法,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...

    酌三巡11782021-10-15
  • PythonPython学习之循环方法详解

    Python学习之循环方法详解

    循环是有着周而复始的运动或变化的规律;在 Python 中,循环的操作也叫做 遍历。与现实中一样,Python 中也同样存在着无限循环的方法与有限循环的方法。...

    渴望力量的哈士奇8242022-10-25
  • PythonSelenium元素的常用操作方法分析

    Selenium元素的常用操作方法分析

    这篇文章主要介绍了Selenium元素的常用操作方法,结合实例形式分析Selenium在获取元素之后针对点击、输入、提交、属性获取等常见操作相关实现技巧,需要的...

    喷跑的豆子11212021-03-27
  • Python10个Python小技巧你值得拥有

    10个Python小技巧你值得拥有

    这篇文章主要介绍了10个Python小技巧,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...

    爱你哟编程9312021-04-05
  • Pythonpython中绑定方法与非绑定方法的实现示例

    python中绑定方法与非绑定方法的实现示例

    本文主要介绍了python中绑定方法与非绑定方法的实现示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    工具晨的日常9822022-01-13
  • PythonDjango实现表单验证

    Django实现表单验证

    这篇文章主要为大家详细介绍了Django实现表单验证的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    不凡De老五6812021-04-01