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的语言类型(详解)
Jun 24 Python
python将txt等文件中的数据读为numpy数组的方法
Dec 22 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
Oct 24 Python
Python pandas自定义函数的使用方法示例
Nov 20 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
jupyter notebook的安装与使用详解
May 18 Python
Python如何读写二进制数组数据
Aug 01 Python
解决python3中os.popen()出错的问题
Nov 19 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
python缺失值填充方法示例代码
Dec 24 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的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
php获取YouTube视频信息的方法
2015/02/11 PHP
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
javascript options属性集合操作代码
2009/12/28 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
js获取多个tagname的节点数组
2013/09/22 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
PHP+jQuery+Ajax实现多图片上传效果
2015/03/14 Javascript
js倒计时简单实现代码
2016/08/11 Javascript
KnockoutJS 3.X API 第四章之click绑定
2016/10/10 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
微信小程序 PHP后端form表单提交实例详解
2017/01/12 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
layui实现三级联动效果
2019/07/26 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
Vue调用后端java接口的实例代码
2019/10/28 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
Vue 禁用浏览器的前进后退操作
2020/09/04 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
Python工程师面试题 与Python基础语法相关
2016/01/14 Python
Python进阶之递归函数的用法及其示例
2018/01/31 Python
Django权限机制实现代码详解
2018/02/05 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
python ftplib模块使用代码实例
2019/12/31 Python
基于Python的OCR实现示例
2020/04/03 Python
python性能测试工具locust的使用
2020/12/28 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
NBA欧洲商店(西班牙):NBA Europe Store ES
2019/04/16 全球购物
矿泉水广告词
2014/03/20 职场文书
职位说明书范文
2014/05/07 职场文书
领导班子四风表现材料
2014/08/23 职场文书
乡文化站暑期培训方案
2014/08/28 职场文书
医院见习报告范文
2014/11/03 职场文书