python学习之乌龟吃鱼and思聪吃热狗游戏
发表于:2024-11-28 作者:热门IT资讯网编辑
编辑最后更新 2024年11月28日,乌龟吃鱼游戏游戏规则:1). 假设游戏场景为范围(x,y)为0<=x<=10,0<=y<=102). 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机3). 乌龟的最大移动能力为2(它可以随机选择1
乌龟吃鱼游戏
游戏规则:
1). 假设游戏场景为范围(x,y)为0<=x<=10,0<=y<=10
2). 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机
3). 乌龟的最大移动能力为2(它可以随机选择1还是2移动),
鱼儿的最大移动能力是1当移动到场景边缘,自动向反方向移动
4). 乌龟初始化体力为100(上限), 乌龟每移动一次,体力消耗1
当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20, 鱼暂不计算体力
5). 当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束
01_turtle_fish.py
import randomclass Turtle(object): """ 乌龟类 属性: (x,y), power 方法: move(), eat() """ def __init__(self): self.x = random.randint(0, 10) self.y = random.randint(0, 10) self.power = 100 def move(self): """乌龟移动的方法""" #乌龟的最大移动能力是2当移动到场景边缘, move_skills = [-2, -1, 1, 2] #计算鱼最新的x轴坐标;() new_x = self.x + random.choice(move_skills) new_y = self.y + random.choice(move_skills) #当移动到场景边缘如何处理? #(10, 0) ---- (11, 1) ----- (1, 1) #(10, 0) --- (9, -1) -----(9, 9) self.x = new_x % 10 self.y = new_y % 10 def eat(self): """乌龟吃鱼""" self.power += 20 print("乌龟吃鱼, 能量+20!")class Fish(object): """ 鱼类 属性: (x,y) 方法: move() """ def __init__(self): self.x = random.randint(0, 10) self.y = random.randint(0, 10) def move(self): """ 鱼儿的最大移动能力是1当移动到场景边缘, """ #鱼儿的最大移动能力是1当移动到场景边缘, move_skills = [-1, 1] #计算鱼最新的x轴坐标;() new_x = self.x + random.choice(move_skills) new_y = self.y + random.choice(move_skills) #当移动到场景边缘如何处理? self.x = new_x % 10 self.y = new_y % 10if __name__ == '__main__': # 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机. tur = Turtle() fishes = [Fish() for item in range(10)]"""
01_turtle_fish.py
import randomclass BaseAnimal(object): def __init__(self): self.x = random.randint(0, 10) self.y = random.randint(0, 10) def move(self, move_skills=(-1, 1)): new_x = self.x + random.choice(move_skills) new_y = self.y + random.choice(move_skills) #当移动到场景边缘如何处理? #(10, 0) ---- (11, 1) ----- (1, 1) #(10, 0) --- (9, -1) -----(9, 9) self.x = new_x % 10 self.y = new_y % 10class Turtle(BaseAnimal): """ 乌龟类 属性: (x,y), power 方法: move(), eat() """ def __init__(self): super(Turtle, self).__init__() self.power = 100 def eat(self): """乌龟吃鱼""" self.power += 20 print("乌龟吃鱼, 能量+20!")class Fish(BaseAnimal): passif __name__ == '__main__': # 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机. tur = Turtle() fishes = [Fish() for item in range(10)]"""
03_pygame游戏基本操作.py
import pygame#1). 初始化pygamepygame.init()#2). 显示游戏界面pygame.display.set_mode((800, 800))while True: for event in pygame.event.get(): if event.type == pygame.QUIT: print("游戏结束......") exit(0) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: print("UP") elif event.key == pygame.K_DOWN: print('DOWN')"""
04_game.py #同理思聪吃热狗游戏
import randomimport pygameclass SiCong(object): """ 思聪类 属性: (x,y), power 方法: move(), eat() """ def __init__(self): self.x = random.randint(50, width - 50) self.y = random.randint(50, height - 50) self.power = 100 def move(self, new_x, new_y): """思聪移动的方法""" self.x = new_x % width self.y = new_y % height def eat(self): """思聪吃热狗""" self.power += 20 print("思聪吃热狗, 能量+20!")class HotDog(object): """ 热狗类 属性: (x,y) 方法: move() """ def __init__(self): self.x = random.randint(50, width - 50) self.y = random.randint(50, height - 50) def move(self): """ 鱼儿的最大移动能力是1当移动到场景边缘, """ #鱼儿的最大移动能力是1当移动到场景边缘, move_skills = [-10] #计算鱼最新的x轴坐标;() new_x = self.x + random.choice(move_skills) #当移动到场景边缘如何处理? self.x = new_x % widthdef main(): pygame.init() #显示游戏界面 screen = pygame.display.set_mode((width, height)) #设置界面标题 pygame.display.set_caption("吃热狗游戏") #加载游戏中需要的图片 bg = pygame.image.load('./img/bigger_bg1.jpg').convert() hotdogImg = pygame.image.load('./img/hot-dog.png').convert_alpha() sicongImg = pygame.image.load('./img/sicong.png').convert_alpha() hd_width, hd_height = hotdogImg.get_width(), hotdogImg.get_height() sc_width, sc_height = sicongImg.get_width(), sicongImg.get_height() #加载游戏音乐(背景音乐和吃掉热狗的音乐) pygame.mixer.music.load('./img/game_music.mp3') pygame.mixer.music.play(loops=0, start=0.0) # 播放设置, 不循环且从0.0s开始播放 #设置分数显示参数信息(显示位置、字体颜色、字体大小) scoreCount = 0 font = pygame.font.SysFont('arial', 20) # 系统设置字体的类型和大小 #颜色表示法: RGB (255, 0, 0)-红色 (255, 255, 255)-白色 (0, 0, 0)-黑色 score = font.render("Score: %s" % (scoreCount), True, (0, 0, 0)) #创建一个Clock对象,跟踪游戏运行时间 fpsClock = pygame.time.Clock() #创建一个思聪和10个热狗 sicong = SiCong() hotdogs = [HotDog() for item in range(10)] while True: for event in pygame.event.get(): if event.type == pygame.QUIT: print("游戏结束......") exit(0) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: # 移动人物向上多少个像素 sicong.move(sicong.x, sicong.y - 10) elif event.key == pygame.K_DOWN: sicong.move(sicong.x, sicong.y + 10) if event.key == pygame.K_LEFT: # 移动人物向上多少个像素 sicong.move(sicong.x - 10, sicong.y) elif event.key == pygame.K_RIGHT: sicong.move(sicong.x + 10, sicong.y) #绘制背景和分数 screen.blit(bg, (0, 0)) screen.blit(score, (200, 20)) #绘制热狗,并实现热狗的移动 for hd in hotdogs: screen.blit(hotdogImg, (hd.x, hd.y)) hd.move() #绘制sicong screen.blit(sicongImg, (sicong.x, sicong.y)) #判断游戏是否结束: 当人物体力值为0(挂掉)或者热狗的数量为0游戏结束 if sicong.power == 0: print("Game Over: Sicong Poer is 0") exit(1) if len(hotdogs) == 0: print("Game Over: hot-dog count is 0") exit(2) #判断人物是否吃到热狗:人物和热狗的坐标值相同, 则认为吃掉 for hd in hotdogs: if 0 < sicong.x - hd.x < 50 and 0 < sicong.y - hd.y < 50: # 增加人物的能量值 sicong.eat() #移除被吃掉的热狗 hotdogs.remove(hd) #增加得分 scoreCount += 10 #重新设置得分信息 score = font.render("Score: %s" % (scoreCount), True, (0, 0, 0)) #更新内容到游戏窗口 pygame.display.update() fpsClock.tick(10) # 每秒更新10帧if __name__ == '__main__': width =1000 height = 666 main()
05_乌龟吃鱼游戏.py
import randomimport timeimport pygameimport sysfrom pygame.locals import * # 导入一些常用的函数width = 474height = 233pygame.init()screen = pygame.display.set_mode([width, height])pygame.display.set_caption('乌龟吃鱼') # 定义窗口的标题为'乌龟吃鱼'background = pygame.image.load("./img/bg.jpg").convert()fishImg = pygame.image.load("./img/hot-dog.png").convert_alpha()wuguiImg = pygame.image.load("./img/sicong.png").convert_alpha()#乌龟吃掉小鱼的音乐 mp3格式的不行,wav格式的#eatsound = pygame.mixer.Sound("achievement.wav")#背景音乐pygame.mixer.music.load("./img/game_music.mp3")pygame.mixer.music.play(loops=0, start=0.0)#成绩文字显示count = 0font = pygame.font.SysFont("arial", 20)score = font.render("score %d" % count, True, (255, 255, 255))#显示游戏状态status = font.render("Gaming", True, (255, 255, 255))w_width = wuguiImg.get_width() - 5 # 得到乌龟图片的宽度,后面留着吃鱼的时候用w_height = wuguiImg.get_height() - 5 # 得到乌龟图片的高度y_width = fishImg.get_width() - 5 # 得到鱼图片的宽度y_height = fishImg.get_height() - 5 # 得到鱼图片的高度fpsClock = pygame.time.Clock() # 创建一个新的Clock对象,可以用来跟踪总共的时间#乌龟类class Turtle: def __init__(self): self.power = 100 # 体力 #乌龟坐标 self.x = random.randint(0, width - w_width) self.y = random.randint(0, height - w_height) #乌龟移动的方法:移动方向均随机 第四条 def move(self, new_x, new_y): self.x = new_x % width self.y = new_y % height self.power -= 1 # 乌龟每移动一次,体力消耗1 def eat(self): self.power += 20 # 乌龟吃掉鱼,乌龟体力增加20 if self.power > 100: self.power = 100 # 乌龟体力100(上限)#鱼类class Fish: def __init__(self): # 鱼坐标 self.x = random.randint(0, width - y_width) self.y = random.randint(0, height - y_height) def move(self): new_x = self.x + random.choice([-10]) self.x = new_x % widthtur = Turtle() # 生成1只乌龟fish = [] # 生成10条鱼for item in range(10): newfish = Fish() fish.append(newfish) # 把生成的鱼放到鱼缸里#pygame有一个事件循环,不断检查用户在做什么。事件循环中,如何让循环中断下来(pygame形成的窗口中右边的插号在未定义前是不起作用的)while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() if event.type == pygame.KEYDOWN: # 通过上下左右方向键控制乌龟的动向 if event.key == pygame.K_LEFT: tur.move(tur.x - 10, tur.y) if event.key == pygame.K_RIGHT: tur.move(tur.x + 10, tur.y) if event.key == pygame.K_UP: tur.move(tur.x, tur.y - 10) if event.key == pygame.K_DOWN: tur.move(tur.x, tur.y + 10) screen.blit(background, (0, 0)) # 绘制背景图片 screen.blit(score, (400, 20)) # 绘制分数 screen.blit(status, (0, 20)) # 绘制分数 #绘制鱼 for item in fish: screen.blit(fishImg, (item.x, item.y)) #pygame.time.delay(100) item.move() # 鱼移动 screen.blit(wuguiImg, (tur.x, tur.y)) # 绘制乌龟 #判断游戏是否结束:当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束 if tur.power < 0: print("Game Over: Turtle power is 0") #显示游戏状态 status = font.render("Game Over: Turtle power is 0", True, (255, 255, 255)) pygame.display.update() # 更新到游戏窗口 time.sleep(1) sys.exit(0) elif len(fish) == 0: status = font.render("Game Over: Fish is empty", True, (255, 255, 255)) pygame.display.update() # 更新到游戏窗口 sys.exit(0) for item in fish: # print("鱼", item.x, item.y, y_width, y_height) #print("乌龟", tur.x, tur.y, w_width, w_height) #判断鱼和乌龟是否碰撞? if ((tur.x < item.x + y_width) and (tur.x + w_width > item.x) and (tur.y < item.y + y_height) and (w_height + tur.y > item.y)): fish.remove(item) # 鱼死掉 #吃鱼音乐 #eatsound.play() count = count + 1 # 累加 score = font.render("score %d" % count, True, (255, 255, 255)) #print("死了一只鱼") #print("乌龟最新体力值为 %d" % tur.power) pygame.display.update() # 更新到游戏窗口 fpsClock.tick(10) # 通过每帧调用一次fpsClock.tick(10),这个程序就永远不会以超过每秒10帧的速度运行