Maison  >  Article  >  développement back-end  >  Exemples de code pour écrire des jeux de serpent en Python

Exemples de code pour écrire des jeux de serpent en Python

Y2J
Y2Joriginal
2017-04-27 09:24:318481parcourir

Cet article présente principalement en détail le code d'écriture du jeu Python Snake. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

J'apprends Python récemment et je veux faire quelque chose. Snake sur la ligne de commande est généralement un projet de pratique en C, mais je n'ai rien trouvé d'autre pendant un moment, alors j'ai d'abord créé un serpent pour pratiquer une grammaire simple.

Comme il est difficile de surveiller le clavier en Python et qu'il n'y a pas de kbhit() en langage C, ce serpent gourmand ne bougera pas tout seul. L'effet de course est le suivant :

<.>

Exigences : Utilisez # pour représenter la bordure, * pour représenter la nourriture, o pour représenter le corps du serpent, O pour représenter la tête du serpent et utilisez wsad pour vous déplacer

Version Python : 3.6.1

Environnement système : Win10

Catégorie :

plateau : échiquier, qui est la zone de jeu

serpent : serpent gourmand, en enregistrant chaque corps Cliquez pour enregistrer l'état du serpent

Jeu : Catégorie de jeu

Je voulais à l'origine une catégorie d'aliments, mais la nourriture n'a besoin que d'une seule coordonnée et un nouveau, donc j'utilise simplement une liste pour sauvegarder les coordonnées. Mettre le nouvel aliment dans le jeu n'est pas un gros problème logiquement

Code source :

.
# 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(&#39;#&#39;)
      else:
        line.append(&#39;#&#39;)
        for j in range(20):
          line.append(&#39; &#39;)
        line.append(&#39;#&#39;)
      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(&#39;#&#39;)
      else:
        line.append(&#39;#&#39;)
        for j in range(20):
          line.append(&#39; &#39;)
        line.append(&#39;#&#39;)
      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]] = &#39;o&#39;

    # the head
    x = snake_locations[len(snake_locations) - 1]
    self.__points[x[0]][x[1]] = &#39;O&#39;

  def put_food(self, food_location):
    self.__points[food_location[0]][food_location[1]] = &#39;*&#39;

  def show(self):
    os.system("cls")
    for i in range(22):
      for j in range(22):
        print(self.__points[i][j], end=&#39;&#39;)
      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=&#39;default&#39;):

    # need to change the value, so copy it
    head = copy.deepcopy(self.__points[len(self.__points) - 1])

    # calc the "default" direction
    if direction == &#39;default&#39;:
      neck = self.__points[len(self.__points) - 2]
      if neck[0] > head[0]:
        direction = &#39;up&#39;
      elif neck[0] < head[0]:
        direction = &#39;down&#39;
      elif neck[1] > head[1]:
        direction = &#39;left&#39;
      elif neck[1] < head[1]:
        direction = &#39;right&#39;

    if direction == &#39;up&#39;:
      head[0] = head[0] - 1
    elif direction == &#39;down&#39;:
      head[0] = head[0] + 1
    elif direction == &#39;left&#39;:
      head[1] = head[1] - 1
    elif direction == &#39;right&#39;:
      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]) == &#39; &#39;:
        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 &#39;w a s d&#39; are the directions
    operation_dict = {b&#39;w&#39;: &#39;up&#39;, b&#39;W&#39;: &#39;up&#39;, b&#39;s&#39;: &#39;down&#39;, b&#39;S&#39;: &#39;down&#39;, b&#39;a&#39;: &#39;left&#39;, b&#39;A&#39;: &#39;left&#39;, b&#39;d&#39;: &#39;right&#39;, b&#39;D&#39;: &#39;right&#39;}
    op = msvcrt.getch()

    while op != b&#39;q&#39;:
      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) == &#39;*&#39;:
          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) == &#39;#&#39; or self.board.getPoint(new_head) == &#39;o&#39;:
          print(&#39;GG&#39;)
          break

        # normal move
        else:
          self.snake.move(new_head)
          self.show()
      op = msvcrt.getch()

game().run()

Remarques :

1. Python n'a pas d'instruction de cas Switch, vous pouvez utiliser Dirt pour implémenter

2. Le signe = de Python est une copie, une référence de copie , la copie profonde doit utiliser la fonction deepcopy() de copy pour implémenter

 3. Même au sein d'une fonction membre, vous devez utiliser self pour accéder aux variables membres, ce qui est très différent du C++ et du JAVA

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn