python实现移动木板小游戏


Posted in Python onOctober 09, 2020

本文实例为大家分享了python实现移动木板小游戏的具体代码,供大家参考,具体内容如下

一、游戏简介

本游戏是通过python编写的小游戏,给初学者熟悉python编程语言抛砖引玉,希望有所帮助。
成型的效果图如下:

python实现移动木板小游戏

python实现移动木板小游戏

二、编写步骤

1.引入库

代码如下:

###### AUTHOR:破茧狂龙 ######
###### DATE:20201002 ######
###### DESCRIPTION:移动的木板 ######
import pygame
from pygame.locals import *
import sys
import time
import random

2.初始化

代码如下:

pygame.init()
BLACK = (0, 0, 0) # 黑色
WHITE = (255, 255, 255) # 白色
bg_color = (0,0,70) # 背景颜色
red = (200, 0, 0)
green = (0, 200, 0)
bright_red = (255, 0, 0)
bright_green = (0, 255, 0)

smallText = pygame.font.SysFont('SimHei', 20) #comicsansms
midlText = pygame.font.SysFont('SimHei', 50)

barsize = [30, 10]
SCREEN_SIZE = [400, 500] # 屏幕大小
BALL_SIZE = [15, 15] # 球的尺寸
fontcolor = (255,255,255) # 定义字体的颜色

myimg = r"img\b1.jpg"
background = pygame.image.load(myimg) # 图片位置
background = pygame.transform.scale(background, SCREEN_SIZE)

# ball 初始位置
ball_pos_x = SCREEN_SIZE[0] // 2 - BALL_SIZE[0] / 2
ball_pos_y = 0

# ball 移动方向
ball_dir_y = 1 # 1:down
ball_pos = pygame.Rect(ball_pos_x, ball_pos_y, BALL_SIZE[0], BALL_SIZE[1])

clock = pygame.time.Clock() # 定时器
screen = pygame.display.set_mode(SCREEN_SIZE)
# 设置标题
pygame.display.set_caption('python小游戏-移动木板')
# 设置图标
image = pygame.image.load(myimg)
pygame.display.set_icon(image)

3.相关自定义函数

代码如下:

###### 自定义函数 ######
def button(msg, x, y, w, h, ic, ac, action=None):
 mouse = pygame.mouse.get_pos()
 click = pygame.mouse.get_pressed()
 if x + w > mouse[0] > x and y + h > mouse[1] > y:
 pygame.draw.rect(screen, ac, (x, y, w, h))
 if click[0] == 1 and action != None:
  action()
 else:
 pygame.draw.rect(screen, ic, (x, y, w, h))
 textSurf, textRect = text_objects(msg, smallText)
 textRect.center = ((x + (w / 2)), (y + (h / 2)))
 screen.blit(textSurf, textRect)

def text_objects(text, font):
 textSurface = font.render(text, True, fontcolor)
 return textSurface, textSurface.get_rect()

def quitgame():
 pygame.quit()
 quit()

def message_diaplay(text):
 largeText = pygame.font.SysFont('SimHei', 115)
 TextSurf, TextRect = text_objects(text, largeText)
 TextRect.center = ((screen[0] / 2), (screen[1] / 2))
 screen.blit(TextSurf, TextRect)
 pygame.display.update()
 time.sleep(2)
 game_loop()

4.相关自定义函数

代码如下:

def game_first_win():
 intro = True
 while intro:
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
  pygame.quit()
  quit()
 screen.fill(bg_color)
 ###游戏名称
 TextSurf, TextRect = text_objects('移动木板', midlText)
 TextRect.center = ((SCREEN_SIZE[0] / 2), (SCREEN_SIZE[1] / 2 - 70 ))
 screen.blit(TextSurf, TextRect)
 ###作者
 TextSurf_ZZ, TextRect_ZZ = text_objects('AUTHOR:破茧狂龙', smallText)
 TextRect_ZZ.center = ((SCREEN_SIZE[0] / 2), (SCREEN_SIZE[1] / 2 + 30))
 screen.blit(TextSurf_ZZ, TextRect_ZZ)
 button("开始", 60, 400, 100, 50, green, bright_green, game_loop)
 button("取消", 230, 400, 100, 50, red, bright_red, quitgame)
 pygame.display.update()
 clock.tick(15)

