Tools
首页
画图
音乐
采集
记事
博客
实验室
登录
lypeng
146
文章
11
分类
46
记事
分类
生活-[23]
Linux-[24]
前端-[9]
数据库-[16]
PHP-[31]
git-[7]
其他-[6]
python-[20]
算法-[4]
React-Native-[4]
中草药-[2]
广告位1
广告位2
首页
/ python
返回列表
pygame 贪吃蛇
阅读:786
发布:2019-12-04
作者:lypeng
## 效果图   ## pygame一些资料 pygame学习教程:https://eyehere.net/page/2/?s=pygame?_blank pygame官方手册:https://www.pygame.org/docs/?_blank pygame中文手册:/uploads/file/Pygame.pdf (可下载离线看) ## pygame pygame学习起来不难,和html5的cavans画板,python的tkinter,整个思路都差不多!难的是代码逻辑~ - 先定义一个框(画布) - 然后填充背景图或背景颜色,在上面画图形,圆,方块,线条 - 通过逻辑代码控制图形的移动 - while true死循环,保持界面一直存在 ## 贪吃蛇: 代码思路分析参见:https://www.cnblogs.com/dengfaheng/p/9241267.html?_blank 感谢这位大神~ 用到了list,tuple,dict的操作,我表示还是不熟练~ - main函数控制主程序 - show_start_info和show_gameover_info定义了开始与结束两个场景 - 再有是别的各种方法(移动,判断是否撞墙或自己body,随机生成食物位置,吃到食物等等) ## 完整代码: ```python # _*_coding:utf-8_*_ import pygame from pygame.locals import * from sys import exit import random # 初始化 变量定义 windows_width = 700 windows_height = 580 cell_size = 20 BG_COLOR = (0,0,0) snake_speed = 5 #贪吃蛇的速度 map_width = int(windows_width / cell_size) map_height = int(windows_height / cell_size) # 定义方向 UP = 1 DOWN = 2 LEFT = 3 RIGHT = 4 HEAD = 0 #贪吃蛇头部下标 # 主函数 def main(): pygame.init() snake_speed_clock = pygame.time.Clock() screen = pygame.display.set_mode((windows_width,windows_height), 0, 32) screen.fill(BG_COLOR) pygame.display.set_caption('贪吃蛇') show_start_info(screen) while True: running_game(screen,snake_speed_clock) show_gameover_info(screen) def running_game(screen,snake_speed_clock): screen.fill(BG_COLOR) #清屏 #开始位置 startx = random.randint(3, map_width - 8) starty = random.randint(3, map_height - 8) #初始贪吃蛇 snake_coords = [{'x':startx, 'y': starty}, {'x': startx-1, 'y': starty}, {'x': startx-2, 'y': starty}] #开始时向右移动 direction = RIGHT #实物随机位置 food = get_random_location() while True: for event in pygame.event.get(): if event.type == QUIT: exit() elif event.type == KEYDOWN: if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT: direction = LEFT elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT: direction = RIGHT elif (event.key == K_UP or event.key == K_w) and direction != DOWN: direction = UP elif (event.key == K_DOWN or event.key == K_s) and direction != UP: direction = DOWN elif event.key == K_ESCAPE: terminate() move_snake(direction, snake_coords) ret = snake_is_alive(snake_coords) if not ret: break #蛇跪了. 游戏结束 #判断蛇是否吃到食物 snake_is_eat_food(snake_coords, food) screen.fill(BG_COLOR) draw_grid(screen) draw_snake(screen, snake_coords) draw_food(screen, food) draw_score(screen, len(snake_coords) - 3) pygame.display.update() snake_speed_clock.tick(snake_speed) #控制fps # 画蛇 def draw_snake(screen,snake_coords): for coord in snake_coords: x = coord['x'] * cell_size y = coord['y'] * cell_size color = (random.randint(0,255),random.randint(0,255),random.randint(0,255)) pygame.draw.rect(screen,color,((x,y),(cell_size,cell_size)),0) pass # 画食物 def draw_food(screen,food): x = food['x'] * cell_size y = food['y'] * cell_size pygame.draw.rect(screen,(255,0,0),((x,y),(cell_size,cell_size)),0) def draw_grid(screen): for x in range(0, windows_width, cell_size): # draw 水平 lines pygame.draw.line(screen, (30,30,30), (x, 0), (x, windows_height)) for y in range(0, windows_height, cell_size): # draw 垂直 lines pygame.draw.line(screen, (30,30,30), (0, y), (windows_width, y)) def move_snake(direction, snake_coords): if direction == UP: newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] - 1} elif direction == DOWN: newHead = {'x': snake_coords[HEAD]['x'], 'y': snake_coords[HEAD]['y'] + 1} elif direction == LEFT: newHead = {'x': snake_coords[HEAD]['x'] - 1, 'y': snake_coords[HEAD]['y']} elif direction == RIGHT: newHead = {'x': snake_coords[HEAD]['x'] + 1, 'y': snake_coords[HEAD]['y']} snake_coords.insert(0, newHead) def snake_is_alive(snake_coords): tag = True if snake_coords[HEAD]['x'] == -1 or snake_coords[HEAD]['x'] == map_width or snake_coords[HEAD]['y'] == -1 or \ snake_coords[HEAD]['y'] == map_height: tag = False # 蛇碰壁啦 for snake_body in snake_coords[1:]: if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']: tag = False # 蛇碰到自己身体啦 return tag def snake_is_eat_food(snake_coords,food): if snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']: food['x'] = random.randint(0, map_width - 1) food['y'] = random.randint(0, map_height - 1) # 实物位置重新设置 else: del snake_coords[-1] # 如果没有吃到实物, 就向前移动, 那么尾部一格删掉 def get_random_location(): return {'x':random.randint(1, map_width-1),'y':random.randint(1, map_height-1)} def show_start_info(screen): background = pygame.image.load('bg4.jpg') screen.blit(background,(0,0)) font = pygame.font.Font('simkai.ttf', 40) title = font.render(u'点击任意键开始游戏,ESC退出',True,(255,0,0)) screen.blit(title,(100,100)) pygame.display.update() while True: for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() if event.type == KEYDOWN: if event.key == K_ESCAPE: terminate() else: return def show_gameover_info(screen): font = pygame.font.Font('simkai.ttf', 40) tip = font.render('按ESC退出游戏, 按任意键重新开始~', True, (65, 105, 225)) gamestart = pygame.image.load('bg5.png') screen.blit(gamestart, (200, 240)) screen.blit(tip, (30, 300)) pygame.display.update() while True: #键盘监听事件 for event in pygame.event.get(): if event.type == QUIT: terminate() elif event.type == KEYDOWN: if event.key == K_ESCAPE: terminate() else: return #结束此函数, 重新开始游戏 def draw_score(screen,score): font = pygame.font.Font('simkai.ttf', 30) scoreSurf = font.render('得分: %s' % score, True, (0,255,0)) scoreRect = scoreSurf.get_rect() scoreRect.topleft = (windows_width - 120, 10) screen.blit(scoreSurf, scoreRect) def terminate(): pygame.quit() exit() # 调用主函数,运行游戏 main() ``` ## 运行说明 用到图片两个bg4.jpg;bg5.png,字体:simkai.ttf 下载:/uploads/file/snake.rar?_blank 我的Python版本:3.7.0 ``` pip install pygame python snake.py ```
------本文结束
感谢阅读------
上一篇:
django(四)参考polls做两个页面以及部署与问题整理
下一篇:
python利用pywin32设置壁纸