python实现贪吃蛇

合集下载

用Python编写一个贪吃蛇游戏

用Python编写一个贪吃蛇游戏

程序目标:玩家可以使用方向键控制贪吃蛇的移动方向,向上键使蛇向上移动,向下键使蛇向下移动,向左键使蛇向左移动,向右键使蛇向右移动。

玩家需要控制蛇吃到食物,每吃到一个食物蛇的长度就会加1,同时游戏难度也会逐渐加大,蛇的移动速度会加快,随着时间的推移,难度会变得越来越高。

如果蛇撞到了边界或者撞到了自己的身体,游戏就会结束。

玩家可以通过关闭游戏窗口来退出游戏。

以下是一个基于Python 的简单贪吃蛇游戏的代码实现。

本实现使用了pygame 模块来创建游戏窗口,渲染游戏场景和监听用户输入,同时使用random 模块来生成随机食物。

import pygameimport random# 初始化pygamepygame.init()# 定义游戏窗口大小window_width = 600window_height = 600# 创建游戏窗口screen=pygame.display.set_mode((window_width,window_height))# 定义游戏场景颜色bg_color = (0, 0, 0)# 定义蛇的初始位置和大小snake_x = window_width // 2snake_y = window_height // 2snake_size = 10snake_speed = 10# 定义蛇的初始方向和长度snake_direction = 'right'snake_length = 1snake_body = [(snake_x, snake_y)]# 定义食物的初始位置和大小food_size = 10food_x = random.randint(0, window_width - food_size) food_y = random.randint(0, window_height - food_size) food_color = (255, 0, 0)# 游戏循环标志game_running = True# 游戏循环while game_running:# 监听用户输入for event in pygame.event.get():if event.type == pygame.QUIT:game_running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP and snake_direction != 'down':snake_direction = 'up'elif event.key == pygame.K_DOWN and snake_direction != 'up':snake_direction = 'down'elif event.key == pygame.K_LEFT and snake_direction != 'right':snake_direction = 'left'elif event.key == pygame.K_RIGHT and snake_direction != 'left':snake_direction = 'right'# 移动蛇的身体if snake_direction == 'up':snake_y -= snake_speedelif snake_direction == 'down':snake_y += snake_speedelif snake_direction == 'left':snake_x -= snake_speedelif snake_direction == 'right':snake_x += snake_speed# 更新蛇的身体列表snake_body.insert(0, (snake_x, snake_y))if len(snake_body) > snake_length:snake_body.pop()# 绘制游戏场景screen.fill(bg_color)pygame.draw.rect(screen, food_color, pygame.Rect(food_x, food_y, food_size, food_size))for x, y in snake_body:pygame.draw.rect(screen, (255, 255, 255), pygame.Rect(x, y, snake_size, snake_size))# 检测蛇是否吃到了食物if pygame.Rect(snake_x, snake_y, snake_size, snake_size).colliderect(pygame.Rect(food_x, food_y, food_size, food_size)):snake_length += 1food_x = random.randint(0, window_width - food_size)food_y = random.randint(0, window_height - food_size) # 检测蛇是否撞到了墙壁if snake_x <0 or snake_x + snake_size > window_width or snake_y < 0 or snake_y + snake_size > window_height:game_running = False# 检测蛇是否撞到了自己的身体for x, y in snake_body[1:]:if pygame.Rect(snake_x, snake_y, snake_size, snake_size).colliderect(pygame.Rect(x, y, snake_size, snake_size)):game_running = False# 更新游戏窗口pygame.display.update()该游戏的注释如下:- `import pygame`: 导入`pygame` 模块,用于创建游戏窗口,渲染游戏场景和监听用户输入。

实验报告贪吃蛇

实验报告贪吃蛇

