班级: 202134
姓名: 王佳慧
学号:20213413
实验教师:王志强
实验日期:2022年5月20日
必修/选修: 公选课
1.Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
2.作业包括(源代码、视频、综合实践报告)
注:在华为ECS服务器(OpenOuler系统)和物理机(Windows/Linux系统)上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
利用python制作人生中的第一个小游戏——飞机打气球,
内容主要为通过方向键控制飞机移动,空格键发射子弹打破从最上方往下飘来的气球,射中后气球爆炸并记一分。当气球与飞机齐平时游戏结束。
import math import pygame import random #引用随机模块使气球随机出现 #初始化 pygame.init() #1.创建游戏窗口(宽和高) screen = pygame.display.set_mode((815,815),0,32) #2.加片头文字 pygame.display.set_caption('飞机打气球') #3.添加图片 icon = pygame.image.load(r"C:\Users\86150\Desktop\飞机大战期末作业\背景图.jpg") pygame.display.set_icon(icon) bgImg = pygame.image.load(r"C:\Users\86150\Desktop\飞机大战期末作业\背景图.jpg") #4.添加背景音效 pygame.mixer.music.load('背景音乐1.wav') pygame.mixer.music.play(-1) #5.添加射中音效 bao_sound = pygame.mixer.Sound('击中.wav') #6.得分 score = 0 font = pygame.font.Font('freesansbold.ttf',32) def show_score(): text = f"SCORE:{score}" score_render = font.render(text,True,(255,255,255)) screen.blit(score_render,(10,10)) #7.游戏结束 is_over = False font1 = pygame.font.Font('freesansbold.ttf',85) def check_is_over(): if is_over: text = f"Game Over" render = font1.render(text,True,(255,0,0)) screen.blit(render,(150,815/2)) #8.创建一架飞机 playerImg = pygame.image.load(r"C:\Users\86150\Desktop\飞机大战期末作业\飞机.png") playerX = 815/2-197/2 playerY = 620 playerStep = 0 #玩家移动的速度 #9.创建气球类 number_of_enemies =6 class Enemy(): def __init__(self): #创建一个enemy的类用来创建多个气球 self.img = pygame.image.load('气球(1).png') self.x = random.randint(100,700) self.y = random.randint(0,100) self.step = random.randint(1,2) #当气球被射中时,秒投胎,回到最初的位置 def reset(self): self.x = random.randint(100,700) self.y = random.randint(0,100) enemies = [] #10.创建子弹类 number_of_enemies =6 class Bullet(): def __init__(self): #创建一个类用来创建多个子弹 self.img = pygame.image.load('激光.png ') self.x = playerX +34 self.y = playerY +10 self.step = 5#子弹运动速度 # 击中 def hit(self ): global score for e in enemies : if (distance(self.x, self.y, e.x, e.y) < 30): #嘿嘿!!射中啦!!! bao_sound.play() bullets.remove(self) e.reset() score = score + 1 print(score) bullets = []#保存现有的子弹 for i in range(number_of_enemies ): enemies .append(Enemy()) #11.两点之间的距离 根据欧几里得定理判断 def distance(bx,by,ex,ey): a = bx - ex b = by - ey return math.sqrt(a*a+b*b)#开根号的函数 #12.飞机设置 def move_player(): global playerX playerX += playerStep #控制飞机出界 815-197=618 if playerX > 618: playerX = 618 if playerX <0: playerX = 0 #13.显示子弹移动的函数 def show_bullets(): for b in bullets: screen.blit(b.img,(b.x,b.y)) b.hit()#判断是否击中气球 b.y -=b.step#移动子弹 #判断子弹是否出界 if b.y <0: bullets.remove(b) #14.显示气球移动的函数 def show_enemy(): global is_over for e in enemies: screen.blit(e.img,(e.x,e.y)) e.x += e.step if(e.x >815-73):# e.step += -0.5 e.y += 5 if (e.x < 0): e.step += 0.5 e.y += e.step#随即下沉 if e.y > 460: is_over = True enemies .clear() #15.游戏主循环,每一帧都画在循环里 running = True while running: #画出背景图 screen.blit(bgImg,(0,0)) show_score() #显示分数 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False #当按下键盘按键时,飞机移动 if event.type == pygame.KEYDOWN: #按下键盘上的按键 if event.key == pygame.K_RIGHT: playerStep = 1 elif event.key ==pygame.K_LEFT: playerStep = -1 elif event.key == pygame.K_SPACE: #创建连续子弹 bullets.append(Bullet()) #当不按时飞机停止运动 if event.type == pygame.KEYUP: playerStep = 0 #给飞机设置坐标,并且能够实现左右移动 screen.blit(playerImg, (playerX, playerY)) #用函数移动飞机 move_player() #用函数显示气球 show_enemy() #用函数显示子弹 show_bullets() #检查游戏否结束 check_is_over() #界面更新,而且要放在最后。 pygame.display.update()
问题1.在制作游戏界面的时候,刚一打开就会闪退
解决方案:在视频教程的指导下,明白要使用循环语句才能使显示窗口的代码进入死循环。
问题2.鼠标进入游戏界面时程序卡死,显示未响应
原因:鼠标点×退出界面、键盘控制飞机移动都是被响应的事件,而程序暂时没有处理的代码
解决方案:加入代码pygame.event.get()
问题3.计算飞机的位置
问题4.气球会从左边界面飞出去
原因:在控制气球飞出界面时没注意enemyX<0 的情况,导致气球从左边飞出去
解决方案:修改代码,将左边和右边的情况分别列出:
enemyX += enemyStep
if(enemyX >815-73):
enemyStep += -0.5
if (enemyX < 0):
enemyStep += 0.5
问题5.在击中气球后分数不会增加
错误原因:没有添加global,就不能改变外面定义的score=0
解决方案:添加global score
问题6.在设置了游戏结束之后却没有游戏结束的字样出现
原因:没有将is_over 设置为全局变量
解决方案:在前面将is_over 设置为全局变量就可以调用了
问题7.python版本是2.7.16,但不会安装新版本
解决方法:查找百度,直接在putty里安装
先利用 wget https://www.python.org/ftp/python/3.6.1Python-3.tar.xz 下载安装包
再利用xz -d Python-3.6.1.tar.xz 解压xz结尾的文件
tar xvf Python-3.6.1.tar
然后再安装配置、编译、安装、注意要导入安装zlib相关的工具包。最终安装成功。
问题8.安装过程中进入文本编辑模式退不出来
解决方案:百度查找,发现应该先按一下[ESC]键(有时要多按两下),然后执行:q!
问题9.最后运行中报错 SyntaxError: Non-ASCII character ‘\xe5‘ in file
原因:这是因为使用中文输出或注释时运行脚本的时候导致的问题。因为python默认的编码文件是ASCII码,但是代码中使用中文或者非英语字符,
解决方法:第一种最最简单的方法就是去文件里把中文部分处理掉,但我的注释很重要,不想动它,因此参考以下几种方法:
在每个源文件的基础上,使用文件顶部的特殊注释声明编码,使python源代码编码既可见又可更改。为了让python知道这个编码声明,对于处理python源代码数据,需要进行一些概念更改。
(注意:要定义源代码编码时,必须将一个提示放到文件的第一行或第二行。)
(在python官网找到解决方法)
最终利用WinSCP和Putty在华为云的虚拟机上搞一下
作为一名对电脑键盘还在二指禅的电脑小白,同时学习C语言和python是一件很困难的事情,我常常会把C语言中的printf和python的print搞混,也会在写python的for语句时后面忘记加 :而在C语言中加上 :,不仅如此,对于许多问题的解决思路和流程有时候我是真想象不出来(尤其是C)。
不过学习最好的品质就是不放弃,我曾经问过比较擅长python的刘恒谦同学,他说学习python的时候最好要做出一个东西来,我也有幸和志强老师聊过,老师也给出了很多宝贵意见,我们学习python的一大原因是,我们能够利用python做出一些实用的好玩的小东西,就比如做一个主动提醒打卡的小闹钟,一个一键打卡的小程序,一个经典好玩的小游戏,即使在做的过程中会面临许多问题,但最终做出来的时候的喜悦感、成就感是难以言喻的。
在这次期末作业的综合实验中我真切地感受到做出一个能控制能发声的小游戏时的快乐以及在做游戏,敲代码,解决错误,完善代码的痛苦,也深深地感受到在随着做一个具体的东西的过程能够学习到很多东西,也能够十分全面地复习原来学过的知识。比如:
(1)在用python制作小游戏的时候要记得引入pygame模块才能更好地制作;在后期需要气球随机出现需要引入random模块;在后期计算气球和子弹的距离时需要用到math库里的函数。
(2)创建游戏窗口需要screen;在窗口里添加背景图片需要用到 pygame.image.load() ;在调取图片时要注意绝对路径和相对路径的区别;
(3)添加音效要用到 pygame.mixer.music.load();音乐循环要用到 pygame.mixer.music.play(-1)
(4)在界面显示文字要用到 font; 文字的颜色改变需要用到三原色原理,如:(255,0,0)为红色;
(5)为了使循环里的代码简洁清晰,可以将所需要的分别设为函数模块,提前将想实现的功能写出来,需要调用时直接一行代码就可以解决。比如下面这一个都是直接调用的前面写的函数,很好理解;不过要注意不要忘记调用,我有好几次在前面写好了函数,结果没放到循环里调用,导致最终显示不出来那个功能。
(6)创建类:因为需要创建多个气球和子弹,所以需要创建许多相似的。正好与之前学过的类,序列有关系。
(7)想要实现键盘控制界面的飞机、子弹需要调用 event.type == pygame.KEYDOWN 之类的,(我感觉这是小游戏的灵魂所在,又学到一个新知识,( •̀ ω •́ )y)
(8)想法要有创新,就比如如何判断子弹打到了气球,一开始我是完全没有思路的,但是讲解中发现就是判断两者的距离小于某个值就可以了,简单又好用。
最后的最后,还是十分感谢老师一学期的讲解,真的学到了很多,也让我感受到python比C语言便捷多了(真哒),最重要的一点是在这次做游戏的过程中,我体会到了学编程的快乐,能够做出小游戏来成就感满满的(可以和弟弟妹妹们小小地炫耀一波),到寒假我会继续优化我这个小游戏,初步想法是搞个可以上下移动的,有封面的,有结束界面的,结束时会有game over的声音的飞机大战游戏。或者再学一个植物大战僵尸(嘿嘿,可以向弟弟妹妹炫一下)。
就到这里吧,祝志强老师越来越帅,假期快乐!!!