猫史档案馆


【Python作品分享】贪吃蛇【作品秀】

用户:ChelseaNChelseaN查看:0 回复:0 评论:0 创建时间:2021-01-30T12:22:56


【作品展示】

center_image

 

【作品介绍】

贪吃蛇作品

用#做边界,*做食物,o做身体和头部

 

【作品源代码】

# 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()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页