一、实验目的1. 掌握Python编程语言的基本语法和面向对象编程思想;2. 理解并实现贪吃蛇游戏的基本算法和流程;3. 学会使用Pygame库进行图形界面设计;4. 提高编程实践能力和团队协作能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 开发工具:PyCharm4. 图形库:Pygame三、实验内容1. 游戏界面设计2. 游戏逻辑实现3. 游戏控制实现4. 游戏测试与优化四、实验步骤1. 游戏界面设计(1)初始化Pygame库```pythonimport pygame```(2)设置游戏窗口```pythonscreen = pygame.display.set_mode((640, 480))pygame.display.set_caption("贪吃蛇游戏")```(3)设置游戏背景颜色```pythonscreen.fill((0, 0, 0))```2. 游戏逻辑实现(1)定义蛇类```pythonclass Snake:def __init__(self, x, y, width, height, color):self.x = xself.y = yself.width = widthself.height = heightself.color = colorself.x_change = 0self.y_change = 0def draw(self, surface):pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height))```(2)定义食物类```pythonclass Food:def __init__(self, x, y, width, height, color):self.x = xself.y = yself.width = widthself.height = heightself.color = colordef draw(self, surface):pygame.draw.rect(surface, self.color, (self.x, self.y, self.width, self.height))```(3)定义游戏主函数```pythondef game():clock = pygame.time.Clock()snake = Snake(50, 50, 10, 10, (0, 255, 0))food = Food(300, 300, 10, 10, (255, 0, 0))game_over = Falsewhile not game_over:for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueelif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:snake.x_change = -10snake.y_change = 0elif event.key == pygame.K_RIGHT:snake.x_change = 10snake.y_change = 0elif event.key == pygame.K_UP:snake.x_change = 0snake.y_change = -10elif event.key == pygame.K_DOWN:snake.x_change = 0snake.y_change = 10snake.x += snake.x_changesnake.y += snake.y_changescreen.fill((0, 0, 0))snake.draw(screen)food.draw(screen)pygame.display.flip()clock.tick(15)pygame.quit()```3. 游戏控制实现在游戏主函数中,通过监听键盘事件来控制蛇的移动方向。

使用Python编写一个贪吃蛇

使用Python编写一个贪吃蛇

import randomimport pygameimport sysfrom pygame.locals import *from os import systemsystem("pause")Snakespeed = 7Window_Width = 800Window_Height = 500Cell_Size = 20# Width and height of the cells# Ensuring that the cells fit perfectly in the window. eg if cell size was# 10 and window width or windowheight were 15 only 1.5 cells would # fit.assert Window_Width % Cell_Size == 0, "Window width must be a multiple of cell size."# Ensuring that only whole integer number of cells fit perfectly in the window.assert Window_Height % Cell_Size == 0, "Window height must be a multipl e of cell size."Cell_W = int(Window_Width / Cell_Size) # Cell WidthCell_H = int(Window_Height / Cell_Size) # Cellc HeightWhite = (255, 255, 255)Black = (0, 0, 0)Red = (255, 0, 0) # Defining element colors for the program.Green = (0, 255, 0)DARKGreen = (0, 155, 0)DARKGRAY = (40, 40, 40)YELLOW = (255, 255, 0)Red_DARK = (150, 0, 0)BLUE = (0, 0, 255)BLUE_DARK = (0, 0, 150)BGCOLOR = Black # Background colorUP = 'up'DOWN = 'down'# Defining keyboard keys.LEFT = 'left'RIGHT = 'right'HEAD = 0# Syntactic sugar: index of the snake's headdef main():global SnakespeedCLOCK, DISPLAYSURF, BASICFONTpygame.init()SnakespeedCLOCK = pygame.time.Clock()DISPLAYSURF = pygame.display.set_mode((Window_Width, Window_Height) )BASICFONT = pygame.font.Font('freesansbold.ttf', 18)pygame.display.set_caption('Snake')showStartScreen()while True:runGame()showGameOverScreen()def runGame():# Set a random start point.startx = random.randint(5, Cell_W - 6)starty = random.randint(5, Cell_H - 6)wormCoords = [{'x': startx, 'y': starty},{'x': startx - 1, 'y': starty},{'x': startx - 2, 'y': starty}]direction = RIGHT# Start the apple in a random place.apple = getRandomLocation()while True: # main game loopfor event in pygame.event.get(): # event handling loopif event.type == QUIT:terminate()elif event.type == KEYDOWN:if (event.key == K_LEFT) and direction != RIGHT:direction = LEFTelif (event.key == K_RIGHT) and direction != LEFT:direction = RIGHTelif (event.key == K_UP) and direction != DOWN:direction = UPelif (event.key == K_DOWN) and direction != UP:direction = DOWNelif event.key == K_ESCAPE:terminate()# check if the Snake has hit itself or the edgeif wormCoords[HEAD]['x'] == -1or wormCoords[HEAD]['x'] == Cell_W or wormCoords[HEAD]['y'] == -1or wormCoords[HEAD]['y'] == Cell_H:return# game overfor wormBody in wormCoords[1:]:if wormBody['x'] == wormCoords[HEAD]['x'] and wormBody['y'] == wormCoords[HEAD]['y']:return# game over# check if Snake has eaten an applyif wormCoords[HEAD]['x'] == apple['x'] and wormCoords[HEAD]['y' ] == apple['y']:# don't remove worm's tail segmentapple = getRandomLocation() # set a new apple somewhere else:del wormCoords[-1] # remove worm's tail segment# move the worm by adding a segment in the direction it is movi ngif direction == UP:newHead = {'x': wormCoords[HEAD]['x'],'y': wormCoords[HEAD]['y'] - 1}elif direction == DOWN:newHead = {'x': wormCoords[HEAD]['x'],'y': wormCoords[HEAD]['y'] + 1}elif direction == LEFT:newHead = {'x': wormCoords[HEAD]['x'] - 1, 'y': wormCoords[HEAD]['y']}elif direction == RIGHT:newHead = {'x': wormCoords[HEAD]['x'] + 1, 'y': wormCoords[HEAD]['y']}wormCoords.insert(0, newHead)DISPLAYSURF.fill(BGCOLOR)drawGrid()drawWorm(wormCoords)drawApple(apple)drawScore(len(wormCoords) - 3)pygame.display.update()SnakespeedCLOCK.tick(Snakespeed)def drawPressKeyMsg():pressKeySurf = BASICFONT.render('Press a key to play.', True, White )pressKeyRect = pressKeySurf.get_rect()pressKeyRect.topleft = (Window_Width - 200, Window_Height - 30)DISPLAYSURF.blit(pressKeySurf, pressKeyRect)def checkForKeyPress():if len(pygame.event.get(QUIT)) > 0:terminate()keyUpEvents = pygame.event.get(KEYUP)if len(keyUpEvents) == 0:return Noneif keyUpEvents[0].key == K_ESCAPE:terminate()return keyUpEvents[0].keydef showStartScreen():titleFont = pygame.font.Font('freesansbold.ttf', 100)titleSurf1 = titleFont.render('Snake!', True, White, DARKGreen)degrees1 = 0degrees2 = 0while True:DISPLAYSURF.fill(BGCOLOR)rotatedSurf1 = pygame.transform.rotate(titleSurf1, degrees1) rotatedRect1 = rotatedSurf1.get_rect()rotatedRect1.center = (Window_Width / 2, Window_Height / 2)DISPLAYSURF.blit(rotatedSurf1, rotatedRect1)drawPressKeyMsg()if checkForKeyPress():pygame.event.get() # clear event queuereturnpygame.display.update()SnakespeedCLOCK.tick(Snakespeed)degrees1 += 3# rotate by 3 degrees each framedegrees2 += 7# rotate by 7 degrees each framedef terminate():pygame.quit()sys.exit()def getRandomLocation():return {'x': random.randint(0, Cell_W - 1), 'y': random.randint(0, Cell_H - 1)}def showGameOverScreen():gameOverFont = pygame.font.Font('freesansbold.ttf', 100)gameSurf = gameOverFont.render('Game', True, White)overSurf = gameOverFont.render('Over', True, White)gameRect = gameSurf.get_rect()overRect = overSurf.get_rect()gameRect.midtop = (Window_Width / 2, 10)overRect.midtop = (Window_Width / 2, gameRect.height + 10 + 25)DISPLAYSURF.blit(gameSurf, gameRect)DISPLAYSURF.blit(overSurf, overRect)drawPressKeyMsg()pygame.display.update()pygame.time.wait(500)checkForKeyPress() # clear out any key presses in the event queuewhile True:if checkForKeyPress():pygame.event.get() # clear event queuereturndef drawScore(score):scoreSurf = BASICFONT.render('Score: %s' % (score), True, White) scoreRect = scoreSurf.get_rect()scoreRect.topleft = (Window_Width - 120, 10)DISPLAYSURF.blit(scoreSurf, scoreRect)def drawWorm(wormCoords):for coord in wormCoords:x = coord['x'] * Cell_Sizey = coord['y'] * Cell_SizewormSegmentRect = pygame.Rect(x, y, Cell_Size, Cell_Size)pygame.draw.rect(DISPLAYSURF, DARKGreen, wormSegmentRect)wormInnerSegmentRect = pygame.Rect(x + 4, y + 4, Cell_Size - 8, Cell_Size - 8)pygame.draw.rect(DISPLAYSURF, Green, wormInnerSegmentRect)def drawApple(coord):x = coord['x'] * Cell_Sizey = coord['y'] * Cell_SizeappleRect = pygame.Rect(x, y, Cell_Size, Cell_Size)pygame.draw.rect(DISPLAYSURF, Red, appleRect)def drawGrid():for x in range(0, Window_Width, Cell_Size): # draw vertical lines pygame.draw.line(DISPLAYSURF, DARKGRAY, (x, 0), (x, Window_Heig ht))for y in range(0, Window_Height, Cell_Size): # draw horizontal lin espygame.draw.line(DISPLAYSURF, DARKGRAY, (0, y), (Window_Width, y))if__name__ == '__main__':try:main()except SystemExit:pass。

