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用Pillow(PIL)进行简单的图像操作方法
Jul 07 Python
Python 多线程Threading初学教程
Aug 22 Python
python psutil库安装教程
Mar 19 Python
python实现图片批量压缩程序
Jul 23 Python
python版本单链表实现代码
Sep 28 Python
Python中拆分字符串的操作方法
Jul 23 Python
python seaborn heatmap可视化相关性矩阵实例
Jun 03 Python
MATLAB数学建模之画图汇总
Jul 16 Python
python Cartopy的基础使用详解
Nov 01 Python
Python使用scapy模块发包收包
May 07 Python
python可视化之颜色映射详解
Sep 15 Python
python 离散点图画法的实现
Apr 01 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
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
基于php常用正则表达式的整理汇总
2013/06/08 PHP
php使用session二维数组实例
2014/11/06 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
PHP中list方法用法示例
2016/12/01 PHP
Laravel框架路由和控制器的绑定操作方法
2018/06/12 PHP
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
window.open 以post方式传递参数示例代码
2014/02/27 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
opencv 识别微信登录验证滑动块位置
2018/08/07 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
JS removeAttribute()方法实现删除元素的某个属性
2021/01/11 Javascript
在类Unix系统上开始Python3编程入门
2015/08/20 Python
使用python读取.text文件特定行的数据方法
2019/01/28 Python
python 函数中的参数类型
2020/02/11 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
python numpy实现rolling滚动案例
2020/06/08 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
基于注解实现 SpringBoot 接口防刷的方法
2021/03/02 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
HTML5中Localstorage的使用教程
2015/07/09 HTML / CSS
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
NET程序员上机面试题
2015/05/23 面试题
介绍一下gcc特性
2015/10/31 面试题
教师对学生的评语
2014/04/28 职场文书
人力资源职位说明书
2014/07/29 职场文书
法英专业大学生职业生涯规划书范文
2014/09/22 职场文书
个人作风建设心得体会
2014/10/22 职场文书
失职检讨书大全
2015/01/26 职场文书
迎新年主持词
2015/07/06 职场文书
学校运动会感想
2015/08/10 职场文书
清明扫墓感想
2015/08/11 职场文书