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 subprocess模块学习总结
Mar 13 Python
利用Python实现颜色色值转换的小工具
Oct 27 Python
Python实现单词翻译功能
Jun 06 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
python写入已存在的excel数据实例
May 03 Python
python得到电脑的开机时间方法
Oct 15 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
PyQt5使用QTimer实现电子时钟
Jul 29 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
python IDLE添加行号显示教程
Apr 25 Python
python 实现socket服务端并发的四种方式
Dec 14 Python
Python列表的深复制和浅复制示例详解
Feb 12 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
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP实现适用于自定义的验证码类
2016/06/15 PHP
Yii2 批量插入、更新数据实例
2017/03/15 PHP
php基于SQLite实现的分页功能示例
2017/06/21 PHP
PHP读取目录树的实现方法分析
2019/03/22 PHP
JavaScript学习历程和心得小结
2010/08/16 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
2010/11/02 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
小程序开发实战:实现九宫格界面的导航的代码实现
2017/01/19 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
react-router实现按需加载
2017/05/09 Javascript
详解Angular模板引用变量及其作用域
2018/11/23 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
nodejs实现聊天机器人功能
2019/09/19 NodeJs
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python网络编程 Python套接字编程
2017/09/13 Python
Python交互环境下实现输入代码
2018/06/22 Python
实例分析python3实现并发访问水平切分表
2018/09/29 Python
python基于socket实现的UDP及TCP通讯功能示例
2019/11/01 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
住院医师规范化培训实施方案
2014/06/12 职场文书
征兵宣传标语
2014/06/20 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年计划生育工作总结
2014/11/14 职场文书
整脏治乱工作简报
2015/07/21 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
详解php中流行的rpc框架
2021/05/29 PHP
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL