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!!!

参考资料

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!!!

参考资料

------------恢复内容结束------------

posted @ 2022-05-27 20:34  今天晚上吃什么好  阅读(197)  评论(0编辑  收藏  举报