菜鸟都收藏了:如何用Pycharm创建Python项目并编写贪吃蛇游戏

一、用Pycharm创建并编写贪吃蛇项目

在这里插入图片描述

1.打开Pycharm

在这里插入图片描述

2.新建Python项目tanchishe

1.>点击菜单File->New Project…

在这里插入图片描述

2.> 设置项目名称目录和运行环境
  • 项目名称填写: tanchishe
  • 运行环境使用:Conda (即 Anaconda,如果没有Anaconda则自己下载安装 )
  • Python version:选择3.6
  • Conda exectable:你自己的 Anaconda 的安装位置
  • 然后点击Create创建项目
    在这里插入图片描述
3.> 项目创建中

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

4.> 设置软件源地址为default

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

5.>在项目中新建tanchishe.py文件

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

6.>在tanchishe.py文件中编写代码
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# pip install pygame # 安装pygame 库
# 如果此命令安装失败则尝试使用下面的命令安装
# python3 -m pip install pygame

import pygame, sys, random
from pygame.locals import *

# 1. 定义颜色变量
greenColor = pygame.Color(0, 255, 0)  # 目标方块的颜色 r g b 取值范围 0 -255
blueColor = pygame.Color(0, 0, 255)  # 贪吃蛇的颜色
blackColor = pygame.Color(0, 0, 0)  # 背景颜色

# 2. 定义游戏结束的函数
def gameOver():
    pygame.quit()
    sys.exit()

# 获取键盘方向键
def getKeyboardDirection(direction):
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            # 判断键盘事件
            if event.key == K_RIGHT:  # 向右
                # 确定方向,移动蛇头坐标
                if not direction == 'left':
                    return 'right'
            elif event.key == K_LEFT:  # 向左
                # 确定方向,移动蛇头坐标
                if not direction == 'right':
                    return 'left'
            elif event.key == K_UP:  # 向上
                # 确定方向,移动蛇头坐标
                if not direction == 'down':
                    return 'up'
            elif event.key == K_DOWN:  # 向下
                # 确定方向,移动蛇头坐标
                if not direction == 'up':
                    return 'down'
            else:
                return direction
    return direction


# 3. 实现工作方式
def main():

    # 3.1 初始化变量

    # 初始化游戏界面尺寸
    wWidth = 640 # 游戏界面窗口宽度
    wHeight = 480 # 游戏界面窗口高度

    # 初始化蛇数据
    snakeBody = [[100, 100], [80, 100], [60, 100]]  # 蛇全身各段的初始位置(像素坐标)
    snakePosition = [100, 100]  # 蛇头的初始位置(像素坐标)
    snakeTail = [60, 100]  # 蛇尾巴

    # 初始化苹果数据
    applePosition = [260, 200]  # 苹果的初始位置(像素坐标)
    blockSize = 20 #方格宽高像素尺寸,蛇身体宽度,苹果宽高与此一至
    direction = 'right'  # 蛇运动的初始方向

    # 3.2 初始化Pygame
    pygame.init()

    # 3.3 定义一个变量用来控制游戏的速度
    fpsClock = pygame.time.Clock()

    # 3.4 创建pygame的显示层
    playSurface = pygame.display.set_mode((wWidth, wHeight))
    pygame.display.set_caption('贪吃蛇')

    # 3.5 画苹果
    pygame.draw.rect(playSurface, greenColor, Rect(applePosition[0], applePosition[1], blockSize, blockSize))

    # 3.6 画蛇
    for position in snakeBody:
        # 画蛇
        pygame.draw.rect(playSurface, blueColor, Rect(position[0], position[1], blockSize, blockSize))

    # 3.7 更新界面显示(画的新图像需要重新显示)
    pygame.display.flip()

    # 3.5 pygame 所有的事件要放到 一个循环当中来完成
    while True:

        # 3.5.1 读取蛇运动方向(当键盘按方向键后,direction 值会及时更新)
        direction = getKeyboardDirection(direction)

        # 3.5.2 根据方向修改蛇头的坐标数据
        if direction == 'right': snakePosition[0] += blockSize
        if direction == 'left': snakePosition[0] -= blockSize
        if direction == 'down': snakePosition[1] += blockSize
        if direction == 'up': snakePosition[1] -= blockSize

        # 3.5.3 新的蛇头数据放入蛇列表数据开头
        snakeBody.insert(0, list(snakePosition))
        # 3.5.4 画新的蛇头(身体不需要重新画)
        pygame.draw.rect(playSurface, blueColor, Rect(snakePosition[0], snakePosition[1], blockSize, blockSize))

        # 3.5.5 画新的苹果
        # 如果我们的贪吃蛇的位置和目标方块重合了,说明吃到了目标方块
        if snakePosition[0] == applePosition[0] and snakePosition[1] == applePosition[1]:
            # 旧的苹果已经变成了蛇头
            # 生成新的苹果
            x = random.randrange(1, wWidth/blockSize) # 新苹果所在方块 水平序号x
            y = random.randrange(1, wHeight/blockSize) # 新苹果所在方块 垂直序号y
            applePosition = [x*blockSize, y*blockSize] # 新苹果像素坐标

            # 画新的苹果
            pygame.draw.rect(playSurface, greenColor, Rect(applePosition[0], applePosition[1], 20, 20))
        # 3.5.6 如果吃到苹果,则由于蛇身体向前移动了,需要把原来尾巴位置的色块清除,尾巴数据需要从列表中删去
        else:
            # 清空蛇尾元素和颜色快
            snakeLen = len(snakeBody) # 获取蛇身列表数据长度
            snakeTail = snakeBody[snakeLen-1]; # 得到蛇尾巴像素坐标
            pygame.draw.rect(playSurface, blackColor, Rect(snakeTail[0], snakeTail[1], 20, 20))  # 把原尾巴的位置的颜色设置为背景色
            snakeBody.pop() # 将原尾巴数据删去

        # 更新显示
        pygame.display.flip()
        # 爬行动作频次时钟控制
        fpsClock.tick(10)

        # 如果碰到围墙则 gameOver
        if snakePosition[0] > (wWidth - 20) or snakePosition[0] < 0:
            gameOver()
        elif snakePosition[1] > (wHeight - 20) or snakePosition[1] < 0:
            gameOver()

        # 如果碰到了自己的身体则 gameOver
        for s in snakeBody[1:]:# 遍历蛇身,判断蛇头是否与蛇身重合
            if snakePosition[0] == s[0] and snakePosition[1] == s[1]:
                gameOver()

