人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Pygame實戰(zhàn)練習之一百層游戲

發(fā)布日期:2022-01-01 01:10 | 文章來源:站長之家

導語

哈嘍哈嘍!大家好!我是木木子,又到了每日游戲更新環(huán)節(jié)!

8月30日,對暑假還意猶未盡的孩子們收到了一份“開學大禮”:

通知要求,嚴格限制向未成年人提供網(wǎng)絡游戲服務的時間!啊這~禁了網(wǎng)游,那這波單機游戲的就是一波收割大勝利。

​安排!家里的孩子沒游戲玩了怎么辦?當然是由我提供新鮮熱乎的游戲代碼!

正文

給整了一個一百層的闖關游戲!能完美通關的話孩子得玩很長一段時間,那我就解放了?。?/p>

主要分為二部分:

​
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()
​

效果圖如下:

總結

我懂!我懂!我現(xiàn)在話不多說都是直接上代碼滴!

記得三連哦~mua 你們的支持是我最大的動力!

到此這篇關于Pygame實戰(zhàn)練習之一百層游戲的文章就介紹到這了,更多相關Pygame 一百層游戲內(nèi)容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!

版權聲明:本站文章來源標注為YINGSOO的內(nèi)容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部