Python编写贪吃蛇小游戏

编程入门 行业动态 更新时间:2024-10-25 20:27:00

Python编写贪吃蛇<a href=https://www.elefans.com/category/jswz/34/1769974.html style=小游戏"/>

Python编写贪吃蛇小游戏

2018.3.15 晴 天气越来越热 要穿T恤了

今天一天就编了一个小游戏:贪吃蛇。 

面向对象这个逻辑是必须要学会的,has a , is a, 这些关系要弄明白,封装,继承,多态,是面向对象的三个属性。今天的贪吃蛇代码基本上是完成了,验证是否碰壁,是否追尾,添加字体,添加弹窗,开始新的游戏,这几个功能基本都是按照自己的逻辑写的,用了个easygui类来弹窗,我觉得挺有意思的。 还有一个排行榜没做,我得考虑一下是用存档的方式还是在游戏进行的时候用一个列表存数据(重开游戏就清空了)

 

 

代码如下:

 

import pygame
from abc import ABCMeta, abstractclassmethod
from random import randint
from pygame.locals import *import easyguiBlack_color = (0, 0, 0)
Food_color = (236, 189, 187)
Green_color = (0, 255, 0)# 顺时针或者逆时针
UP = 0
RIGHT = 1
DOWN = 2
LEFT = 3class GameObject(object, metaclass=ABCMeta):def __init__(self, x, y, color):self._x = xself._y = yself._color = color@propertydef x(self):return self._x@propertydef y(self):return self._y@abstractclassmethoddef draw(self, screen):passclass Snake(GameObject):def __init__(self):self._dir = LEFTself._nodes = []self.has_eat_food = Falsefor index in range(5):node = SnakeNode(290 + index * 20, 250, 20)self._nodes.append(node)@propertydef dir(self):return self._dirdef change_dir(self, new_dir):if (self._dir + new_dir) % 2 != 0:self._dir = new_dirdef draw(self, screen):for node in self._nodes:node.draw(screen)def move(self):head = self._nodes[0]sdir = self._dirx, y, size = head.x, head.y, head.sizeif sdir == UP:y -= sizeelif sdir == RIGHT:x += sizeelif sdir == DOWN:y += sizeelse:x -= sizenew_head = SnakeNode(x, y, size)self._nodes.insert(0, new_head)if self.has_eat_food:self.has_eat_food = Falseelse:self._nodes.pop()def is_over(self):'''撞墙返回真,否则返回假'''head = self._nodes[0]x, y, size = head.x, head.y, head.sizeif x > 600 or x < 10 or y > 600 or y < 10:return Truereturn Falsedef eat_food(self, food):head = self._nodes[0]if food.x == head.x and food.y == head.y:self.has_eat_food = Truereturn Truereturn Falsedef eat_me(self):for a in range(4, len(self._nodes)):if self._nodes[0].x == self._nodes[a].x and self._nodes[0].y == self._nodes[a].y:return Truereturn Falseclass SnakeNode(GameObject):def __init__(self, x, y, size, color=Green_color):super().__init__(x, y, color)self._size = sizeself._color = color@propertydef size(self):return self._sizedef draw(self, screen):pygame.draw.rect(screen, self._color,(self._x, self._y, self._size, self._size), 0)pygame.draw.rect(screen, Black_color,(self._x, self._y, self._size, self._size), 1)class Wall(GameObject):def __init__(self, x, y, width, height, color=Black_color):super().__init__(x, y, color)self._width = widthself._height = height@propertydef width(self):return self._width@propertydef height(self):return self._heightdef draw(self, screen):pygame.draw.rect(screen, self._color,(self._x, self._y, self._width, self._height), 4)class Food(GameObject):def __init__(self, x, y, size, color=Food_color):super().__init__(x, y, color)self._size = sizeself._hide = Falsedef draw(self, screen):if not self._hide:pygame.draw.circle(screen, self._color,(self._x + self._size // 2, self._y + self._size // 2),self._size // 2, 0)# 处理圆和半径的中心点 否则无法相遇self._hide = not self._hidedef main():def refresh():'''刷新游戏窗口'''screen.fill((242, 242, 242))snake.draw(screen)wall.draw(screen)food.draw(screen)pygame.display.flip()def handle_key_event(key_event):key = key_event.keyif key == ord('w'):new_dir = UPelif key == ord('d'):new_dir = RIGHTelif key == ord('s'):new_dir = DOWNelif key == ord('a'):new_dir = LEFTelse:new_dir = keyif new_dir != snake.dir:snake.change_dir(new_dir)def create_food():row = randint(1, 28)col = randint(1, 28)return Food(10 + 20 * row, 10 + 20 * col, 20)def count_txt(snake):score = len(snake._nodes) - 5my_font = pygame.font.SysFont('楷体', 60)game_over = my_font.render('GAME OVER', False, [0, 0, 0])score = my_font.render('score:' + str(score), False, [255, 0, 0])screen.blit(score, (400, 30))screen.blit(game_over, (180, 260))pygame.display.flip()wall = Wall(10, 10, 600, 600)food = create_food()snake = Snake()pygame.init()screen = pygame.display.set_mode((620, 620))pygame.display.set_caption('贪吃蛇')background = screen.fill((242, 242, 242))pygame.display.flip()clock = pygame.time.Clock()running = Trueover = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:handle_key_event(event)if over:refresh()clock.tick(20)if over:snake.move()if snake.eat_food(food):food = create_food()if snake.is_over() or snake.eat_me():count_txt(snake)Yes_or_No = easygui.buttonbox("不好意思,游戏结束", choices=['我不服我还要玩', '我不玩了886'])if Yes_or_No == '我不服我还要玩':snake = Snake()pygame.event.clear()else:over = Falsepygame.quit()if __name__ == '__main__':main()
 

 

 

代码量还是挺大的,逻辑比五子棋好理解一点,五子棋那个判断胜负确实有点绕,但是贪吃蛇基本把面向对象的东西都用到了,需要细嚼慢咽地去理解使用。

 

 

更多推荐

Python编写贪吃蛇小游戏

本文发布于:2024-03-24 00:07:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1744461.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小游戏   贪吃蛇   Python

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!