# 程序入口
if __name__ == '__main__':
    main()
7.> 排除语法等错误
  • 这里缺少pygame库
    在这里插入图片描述
  • 从控制台执行 pip install pygame
    在这里插入图片描述
  • 执行结果如下(安装完成):
1
2
3
4
5
6
7
8
9
10
11
12
(tanchishe) wdh@wdh:~/PycharmProjects/tanchishe$ pip install pygame
Collecting pygame
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f6bc41d8da0>: Failed to establish a new connection: [Errno 101] 网络不可达',)': /packages/8e/24/ede6428359f913ed9cd1643dd5533aefeb5a2699cc95bea089de50ead586/pygame-1.9.6-cp36-cp36m-manylinux1_x86_64.whl
  WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f6bc41e10f0>: Failed to establish a new connection: [Errno 101] 网络不可达',)': /packages/8e/24/ede6428359f913ed9cd1643dd5533aefeb5a2699cc95bea089de50ead586/pygame-1.9.6-cp36-cp36m-manylinux1_x86_64.whl
  WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f6bc41ec780>: Failed to establish a new connection: [Errno 101] 网络不可达',)': /packages/8e/24/ede6428359f913ed9cd1643dd5533aefeb5a2699cc95bea089de50ead586/pygame-1.9.6-cp36-cp36m-manylinux1_x86_64.whl
  WARNING: Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f6bc41ec2b0>: Failed to establish a new connection: [Errno 101] 网络不可达',)': /packages/8e/24/ede6428359f913ed9cd1643dd5533aefeb5a2699cc95bea089de50ead586/pygame-1.9.6-cp36-cp36m-manylinux1_x86_64.whl
  WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'NewConnectionError('<pip._vendor.urllib3.connection.VerifiedHTTPSConnection object at 0x7f6bc4174048>: Failed to establish a new connection: [Errno 101] 网络不可达',)': /packages/8e/24/ede6428359f913ed9cd1643dd5533aefeb5a2699cc95bea089de50ead586/pygame-1.9.6-cp36-cp36m-manylinux1_x86_64.whl
  Downloading pygame-1.9.6-cp36-cp36m-manylinux1_x86_64.whl (11.4 MB)
     |████████████████████████████████| 11.4 MB 76 kB/s
Installing collected packages: pygame
Successfully installed pygame-1.9.6
(tanchishe) wdh@wdh:~/PycharmProjects/tanchishe$
  • 可以看到红色下划线消失了
    在这里插入图片描述
8.>开始运行:Run-》Run …

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

9.>运行效果

在这里插入图片描述