Pygame实战练习之一百层游戏

作者:顾木子吖 时间:2022-01-08 00:07:54 

导语

哈喽哈喽!大家好!我是木木子,又到了每日游戏更新环节!

8月30日,对暑假还意犹未尽的孩子们收到了一份“开学大礼”:

Pygame实战练习之一百层游戏

通知要求,严格限制向未成年人提供网络游戏服务的时间!啊这~禁了网游,那这波单机游戏的就是一波收割大胜利。

安排!家里的孩子没游戏玩了怎么办?当然是由我提供新鲜热乎的游戏代码!

Pygame实战练习之一百层游戏

给整了一个一百层的闯关游戏!能完美通关的话孩子得玩很长一段时间,那我就解放了!!

主要分为二部分:



import pygame
from pygame.locals import *
from sys import exit

FOUR_NEIGH = {"left": (0, -1), "right": (0, 1), "up": (-1, 0), "down": (1, 0)}
EIGHT_NEIGH = list(FOUR_NEIGH.values()) + [(1, 1), (1, -1), (-1, 1), (-1, -1)]
DIRECTION = {pygame.K_UP: "up", pygame.K_LEFT: "left", pygame.K_RIGHT: "right", pygame.K_DOWN: "down"}

def hex2rgb(color):
   b = color % 256
   color = color >> 8
   g = color % 256
   color = color >> 8
   r = color % 256
   return (r, g, b)

class Game(object):
   def __init__(self, title, size, fps=30):
       self.size = size
       pygame.init()
       self.screen = pygame.display.set_mode(size, 0, 32)
       pygame.display.set_caption(title)
       self.keys = {}
       self.keys_up = {}
       self.clicks = {}
       self.timer = pygame.time.Clock()
       self.fps = fps
       self.score = 0
       self.end = False
       self.fullscreen = False
       self.last_time = pygame.time.get_ticks()
       self.is_pause = False
       self.is_draw = True
       self.score_font = pygame.font.SysFont("Calibri", 130, True)

def bind_key(self, key, action):
       if isinstance(key, list):
           for k in key:
               self.keys[k] = action
       elif isinstance(key, int):
           self.keys[key] = action

def bind_key_up(self, key, action):
       if isinstance(key, list):
           for k in key:
               self.keys_up[k] = action
       elif isinstance(key, int):
           self.keys_up[key] = action

def bind_click(self, button, action):
       self.clicks[button] = action

def pause(self, key):
       self.is_pause = not self.is_pause

def set_fps(self, fps):
       self.fps = fps

def handle_input(self, event):
       if event.type == pygame.QUIT:
           pygame.quit()
           exit()
       if event.type == pygame.KEYDOWN:
           if event.key in self.keys.keys():
               self.keys[event.key](event.key)
           if event.key == pygame.K_F11:                           # F11全屏
               self.fullscreen = not self.fullscreen
               if self.fullscreen:
                   self.screen = pygame.display.set_mode(self.size, pygame.FULLSCREEN, 32)
               else:
                   self.screen = pygame.display.set_mode(self.size, 0, 32)
       if event.type == pygame.KEYUP:
           if event.key in self.keys_up.keys():
               self.keys_up[event.key](event.key)
       if event.type == pygame.MOUSEBUTTONDOWN:
           if event.button in self.clicks.keys():
               self.clicks[event.button](*event.pos)

def run(self):
       while True:
           for event in pygame.event.get():
               self.handle_input(event)
           self.timer.tick(self.fps)

self.update(pygame.time.get_ticks())
           self.draw(pygame.time.get_ticks())

def draw_score(self, color, rect=None):
       score = self.score_font.render(str(self.score), True, color)
       if rect is None:
           r = self.screen.get_rect()
           rect = score.get_rect(center=r.center)
       self.screen.blit(score, rect)

def is_end(self):
       return self.end

def update(self, current_time):
       pass

def draw(self, current_time):
       pass

class Test(Game):
   def __init__(self, title, size, fps=30):
       super(Test, self).__init__(title, size, fps)
       self.bind_key(pygame.K_RETURN, self.press_enter)

def press_enter(self):
       print("press enter")

