diff --git a/www/.idea/.gitignore b/www/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/www/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/www/.idea/.name b/www/.idea/.name new file mode 100644 index 0000000..11a5d8e --- /dev/null +++ b/www/.idea/.name @@ -0,0 +1 @@ +main.py \ No newline at end of file diff --git a/www/.idea/inspectionProfiles/profiles_settings.xml b/www/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/www/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/www/.idea/misc.xml b/www/.idea/misc.xml new file mode 100644 index 0000000..bfee43e --- /dev/null +++ b/www/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/www/.idea/modules.xml b/www/.idea/modules.xml new file mode 100644 index 0000000..ef47c9d --- /dev/null +++ b/www/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/www/.idea/paoku_game.iml b/www/.idea/paoku_game.iml new file mode 100644 index 0000000..6755f30 --- /dev/null +++ b/www/.idea/paoku_game.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/www/.idea/vcs.xml b/www/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/www/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/www/main.py b/www/main.py new file mode 100644 index 0000000..33892c3 --- /dev/null +++ b/www/main.py @@ -0,0 +1,197 @@ +import pygame, sys +import random +class Person(): # 金枪小帅的属性 + def __init__(self, surf=None, y=None): + self.surface = surf#初始化surface对象 + self.y = y # y坐标 + self.w = surf.get_width()/ 12 # 宽度 + self.h = surf.get_height() / 2 # 高度 + self.cur_frame = -1 # 当前的运动状态帧 + self.state = 0 # 0代表跑步状态,1代表跳跃状态,2代表连续跳跃 + self.gravity = 1 # 重力加速度 + self.velocity_y = 0 # y方向的速度 + self.vy_start = -20 # 起跳开始速度 + + def getPos(self): # 获取当前的位置坐标,用于碰撞检测,是否与障碍物坐标一致 + return (0, self.y + 12, self.w, self.h)#0表y向的速度, + + +class Obstacle(object): # 障碍物的属性 + def __init__(self, surf, x=0, y=0): + self.surface = surf#初始化surface对象 + self.x = x#放置的x坐标 + self.y = y#放置的y坐标 + self.w = surf.get_width()#获取宽度 + self.h = surf.get_height()#获取高度 + self.cur_frame = random.randint(0, 7) # 随机获取一种障碍物的类型,共7种类型 + self.w = 100#设置初始宽度 + self.h = 100#设置初始高度 + + def getPos(self): # 获取人物角色金枪小帅或者障碍物(当前的)坐标信息,分别是x坐标,y坐标,宽度w,高度h + return (self.x, self.y, self.w, self.h)#返回坐标信息 + + def judgeCollision(self, rect1, rect2): # 碰撞检测,即是判断金枪小帅和障碍物的坐标是否一致,以及考虑障碍物的大小 + if (rect2[0] >= rect1[2] - 20) or (rect1[0] + 40 >= rect2[2]) or (rect1[1] + rect1[3] < rect2[1] + 20) or ( + rect2[1] + rect2[3] < rect1[1] + 20): + return False + return True + + +class BackGround(object): # 背景类属性设计,继承于object + def __init__(self, surf): + self.surface = surf # 初始化Surface对象 + self.dx = -10 + self.w = surf.get_width() # 返回 Surface 对象的宽度 + self.rect = surf.get_rect() # 获取 Surface 对象的矩形区域 + + +class PaoKu(object):#游戏运作过程 + def __init__(self): + pygame.init()#初始化Pygame所有模块 + pygame.mixer.init()#初始化Pygame的声音混合器模块 + + self.width = 1200 # 设置游戏窗口宽度 + self.height = 500 # 设置游戏窗口高度 + self.size = (self.width, self.height)#保存初始设置宽度,高度 + self.screen = pygame.display.set_mode(self.size)#调用pygame.display打开size内容大小的窗口 + pygame.display.set_caption('ygc0417版本跑酷小游戏!')#调用display.set_caption设置游戏的title内容 + self.score = 0 # 游戏取得的分数 + self.font1 = pygame.font.Font("resource/simkai.ttf", 32) # 字体文件问题处理 + self.font2 = pygame.font.Font("resource/simkai.ttf", 64) # 字体文件问题处理 + self.obstacle_pic = pygame.image.load("resource/obstacles.png").convert_alpha() # 从image下载障碍物图片,convert_alpha转变成字母 + self.game_over = pygame.image.load("resource/gameover.bmp").convert_alpha() # 从image下载游戏结束图片,convert_alpha转变成字母 + self.bg = BackGround(pygame.image.load("resource/bg.png").convert_alpha()) # 从image下载背景对象作BackGround类的对象(convert_alpha转变成字母) + self.person = Person(pygame.image.load("resource/person.png").convert_alpha(), 500 - 85) # 从image下载人物对象图片(convert_alpha转变成字母) + self.screen.blit(self.bg.surface, [0, 0]) # 初始化游戏背景,初始坐标(0,0) + + self.obstacle_list = [] # 以空列表作障碍物对象数组 + self.game_state = 0 # 设置游戏状态:0表示游戏中,1表示游戏结束 + self.life = 3 # 初始的生命值,假如是3,即是可以碰撞的次数,为0则游戏自动结束,重新开始计分数 + self.clock = pygame.time.Clock() # pygame.time.Clock从系统时间来用来时钟记时,用clock记录 + self.bg_music = pygame.mixer.Sound(r"resource\bgm.wav").play(0, 0, 0) # 循环播放音乐 + + def startGame(self, screen): # 开始游戏界面设置的函数 + gameStart = pygame.image.load("resource/start1new.png")#从image下载开始游戏界面的图片给gameStart + screen.blit(gameStart, (0, 0))#调用blit放置开始游戏界面的背景图,初始化(0,0)坐标 + font = pygame.font.SysFont("resource/simkai.ttf", 70) # 设置字体格式 + tip = font.render("Press Any Key To Start!, Press Esc To Quit", True, (65, 105, 225))#调用font.render()显示游戏开始的提示内容 + screen.blit(tip, (self.width / 2 - 550, self.height / 2 + 150))#tip提示内容放置在窗口位置的设置 + pygame.display.update()#调用pygame.display.update()更新整个屏幕显示 + while True:#设置一个无限循环 + for event in pygame.event.get(): # 关闭窗口的位置 + if event.type == pygame.QUIT:#操作event.type=256后满足条件,退出游戏 + self.terminate()#调用游戏结束函数terminate() + elif event.type == pygame.KEYDOWN:#操作event.type=768后满足条件,退出游戏 + if (event.key == pygame.K_ESCAPE): # 按下ESC键退出游戏 + self.terminate()#调用游戏结束函数terminate() + else: + return + def addObstacle(self): # 添加障碍物函数设置,相当于游戏的困难程度 + rate = 3 + #是否生成障碍物 + if not random.randint(0, 300) < rate:#避免生成多余设置的障碍物,多余设置的数量就返回开始游戏阶段 + return#返回上一步 + y = random.choice([self.height - 100, self.height - 200, self.height - 300, self.height - 400])#调用choice()随机设置y坐标 + obstacle = Obstacle(self.obstacle_pic, self.width + 40, y)#随机获取障碍物图片,并且设置它在窗口的坐标 + self.obstacle_list.append(obstacle)#将获取的障碍物添加到obstacle_list空列表内 + # 监听键盘事件,并做处理 + def ListenKeyBoard(self): # 键盘事件处理函数设置 + for event in pygame.event.get(): + if event.type == pygame.QUIT:#256判断条件 + sys.exit()#退出系统函数 + elif event.type == pygame.KEYDOWN:#768判断条件 + if self.game_state == 0:# 设置游戏状态0为开始 + if event.key == pygame.K_SPACE:#设置空格键跳跃 + pygame.mixer.Sound(r"resource\jump.wav").play()#开始游戏就循环播放音乐BGM + if self.person.state == 0:#初始角色状态 + self.person.state = 1 + self.person.velocity_y = self.person.vy_start + elif self.person.state == 1: + self.person.state = 2 + self.person.velocity_y = self.person.vy_start#y坐标的速度设置,开始起跳速度为-20 + elif self.game_state == 1:#游戏结束 + if event.key == pygame.K_RETURN: # 重新开始游戏K_RETURN=13 + self.bg_music.stop()#在结束界面,音乐结束 + self.__init__()#游戏运作函数调用 + + if self.game_state == 0:#游戏开始中设置 + # 以下BackGorund的运动 + self.bg.dx += 10#这是游戏进程的设置?? + if self.bg.dx == 1200:#游戏进程为1200吗?? + self.bg.dx = 0 + + # Person的移动 + if self.person.state == 0:#人物为跑步状态中 + self.person.cur_frame += 1#角色运动帧选择+1 + if self.person.cur_frame == 12:#判断运动帧是否到了最后一帧 + self.person.cur_frame = 0#重新设置为0帧 + else:#人物出去跳跃状态中 + self.person.y += self.person.velocity_y#人物坐标加上在人物起跳y坐标的初始速度 + self.person.velocity_y += self.person.gravity#人物起跳y坐标的初始速度+重力加速度1 + if self.person.y >= 500 - 85:#当人物跳跃结束后,重新设置人物坐标 + self.person.y = 500 - 85#结束跳跃状态后,设置好人物的y坐标 + self.person.state = 0#结束跳跃状态后,人物状态设置为跑步0 + # bstacle的操作 + self.addObstacle()#调用障碍物函数生成障碍物 + + for obstacle in self.obstacle_list:#self.obstacle_list障碍物列表清单 + obstacle.x -= 10 # obstacle向左移动十个像素 + + if obstacle.x + obstacle.w <= 0: # 当obstacle离开界面时 + self.obstacle_list.remove(obstacle)#从obstacle_list列表移除掉这个障碍物 + self.score += 100 # 每避开一个障碍物,加100分,分数获取 + if obstacle.judgeCollision(self.person.getPos(), obstacle.getPos()): # 碰撞检测,当前的人物坐标与障碍物坐标作为形参 + if obstacle.cur_frame == 6:#判断是否碰撞到的是金币 + self.obstacle_list.remove(obstacle)#移除这个金币障碍物 + self.score += 1000 # 吃金币加1000分 + coin_sound = pygame.mixer.Sound( + r"resource/coin.wav")#coin_sound保存用pygame.mixer.Sound调用的音乐BGM,碰撞金币音效 + coin_sound.play()#播放音效 + else: + self.life -= 1#每碰撞到其他障碍物就减少1点生命值 + self.obstacle_list.remove(obstacle)#从obstacle_list移除障碍物 + if self.life <= 0:#生命值为0 + self.game_state = 1 # 游戏失败,到结束游戏界面 + die_sound = pygame.mixer.Sound( + r"resource\die.wav") # 添加碰撞之后产生的音效 + die_sound.play()#播放音效 + # 更新显示界面 + def updateScreen(self, screen): + screen.blit(self.bg.surface, [-self.bg.dx, 0]) # 背景的贴图,并且设置坐标位置 + screen.blit(self.bg.surface, [1200 - self.bg.dx, 0])#游戏进程完成后的界面显示,并且设置坐标位置 + text = self.font1.render("score:%d" % self.score, True, (128, 128, 128)) # 调用render,分数的贴图,显示对象self.score,设置颜色 + screen.blit(text, (500, 20))#绘制对象text分数的贴图,设置放置坐标 + del text + rest_life = self.font1.render("life:%d" % self.life, True, (128, 128, 128)) # 剩余生命显示 + screen.blit(rest_life, (400, 20))#生命显示的贴图,绘制对象rest_life + del rest_life + screen.blit(self.person.surface, [0, self.person.y], [int(self.person.cur_frame) * self.person.w, 0, self.person.w, self.person.h]) # 人物的贴图 + for obstacle in self.obstacle_list: # 障碍物的贴图显示 + screen.blit(obstacle.surface, [obstacle.x, obstacle.y], + [int(obstacle.cur_frame) * obstacle.w, 0, obstacle.w, obstacle.h]) + # 判断游戏的状态 + def judgeState(self, screen): + if self.game_state == 0: + self.updateScreen(screen) + return + elif self.game_state == 1: + screen.blit(self.game_over, [0, 0]) + text = self.font1.render("GameOver Score:%d Press Enter to restart" % self.score, True, (255, 0, 0))#显示对象self.score,并且设置颜色(255, 0, 0) + screen.blit(text, (self.width / 2 - 350, self.height / 2 + 150)) + # 游戏结束函数设置 + def terminate(self): + pygame.quit()#退出窗口 + sys.exit()#退出系统 + + # 游戏主入口函数 + def main(self): + self.startGame(self.screen)#开始游戏 + while True: + self.clock.tick(40) # 获取设置时钟频率 + self.judgeState(self.screen)#识别游戏状态是否启动成功 + self.ListenKeyBoard()#键盘处理函数调用 + pygame.display.flip()#更新屏幕 + +if __name__ == '__main__': + paoku = PaoKu()#游戏运作 + paoku.main()#游戏启动 diff --git a/www/pygame_anZ/importpygame.py b/www/pygame_anZ/importpygame.py new file mode 100644 index 0000000..0f86485 --- /dev/null +++ b/www/pygame_anZ/importpygame.py @@ -0,0 +1 @@ +import pygame \ No newline at end of file diff --git a/www/resource/bg.png b/www/resource/bg.png new file mode 100644 index 0000000..e612e2d Binary files /dev/null and b/www/resource/bg.png differ diff --git a/www/resource/bgm.wav b/www/resource/bgm.wav new file mode 100644 index 0000000..c6dd357 Binary files /dev/null and b/www/resource/bgm.wav differ diff --git a/www/resource/coin.wav b/www/resource/coin.wav new file mode 100644 index 0000000..d21eba4 Binary files /dev/null and b/www/resource/coin.wav differ diff --git a/www/resource/die.wav b/www/resource/die.wav new file mode 100644 index 0000000..852831a Binary files /dev/null and b/www/resource/die.wav differ diff --git a/www/resource/gameover.bmp b/www/resource/gameover.bmp new file mode 100644 index 0000000..450248b Binary files /dev/null and b/www/resource/gameover.bmp differ diff --git a/www/resource/jump.wav b/www/resource/jump.wav new file mode 100644 index 0000000..028298a Binary files /dev/null and b/www/resource/jump.wav differ diff --git a/www/resource/obstacles.png b/www/resource/obstacles.png new file mode 100644 index 0000000..599b53d Binary files /dev/null and b/www/resource/obstacles.png differ diff --git a/www/resource/person.png b/www/resource/person.png new file mode 100644 index 0000000..974a494 Binary files /dev/null and b/www/resource/person.png differ diff --git a/www/resource/simkai.ttf b/www/resource/simkai.ttf new file mode 100644 index 0000000..d7c3b90 Binary files /dev/null and b/www/resource/simkai.ttf differ diff --git a/www/resource/start1new.png b/www/resource/start1new.png new file mode 100644 index 0000000..0eae585 Binary files /dev/null and b/www/resource/start1new.png differ diff --git a/www/resource/startgame1.jpg b/www/resource/startgame1.jpg new file mode 100644 index 0000000..74fe0f9 Binary files /dev/null and b/www/resource/startgame1.jpg differ diff --git a/www/resource/startgame2.jpg b/www/resource/startgame2.jpg new file mode 100644 index 0000000..2df1bf6 Binary files /dev/null and b/www/resource/startgame2.jpg differ