Python游戏编程入门3

时间:2023-02-07 13:01:20

用户输入:Bomb Catcher游戏
本章介绍使用键盘和鼠标获得用户输入。包括如下主题:
学习pygame事件
学习实时循环
学习键盘和鼠标事件
学习轮询键盘和鼠标的状态
编写Bomb Catcher游戏

1本章所涉及pygame事件
QUIT
KEYDOWN
KEYUP
MOUSEMOTION
MOUSEBUTTONUP
MOUSEBUTTONDOWN

1.1实时事件循环
    while True:
        for event in pygame.event.get():
            if event.type==QUIT:
                sys.exit()
    在循环中不断地对事件队列中的特定事件进行相应的处理。

1.2键盘事件
    KEYUP  KEYDOWN
    
    1.3鼠标事件
    MOUSEBUTTONDOWN  MOUSEBUTTONUP  MOUSEMOTION
    具体属性见《pygame几个重要模块》

2设备轮询
pygame中的事件系统并非我们可以用来检测用户输入的唯一方法。我们可以轮询输入设备,看看用户是否与我们的
程序交互。

2.1轮询键盘
    在pygame中,使用pygame.key.get_pressed()来轮询键盘接口。该方法返回布尔值的一个列表,对应于键盘
    上的按键,每个键一个标志。使用相同的键常量值来索引布尔值数组。一次轮询所有的键的好处是不必遍历事件
    系统就可以检测多个键的按下。
    以下示例检测escape键。
    keys=pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        sys.exit()

2.2轮询鼠标
    pygame.mouse.get_pos()
    pygame.mouse.get_rel()
    pygame.mouse.get_pressed()
    具体使用参考《pygame几个重要模块》
import sys,pygame
from pygame.locals import *
pygame.init()

def print_text(font,x,y,text,color=(255,255,255)):
    imgtext=font.render(text,True,color)
    screen.blit(imgtext,(x,y))

#main program begins
screen=pygame.display.set_mode((600,500))
pygame.display.set_caption("Mouse Demo")
font1=pygame.font.Font(None,24)
white=255,255,255

mouse_x=mouse_y=0
move_x=move_y=0
mouse_down=mouse_up=0
mouse_down_x=mouse_down_y=0
mouse_up_x=mouse_up_y=0

#repeating loop
while True:
    for event in pygame.event.get():
        if event.type==QUIT:
            sys.exit()
        elif event.type==MOUSEMOTION:
            mouse_x,mouse_y=event.pos
            move_x,move_y=event.rel
        elif event.type==MOUSEBUTTONDOWN:
            mouse_down=event.button
            mouse_down_x,mouse_down_y=event.pos
        elif event.type==MOUSEBUTTONUP:
            mouse_up=event.button
            mouse_up_x,mouse_up_y=event.pos

keys=pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        sys.exit()
    
    screen.fill((0,100,0))
    print_text(font1,0,0,"Mouse Events")
    print_text(font1,0,20,"Mouse position: "+str(mouse_x)+","+str(mouse_y))
    print_text(font1,0,40,"Mouse relative: "+str(move_x)+","+str(move_y))
    print_text(font1,0,60,"Mouse button down: "+str(mouse_down)+" at "+str(mouse_down_x)+","+str(mouse_down_y))
    print_text(font1,0,80,"Mouse button up: "+str(mouse_up)+" at "+str(mouse_up_x)+","+str(mouse_up_y))

print_text(font1,0,160,"Mouse Polling")
    x,y=pygame.mouse.get_pos()
        print_text(font1,0,180,"Mouse Position: "+str(x)+str(y))
        b1,b2,b3=pygame.mouse.get_pressed()
        print_text(font1,0,200,"Mouse buttons: "+str(b1)+","+str(b2)+","+str(b3))

pygame.display.update()

