网站推广.NET

网站推广.NET

用Python写贪吃蛇游戏的代码实例

来源:互联网

这篇文章主要为大家详细介绍了python贪吃蛇游戏的编写代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

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

要求:用#表示边框,用*表示食物,o表示蛇的身体,O表示蛇头,使用wsad来移动

Python版本:3.6.1

立即学习“Python免费学习笔记(深入)”;

系统环境:Win10

类:

  board:棋盘,也就是游戏区域

  snake:贪吃蛇,通过记录身体每个点来记录蛇的状态

  game:游戏类

  本来还想要个food类的,但是food只需要一个坐标,和一个新建,所以干脆使用list来保存坐标,新建food放在game里面,从逻辑上也没有太大问题

源码:

# Write By Guobao# 2017/4//7## 贪吃蛇# 用#做边界,*做食物,o做身体和头部# python 3.6.1import copyimport randomimport osimport msvcrt# the board class, used to put everythingclass 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 classclass 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 gameclass 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()

笔记:

  1.Python 没有Switch case语句,可以利用dirt来实现

  2.Python的=号是复制,复制引用,深复制需要使用copy的deepcopy()函数来实现

  3.即使在成员函数内,也需要使用self来访问成员变量,这和C++、JAVA很不一样

用python写贪吃蛇