New_Stars 发表于 2020-8-8 11:58:35

自创贪吃蛇

这是我自己创的贪吃蛇,但不知道为什么,无法自己动,而是手动,希望大佬如果能改进的话,请发到评论区,谢谢!{:10_254:}


# Write By Guobao
#
# 贪吃蛇
# 用#做边界,*做食物,o做身体和头部

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]]

    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]] = 'o'

      # the head
      x = snake_locations
      self.__points]] = 'O'

    def put_food(self, food_location):
      self.__points]] = '*'

    def show(self):
      os.system("cls")
      for i in range(22):
            for j in range(22):
                print(self.__points, end='')
            print()

# the snake class
class snake:
    __points = []

    def __init__(self):
      for i in range(1, 6):
            self.__points.append()

    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)

      # calc the "default" direction
      if direction == 'default':
            neck = self.__points
            if neck > head:
                direction = 'up'
            elif neck < head:
                direction = 'down'
            elif neck > head:
                direction = 'left'
            elif neck < head:
                direction = 'right'

      if direction == 'up':
            head = head - 1
      elif direction == 'down':
            head = head + 1
      elif direction == 'left':
            head = head - 1
      elif direction == 'right':
            head = head + 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() == ' ':
                self.food =
                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)

                # 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():
                  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]
查看完整版本: 自创贪吃蛇