3游戏简介
bomb Catcher游戏综合了鼠标输入、一些基本图形绘制和少量冲突检测逻辑。
炸弹是不断重复地从屏幕顶端落下的黄色圆圈。
当炸弹到达屏幕底部的时候,玩家未接住炸弹就会丢掉一条生命。
当炸弹撞击到挡板,算作玩家接住炸弹,另一个炸弹还会继续落下。

import sys,random,time,pygame
from pygame.locals import *
pygame.init()

def print_text(font,x,y,text,color=(255,255,255)):
    imgtext=font.render(text,True,color)
    screen.blit(imgtext,(x,y))

screen=pygame.display.set_mode((600,500))
pygame.display.set_caption("Bomb Catching Game")
font1=pygame.font.Font(None,24)
pygame.mouse.set_visible(False)
white=255,255,255
red=220,50,50
yellow=230,230,50
black=0,0,0

lives=3
score=0
game_over=True
mouse_x=mouse_y=0
pos_x=300
pos_y=460
bomb_x=random.randint(0,500)
bomb_y=-50
vel_y=3

#repeating loop
while True:
    for event in pygame.event.get():
        if event.type==QUIT:
            sys.exit()
        elif event.type==MOUSEMOTION:
            mouse_x,mouse_y=event.pos
            move_x,move_y=event.rel
        elif event.type==MOUSEBUTTONUP:
            if game_over:
                game_over=False
                lives=3
                score=0

keys=pygame.key.get_pressed()
    if keys[K_ESCAPE]:
        sys.exit()
    screen.fill((0,0,100))
    
    if game_over:
        print_text(font1,100,200,"<CLICK TO PLAY>")
    else:
        #move the bomb
        bomb_y+=vel_y
    
    #has player missed the bomb?
    if bomb_y>500:
        bomb_x=random.randint(0,500)
        bomb_y=-50
        lives-=1
        if lives==0:
            game_over=True
    
    #see if player has caught the bomb
    elif bomb_y>pos_y:
        if bomb_x>pos_x and bomb_x<pos_x+120:
            score+=10
            bomb_x=random.randint(0,500)
            bomb_y=-50
    
    #draw the bomb
    pygame.draw.circle(screen,black,(bomb_x-4,int(bomb_y)-4),30,0)
    pygame.draw.circle(screen,yellow,(bomb_x,int(bomb_y)),30,0)
    
    #set basket position
    pos_x=mouse_x
    if pos_x<0:
        pos_x=0
    elif pos_x>480:
        pos_x=500
    #draw basket
    pygame.draw.rect(screen,black,(pos_x-4,pos_y-4,120,40),0)
    pygame.draw.rect(screen,red,(pos_x,pos_y,120,40),0)

#print # of lives
    print_text(font1,0,0,"Lives: "+str(lives))
    
    #print score
    print_text(font1,500,0,"Score: "+str(score))

pygame.display.update()

可以改进的地方很多,比如说难度的提升,炸弹的显示效果等等。
现在我会改进这个程序,但是并不能独立写出这个程序来。

