python学习之乌龟吃鱼and思聪吃热狗游戏

乌龟吃鱼游戏
游戏规则:
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 random

class 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 % 10

if __name__ == ‘__main__‘:
    # 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机.
    tur = Turtle()
    fishes = [Fish() for item in range(10)]"""

01_turtle_fish.py

import random
class 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 % 10

class 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):
    pass
if __name__ == ‘__main__‘:
    # 游戏生成1只乌龟和10条鱼, 它们的移动方向均随机.
    tur = Turtle()
    fishes = [Fish() for item in range(10)]"""

03_pygame游戏基本操作.py


import pygame

#1). 初始化pygame
pygame.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 random
import pygame

class 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 % width

def 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 random
import time

import pygame
import sys
from pygame.locals import *  # 导入一些常用的函数

width = 474
height = 233

pygame.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 = 0
font = 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 % width

tur = 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帧的速度运行

原文地址:https://blog.51cto.com/13810716/2463095

时间: 2024-10-28 08:22:49

python学习之乌龟吃鱼and思聪吃热狗游戏的相关文章

python学习笔记(七) 类和pygame实现打飞机游戏

python中类声明如下: class Student(object): def __init__(self, name, score): self.name = name self.score = score def printinfo(self): print('name is %s, score is %d'%(self.name, self.score)) Student类有两个成员变量,name和score,类的成员函数第一个参数都为self,用来实现成员变量的赋值,__init__是

【python游戏编程之旅】第五篇---嗷大喵爱吃鱼小游戏开发实例

本系列博客介绍以python+pygame库进行小游戏的开发.有写的不对之处还望各位海涵. 我们一同在前几期的博客中已经学到了很多pygame的基本知识了,现在该做个小游戏实战一下了. 前几期博客链接: 第一篇:初识pygame  http://www.cnblogs.com/msxh/p/4966899.html 第二篇:pygame中的IO.数据  http://www.cnblogs.com/msxh/p/4973003.html 第三篇:pygame事件与设备轮询  http://www

Python基础教程:Python学习视频Python让你敲的代码不再是造轮子

你敲的代码是在造轮子?那就学Python呗!_Python基础教程 Bruce大神说" 人生苦短,我用Python ". 从公司角度而言: 国内基于Python创业成功的案例不在少数,豆瓣.知乎.果壳,全栈都是 Python,大家对Python自然有信心.并且从这几家公司出来的程序员与 CTO,创业的话一般都会选择Python. 从开发者个人角度而言: 计算机语言只是用来达成目的工具,?各种强大的第三方库,拿来就能用才是王道,让程序替代我们执行一些枯燥繁琐的工作.?至于句式是否优美.能

个人Python学习笔记

--个人python学习笔记,内容记录自鱼C论坛,仅供个人学习参考使用 内容持续更新中...

Python学习之路【第一篇】-Python简介和基础入门

1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是一种开发语言,而且已经进阶到主流的二十多种开发语言的top 5(数据源自最新的TIOBE排行榜). 来头不小啊!二十多种主流的开发语言,我该从哪一个开始呢?人生苦短,let‘s python! 1.2 Python的由来和发展趋势 Python的前世源自鼻祖“龟叔”.1989年,吉多·范罗苏姆(Gu

python学习-第四天补充-面向对象

python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的python的伪私有,实际是python通过名字修改来进行的,python会把这样命名的变量或者函数名改为_类名__变量名 class A: __name="hello" t = A(); #print(t.__name) #这样会出现错误,错误提示说这个变量没有__name类型 print

python学习之面向对象高级特性

类属性与实例属性类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数. 05_类属性鱼实例属性.py import random class Turtle(object): # power是类属性. power = 100 def __init__(self): # x,y:实例属性. self.x = random.randint(0, 10)

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式