侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Python贪吃蛇游戏编写代码

Python  /  管理员 发布于 7年前   189

最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法。

由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这条贪吃蛇不会自己动,运行效果如下:

要求:用#表示边框,用*表示食物,o表示蛇的身体,O表示蛇头,使用wsad来移动

Python版本:3.6.1

系统环境:Win10

类:

  board:棋盘,也就是游戏区域

  snake:贪吃蛇,通过记录身体每个点来记录蛇的状态

  game:游戏类

  本来还想要个food类的,但是food只需要一个坐标,和一个新建,所以干脆使用list来保存坐标,新建food放在game里面,从逻辑上也没有太大问题

源码:

# Write By Guobao# 2017/4//7## 贪吃蛇# 用#做边界,*做食物,o做身体和头部# python 3.6.1import copyimport randomimport osimport msvcrt# the board class, used to put everythingclass board: __points =[] def __init__(self):  self.__points.clear()  for i in range(22):   line = []   if i == 0 or i == 21:    for j in range(22):     line.append('#')   else:    line.append('#')    for j in range(20):     line.append(' ')    line.append('#')   self.__points.append(line) def getPoint(self, location):  return self.__points[location[0]][location[1]] def clear(self):  self.__points.clear()  for i in range(22):   line = []   if i == 0 or i == 21:    for j in range(22):     line.append('#')   else:    line.append('#')    for j in range(20):     line.append(' ')    line.append('#')   self.__points.append(line) def put_snake(self, snake_locations):  # clear the board  self.clear()  # put the snake points  for x in snake_locations:   self.__points[x[0]][x[1]] = 'o'  # the head  x = snake_locations[len(snake_locations) - 1]  self.__points[x[0]][x[1]] = 'O' def put_food(self, food_location):  self.__points[food_location[0]][food_location[1]] = '*' def show(self):  os.system("cls")  for i in range(22):   for j in range(22):    print(self.__points[i][j], end='')   print()# the snake classclass snake: __points = [] def __init__(self):  for i in range(1, 6):   self.__points.append([1, i]) def getPoints(self):  return self.__points # move to the next position # give the next head def move(self, next_head):  self.__points.pop(0)  self.__points.append(next_head) # eat the food # give the next head def eat(self, next_head):  self.__points.append(next_head) # calc the next state # and return the direction def next_head(self, direction='default'):  # need to change the value, so copy it  head = copy.deepcopy(self.__points[len(self.__points) - 1])  # calc the "default" direction  if direction == 'default':   neck = self.__points[len(self.__points) - 2]   if neck[0] > head[0]:    direction = 'up'   elif neck[0] < head[0]:    direction = 'down'   elif neck[1] > head[1]:    direction = 'left'   elif neck[1] < head[1]:    direction = 'right'  if direction == 'up':   head[0] = head[0] - 1  elif direction == 'down':   head[0] = head[0] + 1  elif direction == 'left':   head[1] = head[1] - 1  elif direction == 'right':   head[1] = head[1] + 1  return head# the gameclass game: board = board() snake = snake() food = [] count = 0 def __init__(self):  self.new_food()  self.board.clear()  self.board.put_snake(self.snake.getPoints())  self.board.put_food(self.food) def new_food(self):  while 1:   line = random.randint(1, 20)   column = random.randint(1, 20)   if self.board.getPoint([column, line]) == ' ':    self.food = [column, line]    return def show(self):  self.board.clear()  self.board.put_snake(self.snake.getPoints())  self.board.put_food(self.food)  self.board.show() def run(self):  self.board.show()  # the 'w a s d' are the directions  operation_dict = {b'w': 'up', b'W': 'up', b's': 'down', b'S': 'down', b'a': 'left', b'A': 'left', b'd': 'right', b'D': 'right'}  op = msvcrt.getch()  while op != b'q':   if op not in operation_dict:    op = msvcrt.getch()   else:    new_head = self.snake.next_head(operation_dict[op])    # get the food    if self.board.getPoint(new_head) == '*':     self.snake.eat(new_head)     self.count = self.count + 1     if self.count >= 15:      self.show()      print("Good Job")      break     else:      self.new_food()      self.show()    # 反向一Q日神仙    elif new_head == self.snake.getPoints()[len(self.snake.getPoints()) - 2]:     pass    # rush the wall    elif self.board.getPoint(new_head) == '#' or self.board.getPoint(new_head) == 'o':     print('GG')     break    # normal move    else:     self.snake.move(new_head)     self.show()   op = msvcrt.getch()game().run()

笔记:

  1.Python 没有Switch case语句,可以利用dirt来实现

  2.Python的=号是复制,复制引用,深复制需要使用copy的deepcopy()函数来实现

  3.即使在成员函数内,也需要使用self来访问成员变量,这和C++、JAVA很不一样

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python 生成器生成杨辉三角的方法(必看)
    下一条:
    python使用opencv进行人脸识别
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客