鱼C论坛

 找回密码
 立即注册
查看: 2263|回复: 13

[技术交流] 贪吃蛇代码(简单易懂)

[复制链接]
发表于 2022-3-5 20:58:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import pygame,sys,time,random,math
import collections
import copy
import time
screen_width,screen_height=(600,600)
rect_color=(255,255,255)
snake_color=(100,100,100)
food_color=(50,50,50)
bgcolor=(0,0,0)
direction='up'
last_direction='up'

snake=collections.deque()

def draw_screen(screen,rect_color):
    for y in range(30):
        for x in range(30):
            pygame.draw.rect(screen,rect_color,((20*y,20*x),(19,19)),0)

def init_snake(snake):
    snake.appendleft(pygame.Rect((80, 80),(19, 19)))
    snake.appendleft(pygame.Rect((80, 100), (19, 19)))
    snake.appendleft(pygame.Rect((80, 120), (19, 19)))
    return snake


def draw_snake(screen,snake_color,snake):
    snake_copy=copy.deepcopy(snake)
    while snake_copy:
        pygame.draw.rect(screen,snake_color,snake_copy.pop(),0)

def create_food(snake):
    food_x=random.randrange(0,600,20)
    food_y=random.randrange(0,600,20)

    food_rect=pygame.Rect(((food_x, food_y),(19, 19)))

    snake_copy = copy.deepcopy(snake)
    while snake_copy:
        invalid_food=snake_copy.pop()
        if food_rect==invalid_food:
            food_x = random.randrange(0, 600, 20)
            food_y = random.randrange(0, 600, 20)
            food_rect = pygame.Rect(((food_x, food_y), (19, 19)))
    return food_rect

def draw_food(screen,food_color,food_rect):
    pygame.draw.rect(screen,food_color,food_rect,0)

def snake_auto_move(snake,direction):
    if direction=='up'  :
        rect= copy.deepcopy(snake[len(snake) - 1]) #小心浅复制
        rect.top-=20
        snake.popleft()
        snake.append(rect)
    if direction == 'down':
        rect = copy.deepcopy(snake[len(snake) - 1])
        rect.top += 20
        snake.popleft()
        snake.append(rect)
    if direction == 'right':
        rect = copy.deepcopy(snake[len(snake) - 1])
        rect.left += 20
        snake.popleft()
        snake.append(rect)
    if direction == 'left':
        rect = copy.deepcopy(snake[len(snake) - 1])
        rect.left -= 20
        snake.popleft()
        snake.append(rect)

def game_over():
    print('you lose')
    pygame.quit()
    sys.exit()

def move_conflit(direction,last_direction):
    if (direction=='up' and last_direction=='down') or (direction=='down' and last_direction=='up') :
        game_over()
    if (direction=='left' and last_direction=='right') or (direction=='right' and last_direction=='left'):
        game_over()

def add_snake(snake,direction):
    if direction=='up':
        rect=copy.deepcopy(snake[0])
        rect.top+=20
        snake.appendleft(rect)
    if direction=='down':
        rect=copy.deepcopy(snake[0])
        rect.top-=20
        snake.appendleft(rect)
    if direction=='right':
        rect=copy.deepcopy(snake[0])
        rect.left-=20
        snake.appendleft(rect)
    if direction=='left':
        rect=copy.deepcopy(snake[0])
        rect.left+=20
        snake.appendleft(rect)

def get_food(snake,food_rect,direction):
    if snake[len(snake)-1]==food_rect:
        add_snake(snake,direction)
        food_rect=create_food(snake)
    return food_rect

def collision_snake(snake):
    if snake[len(snake)-1].left<0 or snake[len(snake)-1].left>screen_width:
        game_over()
    if snake[len(snake)-1].top<0 or snake[len(snake)-1].left>screen_height:
        game_over()

def difficulty_choose():
    print('选择难度')
    print('{},{},{}'.format('a:简单','b:中等','c:困难'))
    choice=input()
    if choice=='a':
        return 0.2
    elif choice=='b':
        return  0.15
    elif choice=='c':
        return 0.1
    else:
        print('叫你乱按,席勒')
        return 0

def difficulty_uplift(snake,speed):
    difficuty_limit=0.005
    if not (len(snake)%3) and (speed>difficuty_limit):
        speed-=0.0004
    return speed


food_rect=create_food(snake)
last_time_piece_move=time.time()
speed=difficulty_choose()

pygame.init()
screen=pygame.display.set_mode((screen_width,screen_height))
pygame.display.set_caption('贪吃蛇')
screen.fill(bgcolor)

time.sleep(2)

init_snake(snake)
while True:
    screen.fill(bgcolor)
    draw_screen(screen,rect_color)
    draw_snake(screen,snake_color,snake)
    draw_food(screen,food_color,food_rect)
    pygame.display.update()

    for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type==pygame.KEYDOWN:
                if event.key==pygame.K_UP:
                    direction='up'
                if event.key == pygame.K_DOWN:
                    direction='down'
                if event.key==pygame.K_LEFT:
                    direction='left'
                if event.key==pygame.K_RIGHT:
                    direction='right'
    if time.time()-last_time_piece_move>speed:
        difficulty_uplift(snake,speed)
        move_conflit(direction,last_direction)
        collision_snake(snake)
        snake_auto_move(snake,direction)
        food_rect=get_food(snake,food_rect,direction)
        last_direction=direction
        last_time_piece_move=time.time()



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-20 22:27:15 | 显示全部楼层
嗯 感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-15 15:38:00 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-16 21:24:18 | 显示全部楼层
xiexie
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-21 10:03:50 | 显示全部楼层
感谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-26 09:20:07 | 显示全部楼层
  1. Traceback (most recent call last):
  2.   File "D:/Program Files/Python37/test/贪吃蛇.py", line 1, in <module>
  3.     import pygame,sys,time,random,math
  4. ModuleNotFoundError: No module named 'pygame'
复制代码


运行报错是什么情况哈,谢谢了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2022-9-30 09:36:20 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 10:55:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-14 09:05:32 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-28 19:32:29 | 显示全部楼层
lymbwx 发表于 2022-9-26 09:20
运行报错是什么情况哈,谢谢了.

pygame库没安装
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-19 23:35:12 | 显示全部楼层
虽然很简单,但现在的我还是看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-25 19:24:10 | 显示全部楼层
好像没给主函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 11:27:16 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-8 10:41:49 | 显示全部楼层
感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 15:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表