基于Python的贪吃蛇游戏设计开题报告

基于Python的贪吃蛇游戏设计开题报告

基于Python的贪吃蛇游戏设计开题报告1. 引言贪吃蛇游戏是一款经典的休闲游戏,其简单的玩法和上瘾的游戏体验深受玩家喜爱。

本文将介绍一种基于Python编程语言的贪吃蛇游戏设计方案,并讨论其实现方式和预期效果。

2. 设计目标本次贪吃蛇游戏的设计目标是实现一个具有良好用户体验和富有趣味性的游戏。

具体目标如下:•设计一个简单直观的用户界面,使用户能够轻松上手并快速掌握游戏规则。

•实现一个具有挑战性的游戏难度,使玩家能够有持续的游戏动力和挑战性。

•采用合适的游戏算法和逻辑,确保贪吃蛇的移动和食物的生成均符合预期规则。

•提供合理的游戏得分机制,使玩家能够根据游戏表现进行评估和改进。

3. 设计方案3.1 游戏界面本游戏将采用Python的GUI库,如Tkinter或PyQt等,来实现游戏界面的设计。

界面应包含以下元素:•游戏区域:用于显示贪吃蛇、食物和其他游戏元素的画布。

•分数计数器:用于显示玩家的得分情况。

•游戏控制按钮:包括开始、暂停和重新开始按钮,以实现游戏的控制功能。

3.2 游戏逻辑游戏的逻辑主要包括贪吃蛇的移动、食物的生成与消失、得分情况的判定等。

具体逻辑如下:•贪吃蛇移动:根据玩家的操作,贪吃蛇可以通过键盘输入上下左右方向键来改变移动方向。

每次移动后,贪吃蛇的身体会跟着头部一起移动,并且需要判断是否吃到食物或碰到边界或自身身体。

•食物生成与消失:游戏开始时,在游戏区域内随机生成一个食物,当贪吃蛇吃到食物时,贪吃蛇的身体增加一段,并且生成一个新的食物。

当贪吃蛇吃到食物后,分数计数器会增加相应的得分。

•得分情况判定:根据玩家的游戏表现,通过判断贪吃蛇吃到的食物数量来计算得分。

同时,通过判断贪吃蛇是否撞击到边界或自身身体来判断游戏胜负。

3.3 游戏算法为了实现贪吃蛇游戏的逻辑,我们将使用以下算法:•贪吃蛇移动算法:根据键盘输入的方向键判断贪吃蛇的运动方向,并根据当前的运动方向和移动速度,更新贪吃蛇的位置。

Python实现的贪吃蛇小游戏代码

Python实现的贪吃蛇小游戏代码

