20212217刘恒谦 2022-2022-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2122
姓名: 刘恒谦
学号:20212217
实验教师:王志强
实验日期:2022年5月28日
必修/选修: 公选课

1.实验内容

2. 实验过程及结果

1.购买云服务器
image
此步比较简单,完成如图所示的配置即可。注意的是EularOS和centOS一样下载插件用的是yum。

2.下载pygame

wget https://files.pythonhosted.org/packages/1a/04/d6f1159feaccdfc508517dba1929eb93a2854de729fa68da9d5c6b48fa00/setuptools-39.2.0.zip

unzip setuptools-39.2.0.zip

cd setuptools-39.2.0

python3 setup.py build
#以上命令用于下载setuptool
wget https://files.pythonhosted.org/packages/ae/e8/2340d46ecadb1692a1e455f13f75e596d4eab3d11a57446f08259dee8f02/pip-10.0.1.tar.gz

tar xf pip-10.0.1.tar.gz

cd pip-10.0.1

python3 setup.py install
#以上下载pip3--10.0.1

pip3 install pygame

3.配置远程桌面
下载xterm和xauth,EularOS用如下命令

yum install xterm

yum install xauth

用vim编辑器打开(vi是vim的简写)网络设置,注意xming与putty之间是通过ssh协议通信的

vi /etc/ssh/sshd_config

设置X11Forwarding yes
在vim编辑器中按i进入编辑模式,按Esc退出编辑,按:输入wq退出vim
完成后退出putty

xming下载并安装好后,在菜单栏找到xlaunch,一直点下一步至完成即可。之后打开putty输入xterm即可看见窗口了。
image

xterm启动很慢,需要耐心等待5秒左右

4.编写脚本上传运行
贪吃蛇的套路无非是食物在左我向左,食物在上我朝上因此,首先要检测食物food和蛇头head的坐标大小

蛇头是一个坐标,head = [200, 300]

towards有两个值0和1,分别用来表示x和y方向,并且只用在head上。

head[0]是x方向,左右方向。head[1]是y方向,上下方向。

want是食物列表中的一个食物,它也是个坐标。

head = [200, 300]            #蛇头——一个坐标
towards = 0         #蛇的方向
foods = [(690, 400)]#食物列表
want = foods[0]              #想要的食物——一个坐标

going = True
while going:                       #游戏循环走起——Going
    SCREEN.fill((255, 255, 255))
    for event in pg.event.get([pg.KEYDOWN, pg.QUIT]):
        if event.type == pg.QUIT:
            going = False         #按XX游戏退出——QUIT
#接近目标
    #蛇头在食物 左 towards = 0  或  上 towards = 1
    if head[towards] < want[towards] - R -A:
        run = V
    #蛇头在食物 右 towards = 0  或  下 towards = 1
    elif head[towards] > want[towards] + R:
        run = -V
#什么时候换方向
    else:
        towards = 1 - towards

好了,不过这就大功告成了吗?还没呢。要知道蛇吃了食物后,他就该换一个目标了。

#吃到食物
    for food in foods:
        if food[0] - R - A <= head[0] <= food[0] + R and food[1] - R - A <= head[1] <= food[1] + R:
            #删除食物
            foods.remove(food)
            #追加食物
            foods.append((randint(0, 750), randint(0, 550)))
            #蛇身增长
            snack.append([head[0] - A, head[1]])
            #吃到的就是目标食物
            if food == want:
                #换一个目标
                want = choice(foods)

这就完成了最重要的部分。有了智能蛇后,实现人机对战就很简单了。(长文预警)
下面的智能蛇叫other,它身体的每一部分叫the,它的蛇头叫thead,画出来是绿色的;
而贪吃蛇叫snacks (注意有s),身体的每个方块叫 snack,头叫head,画出来是蓝色的。以此区分两条蛇

源代码

import pygame as pg
from random import randint, choice

SCREEN = pg.display.set_mode([800, 600])
pg.display.set_caption('贪吃蛇')

V = 21      #蛇速
A = 20      #蛇身方块
R = 20      #食物半径

#初始贪吃蛇
direct = "右"
head=[500,500]
snacks = [head]

#初始化食物
foods = [(220, 350), (450, 250), (390, 340), (690, 400)]

#初始智能蛇
thead = [200, 300]
other = [thead]
which = 0
want = foods[0]
run = V

going = True
while going:
    SCREEN.fill((255, 255, 255))
#以下是贪吃蛇的部分_______________________________________________________________________________________
    for event in pg.event.get([pg.KEYDOWN, pg.QUIT]):
        if event.type == pg.QUIT:
            going = False
        elif event.key == pg.K_w:
            direct = "上"
        elif event.key == pg.K_s:
            direct = "下"
        elif event.key == pg.K_a:
            direct = "左"
        elif event.key == pg.K_d:
            direct = "右"
    pg.event.clear()

    if direct == '上':
        head[1] -= V
    if direct == '下':
        head[1] += V
    if direct == '左':
        head[0] -= V
    if direct == '右':
        head[0] += V

    if head[0] < 0:
        head[0] = 800
    if head[0] > 800:
        head[0] = 0
    if head[1] < 0:
        head[1] = 600
    if head[1] > 600:
        head[1] = 0

    snacks.insert(0, head.copy())
    snacks.pop()

