Python贪吃蛇游戏编写代码

yipeiwu_com6年前Python基础

最近在学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设计】。

相关文章

Python实现快速傅里叶变换的方法(FFT)

Python实现快速傅里叶变换的方法(FFT)

本文介绍了Python实现快速傅里叶变换的方法(FFT),分享给大家,具体如下: 这里做一下记录,关于FFT就不做介绍了,直接贴上代码,有详细注释的了: import numpy a...

python字典嵌套字典的情况下找到某个key的value详解

最近在用python写接口的测试程序,期间用到解析字典获取某个key的value,由于多个接口返回的字典格式不是固定的并存在多层嵌套的情况。在字典的方法中也没有找到可直接达到目的的方法(...

mvc框架打造笔记之wsgi协议的优缺点以及接口实现

mvc框架打造笔记之wsgi协议的优缺点以及接口实现

前言: 又是WSGI ,这是我曾经比较熟悉的协议,以前针对实现了wsgi server的unicorn和uwsgi都写过源码解析的文章。  其实他们的实现也很简单,就是给fla...

python为tornado添加recaptcha验证码功能

复制代码 代码如下:    from urllib.request import urlopen    from urllib...

python树莓派红外反射传感器

python树莓派红外反射传感器

本文实例为大家分享了python树莓派红外反射传感器的程序,供大家参考,具体内容如下 1、工具 rpi3,微雪ARPI600,Infrared Reflective Sensor 2、基...