###### 移动的木板游戏类 ######
def game_loop():
 pygame.mouse.set_visible(1) # 移动鼠标不可见
 ###变量###
 score = 0 #分数
 count_O = 0 #循环的次数变量1 用于统计等级
 count_N = 0 #循环的次数变量2 用于统计等级
 c_level = 1 #等级

 x_change = 0 #移动的变量
 x = SCREEN_SIZE[0] // 2 - barsize[0] // 2
 y = SCREEN_SIZE[1] - barsize[1]

 # ball 初始位置
 ball_pos_pz = ball_pos
 while True:
 bar_move_left = False
 bar_move_right = False
 ###当每次满X分后,升级等级
 if count_O != count_N and score % 5 == 0:
  c_level += 1
 count_O = count_N
 ###### 获取键盘输入 ######
 for event in pygame.event.get():
  if event.type == QUIT: # 当按下关闭按键
  pygame.quit()
  sys.exit() # 接收到退出事件后退出程序
  elif event.type == KEYDOWN:
  ##按键盘Q键 暂停
  if event.key == pygame.K_q:
   time.sleep(10)
  ##左移动
  if event.key == pygame.K_LEFT:
   bar_move_left = True
   x_change = -30
  else:
   bar_move_left = False
  ##右移动
  if event.key == pygame.K_RIGHT:
   bar_move_right = True
   x_change = +30
  else:
   bar_move_right = False
  if event.key != pygame.K_LEFT and event.key != pygame.K_RIGHT:
   bar_move_left = False
   bar_move_right = False

  ##木板的位置移动
  if bar_move_left == True and bar_move_right == False:
  x += x_change
  if bar_move_left == False and bar_move_right == True:
  x += x_change

 ##填充背景
 screen.blit(background, (0, 0)) # (0,0)代表图片位置起点x 轴 Y轴
 ##获取最新的木板位置,并渲染在前台
 bar_pos = pygame.Rect(x, y, barsize[0], BALL_SIZE[1])
 bar_pos.left = x
 pygame.draw.rect(screen, WHITE, bar_pos)

 ## 球移动,并渲染在前台
 ball_pos_pz.bottom += ball_dir_y * 3
 pygame.draw.rect(screen, WHITE, ball_pos_pz)

 ## 判断球是否落到板上
 if bar_pos.top <= ball_pos_pz.bottom and (
  bar_pos.left <= ball_pos_pz.right and bar_pos.right >= ball_pos_pz.left):
  score += 1 # 分数每次加1
  count_N += 1
 elif bar_pos.top <= ball_pos_pz.bottom and (
  bar_pos.left > ball_pos_pz.right or bar_pos.right < ball_pos_pz.left):
  print("Game Over: ", score)
  return score

 ## 更新球下落的初始位置
 if bar_pos.top <= ball_pos_pz.bottom:
  ball_x = random.randint(0, SCREEN_SIZE[0] - BALL_SIZE[0])
  ball_pos_pz = pygame.Rect(ball_x, ball_pos_y, BALL_SIZE[0], BALL_SIZE[1])

 ######### 显示游戏等级 #########
 TextSurf_lev, TextRect_lev = text_objects("等级 : " + str(c_level), smallText)
 TextRect_lev.center = (60, 20)
 screen.blit(TextSurf_lev, TextRect_lev)

 ######### 显示分数结果 #########
 TextSurf_sco, TextRect_sco = text_objects("分数 : " + str(score), smallText)
 TextRect_sco.center = (60, 50)
 screen.blit(TextSurf_sco, TextRect_sco)

 pygame.display.update() # 更新软件界面显示
 clock.tick(60)

# 三、完整的代码

代码如下:

###### AUTHOR:破茧狂龙 ######
###### DATE:20201002 ######
###### DESCRIPTION:移动的木板 ######
import pygame
from pygame.locals import *
import sys
import time
import random

pygame.init()
BLACK = (0, 0, 0) # 黑色
WHITE = (255, 255, 255) # 白色
bg_color = (0,0,70) # 背景颜色
red = (200, 0, 0)
green = (0, 200, 0)
bright_red = (255, 0, 0)
bright_green = (0, 255, 0)

smallText = pygame.font.SysFont('SimHei', 20) #comicsansms
midlText = pygame.font.SysFont('SimHei', 50)

barsize = [30, 10]
SCREEN_SIZE = [400, 500] # 屏幕大小
BALL_SIZE = [15, 15] # 球的尺寸
fontcolor = (255,255,255) # 定义字体的颜色

myimg = r"img\b1.jpg"
background = pygame.image.load(myimg) # 图片位置
background = pygame.transform.scale(background, SCREEN_SIZE)

