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使用scrapy抓取网站sitemap信息的方法
Apr 08 Python
在Python的Django框架上部署ORM库的教程
Apr 20 Python
在java中如何定义一个抽象属性示例详解
Aug 18 Python
Python基础语言学习笔记总结(精华)
Nov 14 Python
Python模拟脉冲星伪信号频率实例代码
Jan 03 Python
python中找出numpy array数组的最值及其索引方法
Apr 17 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
djang常用查询SQL语句的使用代码
Feb 15 Python
一文了解Python并发编程的工程实现方法
May 31 Python
用python给自己做一款小说阅读器过程详解
Jul 11 Python
Python Pivot table透视表使用方法解析
Sep 11 Python
python实现简单文件读写函数
Feb 25 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
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
php通过session防url攻击方法
2014/12/10 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
php array_keys 返回数组的键名
2016/10/25 PHP
PHP正则表达式匹配替换与分割功能实例浅析
2017/02/04 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
Node.js实现JS文件合并小工具
2016/02/02 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
详解Node.js项目APM监控之New Relic
2017/05/12 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
python读取csv文件示例(python操作csv)
2014/03/11 Python
python3生成随机数实例
2014/10/20 Python
Python使用turtule画五角星的方法
2015/07/09 Python
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
python 读取Linux服务器上的文件方法
2018/12/27 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
Python拼接字符串的7种方式详解
2020/03/19 Python
Django ValuesQuerySet转json方式
2020/03/16 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
安德玛加拿大官网:Under Armour加拿大
2019/10/02 全球购物
网络维护中文求职信
2014/01/03 职场文书
优秀应届毕业生推荐信
2014/02/18 职场文书
综治宣传月活动总结
2014/04/28 职场文书
服务标兵事迹材料
2014/05/04 职场文书
高中学校对照检查材料
2014/08/31 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
小学国庆节活动总结
2015/03/23 职场文书
社会实践单位意见
2015/06/05 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书