def draw(self, current_time):
       pass

def press_space(key):
   print("press space.")

def click(x, y):
   print(x, y)

def main():
   print(hex2rgb(0xfcf040))
   game = Test("game", (640, 480))
   game.bind_key(pygame.K_SPACE, press_space)
   game.bind_click(1, click)
   game.run()
其二:

import pygame
import game
from random import choice, randint

SCORE = 0
SOLID = 1
FRAGILE = 2
DEADLY = 3
BELT_LEFT = 4
BELT_RIGHT = 5
BODY = 6

GAME_ROW = 40
GAME_COL = 28
OBS_WIDTH = GAME_COL // 4
SIDE = 13
SCREEN_WIDTH = SIDE*GAME_COL
SCREEN_HEIGHT = SIDE*GAME_ROW
COLOR = {SOLID: 0x00ffff, FRAGILE: 0xff5500, DEADLY: 0xff2222, SCORE: 0xcccccc,
       BELT_LEFT: 0xffff44, BELT_RIGHT: 0xff99ff, BODY: 0x00ff00}
CHOICE = [SOLID, SOLID, SOLID, FRAGILE, FRAGILE, BELT_LEFT, BELT_RIGHT, DEADLY]

class Barrier(object):
   def __init__(self, screen, opt=None):
       self.screen = screen
       if opt is None:
           self.type = choice(CHOICE)
       else:
           self.type = opt
       self.frag_touch = False
       self.frag_time = 12
       self.score = False
       self.belt_dire = 0
       self.belt_dire = pygame.K_LEFT if self.type == BELT_LEFT else pygame.K_RIGHT
       left = randint(0, SCREEN_WIDTH - 7 * SIDE - 1)
       top = SCREEN_HEIGHT - SIDE - 1
       self.rect = pygame.Rect(left, top, 7*SIDE, SIDE)

def rise(self):
       if self.frag_touch:
           self.frag_time -= 1
       if self.frag_time == 0:
           return False
       self.rect.top -= 2
       return self.rect.top >= 0