# ball 初始位置
ball_pos_x = SCREEN_SIZE[0] // 2 - BALL_SIZE[0] / 2
ball_pos_y = 0

# ball 移动方向
ball_dir_y = 1 # 1:down
ball_pos = pygame.Rect(ball_pos_x, ball_pos_y, BALL_SIZE[0], BALL_SIZE[1])

clock = pygame.time.Clock() # 定时器
screen = pygame.display.set_mode(SCREEN_SIZE)
# 设置标题
pygame.display.set_caption('python小游戏-移动木板')
# 设置图标
image = pygame.image.load(myimg)
pygame.display.set_icon(image)

###### 自定义函数 ######
def button(msg, x, y, w, h, ic, ac, action=None):
 mouse = pygame.mouse.get_pos()
 click = pygame.mouse.get_pressed()
 if x + w > mouse[0] > x and y + h > mouse[1] > y:
 pygame.draw.rect(screen, ac, (x, y, w, h))
 if click[0] == 1 and action != None:
  action()
 else:
 pygame.draw.rect(screen, ic, (x, y, w, h))
 textSurf, textRect = text_objects(msg, smallText)
 textRect.center = ((x + (w / 2)), (y + (h / 2)))
 screen.blit(textSurf, textRect)

def text_objects(text, font):
 textSurface = font.render(text, True, fontcolor)
 return textSurface, textSurface.get_rect()

def quitgame():
 pygame.quit()
 quit()

def message_diaplay(text):
 largeText = pygame.font.SysFont('SimHei', 115)
 TextSurf, TextRect = text_objects(text, largeText)
 TextRect.center = ((screen[0] / 2), (screen[1] / 2))
 screen.blit(TextSurf, TextRect)
 pygame.display.update()
 time.sleep(2)
 game_loop()

def game_first_win():
 intro = True
 while intro:
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
  pygame.quit()
  quit()
 screen.fill(bg_color)
 ###游戏名称
 TextSurf, TextRect = text_objects('移动木板', midlText)
 TextRect.center = ((SCREEN_SIZE[0] / 2), (SCREEN_SIZE[1] / 2 - 70 ))
 screen.blit(TextSurf, TextRect)
 ###作者
 TextSurf_ZZ, TextRect_ZZ = text_objects('AUTHOR:破茧狂龙', smallText)
 TextRect_ZZ.center = ((SCREEN_SIZE[0] / 2), (SCREEN_SIZE[1] / 2 + 30))
 screen.blit(TextSurf_ZZ, TextRect_ZZ)
 button("开始", 60, 400, 100, 50, green, bright_green, game_loop)
 button("取消", 230, 400, 100, 50, red, bright_red, quitgame)
 pygame.display.update()
 clock.tick(15)

