实验(4)李宇凡 20193404

2019-2020《Python程序设计》实验四报告

课程:《Python程序设计》

班级:1934

姓名:李宇凡

学号:20193404

实验教师:王志强

实验日期:2020年6月9日

必修/选修: 公选课

1. 实验内容

  建立一个贪吃蛇的小游戏。

2.设计分析实验

1、我们可以将整个游戏区域划分成一个个的小格子,由一组连在一起的小格子组成“蛇”,我们可以用不同的颜色来表示,如上图中,我以深色表示背景,浅色表示“蛇”,我们可以用坐标来表示每一个小方格,X 轴和 Y 轴的范围都是可以设定好的。用一个列表来存放“蛇身”的坐标,那么一条“蛇”就出来了,最后只要显示的时候以不同的颜色表示即可。

2、第一反应就是像蚯蚓蠕动一样,每一个小方块向前移动一格,但这样实现起来很麻烦。一开始就是被这里卡住了。想象一下我们玩过的贪吃蛇,每次“蛇”的移动感觉上是整体往前移动了一格,排除掉脑子中“蛇”的“动作”,细想移动前和移动后“蛇”的位置变化,其实除了头尾,其他部分根本就没有变。那就简单了,将下一格的坐标添加到列表开头,并移除列表的最后一个元素,就相当于蛇向前移动了一格。

3、“蛇”移动超出了游戏区的范围或者碰到了自己就算输了,轴坐标的范围是事先定好的,超出范围很容易判断。蛇”是一个列表,那么只要判断下一格的坐标是否已经包含在“蛇”的列表中就可以判断“蛇”是否咬住尾巴。

3.实验代码

每个函数块

def main():
pygame.init()

snake_speed_clock = pygame.time.Clock()

screen = pygame.display.set_mode((windows_width, windows_height))

screen.fill(white)

pygame.display.set_caption("贪吃蛇~")

show_start_info(screen)

while True:
    music()
    running_game(screen, snake_speed_clock)
    show_end_info(screen)

def running_game(screen,snake_speed_clock):

start_x = random.randint(3, map_width - 8) ##开始位置

start_y = random.randint(3, map_height - 8)

snake_coords = [{'x': start_x, 'y': start_y},  ##初始贪吃蛇
              {'x': start_x - 1, 'y': start_y},
              {'x': start_x - 2, 'y': start_y}]

direction = RIGHT       ##开始时向右移动

food = get_random_location()     ##实物随机位置

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
        elif event.type == KEYDOWN:
            if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
                direction = LEFT
            elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
                direction = RIGHT
            elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
                direction = UP
            elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
                direction = DOWN
            elif event.key == K_ESCAPE:
                terminate()

    move_snake(direction, snake_coords) ##移动蛇

    ret = snake_is_alive(snake_coords)
    if not ret:
        gameover_music()
        break     ##蛇死了. 游戏结束
    snake_is_eat_food(snake_coords, food) ##判断蛇是否吃到食物

    screen.fill(BG_COLOR)
    draw_snake(screen, snake_coords)
    draw_food(screen, food)
    show_score(screen, len(snake_coords) - 3)
    pygame.display.update()
    snake_speed_clock.tick(snake_speed) ##控制fps

def draw_food(screen, food):

x = food['x'] * cell_size
y = food['y'] * cell_size
appleRect = pygame.Rect(x, y, cell_size, cell_size)
pygame.draw.rect(screen, red, appleRect)

def draw_snake(screen, snake_coords):

for coord in snake_coords:
    x = coord['x'] * cell_size
    y = coord['y'] * cell_size
    wormSegmentRect = pygame.Rect(x,y,cell_size,cell_size)
    pygame.draw.rect(screen, dark_blue, wormSegmentRect)
    wormInnerSegmentRect = pygame.Rect(x+4,y+4,cell_size - 8, cell_size - 8)
    pygame.draw.rect(screen, blue, wormInnerSegmentRect)

def move_snake(direction, snake_coords):

if direction == UP:
    newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] - 1}
elif direction == DOWN:
    newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] + 1}
elif direction == LEFT:
    newHead = {'x':snake_coords[HEAD]['x'] - 1, 'y':snake_coords[HEAD]['y']}
elif direction == RIGHT:
    newHead = {'x':snake_coords[HEAD]['x'] + 1, 'y':snake_coords[HEAD]['y']}
snake_coords.insert(0, newHead)

def snake_is_alive(snake_coords):

tag = True
# 头坐标超出地图范围
if(snake_coords[HEAD]['x'] == -1 \
        or snake_coords[HEAD]['x'] == map_width \
        or snake_coords[HEAD]['y'] == -1 \
        or snake_coords[HEAD]['y'] == map_height):
    tag = False
