20212217刘恒谦 2022-2022-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2122
姓名: 刘恒谦
学号:20212217
实验教师:王志强
实验日期:2022年5月28日
必修/选修: 公选课
1.实验内容
2. 实验过程及结果
1.购买云服务器
此步比较简单,完成如图所示的配置即可。注意的是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即可看见窗口了。
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()
3.实验问题及解决
1.下载pygame报错
本来以为和windows一样,没想到遇到了诸多困难。
首先是EularOS和一般的linux一样自带一个Python2.7和python3.7。而它默认的python是python2.7因此很容易搞混。python2.7有诸多语法和python3不同,因此python3脚本多半是不能被python2执行的。此处很容易弄错。
用下面这两个命令检查一下
whereis python3
whereis pip3
用下面的命令可以查看python3和pip3的路径,这个V代表version
python3 -V
pip3 -V
检查没问题的话就可以用下面的命令执行文件
python3 file.py
服务器里的pip是系统级的,有很高的权限,叫pip3.7,但这个pip3.7一下载就报错
如下载lxml
如下载pygame
要解决这个问题就得自己再下一个pip3
2.运行报错
pygame和tkinter, turtle一样,运行时会产生窗口,如果没有可用的屏幕,就会引发error
在turtle或tkinter中也是一样的
为解决此问题需要为putty配置xming。
再登录putty
4.实验感悟与思考
近些天来学python想动手写一个贪吃蛇小游戏,知乎网传贪吃蛇AI算法,贪吃蛇自动觅食。如果作为AI练习尚可,要是用来做游戏未免大材小用了。因此我就想用一种简单的办法让电脑也能控制蛇的觅食。
5.参考资料
6.结课感想与体会
高中的时候我对化学生物很感兴趣,本来没打算报计算机。但由于后来在填志愿时,我还是选择了计算机。但是我从来没接触过这个领域,又听说计算机很难,对数学要求高。于是我开始在网上查资料,最后了解到Python是最简单的语言,而且它已经被列入浙江信息技术高考了。于是我开始专心学Python。
我发现Python并没有我想象得那么简单,它是一门强类型语言。而且安装过程也比较繁琐。但在学Python的过程中,我学会了写游戏,会做界面。这一切都让我感受到了创作的乐趣。
在这一学期,感谢老师的倾囊相授。一开始我觉得老师教得好简单,都是之前学过的。但是到了正则表达式的时候我才发现Python这么陌生,到了爬虫的时候我又感觉到难度了。毕竟之前从来没学过。不过万事总是开头难而熟能生巧。多写几次,多练几次。Python又是很亲切的了。(本来实验想写爬虫的,但是比起这个我还是游戏更擅长)
最后建议老师在讲的同时把代码发群里,这样更容易让我们跟上进度。