20212211 实验四 Python综合实践
20212211 2021-2022-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2122
姓名: 彭派
学号:20212211
实验教师:王志强
实验日期:2022年5月22日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
1.运用python编写2048小游戏
游戏规则:移动方块,数字相同的方块合并数字相加,
同时加上分数,达到2048即为游戏胜利,也可以选择冲击更高的分数!
游戏代码如下
`
import turtle, random
class BackGround(turtle.Turtle): # 定义一个类,用来画除了数字方块之外的图形
def __init__(self):
super().__init__()
self.penup()
self.ht()
def draw_block(self):
self.shape('bg.gif') # 画出背景方块
for i in allpos:
self.goto(i)
self.stamp()
self.color('white', 'white') # 画出其他背景
self.goto(-215, 120)
self.begin_fill()
self.goto(215, 120)
self.goto(215, 110)
self.goto(-215, 110)
self.end_fill()
self.shape('title.gif')
self.goto(-125, 210)
self.stamp()
self.shape('score.gif')
self.goto(125, 245)
self.stamp()
self.shape('top_score.gif')
self.goto(125, 170)
self.stamp()
def judge(self): # 游戏失败及达成2048的提示文字
global flag_win, flag_win_lose_text
self.color('blue')
judge = 0 # 判断是否还有位置可以移动
for i in block_dic.values():
for j in block_dic.values():
if i.num == 0 or i.num == j.num and i.distance(j) == 100:
judge += 1
if judge == 0: # 无位置可移动,游戏失败
self.write(' GAME OVER\n重新开始请按空格键', align='center', font=('黑体', 30, 'bold'))
flag_win_lose_text = False
if flag_win is True: # 此条件让2048达成的判断只能进行一次
for k in block_dic.values():
if k.num == 2048: # 游戏达成
flag_win = False
self.write(' 达成2048\n继续游戏请按回车键', align='center', font=('黑体', 30, 'bold'))
flag_win_lose_text = False
def win_lose_clear(self): # 游戏失败及达成2048提示文字clear
global flag_win_lose_text
self.clear()
flag_win_lose_text = True
def show_score(self): # 分值的显示
global score, top_score
if score > top_score:
top_score = score
with open('.\\score.txt', 'w') as f:
f.write(f'{top_score}')
self.color('white')
self.goto(125, 210)
self.clear()
self.write(f'{score}', align='center', font=('Arial', 20, 'bold'))
self.goto(125, 135)
self.write(f'{top_score}', align='center', font=('Arial', 20, 'bold'))
class Block(turtle.Turtle): # 数字方块类
def __init__(self):
super().__init__()
self.ht()
self.penup()
self.num = 0
def draw(self):
self.clear()
dic_draw = {2: '#eee6db', 4: '#efe0cd', 8: '#f5af7b',
16: '#fb9660', 32: '#f57d5a', 64: '#f95c3d',
128: '#eccc75', 256: '#eece61', 512: '#efc853',
1024: '#ebc53c', 2048: '#eec430', 4096: '#aeb879',
8192: '#aab767', 16384: '#a6b74f'}
if self.num > 0: # 数字大于0,画出方块
self.color(f'{dic_draw[self.num]}') # 选择颜色
self.begin_fill()
self.goto(self.xcor()+48, self.ycor()+48)
self.goto(self.xcor()-96, self.ycor())
self.goto(self.xcor(), self.ycor()-96)
self.goto(self.xcor()+96, self.ycor())
self.goto(self.xcor(), self.ycor()+96)
self.end_fill()
self.goto(self.xcor()-48, self.ycor()-68)
if self.num > 4: # 按照数字选择数字的颜色
self.color('white')
else:
self.color('#6d6058')
self.write(f'{self.num}', align='center', font=('Arial', 27, 'bold'))
self.goto(self.xcor(), self.ycor()+20)
class Game():
def init(self):
back = BackGround() # 实例画出游戏的背景
back.draw_block()
for i in allpos: # 画出16个海龟对应16个数字块
block = Block()
block.goto(i)
block_dic[i] = block
game.grow()
def restart(self): # 重开游戏的方法
global score, flag_win_lose_text
score = 0
for i in block_dic.values():
i.num = 0
i.clear()
win_lose_text.clear()
game.grow()
flag_win_lose_text = True # 此flag为游戏达成或失败出现提示语后的判断,要提示语被clear后才能继续move
def grow(self): # 随机出现一个2或4的数字块
block_list = []
for i in allpos:
if block_dic[i].num == 0:
block_list.append(block_dic[i]) # 挑出空白方块的海龟
turtle_choice = random.choice(block_list) # 随机选中其中一个海龟
turtle_choice.num = random.choice([2, 2, 2, 2, 4]) # 赋属性num=2/4
turtle_choice.draw()
win_lose_text.judge()
show_score_text.show_score()
ms.update()
def move_up(self):
allpos1 = allpos[::4] # 切片为四列
allpos2 = allpos[1::4]
allpos3 = allpos[2::4]
allpos4 = allpos[3::4]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_down(self):
allpos1 = allpos[-4::-4]
allpos2 = allpos[-3::-4]
allpos3 = allpos[-2::-4]
allpos4 = allpos[-1::-4]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_left(self):
allpos1 = allpos[:4]
allpos2 = allpos[4:8]
allpos3 = allpos[8:12]
allpos4 = allpos[12:16]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_right(self):
allpos1 = allpos[-1:-5:-1]
allpos2 = allpos[-5:-9:-1]
allpos3 = allpos[-9:-13:-1]
allpos4 = allpos[-13:-17:-1]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_move(self, allpos1, allpos2, allpos3, allpos4):
if flag_win_lose_text is True:
count1 = self.move(allpos1) # 四列或四行依次移动
count2 = self.move(allpos2)
count3 = self.move(allpos3)
count4 = self.move(allpos4)
if count1 or count2 or count3 or count4: # 判断是否有方块移动,有才能继续出现新的数字块
self.grow()
def move(self, pos_list):
num_list = [] # 为某一列或行的数字块海龟的坐标
for i in pos_list:
num_list.append(block_dic[i].num) # 把这些海龟的NUM形成list
new_num_list, count = self.list_oper(num_list) # 只是list_oper的方法形成新的list
for j in range(len(new_num_list)): # 把新的list依次赋值给对应的海龟.num属性并调用draw()方法
block_dic[pos_list[j]].num = new_num_list[j]
block_dic[pos_list[j]].draw()
return count
def list_oper(self, num_list): # num_list的操作,假设其为【2,0,2,2】
global score
count = True
temp = []
new_temp = []
for j in num_list:
if j != 0:
temp.append(j) # temp=[2,2,2]
flag = True
for k in range(len(temp)):
if flag:
if k < len(temp)-1 and temp[k] == temp[k+1]:
new_temp.append(temp[k]*2)
flag = False
score += temp[k]
else:
new_temp.append(temp[k]) # new_temp=[4,2]
else:
flag = True
for m in range(len(num_list)-len(new_temp)):
new_temp.append(0) # new_temp=[4,2,0,0]
if new_temp == num_list:
count = False # 此变量判断num_list没有变化,数字块无移动
return(new_temp, count)
if __name__ == '__main__':
ms = turtle.Screen() # 主窗口的设置
ms.setup(430, 630, 400, 50)
ms.bgcolor('gray')
ms.title('2048')
ms.tracer(0)
ms.register_shape('bg.gif')
ms.register_shape('title.gif')
ms.register_shape('score.gif')
ms.register_shape('top_score.gif')
block_dic = {} # 放数字方块海龟的字典,位置坐标为key,对应海龟为value
allpos = [(-150, 50), (-50, 50), (50, 50), (150, 50),
(-150, -50), (-50, -50), (50, -50), (150, -50),
(-150, -150), (-50, -150), (50, -150), (150, -150),
(-150, -250), (-50, -250), (50, -250), (150, -250)]
flag_win = True # 达成2048的判断,让达成的文字仅出现一次
flag_win_lose_text = True # 用来判断失败或成功的提示文字是否有被清除,不清除不能继续移动方块
score = 0
with open('.\\score.txt', 'r') as f:
top_score = int(f.read()) # 读取score中的数据
show_score_text = BackGround()
win_lose_text = BackGround()
game = Game()
game.init()
ms.listen()
ms.onkey(game.move_up, 'Up')
ms.onkey(game.move_down, 'Down')
ms.onkey(game.move_left, 'Left')
ms.onkey(game.move_right, 'Right')
ms.onkey(win_lose_text.win_lose_clear, 'Return')
ms.onkey(game.restart, 'space')
ms.mainloop()
`
2. 代码分析
1. 主窗口的设计
设置主窗口
添加图片素材
设置好坐标
计分
监听键盘输入
2. 游戏显示界面的设置
画出游戏的主要背景
画出游戏中的方块,并根据数字来填充不同的颜色
3. 游戏主要进程
首先画好游戏背景
游戏开始,随机出现数字方块
游戏主要模块,方块的移动
首先通过切片将其切成四片,使其移动时一块一块的移动,此处以向上移动为例
然后进入move_move,判断游戏是否继续进行,然后进行方块的移动
把方块的坐标形成list
list_oper是对num_list的操作
首先将num_list中不为0的数挑出来成temp[]
然后将所有相同的数字两两相加,形成新的temp[]并加上分数
然后补齐移动过后产生的空格,这样新的list就形成了
通过list_oper,形成新的list后,进行赋值,画方块颜色
move移动完后判断是否移动,然后返回grow,再次随机生成,继续游戏
分数的记录,最高分的刷新
4. 游戏失败或达成2048的条件
判断是否还有位置移动,如果有继续,没有就是游戏失败
达到2048显示文字,继续或者结束游戏
然后清除显示的文字
5. 游戏重新开始
输入空格,重新开始游戏
重新运行游戏
3. 小游戏运行界面
如图所示
然后按上键,可以看到,两个2的方块合并为一个4方块,然后新生成一个2的方块,同时记录了分数
游戏失败界面
4. 用putty在云服务器上运行该文件(游戏时间!!!!
3. 实验过程中遇到的问题和解决过程
- 问题1:不会在服务器中进行文件的修改
- 问题1解决方案:上网查找资料
- 问题2:turtle安装出错
- 问题2解决方案:因为turtle为python2中的库,所以将将pip install改为pip3 install即可正常安装
- 问题3:文件无法在服务器上用python2运行
- 问题3解决方案:安装python3后用python3来运行
- 问题4:配置python3环境时出现未知错误,无法正常安装
- 问题4解决方案:上网查找资料
- 问题5:云服务器上无法显示tuetle的窗口
- 问题5解决方案:安装xming
- 问题6:在云服务器上运行时文件报错
- 问题6解决方案:将“with open('.//score.txt', 'r') as f:”改为“with open('score.txt', 'r') as f:”
4. 课程小结
身为一名网空系的学生,其实在程序与设计这门课上就已经学习了一门编程语言(就是C语言啦)。还记得第一次上课的时候,志强老师说这门课对于二系的学生来说,其实没有选修的必要(大概意思是这样吧?),但是我觉得对于我这样一个编程初学者而言,python这门选修课还是带给了我很多。如果我只学了C语言,那么我将无法体会到python的方便与快捷,如果我只学了python,那么我将无法体会到C语言规范的美丽。第二门编程语言的学习不仅让我又掌握了一个语言,也让我对编程语言有了更加深刻的认识。
刚开始学习的时候并没有感觉到python与C语言有什么不同,除了语句有点小区别,输入输出、数据类型、条件控制、循环语句,逻辑上和C语言是一样的。学到序列那一部分的时候,有点晕,列表、元组、字典、集合,感觉比C语言的数组要花哨好多(当时C语言还没学到数组),不过全部学下来还是很有成就感的。字符串还可以接受,学正则表达式的时候,一开始并不能充分理解,程序运行也老是不对,不能提取出正确的信息,把老师上传的资料来来回回看了还好几遍,终于搞明白是怎么一回事。这部分内容,在理解过后,然后直接用资料里的语句,感觉非常好用!学到这里的时候,已经感觉到有一些难度了(我才只是一个大一的孩子..),有些东西已经超出理解范围了。真正体会到python与C语言的不同(可以说是面向对象的语言与面向过程的语言的不同),是在学习面向对象程序设计的时候(封装!继承!多态!上完课记得最清楚的哈哈哈哈),“类”这种概念是在学习C语言的时候没有接触到的,当时就是打开了新世界的感觉(一开始也不是很能理解),后来明白了,感觉这个东西很有趣。学习套接字的时候找了很多资料(因为是完全没听过的东西),简单来说就是两个服务器之间的连接吧(我是这么理解的..)。同时学习了一下文件的操作(相比之下,这个简单很多)。模块与异常操作提升了文件的可执性,,也让我看懂了网上的许多代码。在数据库之后就是爬虫,这个时候体会到了python的魅力。只要几行代码就可以实现强大的功能(不知道别的语言行不行,反正C语言是不大行),实在是太神奇了!
不过最后的作业做下来,感触还是很多的。尤其是这次实验,要在华为云服务器上运行,上C语言课的时候也有做华为云服务器,不过做C语言的时候有老师的指导手册,但是在这次做python的过程就是自己做了。从安装python3,配置python3的环境,到安装turtle模块,中间有很多次尝试,很多次失败。然后发现程序能运行了,但是没有显示的窗口,上网找资料过后,终于找到了解决办法,安装配置了xming,终于有显示的窗口了,当时的心情很激动。看着运行的程序,成就感满满。其实呢,我觉得这样的作业,完全靠自己从头到尾做出来,感觉是很不一样的。对于云服务器的操作又更熟悉了一些,虽然感觉这个东西不是很容易,但是我相信,在不懈的努力之下,我也可以像大佬们一样的!
在学习编程语言的时候,会遇到很多很多问题,而且都是自己一开始都解决不了的,这就要求我上网去找资料,寻找解决办法,过程总是很痛苦,解决之后还是很开兴的。在这样的过程中,不断地学习解决问题的方法,一开始总是看不懂报错,到后来可以自己调试一些程序。在这个学期里,感觉到自己的不断进步,从一窍不通,到可以自己解决问题,这样的过程,快乐而痛苦……
最后,志强老师是个很好的老师!!!不愧是我们二系的老师!老师水平很高,笑容十分情亲切,尤其喜欢讲课(讲课!讲课!),讲的也很好,很生动有趣,虽然内容很难QAQ。遇到老师很幸运,学习python很幸福。这门课带给我的远不只是一种编程语言的知识,也让我在实践中体会不怕困难,勇敢而上的精神!!!
人生苦短,我学python!!!
参考资料
- centos怎么修改文件
- python入门可视化小游戏之2048
------------恢复内容开始------------
20212211 2021-2022-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2122
姓名: 彭派
学号:20212211
实验教师:王志强
实验日期:2022年5月22日
必修/选修: 公选课
1.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
2. 实验过程及结果
1.运用python编写2048小游戏
游戏规则:移动方块,数字相同的方块合并数字相加,
同时加上分数,达到2048即为游戏胜利,也可以选择冲击更高的分数!
游戏代码如下
`
import turtle, random
class BackGround(turtle.Turtle): # 定义一个类,用来画除了数字方块之外的图形
def __init__(self):
super().__init__()
self.penup()
self.ht()
def draw_block(self):
self.shape('bg.gif') # 画出背景方块
for i in allpos:
self.goto(i)
self.stamp()
self.color('white', 'white') # 画出其他背景
self.goto(-215, 120)
self.begin_fill()
self.goto(215, 120)
self.goto(215, 110)
self.goto(-215, 110)
self.end_fill()
self.shape('title.gif')
self.goto(-125, 210)
self.stamp()
self.shape('score.gif')
self.goto(125, 245)
self.stamp()
self.shape('top_score.gif')
self.goto(125, 170)
self.stamp()
def judge(self): # 游戏失败及达成2048的提示文字
global flag_win, flag_win_lose_text
self.color('blue')
judge = 0 # 判断是否还有位置可以移动
for i in block_dic.values():
for j in block_dic.values():
if i.num == 0 or i.num == j.num and i.distance(j) == 100:
judge += 1
if judge == 0: # 无位置可移动,游戏失败
self.write(' GAME OVER\n重新开始请按空格键', align='center', font=('黑体', 30, 'bold'))
flag_win_lose_text = False
if flag_win is True: # 此条件让2048达成的判断只能进行一次
for k in block_dic.values():
if k.num == 2048: # 游戏达成
flag_win = False
self.write(' 达成2048\n继续游戏请按回车键', align='center', font=('黑体', 30, 'bold'))
flag_win_lose_text = False
def win_lose_clear(self): # 游戏失败及达成2048提示文字clear
global flag_win_lose_text
self.clear()
flag_win_lose_text = True
def show_score(self): # 分值的显示
global score, top_score
if score > top_score:
top_score = score
with open('.\\score.txt', 'w') as f:
f.write(f'{top_score}')
self.color('white')
self.goto(125, 210)
self.clear()
self.write(f'{score}', align='center', font=('Arial', 20, 'bold'))
self.goto(125, 135)
self.write(f'{top_score}', align='center', font=('Arial', 20, 'bold'))
class Block(turtle.Turtle): # 数字方块类
def __init__(self):
super().__init__()
self.ht()
self.penup()
self.num = 0
def draw(self):
self.clear()
dic_draw = {2: '#eee6db', 4: '#efe0cd', 8: '#f5af7b',
16: '#fb9660', 32: '#f57d5a', 64: '#f95c3d',
128: '#eccc75', 256: '#eece61', 512: '#efc853',
1024: '#ebc53c', 2048: '#eec430', 4096: '#aeb879',
8192: '#aab767', 16384: '#a6b74f'}
if self.num > 0: # 数字大于0,画出方块
self.color(f'{dic_draw[self.num]}') # 选择颜色
self.begin_fill()
self.goto(self.xcor()+48, self.ycor()+48)
self.goto(self.xcor()-96, self.ycor())
self.goto(self.xcor(), self.ycor()-96)
self.goto(self.xcor()+96, self.ycor())
self.goto(self.xcor(), self.ycor()+96)
self.end_fill()
self.goto(self.xcor()-48, self.ycor()-68)
if self.num > 4: # 按照数字选择数字的颜色
self.color('white')
else:
self.color('#6d6058')
self.write(f'{self.num}', align='center', font=('Arial', 27, 'bold'))
self.goto(self.xcor(), self.ycor()+20)
class Game():
def init(self):
back = BackGround() # 实例画出游戏的背景
back.draw_block()
for i in allpos: # 画出16个海龟对应16个数字块
block = Block()
block.goto(i)
block_dic[i] = block
game.grow()
def restart(self): # 重开游戏的方法
global score, flag_win_lose_text
score = 0
for i in block_dic.values():
i.num = 0
i.clear()
win_lose_text.clear()
game.grow()
flag_win_lose_text = True # 此flag为游戏达成或失败出现提示语后的判断,要提示语被clear后才能继续move
def grow(self): # 随机出现一个2或4的数字块
block_list = []
for i in allpos:
if block_dic[i].num == 0:
block_list.append(block_dic[i]) # 挑出空白方块的海龟
turtle_choice = random.choice(block_list) # 随机选中其中一个海龟
turtle_choice.num = random.choice([2, 2, 2, 2, 4]) # 赋属性num=2/4
turtle_choice.draw()
win_lose_text.judge()
show_score_text.show_score()
ms.update()
def move_up(self):
allpos1 = allpos[::4] # 切片为四列
allpos2 = allpos[1::4]
allpos3 = allpos[2::4]
allpos4 = allpos[3::4]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_down(self):
allpos1 = allpos[-4::-4]
allpos2 = allpos[-3::-4]
allpos3 = allpos[-2::-4]
allpos4 = allpos[-1::-4]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_left(self):
allpos1 = allpos[:4]
allpos2 = allpos[4:8]
allpos3 = allpos[8:12]
allpos4 = allpos[12:16]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_right(self):
allpos1 = allpos[-1:-5:-1]
allpos2 = allpos[-5:-9:-1]
allpos3 = allpos[-9:-13:-1]
allpos4 = allpos[-13:-17:-1]
self.move_move(allpos1, allpos2, allpos3, allpos4)
def move_move(self, allpos1, allpos2, allpos3, allpos4):
if flag_win_lose_text is True:
count1 = self.move(allpos1) # 四列或四行依次移动
count2 = self.move(allpos2)
count3 = self.move(allpos3)
count4 = self.move(allpos4)
if count1 or count2 or count3 or count4: # 判断是否有方块移动,有才能继续出现新的数字块
self.grow()
def move(self, pos_list):
num_list = [] # 为某一列或行的数字块海龟的坐标
for i in pos_list:
num_list.append(block_dic[i].num) # 把这些海龟的NUM形成list
new_num_list, count = self.list_oper(num_list) # 只是list_oper的方法形成新的list
for j in range(len(new_num_list)): # 把新的list依次赋值给对应的海龟.num属性并调用draw()方法
block_dic[pos_list[j]].num = new_num_list[j]
block_dic[pos_list[j]].draw()
return count
def list_oper(self, num_list): # num_list的操作,假设其为【2,0,2,2】
global score
count = True
temp = []
new_temp = []
for j in num_list:
if j != 0:
temp.append(j) # temp=[2,2,2]
flag = True
for k in range(len(temp)):
if flag:
if k < len(temp)-1 and temp[k] == temp[k+1]:
new_temp.append(temp[k]*2)
flag = False
score += temp[k]
else:
new_temp.append(temp[k]) # new_temp=[4,2]
else:
flag = True
for m in range(len(num_list)-len(new_temp)):
new_temp.append(0) # new_temp=[4,2,0,0]
if new_temp == num_list:
count = False # 此变量判断num_list没有变化,数字块无移动
return(new_temp, count)
if __name__ == '__main__':
ms = turtle.Screen() # 主窗口的设置
ms.setup(430, 630, 400, 50)
ms.bgcolor('gray')
ms.title('2048')
ms.tracer(0)
ms.register_shape('bg.gif')
ms.register_shape('title.gif')
ms.register_shape('score.gif')
ms.register_shape('top_score.gif')
block_dic = {} # 放数字方块海龟的字典,位置坐标为key,对应海龟为value
allpos = [(-150, 50), (-50, 50), (50, 50), (150, 50),
(-150, -50), (-50, -50), (50, -50), (150, -50),
(-150, -150), (-50, -150), (50, -150), (150, -150),
(-150, -250), (-50, -250), (50, -250), (150, -250)]
flag_win = True # 达成2048的判断,让达成的文字仅出现一次
flag_win_lose_text = True # 用来判断失败或成功的提示文字是否有被清除,不清除不能继续移动方块
score = 0
with open('.\\score.txt', 'r') as f:
top_score = int(f.read()) # 读取score中的数据
show_score_text = BackGround()
win_lose_text = BackGround()
game = Game()
game.init()
ms.listen()
ms.onkey(game.move_up, 'Up')
ms.onkey(game.move_down, 'Down')
ms.onkey(game.move_left, 'Left')
ms.onkey(game.move_right, 'Right')
ms.onkey(win_lose_text.win_lose_clear, 'Return')
ms.onkey(game.restart, 'space')
ms.mainloop()
`
2. 代码分析
1. 主窗口的设计
设置主窗口
添加图片素材
设置好坐标
计分
监听键盘输入
2. 游戏显示界面的设置
画出游戏的主要背景
画出游戏中的方块,并根据数字来填充不同的颜色
3. 游戏主要进程
首先画好游戏背景
游戏开始,随机出现数字方块
游戏主要模块,方块的移动
首先通过切片将其切成四片,使其移动时一块一块的移动,此处以向上移动为例
然后进入move_move,判断游戏是否继续进行,然后进行方块的移动
把方块的坐标形成list
list_oper是对num_list的操作
首先将num_list中不为0的数挑出来成temp[]
然后将所有相同的数字两两相加,形成新的temp[]并加上分数
然后补齐移动过后产生的空格,这样新的list就形成了
通过list_oper,形成新的list后,进行赋值,画方块颜色
move移动完后判断是否移动,然后返回grow,再次随机生成,继续游戏
分数的记录,最高分的刷新
4. 游戏失败或达成2048的条件
判断是否还有位置移动,如果有继续,没有就是游戏失败
达到2048显示文字,继续或者结束游戏
然后清除显示的文字
5. 游戏重新开始
输入空格,重新开始游戏
重新运行游戏
3. 小游戏运行界面
如图所示
然后按上键,可以看到,两个2的方块合并为一个4方块,然后新生成一个2的方块,同时记录了分数
游戏失败界面
4. 用putty在云服务器上运行该文件(游戏时间!!!!
3. 实验过程中遇到的问题和解决过程
- 问题1:不会在服务器中进行文件的修改
- 问题1解决方案:上网查找资料
- 问题2:turtle安装出错
- 问题2解决方案:因为turtle为python2中的库,所以将将pip install改为pip3 install即可正常安装
- 问题3:文件无法在服务器上用python2运行
- 问题3解决方案:安装python3后用python3来运行
- 问题4:配置python3环境时出现未知错误,无法正常安装
- 问题4解决方案:上网查找资料
- 问题5:云服务器上无法显示tuetle的窗口
- 问题5解决方案:安装xming
- 问题6:在云服务器上运行时文件报错
- 问题6解决方案:将“with open('.//score.txt', 'r') as f:”改为“with open('score.txt', 'r') as f:”
4. 课程小结
身为一名网空系的学生,其实在程序与设计这门课上就已经学习了一门编程语言(就是C语言啦)。还记得第一次上课的时候,志强老师说这门课对于二系的学生来说,其实没有选修的必要(大概意思是这样吧?),但是我觉得对于我这样一个编程初学者而言,python这门选修课还是带给了我很多。如果我只学了C语言,那么我将无法体会到python的方便与快捷,如果我只学了python,那么我将无法体会到C语言规范的美丽。第二门编程语言的学习不仅让我又掌握了一个语言,也让我对编程语言有了更加深刻的认识。
刚开始学习的时候并没有感觉到python与C语言有什么不同,除了语句有点小区别,输入输出、数据类型、条件控制、循环语句,逻辑上和C语言是一样的。学到序列那一部分的时候,有点晕,列表、元组、字典、集合,感觉比C语言的数组要花哨好多(当时C语言还没学到数组),不过全部学下来还是很有成就感的。字符串还可以接受,学正则表达式的时候,一开始并不能充分理解,程序运行也老是不对,不能提取出正确的信息,把老师上传的资料来来回回看了还好几遍,终于搞明白是怎么一回事。这部分内容,在理解过后,然后直接用资料里的语句,感觉非常好用!学到这里的时候,已经感觉到有一些难度了(我才只是一个大一的孩子..),有些东西已经超出理解范围了。真正体会到python与C语言的不同(可以说是面向对象的语言与面向过程的语言的不同),是在学习面向对象程序设计的时候(封装!继承!多态!上完课记得最清楚的哈哈哈哈),“类”这种概念是在学习C语言的时候没有接触到的,当时就是打开了新世界的感觉(一开始也不是很能理解),后来明白了,感觉这个东西很有趣。学习套接字的时候找了很多资料(因为是完全没听过的东西),简单来说就是两个服务器之间的连接吧(我是这么理解的..)。同时学习了一下文件的操作(相比之下,这个简单很多)。模块与异常操作提升了文件的可执性,,也让我看懂了网上的许多代码。在数据库之后就是爬虫,这个时候体会到了python的魅力。只要几行代码就可以实现强大的功能(不知道别的语言行不行,反正C语言是不大行),实在是太神奇了!
不过最后的作业做下来,感触还是很多的。尤其是这次实验,要在华为云服务器上运行,上C语言课的时候也有做华为云服务器,不过做C语言的时候有老师的指导手册,但是在这次做python的过程就是自己做了。从安装python3,配置python3的环境,到安装turtle模块,中间有很多次尝试,很多次失败。然后发现程序能运行了,但是没有显示的窗口,上网找资料过后,终于找到了解决办法,安装配置了xming,终于有显示的窗口了,当时的心情很激动。看着运行的程序,成就感满满。其实呢,我觉得这样的作业,完全靠自己从头到尾做出来,感觉是很不一样的。对于云服务器的操作又更熟悉了一些,虽然感觉这个东西不是很容易,但是我相信,在不懈的努力之下,我也可以像大佬们一样的!
在学习编程语言的时候,会遇到很多很多问题,而且都是自己一开始都解决不了的,这就要求我上网去找资料,寻找解决办法,过程总是很痛苦,解决之后还是很开兴的。在这样的过程中,不断地学习解决问题的方法,一开始总是看不懂报错,到后来可以自己调试一些程序。在这个学期里,感觉到自己的不断进步,从一窍不通,到可以自己解决问题,这样的过程,快乐而痛苦……
最后,志强老师是个很好的老师!!!不愧是我们二系的老师!老师水平很高,笑容十分情亲切,尤其喜欢讲课(讲课!讲课!),讲的也很好,很生动有趣,虽然内容很难QAQ。遇到老师很幸运,学习python很幸福。这门课带给我的远不只是一种编程语言的知识,也让我在实践中体会不怕困难,勇敢而上的精神!!!
人生苦短,我学python!!!
参考资料
------------恢复内容结束------------