Python貪吃蛇游戲編寫代碼
最近在學(xué)Python,想做點(diǎn)什么來(lái)練練手,命令行的貪吃蛇一般是C的練手項(xiàng)目,但是一時(shí)之間找不到別的,就先做個(gè)貪吃蛇來(lái)練練簡(jiǎn)單的語(yǔ)法。
由于Python監(jiān)聽(tīng)鍵盤很麻煩,沒(méi)有C語(yǔ)言的kbhit(),所以這條貪吃蛇不會(huì)自己動(dòng),運(yùn)行效果如下:

要求:用#表示邊框,用*表示食物,o表示蛇的身體,O表示蛇頭,使用wsad來(lái)移動(dòng)
Python版本:3.6.1
系統(tǒng)環(huán)境:Win10
類:
board:棋盤,也就是游戲區(qū)域
snake:貪吃蛇,通過(guò)記錄身體每個(gè)點(diǎn)來(lái)記錄蛇的狀態(tài)
game:游戲類
本來(lái)還想要個(gè)food類的,但是food只需要一個(gè)坐標(biāo),和一個(gè)新建,所以干脆使用list來(lái)保存坐標(biāo),新建food放在game里面,從邏輯上也沒(méi)有太大問(wèn)題
源碼:
# 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 沒(méi)有Switch case語(yǔ)句,可以利用dirt來(lái)實(shí)現(xiàn)
2.Python的=號(hào)是復(fù)制,復(fù)制引用,深復(fù)制需要使用copy的deepcopy()函數(shù)來(lái)實(shí)現(xiàn)
3.即使在成員函數(shù)內(nèi),也需要使用self來(lái)訪問(wèn)成員變量,這和C++、JAVA很不一樣
更多關(guān)于python游戲的精彩文章請(qǐng)點(diǎn)擊查看以下專題:
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)反向生成Django里面的models指令方式
這篇文章主要介紹了Mysql數(shù)據(jù)庫(kù)反向生成Django里面的models指令方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python偏函數(shù)實(shí)現(xiàn)原理及應(yīng)用
這篇文章主要介紹了Python偏函數(shù)實(shí)現(xiàn)原理及應(yīng)用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果
這篇文章主要介紹了使用Python進(jìn)行數(shù)據(jù)可視化實(shí)現(xiàn)引人注目的視覺(jué)效果,您將了解基本的數(shù)據(jù)可視化概念,以及如何創(chuàng)建各種引人注目的圖表和圖形,從而更好地理解和呈現(xiàn)數(shù)據(jù)2023-04-04
淺談pytorch中stack和cat的及to_tensor的坑
這篇文章主要介紹了pytorch中stack和cat的及to_tensor的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
pip安裝python庫(kù)時(shí)報(bào)Failed?building?wheel?for?xxx錯(cuò)誤的解決方法
最近在使用pip安裝python的時(shí)候遇到些問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于pip安裝python庫(kù)時(shí)報(bào)Failed?building?wheel?for?xxx錯(cuò)誤的解決方法,需要的朋友可以參考下2023-01-01
在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法
本文主要介紹了在PyCharm中找不到Conda創(chuàng)建的環(huán)境的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