def draw_side(self, x, y):
       if self.type == SOLID:
           rect = pygame.Rect(x, y, SIDE, SIDE)
           self.screen.fill(COLOR[SOLID], rect)
       elif self.type == FRAGILE:
           rect = pygame.Rect(x+2, y, SIDE-4, SIDE)
           self.screen.fill(COLOR[FRAGILE], rect)
       elif self.type == BELT_LEFT or self.type == BELT_RIGHT:
           rect = pygame.Rect(x, y, SIDE, SIDE)
           pygame.draw.circle(self.screen, COLOR[self.type], rect.center, SIDE // 2 + 1)
       elif self.type == DEADLY:
           p1 = (x + SIDE//2 + 1, y)
           p2 = (x, y + SIDE)
           p3 = (x + SIDE, y + SIDE)
           points = [p1, p2, p3]
           pygame.draw.polygon(self.screen, COLOR[DEADLY], points)

def draw(self):
       for i in range(7):
           self.draw_side(i*SIDE+self.rect.left, self.rect.top)

class Hell(game.Game):
   def __init__(self, title, size, fps=60):
       super(Hell, self).__init__(title, size, fps)
       self.last = 6 * SIDE
       self.dire = 0
       self.barrier = [Barrier(self.screen, SOLID)]
       self.body = pygame.Rect(self.barrier[0].rect.center[0], 200, SIDE, SIDE)

self.bind_key([pygame.K_LEFT, pygame.K_RIGHT], self.move)
       self.bind_key_up([pygame.K_LEFT, pygame.K_RIGHT], self.unmove)
       self.bind_key(pygame.K_SPACE, self.pause)

def move(self, key):
       self.dire = key

def unmove(self, key):
       self.dire = 0

def show_end(self):
       self.draw(0, end=True)
       self.end = True

def move_man(self, dire):
       if dire == 0:
           return True
       rect = self.body.copy()
       if dire == pygame.K_LEFT:
           rect.left -= 1
       else:
           rect.left += 1
       if rect.left < 0 or rect.left + SIDE >= SCREEN_WIDTH:
           return False
       for ba in self.barrier:
           if rect.colliderect(ba.rect):
               return False
       self.body = rect
       return True

def get_score(self, ba):
       if self.body.top > ba.rect.top and not ba.score:
           self.score += 1
           ba.score = True

def to_hell(self):
       self.body.top += 2
       for ba in self.barrier:
           if not self.body.colliderect(ba.rect):
               self.get_score(ba)
               continue
           if ba.type == DEADLY:
               self.show_end()
               return
           self.body.top = ba.rect.top - SIDE - 2
           if ba.type == FRAGILE:
               ba.frag_touch = True
           elif ba.type == BELT_LEFT or ba.type == BELT_RIGHT:
               # self.body.left += ba.belt_dire
               self.move_man(ba.belt_dire)
           break

top = self.body.top
       if top < 0 or top+SIDE >= SCREEN_HEIGHT:
           self.show_end()

def create_barrier(self):
       solid = list(filter(lambda ba: ba.type == SOLID, self.barrier))
       if len(solid) < 1:
           self.barrier.append(Barrier(self.screen, SOLID))
       else:
           self.barrier.append(Barrier(self.screen))
       self.last = randint(3, 5) * SIDE

def update(self, current_time):
       if self.end or self.is_pause:
           return
       self.last -= 1
       if self.last == 0:
           self.create_barrier()

for ba in self.barrier:
           if not ba.rise():
               if ba.type == FRAGILE and ba.rect.top > 0:
                   self.score += 1
               self.barrier.remove(ba)

self.move_man(self.dire)
       self.move_man(self.dire)
       self.to_hell()

def draw(self, current_time, end=False):
       if self.end or self.is_pause:
           return
       self.screen.fill(0x000000)
       self.draw_score((0x3c, 0x3c, 0x3c))
       for ba in self.barrier:
           ba.draw()
       if not end:
           self.screen.fill(COLOR[BODY], self.body)
       else:
           self.screen.fill(COLOR[DEADLY], self.body)
       pygame.display.update()

if __name__ == '__main__':
   hell = Hell("一百层", (SCREEN_WIDTH, SCREEN_HEIGHT))
   hell.run()

效果图如下:

Pygame实战练习之一百层游戏

Pygame实战练习之一百层游戏

来源:https://blog.csdn.net/weixin_55822277/article/details/120451983

标签:Pygame,一百层游戏,python
0
投稿

猜你喜欢

  • 用数据库生成不重复的流水号

    2007-10-06 22:49:00
  • banner字体设计与应用

    2009-07-06 14:42:00
  • js调用flash代码

    2010-01-23 12:35:00
  • sqlserver 查询数据库大小的方法

    2012-08-21 10:22:10
  • python flappy bird小游戏分步实现流程

    2023-10-09 10:45:41
  • 用Python实现KNN分类算法

    2021-12-26 14:15:24
  • 在SQL触发器或存储过程中获取在程序登录的用户

    2012-01-29 18:01:32
  • symfony2.4的twig中date用法分析

    2023-11-15 01:30:06
  • PHP面向对象继承用法详解(优化与减少代码重复)

    2023-11-21 10:16:48
  • Yahoo!上的小秘密

    2007-08-23 09:48:00
  • Python3爬虫之urllib携带cookie爬取网页的方法

    2022-07-01 14:19:02
  • css中absolute与relative的区别

    2007-11-17 08:04:00
  • SQL语句练习实例之三——平均销售等待时间

    2011-10-24 20:11:47
  • python类参数定义及数据扩展方式unsqueeze/expand

    2023-08-07 21:56:42
  • Oracle 的入门心得 强烈推荐

    2009-05-24 19:55:00
  • asp.net(c#)实现从sqlserver存取二进制图片的代码

    2023-06-26 21:48:03
  • ASP向Excel导数据(图片)终结版 ASP操作Excel

    2011-03-25 10:48:00
  • IE9初窥:支持CSS3,和HTML5?

    2009-12-01 14:20:00
  • 通过事务日志解决SQL Server常见四大故障(一)

    2009-03-25 13:46:00
  • 错误的随机数_JavaScript

    2009-08-28 12:43:00
  • asp之家 网络编程 m.aspxhome.com