# 头坐标等于身体某节坐标
for snake_body in snake_coords[1:]:
    if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:
        tag = False
return tag

def snake_is_eat_food(snake_coords, food):

if(snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']):
    ## 重新生成食物
    food['x'] = random.randint(0, map_width - 1)
    food['y'] = random.randint(0, map_height - 1)
else:
    del snake_coords[-1] ##如果没有吃到实物, 就向前移动, 那么尾部一格删掉

def get_random_location():

return {'x':random.randint(0, map_width - 1),'y':random.randint(0, map_height - 1)}

def show_start_info(screen):

##创建Font字体对象,使用render方法写字
font = pygame.font.Font("simsun.ttc", 40)
tip = font.render('按任意键开始游戏', True,(65,105,255))
##加载图片
gamestart = pygame.image.load('startlogo.jpg').convert()
##通过blit方法输出在屏幕上
screen.blit(gamestart,(140, 30))
screen.blit(tip,(240, 550))
## 刷新屏幕
pygame.display.update()

while True: 
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
        elif event.type == KEYDOWN:  ##任意键按下
            return
            if (event.key == K_ESCAPE):  ##若为ESC,则终止程序
                terminate()
            else:
                return

def show_end_info(screen):

font = pygame.font.Font("simsun.ttc", 40)
tip = font.render("按ESC退出游戏,按任意键重新开始游戏",True,(65,105,255))
# gamestart = pygame.image.load('gameover.png')
# screen.blit(gamestart,(60, 0))
screen.blit(tip,(80, 300))
pygame.display.update()

while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            terminate()
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                terminate()
            else:
                return

def show_score(screen, score):

font = pygame.font.Font("simsun.ttc", 30)
scoreSurf = font.render("得分:%s" % score, True, green)
scoreRect = scoreSurf.get_rect()
scoreRect.topleft = (windows_width - 120, 10)
screen.blit(scoreSurf,scoreRect)

def terminate():

pygame.quit()
sys.exit()


(视频传到了云班课)

4.问题与解决

1.没有安装模块。
安装了pygame;

2.有闪退的情况,由于没有安装库函数

5. 结课总结:

课程总结:

1.Python易于学习

  Python 相较于其它编程语言而言,Python更容易一些。Python 的语言没有多少仪式化的东西,所以就算不是一个 Python 专家,你也能读懂它的代码。我的经验是,通过实例来学习Python会更加容易,因为 Python 的语法里面条条框框以及特殊的处理场景要少得多。 它所专注的并非语言表现的丰富程度,而是你想要用你的代码完成什么。

2.它能用少量的代码构建出很多功能

  Python 能带给所有开发者一种快速的学习体验。通过实践,你可以在最多两天之内轻松实现一个具备基础功能的程序。另外一些让 Python 成为一门引人注目的编程语言的因素就是它的可读性和高效性。

3.Python 应用范围十分广泛

  Python 应用场景广泛,可被应用于如今你所能想得到的相当多的软件开发和操作场景,目前已广泛应用于人工智能、云计算开发、大数据开发、数据分析、科学运算、网站开发、爬虫、自动化运维、自动化测试、游戏开发等领域,因此,只需要你将 Python 了解得更加深入一点点,就能让你具备可以适应范围更宽泛的工作角色的技能。

4.Python 有丰富的库

  Python 标准库确实很庞大。python有可定义的第三方库可以使用。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

5.可移植性强

  Python 可以跨操作平台运行,即Python程序的核心语言和标准库可以在Linux、Windows及其他带有Python解释器的平台上无差别的运行。

6.面向对象

  Python 是面向对象经行编程。

  通过这门课程的学习,我学到了python的使用方法,学习到了如和编写函数,学习了面向对象编程。学习如何处理异常文件,使得程序健壮性提高。学习了数据库和爬虫,学习到了流程控制语句、学习到了序列如何应用、字符串与正则表达式如何实际去应用以及相关之间的关系以丰满程序的可读性和功能。相对于本学期的C语言,我觉得Python比C语言好用很多,但是自己一学期仍然是一个小白,将来还需要多多学习!

建议

1、老师可以像后面的课程作业可以定时完成,因为我是一个比较拖延的人,往往会拖到最后做。
2、课上的例子我觉得可以结合一些最近比较热的东西来达到更好的效果,提高同学们注意力。
3、对于看视频任务量比较大,还是比较喜欢直播,可以更加直接的和老师互动。

posted @ 2020-06-09 20:11  20193404李宇凡  阅读(129)  评论(0编辑  收藏