以下是Python实现的贪吃蛇小游戏代码:```pythonimport pygameimport random# 初始化Pygamepygame.init()# 设置游戏窗口大小和标题screen_width = 480screen_height = 480game_display = pygame.display.set_mode((screen_width, screen_height))pygame.display.set_caption('贪吃蛇游戏')# 定义颜色white = (255, 255, 255)black = (0, 0, 0)red = (255, 0, 0)green = (0, 255, 0)# 定义蛇的初始位置和尺寸snake_block_size = 20snake_speed = 10initial_snake_pos = {'x': screen_width/2, 'y': screen_height/2}snake_list = [initial_snake_pos]# 定义食物的尺寸和位置food_block_size = 20food_pos = {'x': round(random.randrange(0, screen_width - food_block_size) / 20.0) * 20.0, 'y': round(random.randrange(0, screen_height - food_block_size) / 20.0) * 20.0}# 定义分数、字体和大小score = 0font_style = pygame.font.SysFont(None, 30)# 刷新分数def refresh_score(score):score_text = font_style.render("Score: " + str(score), True, black)game_display.blit(score_text, [0, 0])# 绘制蛇def draw_snake(snake_block_size, snake_list):for pos in snake_list:pygame.draw.rect(game_display, green, [pos['x'], pos['y'], snake_block_size, snake_block_size])# 显示消息def message(msg, color):message_text = font_style.render(msg, True, color)game_display.blit(message_text, [screen_width/6, screen_height/3])# 主函数循环def game_loop():game_over = Falsegame_close = False# 设置蛇头的初始移动方向x_change = 0y_change = 0# 处理事件while not game_over:while game_close:game_display.fill(white)message("You lost! Press Q-Quit or C-Play Again", red)refresh_score(score)pygame.display.update()# 处理重新开始和退出事件for event in pygame.event.get():if event.type == pygame.KEYDOWN:if event.key == pygame.K_q:game_over = Truegame_close = Falseelif event.key == pygame.K_c:game_loop()# 处理按键事件for event in pygame.event.get():if event.type == pygame.QUIT:game_over = Trueif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:x_change = -snake_block_sizey_change = 0elif event.key == pygame.K_RIGHT:x_change = snake_block_sizey_change = 0elif event.key == pygame.K_UP:y_change = -snake_block_sizex_change = 0elif event.key == pygame.K_DOWN:y_change = snake_block_sizex_change = 0# 处理蛇的移动位置if snake_list[-1]['x'] >= screen_width or snake_list[-1]['x'] < 0 or snake_list[-1]['y'] >= screen_height or snake_list[-1]['y'] < 0:game_close = Truesnake_list[-1]['x'] += x_changesnake_list[-1]['y'] += y_change# 处理食物被吃掉的情况if snake_list[-1]['x'] == food_pos['x'] and snake_list[-1]['y'] == food_pos['y']:score += 10food_pos = {'x': round(random.randrange(0, screen_width -food_block_size) / 20.0) * 20.0,'y': round(random.randrange(0, screen_height -food_block_size) / 20.0) * 20.0}else:snake_list.pop(0)# 处理蛇撞到自身的情况for pos in snake_list[:-1]:if pos == snake_list[-1]:game_close = True# 刷新游戏窗口game_display.fill(white)draw_snake(snake_block_size, snake_list)pygame.draw.rect(game_display, red, [food_pos['x'], food_pos['y'], food_block_size, food_block_size])refresh_score(score)pygame.display.update()# 设置蛇移动的速度clock = pygame.time.Clock()clock.tick(snake_speed)pygame.quit()quit()game_loop()```当您运行此代码时,将会启动一个贪吃蛇小游戏。

Python贪吃蛇游戏编写代码

Python贪吃蛇游戏编写代码

Python贪吃蛇游戏编写代码最近在学Python,想做点什么来练练⼿,命令⾏的贪吃蛇⼀般是C的练⼿项⽬,但是⼀时之间找不到别的,就先做个贪吃蛇来练练简单的语法。

由于Python监听键盘很⿇烦,没有C语⾔的kbhit(),所以这条贪吃蛇不会⾃⼰动,运⾏效果如下:要求:⽤#表⽰边框,⽤*表⽰⾷物,o表⽰蛇的⾝体,O表⽰蛇头,使⽤wsad来移动Python版本:3.6.1系统环境: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('#')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 boardself.clear()# put the snake pointsfor x in snake_locations:self.__points[x[0]][x[1]] = 'o'# the headx = 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 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 headdef move(self, next_head):self.__points.pop(0)self.__points.append(next_head)# eat the food# give the next headdef eat(self, next_head):self.__points.append(next_head)# calc the next state# and return the directiondef next_head(self, direction='default'):# need to change the value, so copy ithead = copy.deepcopy(self.__points[len(self.__points) - 1])# calc the "default" directionif 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] - 1elif direction == 'down':head[0] = head[0] + 1elif direction == 'left':head[1] = head[1] - 1elif direction == 'right':head[1] = head[1] + 1return head# the gameclass game:board = board()snake = snake()food = []count = 0def __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]returndef 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 directionsoperation_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 foodif self.board.getPoint(new_head) == '*':self.snake.eat(new_head)self.count = self.count + 1if self.count >= 15:self.show()print("Good Job")breakelse:self.new_food()self.show()# 反向⼀Q⽇神仙elif new_head == self.snake.getPoints()[len(self.snake.getPoints()) - 2]:pass# rush the wallelif self.board.getPoint(new_head) == '#' or self.board.getPoint(new_head) == 'o':print('GG')break# normal moveelse: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游戏的精彩⽂章请点击查看以下专题:更多有趣的经典⼩游戏实现专题,分享给⼤家:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