#以下是智能蛇的部分_______________________________________________________________________________________
#接近目标
    #蛇头在食物 左 towards = 0  或  上 towards = 1
    if thead[which] < want[which] - R:
        run = V
        #蛇头在食物 右 towards = 0  或  下 towards = 1
    elif thead[which] > want[which] + R:
        run = -V
        #什么时候换方向
    else:
        which = 1 - which
#蛇的运动
    thead[which] += run
    other.insert(0, thead.copy())
    other.pop()

#吃到食物_______智能蛇 和 贪吃蛇_____________________________________________________________________________
    for food in foods:
        #把食物画出来
        pg.draw.circle(SCREEN, (238, 180, 34), (food[0], food[1]), R)
        #如果贪吃蛇吃到食物
        if food[0] - R - A <= head[0] <= food[0] + R and food[1] - R - A <= head[1] <= food[1] + R:
            #删除食物
            foods.remove(food)
            #蛇身增长
            snacks.append([head[0] - A, head[1]])
            #吃到的就是目标食物
            if food == want:
                #换一个目标
                want = choice(foods)
        #如果智能蛇吃到食物
        elif food[0] - R - A <= thead[0] <= food[0] + R and food[1] - R - A <= thead[1] <= food[1] + R:
            #删除食物
            foods.remove(food)
            #追加食物
            other.append([thead[0] - A, thead[1]])
            #吃到的就是目标食物
            if food == want:
                #换一个目标
                want = choice(foods)
#追加食物
    if len(foods) < 4:
        foods.append((randint(0, 750), randint(0, 550)))

#安排就绪后绘制
    for snack in snacks[1:]:
        pg.draw.rect(SCREEN, (100, 200, 200), (snack[0], snack[1], A, A))
    pg.draw.rect(SCREEN, (0, 255, 255), (head[0], head[1], A, A))

    for the in other[1:]:
        pg.draw.rect(SCREEN, (0, 238, 118), (the[0], the[1], A, A))
    pg.draw.rect(SCREEN, (0, 139, 69), (thead[0], thead[1], A, A))

    pg.display.update()
    pg.time.Clock().tick(20)
pg.quit()

image

3.实验问题及解决

1.下载pygame报错
本来以为和windows一样,没想到遇到了诸多困难。
首先是EularOS和一般的linux一样自带一个Python2.7和python3.7。而它默认的python是python2.7因此很容易搞混。python2.7有诸多语法和python3不同,因此python3脚本多半是不能被python2执行的。此处很容易弄错。
image
用下面这两个命令检查一下

whereis python3

whereis pip3

用下面的命令可以查看python3和pip3的路径,这个V代表version

python3 -V

pip3 -V

检查没问题的话就可以用下面的命令执行文件

python3 file.py

服务器里的pip是系统级的,有很高的权限,叫pip3.7,但这个pip3.7一下载就报错
如下载lxml
image

如下载pygame
image
要解决这个问题就得自己再下一个pip3

2.运行报错
pygame和tkinter, turtle一样,运行时会产生窗口,如果没有可用的屏幕,就会引发error
image
在turtle或tkinter中也是一样的
image

为解决此问题需要为putty配置xming。
image

再登录putty

4.实验感悟与思考

近些天来学python想动手写一个贪吃蛇小游戏,知乎网传贪吃蛇AI算法,贪吃蛇自动觅食。如果作为AI练习尚可,要是用来做游戏未免大材小用了。因此我就想用一种简单的办法让电脑也能控制蛇的觅食。

5.参考资料

6.结课感想与体会

高中的时候我对化学生物很感兴趣,本来没打算报计算机。但由于后来在填志愿时,我还是选择了计算机。但是我从来没接触过这个领域,又听说计算机很难,对数学要求高。于是我开始在网上查资料,最后了解到Python是最简单的语言,而且它已经被列入浙江信息技术高考了。于是我开始专心学Python。

我发现Python并没有我想象得那么简单,它是一门强类型语言。而且安装过程也比较繁琐。但在学Python的过程中,我学会了写游戏,会做界面。这一切都让我感受到了创作的乐趣。

在这一学期,感谢老师的倾囊相授。一开始我觉得老师教得好简单,都是之前学过的。但是到了正则表达式的时候我才发现Python这么陌生,到了爬虫的时候我又感觉到难度了。毕竟之前从来没学过。不过万事总是开头难而熟能生巧。多写几次,多练几次。Python又是很亲切的了。(本来实验想写爬虫的,但是比起这个我还是游戏更擅长)

最后建议老师在讲的同时把代码发群里,这样更容易让我们跟上进度。

posted on 2022-05-27 18:13  亦知亦行  阅读(133)  评论(0编辑  收藏  举报