|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 石泊远 于 2021-1-26 21:00 编辑
- import pygame, sys
- import random
- from pygame.math import Vector2
- pygame.init()
- class SNAKE:
- def __init__(self):
- self.body = [Vector2(5,10),Vector2(4,10),Vector2(3,10)]
- self.direction = Vector2(1,0)
- self.new_block = False
- def draw_snake(self):
- for block in self.body:
- x_pos = int(block.x * cell_size)
- y_pos = int(block.y * cell_size)
- block_rect = pygame.Rect(x_pos,y_pos,cell_size,cell_size)
- pygame.draw.rect(screen,(255,106,106),block_rect)
- def move_snake(self):
- if self.new_block:
- body_copy = self.body[:]
- body_copy.insert(0, body_copy[0] + self.direction)
- self.body = body_copy[:]
- self.new_block = False
- else:
- body_copy = self.body[:-1]
- body_copy.insert(0,body_copy[0] + self.direction)
- self.body = body_copy[:]
- def add_block(self):
- self.new_block = True
- class FRUIT:
- def __init__(self):
- self.randommize()
- def draw_fruit(self):
- fruit_rect = pygame.Rect(int(self.pos.x * cell_size),int(self.pos.y * cell_size),cell_size,cell_size)
- screen.blit(apple,fruit_rect)
- def randommize(self):
- self.x = random.randint(0, cell_number - 1)
- self.y = random.randint(0, cell_number - 1)
- self.pos = Vector2(self.x, self.y)
- class MAIN:
- def __init__(self):
- self.snake = SNAKE()
- self.fruit = FRUIT()
- def update(self):
- self.snake.move_snake()
- self.check_collision()
- self.check_fail()
- def draw_elements(self):
- self.draw_grass()
- self.draw_score()
- self.fruit.draw_fruit()
- self.snake.draw_snake()
- def check_collision(self):
- if self.fruit.pos == self.snake.body[0]:
- self.fruit.randommize()
- self.snake.add_block()
- def check_fail(self):
- if not ((0 <= self.snake.body[0].x >= cell_number) or
- not (0 <= self.snake.body[0].y >= cell_number)):
- self.game_over()
- for block in self.snake.body[1:]:
- if block == self.snake.body[0]:
- self.game_over()
- def draw_grass(self):
- grass_color = (167,199,61)
- for cl in range(cell_number):
- c_n = 0 if (cl == 0) or (cl % 2 == 0) else 1
- for col in range(c_n,cell_number,2):
- grass_rect = pygame.Rect(col * cell_size,cl * cell_size,cell_size,cell_size)
- pygame.draw.rect(screen,grass_color,grass_rect)
- def draw_score(self):
- score_num = int(len(self.snake.body) - 3)
- score_surface = game_font.render('SCORE '+str(score_num),True,(85,107,47))
- score_x = int(3 * cell_size)
- score_y = int(1 * cell_size)
- score_rect = score_surface.get_rect(center = (score_x,score_y))
- screen.blit(score_surface,score_rect)
- def game_over(self):
- pygame.quit()
- sys.exit()
- cell_size = 30
- cell_number = 20
- screen = pygame.display.set_mode((cell_size * cell_number,cell_size * cell_number))
- clock = pygame.time.Clock()
- apple = pygame.image.load('apple.jpg').convert_alpha()
- game_font = pygame.font.Font(None,25)
- main_game = MAIN()
- SCREEN_UPDATE = pygame.USEREVENT
- pygame.time.set_timer(SCREEN_UPDATE,100)
- while True:
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- main_game.game_over()
- if event.type == SCREEN_UPDATE:
- main_game.update() #这里出问题了
复制代码
- if event.type == pygame.KEYDOWN:
- if event.key == pygame.K_UP:
- if main_game.snake.direction.y != 1:
- main_game.snake.direction = Vector2(0,-1)
- if event.key == pygame.K_RIGHT:
- if main_game.snake.direction.x != -1:
- main_game.snake.direction = Vector2(1,0)
- if event.key == pygame.K_DOWN:
- if main_game.snake.direction.y != -1:
- main_game.snake.direction = Vector2(0,1)
- if event.key == pygame.K_LEFT:
- if main_game.snake.direction.x != 1:
- main_game.snake.direction = Vector2(-1,0)
- screen.fill((175,215,70))
- main_game.draw_elements()
- pygame.display.update()
- clock.tick(60)
复制代码
- import random
- import pygame
- import sys
- from pygame.locals import *
- snake_speed = 5 #贪吃蛇的速度
- windows_width = 800
- windows_height = 600 #游戏窗口的大小
- cell_size = 20 #贪吃蛇身体方块大小,注意身体大小必须能被窗口长宽整除
- ''' #初始化区
- 由于我们的贪吃蛇是有大小尺寸的, 因此地图的实际尺寸是相对于贪吃蛇的大小尺寸而言的
- '''
- map_width = int(windows_width / cell_size)
- map_height = int(windows_height / cell_size)
- # 颜色定义
- white = (255, 255, 255)
- black = (0, 0, 0)
- gray = (230, 230, 230)
- dark_gray = (40, 40, 40)
- DARKGreen = (0, 155, 0)
- Green = (0, 255, 0)
- Red = (255, 0, 0)
- blue = (0, 0, 255)
- dark_blue =(0,0, 139)
- BG_COLOR = black #游戏背景颜色
- # 定义方向
- UP = 1
- DOWN = 2
- LEFT = 3
- RIGHT = 4
- HEAD = 0 #贪吃蛇头部下标
- #主函数
- def main():
- pygame.init() # 模块初始化
- snake_speed_clock = pygame.time.Clock() # 创建Pygame时钟对象
- screen = pygame.display.set_mode((windows_width, windows_height)) #
- screen.fill(white)
- pygame.display.set_caption("蓝蛇修仙") #设置标题
- show_start_info(screen) #欢迎信息
- while True:
- running_game(screen, snake_speed_clock)
- show_gameover_info(screen)
- #游戏运行主体
- def running_game(screen,snake_speed_clock):
- startx = random.randint(3, map_width - 8) #开始位置
- starty = random.randint(3, map_height - 8)
- snake_coords = [{'x': startx, 'y': starty}, #初始贪吃蛇
- {'x': startx - 1, 'y': starty},
- {'x': startx - 2, 'y': starty}]
- direction = RIGHT # 开始时向右移动
- food = get_random_location() #实物随机位置
- while True:
- for event in pygame.event.get():
- if event.type == QUIT:
- terminate()
- elif event.type == KEYDOWN:
- if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
- direction = LEFT
- elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
- direction = RIGHT
- elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
- direction = UP
- elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
- direction = DOWN
- elif event.key == K_ESCAPE:
- terminate()
- move_snake(direction, snake_coords) #移动蛇
- ret = snake_is_alive(snake_coords)
- if not ret:
- break #蛇跪了. 游戏结束
- snake_is_eat_food(snake_coords, food) #判断蛇是否吃到食物
- screen.fill(BG_COLOR)
- #draw_grid(screen)
- draw_snake(screen, snake_coords)
- draw_food(screen, food)
- draw_score(screen, len(snake_coords) - 3)
- pygame.display.update()
- snake_speed_clock.tick(snake_speed) #控制fps
- #将食物画出来
- def draw_food(screen, food):
- x = food['x'] * cell_size
- y = food['y'] * cell_size
- appleRect = pygame.Rect(x, y, cell_size, cell_size)
- pygame.draw.rect(screen, Red, appleRect)
- #将贪吃蛇画出来
- def draw_snake(screen, snake_coords):
- for coord in snake_coords:
- x = coord['x'] * cell_size
- y = coord['y'] * cell_size
- wormSegmentRect = pygame.Rect(x, y, cell_size, cell_size)
- pygame.draw.rect(screen, dark_blue, wormSegmentRect)
- wormInnerSegmentRect = pygame.Rect( #蛇身子里面的第二层亮绿色
- x + 4, y + 4, cell_size - 8, cell_size - 8)
- pygame.draw.rect(screen, blue, wormInnerSegmentRect)
- #画网格(可选)
- def draw_grid(screen):
- for x in range(0, windows_width, cell_size): # draw 水平 lines
- pygame.draw.line(screen, dark_gray, (x, 0), (x, windows_height))
- for y in range(0, windows_height, cell_size): # draw 垂直 lines
- pygame.draw.line(screen, dark_gray, (0, y), (windows_width, y))
- #移动贪吃蛇
- def move_snake(direction, snake_coords):
- if direction == UP:
- newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] - 1}
- elif direction == DOWN:
- newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] + 1}
- elif direction == LEFT:
- newHead = {'x': snake_coords[HEAD]['x'] - 1, 'y': snake_coords[HEAD]['y']}
- elif direction == RIGHT:
- newHead = {'x': snake_coords[HEAD]['x'] + 1, 'y': snake_coords[HEAD]['y']}
- snake_coords.insert(0, newHead)
- #判断蛇死了没
- def snake_is_alive(snake_coords):
- tag = True
- if snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \
- snake_coords[HEAD]['y'] == map_height:
- tag = False # 蛇碰壁啦
- for snake_body in snake_coords[1:]:
- if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:
- tag = False # 蛇碰到自己身体啦
- return tag
- #判断贪吃蛇是否吃到食物
- def snake_is_eat_food(snake_coords, food): #如果是列表或字典,那么函数内修改参数内容,就会影响到函数体外的对象。
- if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']:
- food['x'] = random.randint(0, map_width - 1)
- food['y'] = random.randint(0, map_height - 1) # 实物位置重新设置
- else:
- del snake_coords[-1] # 如果没有吃到实物, 就向前移动, 那么尾部一格删掉
- #食物随机生成
- def get_random_location():
- return {'x': random.randint(0, map_width - 1), 'y': random.randint(0, map_height - 1)}
- #开始信息显示
- def show_start_info(screen):
- font = pygame.font.Font('myfont.ttf', 40)
- tip = font.render('按任意键开始游戏~~~', True, (65, 105, 225))
- gamestart = pygame.image.load('ok.png')
- screen.blit(gamestart, (140, 30))
- screen.blit(tip, (240, 550))
- pygame.display.update()
- while True: #键盘监听事件
- for event in pygame.event.get(): # event handling loop
- if event.type == QUIT:
- terminate() #终止程序
- elif event.type == KEYDOWN:
- if (event.key == K_ESCAPE): #终止程序
- terminate() #终止程序
- else:
- return #结束此函数, 开始游戏
- #游戏结束信息显示
- def show_gameover_info(screen):
- font = pygame.font.Font('myfont.ttf', 40)
- tip = font.render('按Q或者ESC退出游戏, 按任意键重新开始游戏~', True, (65, 105, 225))
- gamestart = pygame.image.load('gameover.png')
- screen.blit(gamestart, (60, 0))
- screen.blit(tip, (80, 300))
- pygame.display.update()
- while True: #键盘监听事件
- for event in pygame.event.get(): # event handling loop
- if event.type == QUIT:
- terminate() #终止程序
- elif event.type == KEYDOWN:
- if event.key == K_ESCAPE or event.key == K_q: #终止程序
- terminate() #终止程序
- else:
- return #结束此函数, 重新开始游戏
- #画成绩
- def draw_score(screen,score):
- font = pygame.font.Font('myfont.ttf', 30)
- scoreSurf = font.render('得分: %s' % score, True, Green)
- scoreRect = scoreSurf.get_rect()
- scoreRect.topleft = (windows_width - 120, 10)
- screen.blit(scoreSurf, scoreRect)
- #程序终止
- def terminate():
- pygame.quit()
- sys.exit()
- main()
复制代码
|
|