使用Python写一个贪吃蛇游戏实例代码

使用Python写一个贪吃蛇游戏实例代码

使⽤Python写⼀个贪吃蛇游戏实例代码我在程序中加⼊了分数显⽰,三种特殊⾷物,将贪吃蛇的游戏逻辑写到了SnakeGame的类中,⽽不是在Snake类中。

特殊⾷物:1.绿⾊:普通,吃了增加体型2.红⾊:吃了减少体型3.⾦⾊:吃了回到最初体型4.变⾊⾷物:吃了会根据⾷物颜⾊改变蛇的颜⾊#coding=UTF-8from Tkinter import *from random import randintimport tkMessageBoxclass Grid(object):def __init__(self, master=None,height=16, width=24, offset=10, grid_width=50, bg="#808080"):self.height = heightself.width = widthself.offset = offsetself.grid_width = grid_widthself.bg = bgself.canvas = Canvas(master, width=self.width*self.grid_width+2*self.offset, height=self.height*self.grid_width+2*self.offset, bg=self.bg)self.canvas.pack(side=RIGHT, fill=Y)def draw(self, pos, color, ):x = pos[0] * self.grid_width + self.offsety = pos[1] * self.grid_width + self.offset#outline属性要与⽹格的背景⾊(self.bg)相同,要不然会很丑self.canvas.create_rectangle(x, y, x + self.grid_width, y + self.grid_width, fill=color, outline=self.bg)class Food(object):def __init__(self, grid, color = "#23D978"):self.grid = gridself.color = colorself.set_pos()self.type = 1def set_pos(self):x = randint(0, self.grid.width - 1)y = randint(0, self.grid.height - 1)self.pos = (x, y)def display(self):self.grid.draw(self.pos, self.color)class Snake(object):def __init__(self, grid, color = "#000000"):self.grid = gridself.color = colorself.body = [(8, 11), (8, 12), (8, 13)]self.direction = "Up"for i in self.body:self.grid.draw(i, self.color)#这个⽅法⽤于游戏重新开始时初始化贪吃蛇的位置def initial(self):while not len(self.body) == 0:pop = self.body.pop()self.grid.draw(pop, self.grid.bg)self.body = [(8, 11), (8, 12), (8, 13)]self.direction = "Up"self.color = "#000000"for i in self.body:self.grid.draw(i, self.color)#蛇像⼀个指定点移动def move(self, new):self.body.insert(0, new)pop = self.body.pop()self.grid.draw(pop, self.grid.bg)self.grid.draw(new, self.color)#蛇像⼀个指定点移动,并增加长度def add(self ,new):self.body.insert(0, new)self.grid.draw(new, self.color)#蛇吃到了特殊⾷物1,剪短⾃⾝的长度def cut_down(self,new):self.body.insert(0, new)self.grid.draw(new, self.color)for i in range(0,3):pop = self.body.pop()self.grid.draw(pop, self.grid.bg)#蛇吃到了特殊⾷物2,回到最初长度def init(self, new):self.body.insert(0, new)self.grid.draw(new, self.color)while len(self.body) > 3:pop = self.body.pop()self.grid.draw(pop, self.grid.bg)#蛇吃到了特殊⾷物3,改变了⾃⾝的颜⾊,纯属好玩def change(self, new, color):self.color = colorself.body.insert(0, new)for item in self.body:self.grid.draw(item, self.color)class SnakeGame(Frame):def __init__(self, master):Frame.__init__(self, master)self.grid = Grid(master)self.snake = Snake(self.grid)self.food = Food(self.grid)self.gameover = Falseself.score = 0self.status = ['run', 'stop']self.speed = 300self.grid.canvas.bind_all("<KeyRelease>", self.key_release)self.display_food()#⽤于设置变⾊⾷物self.color_c = ("#FFB6C1","#6A5ACD","#0000FF","#F0FFF0","#FFFFE0","#F0F8FF","#EE82EE","#000000","#5FA8D9","#32CD32") self.i = 0#界⾯左侧显⽰分数self.m = StringVar()self.ft1 = ('Fixdsys', 40, "bold")self.m1 = Message(master, textvariable=self.m, aspect=5000, font=self.ft1, bg="#696969")self.m1.pack(side=LEFT, fill=Y)self.m.set("Score:"+str(self.score))#这个⽅法⽤于游戏重新开始时初始化游戏def initial(self):self.gameover = Falseself.score = 0self.m.set("Score:"+str(self.score))self.snake.initial()#type1:普通⾷物 type2:减少2 type3:⼤乐透,回到最初状态 type4:吃了会变⾊def display_food(self):self.food.color = "#23D978"self.food.type = 1if randint(0, 40) == 5:self.food.color = "#FFD700"self.food.type = 3while (self.food.pos in self.snake.body):self.food.set_pos()self.food.display()elif randint(0, 4) == 2:self.food.color = "#EE82EE"self.food.type = 4while (self.food.pos in self.snake.body):self.food.set_pos()self.food.display()elif len(self.snake.body) > 10 and randint(0, 16) == 5:self.food.color = "#BC8F8F"self.food.type = 2while (self.food.pos in self.snake.body):self.food.set_pos()self.food.display()else:while (self.food.pos in self.snake.body):self.food.set_pos()self.food.display()def key_release(self, event):key = event.keysymkey_dict = {"Up": "Down", "Down": "Up", "Left": "Right", "Right": "Left"}#蛇不可以像⾃⼰的反⽅向⾛if key_dict.has_key(key) and not key == key_dict[self.snake.direction]:self.snake.direction = keyself.move()elif key == 'p':self.status.reverse()def run(self):#⾸先判断游戏是否暂停if not self.status[0] == 'stop':#判断游戏是否结束if self.gameover == True:message = tkMessageBox.showinfo("Game Over", "your score: %d" % self.score)if message == 'ok':self.initial()if self.food.type == 4:color = self.color_c[self.i]self.i = (self.i+1)%10self.food.color = colorself.food.display()self.move(color)else:self.move()self.after(self.speed, self.run)def move(self, color="#EE82EE"):# 计算蛇下⼀次移动的点head = self.snake.body[0]if self.snake.direction == 'Up':if head[1] - 1 < 0:new = (head[0], 16)else:new = (head[0], head[1] - 1)elif self.snake.direction == 'Down':new = (head[0], (head[1] + 1) % 16)elif self.snake.direction == 'Left':if head[0] - 1 < 0:new = (24, head[1])else:new = (head[0] - 1, head[1])else:new = ((head[0] + 1) % 24, head[1])#撞到⾃⼰,设置游戏结束的标志位,等待下⼀循环if new in self.snake.body:self.gameover=True#吃到⾷物elif new == self.food.pos:if self.food.type == 1:self.snake.add(new)elif self.food.type == 2:self.snake.cut_down(new)elif self.food.type == 4:self.snake.change(new, color)else:self.snake.init(new)self.display_food()self.score = self.score+1self.m.set("Score:" + str(self.score))#什么都没撞到,继续前进else:self.snake.move(new)if __name__ == '__main__':root = Tk()snakegame = SnakeGame(root)snakegame.run()snakegame.mainloop()总结以上所述是⼩编给⼤家介绍的使⽤Python写⼀个贪吃蛇游戏实例代码,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

