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 示例分享---逻辑推理编程解决八皇后
Jul 20 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
python监控文件并且发送告警邮件
Jun 21 Python
python3实现windows下同名进程监控
Jun 21 Python
tensorflow 加载部分变量的实例讲解
Jul 27 Python
Python实现iOS自动化打包详解步骤
Oct 03 Python
Python选择网卡发包及接收数据包
Apr 04 Python
python版DDOS攻击脚本
Jun 12 Python
详解PyCharm+QTDesigner+PyUIC使用教程
Jun 13 Python
Python Multiprocessing多进程 使用tqdm显示进度条的实现
Aug 13 Python
pytorch动态网络以及权重共享实例
Jan 06 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 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
一个MYSQL操作类
2006/11/16 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php实现统计网站在线人数的方法
2015/05/12 PHP
搭建基于Docker的PHP开发环境的详细教程
2015/07/01 PHP
使用PHP生成图片的缩略图的方法
2015/08/18 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
PHP自定义错误处理的方法分析
2018/12/19 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
NodeJS中Buffer模块详解
2015/01/07 NodeJs
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
JavaScript取得gridview中获取checkbox选中的值
2017/07/24 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
JS实现轮播图效果
2020/01/11 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
python中随机函数random用法实例
2015/04/30 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
Django处理Ajax发送的Get请求代码详解
2019/07/29 Python
python实现高斯(Gauss)迭代法的例子
2019/11/20 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
python的链表基础知识点
2020/09/13 Python
TripAdvisor越南:全球领先的旅游网站
2017/09/21 全球购物
蛋白质世界:Protein World
2017/11/23 全球购物
YSL圣罗兰美妆俄罗斯官网:Yves Saint Lauret RU
2020/09/23 全球购物
外企财务年会演讲稿
2014/01/03 职场文书