最近在学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.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经典小游戏汇总
python微信跳一跳游戏集合
更多有趣的经典小游戏实现专题,分享给大家:
C++经典小游戏汇总
JavaScript经典游戏 玩不停
java经典小游戏汇总
javascript经典小游戏汇总
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# python
# 贪吃蛇
# 游戏
# Python写的贪吃蛇游戏例子
# 使用Python写一个贪吃蛇游戏实例代码
# python实现贪吃蛇小游戏
# python贪吃蛇游戏代码
# python实现贪吃蛇游戏
# python实现贪吃蛇游戏源码
# python实现简单贪吃蛇游戏
# python实现简单贪吃蛇小游戏
# python实现一个简单的贪吃蛇游戏附代码
# Python版贪吃蛇保姆级教程(附完整代码有详细注释)
# 经典小游戏
# 来实现
# 放在
# 请点击
# 找不到
# 这条
# 太大
# 给大家
# 做个
# 只需要
# 上也
# 想做
# 更多关于
# 就先
# 可以利用
# 很不
# 这和
# 命令行
# 大家多多
相关文章:
建站之星导航如何优化提升用户体验?
哈尔滨网站建设策划,哈尔滨电工证查询网站?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
全景视频制作网站有哪些,全景图怎么做成网页?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
实惠建站价格推荐:2025年高性价比自助建站套餐解析
如何快速搭建高效WAP手机网站吸引移动用户?
小型网站制作HTML,*游戏网站怎么搭建?
建站之星免费版是否永久可用?
b2c电商网站制作流程,b2c水平综合的电商平台?
建站之星好吗?新手能否轻松上手建站?
电商网站制作公司有哪些,1688网是什么意思?
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
网站制作免费,什么网站能看正片电影?
上海网站制作开发公司,上海买房比较好的网站有哪些?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?
如何通过可视化优化提升建站效果?
手机网站制作与建设方案,手机网站如何建设?
微信h5制作网站有哪些,免费微信H5页面制作工具?
建站之星后台密码如何安全设置与找回?
如何在云服务器上快速搭建个人网站?
如何在服务器上配置二级域名建站?
如何选择最佳自助建站系统?快速指南解析优劣
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何在IIS中新建站点并配置端口与物理路径?
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
公司网站的制作公司,企业网站制作基本流程有哪些?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?
已有域名和空间,如何快速搭建网站?
如何设置并定期更换建站之星安全管理员密码?
SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
建站之星CMS五站合一模板配置与SEO优化指南
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
大连网站设计制作招聘信息,大连投诉网站有哪些?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站主机SSH密钥生成步骤及常见问题解答?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
建站主机CVM配置优化、SEO策略与性能提升指南
如何在景安服务器上快速搭建个人网站?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
高端云建站费用究竟需要多少预算?
公司网站设计制作厂家,怎么创建自己的一个网站?
常州自助建站工具推荐:低成本搭建与模板选择技巧
*请认真填写需求信息,我们会在24小时内与您取得联系。