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编写贪吃蛇小游戏相关推荐

  1. python 贪吃蛇小游戏代码_10分钟再用Python编写贪吃蛇小游戏

    Python编写贪吃蛇 前不久我们公众号发布了一篇C++编写贪吃蛇小游戏的推文,反响空前.看来大家对这类简单易上手小游戏还是很喜爱的. 恰逢2018年IEEE Spectrum编程语言排行榜新鲜出炉, ...

  2. 10分钟用python编写贪吃蛇小游戏_牛得一批!10分钟用Python编写一个贪吃蛇小游戏...

    贪吃蛇,大家应该都玩过.当初第一次接触贪吃蛇的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎.今天,我们用Python编程一个贪吃蛇游戏,下面我们先看看效果: 好了,先介绍一个思路 所有的游戏最主要 ...

  3. Python使用pygame编写贪吃蛇小游戏

    Python使用pygame编写贪吃蛇小游戏 代码如下: # -*- coding:utf-8 -*- """ 贪吃蛇 """ import ...

  4. 用Python做贪吃蛇小游戏

    用Python做贪吃蛇小游戏 简介 引言 游戏预览 结构图 代码框架图 代码讲解 main主函数-开始工作 show_start_info()欢迎进入游戏 running_game-让我们开始游戏吧 ...

  5. 用python实现贪吃蛇小游戏

    好的,以下是用Python实现贪吃蛇小游戏的基本步骤: 1.导入必要的模块:需要使用Pygame模块来创建游戏窗口.处理用户输入.绘制游戏元素等. 2.初始化游戏:创建游戏窗口.初始化游戏元素(如蛇的 ...

  6. python简易贪吃蛇小游戏任务书含代码

    目  录 第一章 绪论 1.1 开发的背景 1.2 开发的目的 1.3 开发的意义 1.4 开发工具简介 第二章 需求分析 (1) 利用方向键来改变蛇的运行方向. (2) 在随机的地方产生食物. (3 ...

  7. Python实现贪吃蛇小游戏(双人模式)

    这篇文章主要为大家详细介绍了Python实现双人模式的贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 简单用py写了一个贪吃蛇游戏,有单人.双人模式,比较简 ...

  8. python制作贪吃蛇小游戏,畅玩无限制

    前言 大家早好.午好.晚好吖 ❤ ~ 现在这年头,无论玩个什么游戏都有健康机制, 这让我们愉悦玩游戏得步伐变得承重起来, 于是无聊之下我写了个贪吃蛇小游戏,来玩个快乐 代码展示 导入模块 import ...

  9. Python游戏开发,Python实现贪吃蛇小游戏与吃豆豆 附带源码

    开发工具 Python版本: 3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 贪吃蛇 ...

  10. Python:贪吃蛇小游戏

    #pygame游戏库,sys操控python运行的环境 import pygame,sys,random #这个模块包含所有pygame所使用的常亮 from pygame.locals import ...

最新文章

  1. 惰性求值 php,详细介绍C#函数式编程的示例代码
  2. MobileNet Unet
  3. 不用安装Oracle Client如何使用PLSQL Developer
  4. Spring Boot笔记-Hibernate中@ManyToOne及@OneToOne
  5. php mysql 链表_浅谈PHP链表数据结构(单链表)
  6. 《王牌竞速》与HUAWEI Mate40 系列打造全新游戏体验
  7. 网易2017春招笔试真题编程题集合
  8. centos7安装浏览器
  9. mysql连接自己的ip地址_mysql 连接字符串 远程连接用IP地址 而非只是localhost时
  10. hdoj 4940 强连通图
  11. 第五十五节,IO多路复用select模块加socket模块,伪多线并发
  12. ssl免费证书获取,并在nginx服务器上安装ssl证书,以及docker安装nginx需注意的细节。
  13. AMD免驱显卡支持列表
  14. 阴阳师1月服务器维护,阴阳师1月15日更新维护公告 鬼童丸降临平安京
  15. 【论文阅读】Enhancing Underwater Imagery using Generative Adversarial Networks
  16. python图片镜像翻转_python图像处理之镜像实现方法
  17. (已完善)基于Python的TCP 协议实现人机聊天(程序具有服务端和客户端)
  18. 初步中的初步了解DFS以及DFT
  19. logic原理图板框制作
  20. cesium加载BIM模型

热门文章

  1. Win10+GTX1050ti+cuda8.0+cuDNN5.1+Tensorflow-gpu1.2+Keras+Theano环境搭建
  2. 从PWR_BackupAccessCmd函数理解位带操作
  3. 计算机等级考试四级 网络工程师 之 操作系统原理2 适合懒人备考哈哈哈
  4. 湖南大学python头歌实训-简单计算
  5. e代家园 / IT-RT508 路由器模块套装
  6. 面试官: 美团外卖的分库分表怎么设计?
  7. 商米开发之获取设备sn
  8. 金丝雀来了!Canary:守卫计算机系统的最后一道防线!
  9. app 自动化工具uiautomator2 + app页面分析工具weditor的使用
  10. 【金九银十】和网易大牛的技术面谈