###### 移动的木板游戏类 ######
def game_loop():
 pygame.mouse.set_visible(1) # 移动鼠标不可见
 ###变量###
 score = 0 #分数
 count_O = 0 #循环的次数变量1 用于统计等级
 count_N = 0 #循环的次数变量2 用于统计等级
 c_level = 1 #等级

 x_change = 0 #移动的变量
 x = SCREEN_SIZE[0] // 2 - barsize[0] // 2
 y = SCREEN_SIZE[1] - barsize[1]

 # ball 初始位置
 ball_pos_pz = ball_pos
 while True:
 bar_move_left = False
 bar_move_right = False
 ###当每次满X分后,升级等级
 if count_O != count_N and score % 5 == 0:
  c_level += 1
 count_O = count_N
 ###### 获取键盘输入 ######
 for event in pygame.event.get():
  if event.type == QUIT: # 当按下关闭按键
  pygame.quit()
  sys.exit() # 接收到退出事件后退出程序
  elif event.type == KEYDOWN:
  ##按键盘Q键 暂停
  if event.key == pygame.K_q:
   time.sleep(10)
  ##左移动
  if event.key == pygame.K_LEFT:
   bar_move_left = True
   x_change = -30
  else:
   bar_move_left = False
  ##右移动
  if event.key == pygame.K_RIGHT:
   bar_move_right = True
   x_change = +30
  else:
   bar_move_right = False
  if event.key != pygame.K_LEFT and event.key != pygame.K_RIGHT:
   bar_move_left = False
   bar_move_right = False

  ##木板的位置移动
  if bar_move_left == True and bar_move_right == False:
  x += x_change
  if bar_move_left == False and bar_move_right == True:
  x += x_change

 ##填充背景
 screen.blit(background, (0, 0)) # (0,0)代表图片位置起点x 轴 Y轴
 ##获取最新的木板位置,并渲染在前台
 bar_pos = pygame.Rect(x, y, barsize[0], BALL_SIZE[1])
 bar_pos.left = x
 pygame.draw.rect(screen, WHITE, bar_pos)

 ## 球移动,并渲染在前台
 ball_pos_pz.bottom += ball_dir_y * 3
 pygame.draw.rect(screen, WHITE, ball_pos_pz)

 ## 判断球是否落到板上
 if bar_pos.top <= ball_pos_pz.bottom and (
  bar_pos.left <= ball_pos_pz.right and bar_pos.right >= ball_pos_pz.left):
  score += 1 # 分数每次加1
  count_N += 1
 elif bar_pos.top <= ball_pos_pz.bottom and (
  bar_pos.left > ball_pos_pz.right or bar_pos.right < ball_pos_pz.left):
  print("Game Over: ", score)
  return score

 ## 更新球下落的初始位置
 if bar_pos.top <= ball_pos_pz.bottom:
  ball_x = random.randint(0, SCREEN_SIZE[0] - BALL_SIZE[0])
  ball_pos_pz = pygame.Rect(ball_x, ball_pos_y, BALL_SIZE[0], BALL_SIZE[1])

 ######### 显示游戏等级 #########
 TextSurf_lev, TextRect_lev = text_objects("等级 : " + str(c_level), smallText)
 TextRect_lev.center = (60, 20)
 screen.blit(TextSurf_lev, TextRect_lev)

 ######### 显示分数结果 #########
 TextSurf_sco, TextRect_sco = text_objects("分数 : " + str(score), smallText)
 TextRect_sco.center = (60, 50)
 screen.blit(TextSurf_sco, TextRect_sco)

 pygame.display.update() # 更新软件界面显示
 clock.tick(60)

####程序执行顺序######
game_first_win()
game_loop()
pygame.quit()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单实现python进度条脚本
Dec 18 Python
python如何使用unittest测试接口
Apr 04 Python
对Python中的@classmethod用法详解
Apr 21 Python
python使用folium库绘制地图点击框
Sep 21 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
用django设置session过期时间的方法解析
Aug 05 Python
python通过链接抓取网站详解
Nov 20 Python
屏蔽Django admin界面添加按钮的操作
Mar 11 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
想学画画?python满足你!
Dec 24 Python
python三子棋游戏
May 04 Python
详解Python中Pyyaml模块的使用
Oct 08 #Python
Python实现七个基本算法的实例代码
Oct 08 #Python
python自动化测试三部曲之request+django实现接口测试
Oct 07 #Python
python自动化测试三部曲之unittest框架的实现
Oct 07 #Python
浅谈anaconda python 版本对应关系
Oct 07 #Python
简述python&amp;pytorch 随机种子的实现
Oct 07 #Python
详解基于python的全局与局部序列比对的实现(DNA)
Oct 07 #Python
You might like
短波收音机简介
2021/03/01 无线电
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
php实现的一段简单概率相关代码
2016/05/30 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
javascript Keycode对照表
2009/10/24 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
2013/01/11 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
超实用的JavaScript代码段 附使用方法
2016/05/22 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
仿照Element-ui实现一个简易的$message方法
2020/09/14 Javascript
Python中的XML库4Suite Server的介绍
2015/04/14 Python
Python做简单的字符串匹配详解
2017/03/21 Python
Python金融数据可视化汇总
2017/11/17 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
Python同时处理多个异常的方法
2020/07/28 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
粉红色的鲸鱼:Vineyard Vines
2018/02/17 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
业务助理岗位职责
2013/11/18 职场文书
毕业生就业自荐书
2013/12/15 职场文书
法学专业本科生自荐信范文
2013/12/17 职场文书
小学二年级评语
2014/04/21 职场文书
旅游局领导班子“四风”问题对照检查材料思想汇报
2014/09/29 职场文书
2015年秋季小学开学典礼主持词
2015/07/16 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
分析Netty直接内存原理及应用
2021/06/14 Java/Android
Python爬虫入门案例之爬取去哪儿旅游景点攻略以及可视化分析
2021/10/16 Python
CSS中实现动画效果-附案例
2022/02/28 HTML / CSS
nginx配置之并发频次限制
2022/04/18 Servers