Python游戏编程入门3的更多相关文章

  1. Python游戏编程入门

    <Python游戏编程入门>这些文章负责整理在这本书中的知识点.注意事项和课后习题的尝试实现.并且对每一个章节给出的最终实例进行分析和注释. 初识pygame:pie游戏pygame游戏库 ...

  2. Python游戏编程入门 中文pdf扫描版&vert;网盘下载内附地址提取码&vert;

    Python是一种解释型.面向对象.动态数据类型的程序设计语言,在游戏开发领域,Python也得到越来越广泛的应用,并由此受到重视. 本书教授用Python开发精彩游戏所需的[]为重要的该你那.本书不 ...

  3. Python游戏编程入门2

    I/O.数据和字体:Trivia游戏 本章包括如下内容:Python数据类型获取用户输入处理异常Mad Lib游戏操作文本文件操作二进制文件Trivia游戏 其他的不说,我先去自己学习文件类型和字符串 ...

  4. python编程学习--Pygame - Python游戏编程入门&lpar;0&rpar;---转载

    原文地址:https://www.cnblogs.com/wuzhanpeng/p/4261015.html 引言 博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因 ...

  5. Pygame - Python游戏编程入门&lpar;0&rpar; 转

    博客刚开,想把最近学习的东西记录下来,算是一种笔记.最近打算开始学习Python,因为我感觉Python是一门很有意思的语言,很早以前就想学了(碍于懒),它的功能很强大,你可以用它来做科学运算,或者数 ...

  6. Pygame - Python游戏编程入门

    >>> import pygame>>> print(pygame.ver)1.9.2a0 如果没有报错,应该是安装好了~ 如果报错找不到模块,很可能是安装版本的问 ...

  7. Python游戏编程入门4

    Math和Graphics:Analog Clock示例程序本章介绍Python的math模块,该模块可以执行计算,如常见的三角正弦函数.余弦函数.正切函数等. 使用正弦和余弦函数绘制圆创建Anlog ...

  8. PC游戏编程&lpar;入门篇&rpar;(前言写的很不错)

    PC游戏编程(入门篇) 第一章 基石 1. 1 BOSS登场--GAF简介 第二章 2D图形程式初体验 2.l 饮水思源--第一个"游戏"程式 2.2 知其所以然一一2D图形学基础 ...

  9. 分享《Python 游戏编程快速上手&lpar;第3版&rpar;》高清中文版PDF&plus;高清英文版PDF&plus;源代码

    通过编写一个个小巧.有趣的游戏来学习Python,通过实例来解释编程的原理的方式.14个游戏程序和示例,介绍了Python基础知识.数据类型.函数.流程控制.程序调试.流程图设计.字符串操作.列表和字 ...

随机推荐

  1. 利用sqlmap进行mysql提权的小方法&lpar;win与liunx通用)

    文章作者:pt007@vip.sina.com文章来源:https://www.t00ls.net/thread-36196-1-1.html1.连接mysql数据打开一个交互shell:sqlmap ...

  2. JS 原型的妙用

    原型是JS的一个重要的特征,通过它可以实现类和实例直接的继承关系. 1.原型来来实现数据备份 // 通过原型来来实现数据备份 function p(x){ this.x = x; } p.protot ...

  3. 学习angular&period;js的一些笔记想法&lpar;上&rpar;

    1.data-ng-app与ng-app的区别 data-ng-app是为了h5不报错 2.ng-class 不多说就来拿例子说吧 html代码 <div class='color-change ...

  4. SU suacor命令学习

    前段时间事情忙,今天才更新.

  5. Mingyang&period;net:如何获取所有的请求参数?

    第一种方法:用@RequestParam. @RequestMapping(params="m=update", method=RequestMethod.POST) public ...

  6. 一步步搭建自己的轻量级MVCphp框架-(三)一个国产轻量级框架Amysql源码分析(2) 进程

    Amysql类 按照我的理解这就是框架的初始化 上代码 class Amysql { public $AmysqlProcess; public function Amysql() { global ...

  7. ECharts使用—折线图动态加载

    最近需求中用到折线图,单线条,多线交错,之前是散点图,用的是另一个 amcharts.js,这个文档也能找的到,回归早本次重点:ECharts 一.首先引入echarts.common.min.js文 ...

  8. Nginx系列1:ubuntu16&period;04编译出适合自己的nginx服务器

    1.下载nginx nginx官网:nginx.org tar.gz文件 解压缩命令: wget https://nginx.org/download/nginx-1.14.2.tar.gz #下载n ...

  9. &lbrack;TensorFlow&rsqb; Introduction to TensorFlow Datasets and Estimators

    Datasets and Estimators are two key TensorFlow features you should use: Datasets: The best practice ...

  10. 2-Twenty First Scrum Meeting-20151221

    任务安排 成员 今日完成 明日任务 闫昊 请假(数据库)   唐彬 请假(数据库)   史烨轩  尝试使用downloadmanager对notification进行更新  尝试使用downloadm ...