python ### 刚学了python不久,发现了一个好玩的库pygame
使用pygame模块 利用面向对象的思想编写贪吃蛇,主要用到pygame.sprite:
游戏主类
import pygame,sys from snake_sprite import Game_sprite,Snake,Food SCREEN_RECT=pygame.Rect(0,0,828,600) IMG_URL="./image/bg.jpg" #主类 class Snakegame(object): def __init__(self): self.screen=pygame.display.set_mode(SCREEN_RECT.size) self.clock=pygame.time.Clock() self.__create_sprites() def __create_sprites(self): bg=Game_sprite(IMG_URL) self.snake=Snake() for pos in self.snake.snake_point: self.screen.blit(self.snake.image,pos) food=Food() self.bg_group=pygame.sprite.Group(bg) self.snake_group=pygame.sprite.Group(self.snake) self.food_group = pygame.sprite.Group(food) def start_game(self): while True: #1.时钟设置 self.clock.tick(30) #2.事件监听 self.__event_handler() #3.碰撞检测 self.__check_collide() #4.精灵更新 self.__update_sprites() #5.屏幕更新 pygame.display.update() def __event_handler(self): for event in pygame.event.get(): if event.type==pygame.QUIT: Snakegame.__game_over() elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT and self.snake.direction !='L': self.snake.speedy = 0 self.snake.speedx = 1 self.snake.direction = 'R' elif event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT and self.snake.direction !='R': self.snake.speedy = 0 self.snake.speedx = -1 self.snake.direction = 'L' elif event.type == pygame.KEYDOWN and event.key == pygame.K_UP and self.snake.direction !='D': self.snake.speedx = 0 self.snake.speedy = -1 self.snake.direction = 'U' elif event.type == pygame.KEYDOWN and event.key == pygame.K_DOWN and self.snake.direction !='U': self.snake.speedx=0 self.snake.speedy=1 self.snake.direction='D' def __check_collide(self): pass def __update_sprites(self): self.bg_group.update() self.bg_group.draw(self.screen) self.snake_group.update() self.snake_group.draw(self.screen) self.food_group.update() self.food_group.draw(self.screen) @staticmethod def __game_over(): pygame.quit() exit() #游戏启动 if __name__ == '__main__': snake=Snakegame() snake.start_game()
工具类
import pygame import random SNAKE_IMG="./image/snake.png" FOOD_IMG="./image/food.jpg" class Game_sprite(pygame.sprite.Sprite): def __init__(self,img_name,speedx=1,speedy=0): #调用父类的初始化方法 super(Game_sprite, self).__init__() #属性 self.image=pygame.image.load(img_name) self.rect=self.image.get_rect() self.speedx=speedx self.speedy=speedy def update(self): pass #蛇实物 class Snake(Game_sprite): def __init__(self,direction='R',snakelist=[[40,40],[80,40]]): self.direction=direction self.snake_point=snakelist super().__init__(SNAKE_IMG) self.rect.x=self.snake_point[1][0] self.rect.y=self.snake_point[1][1] def update(self): self.rect.x += self.speedx self.rect.y += self.speedy class Food(Game_sprite): def __init__(self): super(Food, self).__init__(FOOD_IMG) self.rect.x = random.randint(50, 828) self.rect.y = random.randint(38, 600) def update(self): pass
关于这次demo
我发现自己并没有弄懂pygame的具体画面更新机制,以及精灵的控制,对于贪吃蛇头部及身体的画面更新并没有做出来,还有对身体和头的数据结构如何构建 并不是很了解。毕竟第一次,希望有大佬看到这篇博客能够指点下。
附上函数式编程的代码
import pygame import time import random x = pygame.init() white = (255,255,255) black = (0,0,0) red = (255,0,0) green = (0,155,0) display_width = 800 display_height = 600 gameDisplay = pygame.display.set_mode((display_width,display_height)) pygame.display.set_caption('Slither') gameDisplay.fill(white) pygame.display.update() block_size = 20 applethickness = 30 FPS = 10 icon = pygame.image.load('appleimage.jpg') pygame.display.set_icon(icon) img = pygame.image.load('snakeimage.jpg') appleimage = pygame.image.load('appleimage.jpg') clock = pygame.time.Clock() smallfont = pygame.font.SysFont(None,30) midfont = pygame.font.SysFont(None,50) largefont = pygame.font.SysFont("comicsansms",80) direction = "right" def pause(): paused = True message_to_screen("暂停",black,-100,"large") message_to_screen("空格暂停Q退出",black, 30) pygame.display.update() while paused: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: paused = False elif event.key == pygame.K_q: pygame.quit() quit() #gameDisplay.fill(white) clock.tick(5) def score(score): text1 = smallfont.render("Score : " + str(score), True, black) gameDisplay.blit(text1,(0,0)) def randApplegen(): randAppleX = round(random.randrange(0,display_width-applethickness))#/10.0)*10.0 randAppleY = round(random.randrange(0,display_height-applethickness))#/10.0)*10.0 return randAppleX, randAppleY def intro(): intro = True message_to_screen("按c开始游戏",red,150) pygame.display.update() while intro: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_c: intro = False if event.key == pygame.K_q: pygame.quit() quit() clock.tick(15) def snake(snakelist): for xny in snakelist[:-1]: pygame.draw.rect(gameDisplay,green,[xny[0],xny[1],block_size,block_size]) if(direction == "right"): head = pygame.transform.rotate(img,270) elif(direction == "left"): head = pygame.transform.rotate(img,90) elif(direction == "up"): head = img elif(direction == "down"): head = pygame.transform.rotate(img,180) gameDisplay.blit(head,(snakelist[-1][0],snakelist[-1][1])) def text_objects(text,color,size): if(size == "small"): textsurface = smallfont.render(text,True,color) elif(size == "middle"): textsurface = midfont.render(text,True,color) elif(size == "large"): textsurface = largefont.render(text,True,color) return textsurface, textsurface.get_rect() def message_to_screen(msg,color,y_displace=0,size="small"): textsurf, textsurf_rect = text_objects(msg,color,size) textsurf_rect.center = (display_width/2), (display_height/2) + y_displace gameDisplay.blit(textsurf,textsurf_rect) def gameLoop(): global direction direction = "right" gameExit = False gameOver = False lead_x = display_width/2 lead_y = display_height/2 lead_x_change = 10 lead_y_change = 0 randAppleX, randAppleY = randApplegen() snakelist = [] snakelength = 1 while not gameExit: if gameOver == True: message_to_screen("Game Over",red,-50,"large") message_to_screen("Press C to play again or Q to quit the game",black,50,"small") pygame.display.update() while gameOver == True: #gameDisplay.fill(white) for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: gameExit = True gameOver = False if event.key == pygame.K_c: gameLoop() pygame.quit() quit() if event.type == pygame.QUIT: gameExit = True gameOver = False # pygame.quit() # quit() for event in pygame.event.get(): if event.type == pygame.QUIT: gameExit = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT and direction != "right": direction = "left" lead_x_change = -block_size lead_y_change = 0 elif event.key == pygame.K_RIGHT and direction != "left": direction = "right" lead_x_change = block_size lead_y_change = 0 elif event.key == pygame.K_UP and direction != "down": direction = "up" lead_y_change = -block_size lead_x_change = 0 elif event.key == pygame.K_DOWN and direction != "up": direction = "down" lead_y_change = block_size lead_x_change = 0 elif event.key == pygame.K_SPACE: pause() if lead_x + block_size/2 >= display_width or lead_x < 0 or lead_y + block_size/2 >= display_height or lead_y < 0: gameOver = True lead_x += lead_x_change lead_y += lead_y_change gameDisplay.fill(white) gameDisplay.blit(appleimage,(randAppleX,randAppleY)) #pygame.draw.rect(gameDisplay,red,[350,350,100,10]) # gameDisplay.fill(red, rect=[200,200,50,50]) #good method snakehead = [] snakehead.append(lead_x) snakehead.append(lead_y) snakelist.append(snakehead) if len(snakelist) > snakelength: del snakelist[0] for each in snakelist[:-1]: if each == snakehead: gameOver = True snake(snakelist) score(snakelength-1) pygame.display.update() if lead_x >= randAppleX and lead_x <= randAppleX + applethickness or lead_x + block_size >= randAppleX and lead_x + block_size <= randAppleX + applethickness: if lead_y >= randAppleY and lead_y <= randAppleY + applethickness or lead_y + block_size >= randAppleY and lead_y + block_size <= randAppleY + applethickness: randAppleX, randAppleY = randApplegen() snakelength += 1; clock.tick(FPS) intro() gameLoop() pygame.quit() quit()
以上这篇使用pygame模块编写贪吃蛇的实例讲解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月15日
2024年11月15日
- 姚璎格《发烧女中音》DSD版[低速原抓WAV+CUE][1G]
- 张玮伽《微风细雨DSD》发烧大碟[WAV+CUE][1.1G]
- 群星《2024好听新歌14》十倍音质 U盘音乐 [WAV分轨][966M]
- s14全球总决赛T1战队队员都有谁 LOLs14全球总决赛T1战队介绍
- 英雄联盟faker身价有10亿吗 英雄联盟faker身价介绍一览
- faker大魔王称号怎么来的 faker大魔王称号来源介绍
- PS5 Pro上的蒂法更美了!博主盛赞新机1000%值得购买
- 腾讯互娱再离职一员大将!或因供应商贪腐
- Ayaneo3游戏掌机预热:旗舰定位、造型圆润自带底键
- 动力火车.1999-背叛情歌【上华】【WAV+CUE】
- 刘力扬.2019-Neon.Lit虹【摩登天空】【FLAC分轨】
- 群星.2002-恋爱物语情歌对唱精选2CD(引进版)【滚石】【WAV+CUE】
- 群星《闽南情24K德国HD金碟》2CD[WAV+CUE]
- 周传雄《恋人创世纪》环球唱片[WAV+CUE]
- 关淑怡-《真假情话K2HD》(日本压制)【WAV+CUE】