50行代码实现贪吃蛇(具体思路及代码)

50行代码实现贪吃蛇(具体思路及代码)

50⾏代码实现贪吃蛇(具体思路及代码)最近⼀直在准备⽤来⾯试的⼏个⼩demo,为了能展现⾃⼰,所以都是亲⾃设计并实现的,其中⼀个就是在50⾏代码内来实现⼀个贪吃蛇,为了说明鄙⼈⾃⼰练习编程的⼀种⽅式--把代码写短,为了理解语⾔细节。

复制代码代码如下:<SPAN style="FONT-SIZE: 14px">import sys, pygamefrom pygame.locals import *from random import randrangeup =lambda x:(x[0]-1,x[1])down = lambda x :(x[0]+1,x[1])left = lambda x : (x[0],x[1]-1)right = lambda x : (x[0],x[1]+1)tl = lambda x :x<3 and x+1 or 0tr = lambda x :x==0 and 3 or x-1dire = [up,left,down,right]move = lambda x,y:[y(x[0])]+x[:-1]grow = lambda x,y:[y(x[0])]+xs = [(5,5),(5,6),(5,7)]d = upfood = randrange(0,30),randrange(0,40)FPSCLOCK=pygame.time.Clock()pygame.init()pygame.display.set_mode((800,600))pygame.mouse.set_visible(0)screen = pygame.display.get_surface()screen.fill((0,0,0))times=0.0while True:time_passed = FPSCLOCK.tick(30)if times>=150:times =0.0s = move(s,d)else:times +=time_passedfor event in pygame.event.get():if event.type == QUIT:sys.exit()if event.type == KEYDOWN and event.key == K_UP:s = move(s,d)if event.type == KEYDOWN and event.key == K_LEFT:d=dire[tl(dire.index(d))]if event.type == KEYDOWN and event.key == K_RIGHT:d=dire[tr(dire.index(d))]if s[0]==food:s = grow(s,d)food =randrange(0,30),randrange(0,40)if s[0] in s[1:] or s[0][0]<0 or s[0][0] >= 30 or s[0][1]<0 or s[0][1]>=40:breakscreen.fill((0,0,0))for r,c in s:pygame.draw.rect(screen,(255,0,0),(c*20,r*20,20,20))pygame.draw.rect(screen,(0,255,0),(food[1]*20,food[0]*20,20,20))pygame.display.update()</SPAN>游戏截图:说明:1.其实不⽤pygame,在把⼀些条件判断改改,估计可以再短⼀半。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python版贪吃蛇.py
#!/usr/bin/python
from Tkinter import *
import random
class snake(Frame):
def __init__(self, master=None):
Frame.__init__(self, master)
self.body = [(0,0)]
self.bodyid = []
self.food = [ -1, -1 ]
self.foodid = -1
self.gridcount = 10
self.size = 500
self.di = 3
self.speed = 500
self.top = self.winfo_toplevel()
self.top.resizable(False, False)
self.grid()
self.canvas = Canvas(self)
self.canvas.grid()
self.canvas.config(width=self.size, height=self.size,relief=RIDGE)
self.drawgrid()
s = self.size/self.gridcount
id = self.canvas.create_rectangle(self.body[0][0]*s,self.body[0][1]*s,
(self.body[0][0]+1)*s, (self.body[0][1]+1)*s, fill="yellow") self.bodyid.insert(0, id)
self.bind_all("<KeyRelease>", self.keyrelease)
self.drawfood()
self.after(self.speed, self.drawsnake)
defdrawgrid(self):
s = self.size/self.gridcount
for i in range(0, self.gridcount+1):
self.canvas.create_line(i*s, 0, i*s, self.size)
self.canvas.create_line(0, i*s, self.size, i*s)
defdrawsnake(self):
s = self.size/self.gridcount
head = self.body[0]
new = [head[0], head[1]]
if self.di == 1:
new[1] = (head[1]-1) % self.gridcount
elifself.di == 2:
new[0] = (head[0]+1) % self.gridcount
elifself.di == 3:
new[1] = (head[1]+1) % self.gridcount
else:
new[0] = (head[0]-1) % self.gridcount
next = ( new[0], new[1] )
if next in self.body:
exit()
elif next == (self.food[0], self.food[1]):
self.body.insert(0, next)
self.bodyid.insert(0, self.foodid)
self.drawfood()
else:
tail = self.body.pop()
id = self.bodyid.pop()
self.canvas.move(id, (next[0]-tail[0])*s, (next[1]-tail[1])*s)
self.body.insert(0, next)
self.bodyid.insert(0, id)
self.after(self.speed, self.drawsnake)
defdrawfood(self):
s = self.size/self.gridcount
x = random.randrange(0, self.gridcount)
y = random.randrange(0, self.gridcount)
while (x, y) in self.body:
x = random.randrange(0, self.gridcount)
y = random.randrange(0, self.gridcount)
id = self.canvas.create_rectangle(x*s,y*s, (x+1)*s, (y+1)*s, fill="yellow") self.food[0] = x
self.food[1] = y
self.foodid = id
defkeyrelease(self, event):
if event.keysym == "Up" and self.di != 3:
self.di = 1
elifevent.keysym == "Right" and self.di !=4:
self.di = 2
elifevent.keysym == "Down" and self.di != 1:
self.di = 3
elifevent.keysym == "Left" and self.di != 2:
self.di = 4
app = snake()
app.master.title("Greedy Snake")
app.mainloop()。

相关文档
最新文档