最近在学Python,想做点什么来练练手,命令行的贪吃蛇一般是C的练手项目,但是一时之间找不到别的,就先做个贪吃蛇来练练简单的语法。

由于Python监听键盘很麻烦,没有C语言的kbhit(),所以这条贪吃蛇不会自己动,运行效果如下:

要求:用#表示边框,用*表示食物,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贪吃蛇游戏编写代码

本文地址: http://www.cppcns.com/jiaoben/python/184410.html

python贪吃蛇游戏无法运行_Python贪吃蛇游戏编写代码相关推荐

  1. python代码编辑教程_python教程:pycharm编写代码的方式教学

    python可以说是新的编程语言,虽说是新编程,但一出来,就受到很长程序员的关注,而且刚出现和java进行对比,很多人就拿python和java进行比较,想python到底好不好,他和java有什么区 ...

  2. python脚本 游戏赚金币_python捡金币游戏(上)

    创建游戏背景 这里设置了游戏的基本窗口尺寸,标题,以及背景颜色.游戏背景可以使用现成的图片素材,也可以使用单纯的颜色设置,这里采用颜色设置,具体颜色值可以到网上搜索一下就可以了. 添加角色素材 这里添 ...

  3. python游戏开发库_Python库之游戏开发及虚拟现实

    1.PyGame:简单的游戏开发功能库 http://www.pygame.org 提供了基于SDL的简单游戏开发功能及实现引擎 理解游戏对外部输入的响应机制及角色构建和交互机制 Python游戏入门 ...

  4. python怎么实现音乐快进_Python 超简单3行代码提取音乐高潮(附批量提取)

    有些时候,为了设定手机铃声或者发抖音视频,我们会耗费大量时间在剪辑音乐高潮部分上.那么这个音乐高潮的提取能不能自动化呢?当然可以. 先来听听效果,孤芳自赏提取高潮后的部分: 怎么样,是不是迫不及待想往 ...

  5. python 围棋按照坐标查找棋子_python 实现围棋游戏(纯tkinter gui)

    1. 开始前 本程序基于tkinter生成GUI,使用前请确保已经安装好tkinter 对于windows用户,您可能已经安装了tkinter,cmd中输入python -c 'import tkin ...

  6. python游戏制作软件_python制作小游戏(三)

    往期回顾python制作小游戏(一)python制作小游戏(二) GitHub: https://github.com/CharlesPikachu/Games 本系列文章中所涉及到的所有源代码以及相 ...

  7. python游戏制作软件_python制作小游戏(二)

    下载W3Cschool手机App,0基础随时随地学编程导语 T_T突然发现N久以前我还做过一个系列??? 利用Python制作小游戏??? 好吧,既然做了,就有头有尾吧~~~ 本期我们将制作一个类似八 ...

  8. python高级语言设计我是卧底_python实现 谁是卧底游戏

    展开全部 #!/usr/local/bin/python3 import random from spyword import spyword num=int(input('请输入玩家数(至少为3)\ ...

  9. python五子棋游戏控制台版_python实现五子棋游戏(pygame版)

    本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 目录 简介 实现过程 结语 简介 使用python实现pygame版的五子棋游戏: 环境:Windows系统+pytho ...

  10. python画完图 程序暂停运行_Python编程:认识IDLE,编写保存运行第1个程序

    Python编程需要有一个合适的编辑器. 就像我们平常写文章用Word,处理数据用Excel一样,处理图片要用PS或美图秀秀,我们编写Python程序也需要一个编辑器,正所谓工欲善其事,必先利其器. ...

最新文章

  1. ggplot2:9绘图需要的数据整理技术-数据转换
  2. 管理口地址 ibm_WAN口有IP地址上不了网如何解决 WAN口有IP地址上不了网解决方法【详解】...
  3. IDEA:生成javadoc/断点调试/缓存和索引的清理
  4. Objective-C初学者指南(第2版)
  5. .NET MVC扩展UrlHelper支持CDN
  6. 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序 解决方案
  7. 学习方法:提出和解决问题
  8. layui 上传图片回显并点击放大实现
  9. java word_java输出word解决方案
  10. 程序员常用不常见很难得的地址大全
  11. android 5.1 httpclient,【Android进阶学习】Http编程之HttpClient
  12. iPhone如何连接U盘呢 iphone连接u盘方法教程
  13. 配置使用ATTINY85
  14. 【设计】二极管-稳压管稳压电路
  15. Android自定义控件的步骤
  16. 【错误解决】SELECT list is not in GROUP BY clause and contains nonaggregated column
  17. App.xaml MainWindow.xaml
  18. 《深入浅出图神经网络》读书笔记(5.图信号处理与图卷积神经网络)
  19. 【PHP框架 | Laravel8 系列3】 - 路由
  20. 毕业季,说一说自己从学生初入职场的感受

热门文章

  1. 【pytorch目标检测】开山之作:R-CNN算法解读
  2. MySQL sql语句总结
  3. SQL Server 2012 数据库可疑问题解决
  4. SpringBoot验证码
  5. WMS软件国内主要供应商分析
  6. springboot activiti 7 和activiti 6 配置详解
  7. 人工智能—产生式系统(专家系统)
  8. 易语言html代码解释器,易语言执行javascript
  9. 一小时入门proteus使用教程
  10. Vdbench工具安装使用