Python贪吃蛇游戏编写代码

时间:2021-09-19 09:03:21

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

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

Python贪吃蛇游戏编写代码

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

Python版本:3.6.1

系统环境:Win10

类:

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

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

  game:游戏类

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

源码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# 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很不一样

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。