赞
踩
想要提高编程能力就要多敲代码,自己写一款小游戏是一个很不错的练习方式,接下来我们一起来完成一款经典的游戏
贪吃蛇大作战
, 在实践过程中体会面向对象的优点
# 初始化 Pygame pygame.init() # 设置游戏界面大小、背景颜色和游戏标题 screen_width = 640 screen_height = 480 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption('贪吃蛇') # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) snake_size = 20 # 定义一个计时器来控制蛇的移动速度 clock = pygame.time.Clock()
定义snake类
class snake(object): # 初始化蛇的初始位置、大小和速度 def __init__(self): self.snake_x = 100 self.snake_y = 100 self.snake_size = 20 self.snake_speed = 5 # 定义蛇的移动方向 snake_direction = 'right' # 定义一个列表来保存蛇的身体坐标 snake_body = [] def move_(self, snake_direction): if snake_direction == 'up': self.snake_y -= self.snake_speed elif snake_direction == 'down': self.snake_y += self.snake_speed elif snake_direction == 'left': self.snake_x -= self.snake_speed elif snake_direction == 'right': self.snake_x += self.snake_speed self.snake_direction=snake_direction self.snake_body.insert(0, [self.snake_x, self.snake_y])
每移动一步,将新的头部坐标加入snake_body[0],后面会有更新身体操作
定义food类
# 定义食物的大小 food_size = 20 #定义食物类 class food(object): def __init__(self,food_x,food_y): self.food_x = food_x self.food_y = food_y #检测食物是否被吃 def ate(self, snake): snake_x = snake.snake_x snake_y = snake.snake_y food_x = self.food_x food_y = self.food_y if (snake_x == food_x and snake_y == food_y) or (snake_x == food_x and abs(snake_y - food_y) < snake_size) or ( snake_y == food_y and abs(snake_x - food_x) < snake_size): self.food_x = random.randrange(0, screen_width - snake_size, 10) self.food_y = random.randrange(0, screen_height - snake_size, 10) snake.snake_body.append([snake_x, snake_y])
蛇吃到食物的3种情况
- 蛇头坐标和食物坐标重合(snake_x == food_x and snake_y == food_y)
- 蛇从左右两侧碰到食物(snake_x == food_x and abs(snake_y - food_y) < snake_size)
- 蛇从上下两侧碰到食物 snake_y == food_y and abs(snake_x - food_x) < snake_size)
1.定义一个draw函数
# 定义一个函数来绘制蛇和食物
def draw(snake, food):
screen.fill(BLACK)
for pos in snake.snake_body:
pygame.draw.rect(screen, GREEN, [pos[0], pos[1], snake_size, snake_size])
print(food.food_x, food.food_y)
pygame.draw.rect(screen, RED, [food.food_x, food.food_y, food_size, food_size])
pygame.display.update()
函数最开始一定要进行screen.fill(BLACK),清空整个窗口,因为pygame.display.update()是在原来的基础上进行更新,会保留蛇和食物的痕迹
2.main()函数
# 主循环 def main(snake,food): while True: snake_direction = snake.snake_direction # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: # 退出游戏 pygame.quit() quit() # 处理按键事件 if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake_direction = 'up' elif event.key == pygame.K_DOWN: snake_direction = 'down' elif event.key == pygame.K_LEFT: snake_direction = 'left' elif event.key == pygame.K_RIGHT: snake_direction = 'right' # 移动蛇的头部 snake.move_( snake_direction) # 判断是否吃到食物 food.ate(snake) # 更新蛇的身体坐标 if len(snake.snake_body) > 1: snake.snake_body.pop() # 判断游戏是否结束 snake_x = snake.snake_x snake_y = snake.snake_y food_x = food.food_x food_y = food.food_y snake_body = snake.snake_body if snake_x < 0 or snake_x > screen_width - snake_size or snake_y < 0 or snake_y > screen_height - snake_size or [ snake_x, snake_y] in snake_body[1:]: # 游戏结束,显示分数并等待退出 font = pygame.font.Font(None, 36) text = font.render('Score: ' + str(len(snake_body)), True, WHITE) screen.blit(text, ((screen_width - text.get_width()) / 2, (screen_height - text.get_height()) / 2)) pygame.display.update() pygame.time.wait(2000) pygame.quit() quit() # 绘制蛇和食物 draw(snake, food) # 控制蛇的移动速度 clock.tick(20)
游戏结束的2种情况
1.蛇撞墙(snake_x < 0 or snake_x > screen_width - snake_size or snake_y < 0 or snake_y > screen_height - snake_size)
2.蛇吃自己 ([ snake_x, snake_y] in snake_body[1:])
到这里游戏以及圆满完成了,来看看运行效果
完整代码
import pygame import random # 初始化 Pygame pygame.init() # 设置游戏界面大小、背景颜色和游戏标题 screen_width = 640 screen_height = 480 screen = pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption('贪吃蛇') # 定义颜色 BLACK = (0, 0, 0) WHITE = (255, 255, 255) RED = (255, 0, 0) GREEN = (0, 255, 0) snake_size = 20 # 定义一个计时器来控制蛇的移动速度 clock = pygame.time.Clock() class snake(object): # 初始化蛇的初始位置、大小和速度 def __init__(self): self.snake_x = 100 self.snake_y = 100 self.snake_size = 20 self.snake_speed = 5 # 定义蛇的移动方向 snake_direction = 'right' # 定义一个列表来保存蛇的身体坐标 snake_body = [] def move_(self, snake_direction): if snake_direction == 'up': self.snake_y -= self.snake_speed elif snake_direction == 'down': self.snake_y += self.snake_speed elif snake_direction == 'left': self.snake_x -= self.snake_speed elif snake_direction == 'right': self.snake_x += self.snake_speed self.snake_direction=snake_direction self.snake_body.insert(0, [self.snake_x, self.snake_y]) # 定义食物的大小 food_size = 20 #定义食物类 class food(object): def __init__(self,food_x,food_y): self.food_x = food_x self.food_y = food_y def ate(self, snake): snake_x = snake.snake_x snake_y = snake.snake_y food_x = self.food_x food_y = self.food_y if (snake_x == food_x and snake_y == food_y) or (snake_x == food_x and abs(snake_y - food_y) < snake_size) or ( snake_y == food_y and abs(snake_x - food_x) < snake_size): self.food_x = random.randrange(0, screen_width - snake_size, 10) self.food_y = random.randrange(0, screen_height - snake_size, 10) snake.snake_body.append([snake_x, snake_y]) # 定义一个函数来绘制蛇和食物 def draw(snake, food): screen.fill(BLACK) for pos in snake.snake_body: pygame.draw.rect(screen, GREEN, [pos[0], pos[1], snake_size, snake_size]) print(food.food_x, food.food_y) pygame.draw.rect(screen, RED, [food.food_x, food.food_y, food_size, food_size]) pygame.display.update() # 主循环 def main(snake,food): while True: snake_direction = snake.snake_direction # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: # 退出游戏 pygame.quit() quit() # 处理按键事件 if event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: snake_direction = 'up' elif event.key == pygame.K_DOWN: snake_direction = 'down' elif event.key == pygame.K_LEFT: snake_direction = 'left' elif event.key == pygame.K_RIGHT: snake_direction = 'right' # 移动蛇的头部 snake.move_( snake_direction) print(1) # 判断是否吃到食物 food.ate(snake) print(2) # 更新蛇的身体坐标 if len(snake.snake_body) > 1: snake.snake_body.pop() # 判断游戏是否结束 snake_x = snake.snake_x snake_y = snake.snake_y food_x = food.food_x food_y = food.food_y snake_body = snake.snake_body if snake_x < 0 or snake_x > screen_width - snake_size or snake_y < 0 or snake_y > screen_height - snake_size or [ snake_x, snake_y] in snake_body[1:]: # 游戏结束,显示分数并等待退出 font = pygame.font.Font(None, 36) text = font.render('Score: ' + str(len(snake_body)), True, WHITE) screen.blit(text, ((screen_width - text.get_width()) / 2, (screen_height - text.get_height()) / 2)) pygame.display.update() pygame.time.wait(2000) pygame.quit() quit() # 绘制蛇和食物 print(3) draw(snake, food) # 控制蛇的移动速度 clock.tick(20) if __name__ == "__main__": main( snake(),food(random.randrange(0, screen_width - snake_size, 20),random.randrange(0, screen_width - snake_size, 20)))
感谢你的观看,如果对你有帮助的话,请点个赞哦,最后,祝我们一起迈向更高的目标,共同追求卓越与进步!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。