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开启多个子进程并行运行的方法
Apr 18 Python
学习python类方法与对象方法
Mar 15 Python
Django admin实现图书管理系统菜鸟级教程完整实例
Dec 12 Python
Python实现的字典值比较功能示例
Jan 08 Python
Python基于生成器迭代实现的八皇后问题示例
May 23 Python
Python中判断输入是否为数字的实现代码
May 26 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
python并发编程多进程之守护进程原理解析
Aug 20 Python
使用Python实现分别输出每个数组
Dec 06 Python
Python使用Excel将数据写入多个sheet
May 16 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 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
apache php模块整合操作指南
2012/11/16 PHP
ThinkPHP有变量的where条件分页实例
2014/11/03 PHP
php页面函数设置超时限制的方法
2014/12/01 PHP
laravel5创建service provider和facade的方法详解
2016/07/26 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
JavaScript实现的简单幂函数实例
2015/04/17 Javascript
JavaScript实现的简单拖拽效果
2015/06/01 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
JavaScript中var、let、const区别浅析
2018/06/24 Javascript
JS实现头条新闻的经典轮播图效果示例
2019/01/30 Javascript
Vue页面手动刷新,实现导航栏激活项还原到初始状态
2020/08/06 Javascript
python的常见命令注入威胁
2013/02/18 Python
Python中字符串的格式化方法小结
2016/05/03 Python
利用标准库fractions模块让Python支持分数类型的方法详解
2017/08/11 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python连接Redis的基本配置方法
2018/09/13 Python
python读取目录下最新的文件夹方法
2018/12/24 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
学习Python需要哪些工具
2020/09/04 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
全世界最美丽的四星和五星级酒店预订:Prestigia.com
2017/11/15 全球购物
给水工程专业毕业生自荐信
2014/01/28 职场文书
铁路安全事故反思
2014/04/26 职场文书
主题团日活动总结
2014/06/25 职场文书
绿色环保家庭事迹材料
2014/08/31 职场文书
人事文员岗位职责
2015/02/04 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书
法学专业求职信范文
2015/03/19 职场文书
2015年财政局工作总结
2015/05/21 职场文书
box-shadow单边阴影的实现
2023/05/21 HTML / CSS