Python贪吃蛇游戏编写代码


Posted in Python onOctober 26, 2020

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

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

Python贪吃蛇游戏编写代码

要求:用#表示边框,用*表示食物,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.1

import copy
import random
import os
import msvcrt

# the board class, used to put everything
class 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 class
class 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 game
class 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 相关文章推荐
Python计时相关操作详解【time,datetime】
May 26 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
python numpy 一维数组转变为多维数组的实例
Jul 02 Python
Python实现模拟登录网易邮箱的方法示例
Jul 05 Python
解决pycharm回车之后不能换行或不能缩进的问题
Jan 16 Python
详解Python做一个名片管理系统
Mar 14 Python
python通过TimedRotatingFileHandler按时间切割日志
Jul 17 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
Python IDLE或shell中切换路径的操作
Mar 09 Python
python实现引用其他路径包里面的模块
Mar 09 Python
Python转换字典成为对象,可以用&quot;.&quot;方式访问对象属性实例
May 11 Python
OpenCV实现人脸识别
Apr 07 #Python
python使用opencv进行人脸识别
Apr 07 #Python
Python 实现链表实例代码
Apr 07 #Python
python中如何使用朴素贝叶斯算法
Apr 06 #Python
python获取当前运行函数名称的方法实例代码
Apr 06 #Python
python爬取w3shcool的JQuery课程并且保存到本地
Apr 06 #Python
使用Python对SQLite数据库操作
Apr 06 #Python
You might like
PHP防止跨域提交表单
2013/11/01 PHP
php压缩和解压缩字符串的方法
2015/03/14 PHP
PHP中的静态变量及static静态变量使用详解
2015/11/05 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
jquery 经典动画菜单效果代码
2010/01/26 Javascript
jquery插件开发方法(初学者)
2012/02/03 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
老生常谈 js中this的指向
2016/06/30 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
JS控件bootstrap datepicker使用方法详解
2017/03/25 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
vue基于better-scroll实现左右联动滑动页面
2020/06/30 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
Python Flask前后端Ajax交互的方法示例
2018/07/31 Python
使用Python3+PyQT5+Pyserial 实现简单的串口工具方法
2019/02/13 Python
Pytorch 实现自定义参数层的例子
2019/08/17 Python
PyTorch 对应点相乘、矩阵相乘实例
2019/12/27 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
python中类与对象之间的关系详解
2020/12/16 Python
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
Steve Madden官网:美国鞋类品牌
2017/01/29 全球购物
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
幼师岗位求职简历的自荐信格式
2013/09/21 职场文书
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
暑假学习心得体会
2014/09/02 职场文书
重阳节慰问信
2015/02/15 职场文书
社会实践单位意见
2015/06/05 职场文书
2016年寒假学习心得体会
2015/10/09 职场文书
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
如何用vue实现网页截图你知道吗
2021/11/17 Vue.js
Oracle锁表解决方法的详细记录
2022/06/05 Oracle