贪吃蛇

`

import random

import sys

import time

import pygame

from pygame.localsimport *

from collectionsimport deque

# 基础设置

Screen_Height =480

Screen_Width =600

Size =20  # 小方格大小

Line_Width =1

# 游戏区域的坐标范围

Area_x = (0, Screen_Width // Size -1)# 0是左边界,1是右边界 #注:python中//为整数除法;/为浮点数除法

Area_y = (2, Screen_Height // Size -1)

# 食物的初步设置

# 食物的分值+颜色

Food_Style_List = [(10, (255,100,100)), (20, (100,255,100)), (30, (100,100,255))]

# 整体颜色设置

Light = (100,100,100)

Dark = (200,200,200)

Black = (0,0,0)

Red = (200,30,30)

Back_Ground = (40,40,60)

# 文本输出格式设置

def Print_Txt(screen, font, x, y, text, fcolor=(255,255,255)):

# font.render参数意义:.render(内容,是否抗锯齿,字体颜色,字体背景颜色)

    Text = font.render(text,True, fcolor)

screen.blit(Text, (x, y))

# 初始化蛇

def init_snake():

snake = deque()

snake.append((2, Area_y[0]))

snake.append((1, Area_y[0]))

snake.append((0, Area_y[0]))

return snake

# 食物设置

# 注意需要对食物出现在蛇身上的情况进行判断

def Creat_Food(snake):

'''

    注:randint 产生的随机数区间是包含左右极限的,

    也就是说左右都是闭区间的[1, n],能取到1和n。

    而 randrange 产生的随机数区间只包含左极限,

    也就是左闭右开的[1, n),1能取到,而n取不到。randint

    产生的随机数是在指定的某个区间内的一个值,

    而 randrange 产生的随机数可以设定一个步长,也就是一个间隔。'''

    food_x = random.randint(Area_x[0], Area_x[1])# 此处有疑问

    food_y = random.randint(Area_y[0], Area_y[1])

# 如果食物出现在蛇上,重来;

    while (food_x, food_y)in snake:

food_x = random.randint(Area_x[0], Area_x[1])

food_y = random.randint(Area_y[0], Area_y[1])

return food_x, food_y

# 食物风格

def Food_Style():

return Food_Style_List[random.randint(0,2)]# 返回随机的分值和颜色

def snake_main(windowname='贪吃蛇', overname='GAME OVER'):

pygame.init()

screen = pygame.display.set_mode((Screen_Width, Screen_Height))# 初始化一个准备显示的窗口或屏幕

    pygame.display.set_caption(windowname)# 设置窗口名字

    # 得分字体设置

    font1 = pygame.font.SysFont('SimHei',24)

# GO字体设置

    font2 = pygame.font.SysFont(None,72)

fwidth, fheight = font2.size(overname)###

    # 程序bug修复:如果蛇在向右移动,快速点击分别施加向下、向左的命令,向下的命令会被覆盖,只有向左的命令被接受,直接GameOver

    # b变量为了防止这个情况发生

    b =True

    # 蛇

    snake = init_snake()

# 食物

    food = Creat_Food(snake)

food_style = Food_Style()

# 方向控制

    pos = (1,0)###

    # 启动游戏相关变量初始化

    game_over =True  # 结束标志 # 是否开始,当start = True,game_over = True 时,才显示GAME OVER

    game_start =False  # 开始标志

    score =0  # 得分

    orispeed =0.3  # 蛇初始速度

    speed = orispeed# 蛇速度

    last_move_time =None

    pause =False  # 暂停

    while True:

for eventin pygame.event.get():

if event.type == QUIT:

sys.exit()

elif event.type == KEYDOWN:

if event.key == K_RETURN:

if game_over:

game_start =True

                        game_over =False

                        b =True

                        snake = init_snake()

food = Creat_Food(snake)

food_style = Food_Style()

pos = (1,0)

# 得分

                        score =0

                        last_move_time = time.time()

elif event.key == K_SPACE:

if not game_over:

pause =not pause

# 以下为防止蛇在向右移动时按向左键,导致GameOver

                elif event.keyin (K_UP, K_w):

if band not pos[1]:###

                        pos = (0, -1)

b =False

                elif event.keyin (K_DOWN, K_s):

if band not pos[1]:

pos = (0,1)

b =False

                elif event.keyin (K_LEFT, K_a):

if band not pos[0]:

pos = (-1,0)

b =False

                elif event.keyin (K_RIGHT, K_d):

if band not pos[0]:

pos = (1,0)

b =False

        # 填充背景色

        screen.fill(Back_Ground)

###

        # 画网格线、竖线

        for xin range(Size, Screen_Width, Size):

pygame.draw.line(screen, Black, (x, Area_y[0] * Size), (x, Screen_Height), Line_Width)

# 画网格线、横线

        for yin range(Area_y[0] * Size, Screen_Height, Size):

pygame.draw.line(screen, Black, (0, y), (Screen_Width, y), Line_Width)

# 蛇的爬行过程

        if not game_over:

curTime = time.time()

if curTime - last_move_time > speed:###

                if not pause:

b =True

                    last_move_time = curTime

next_s = (snake[0][0] + pos[0], snake[0][1] + pos[1])

# 如果吃到了食物

                    if next_s == food:

snake.appendleft(next_s)

score += food_style[0]

speed = orispeed -0.03 * (score //100)

food = Creat_Food(snake)

food_style = Food_Style()

else:

# 在区域内

                        if Area_x[0] <= next_s[0] <= Area_x[1]and Area_y[0] <= next_s[1] <= Area_y[

1]and next_snot in snake:

snake.appendleft(next_s)

snake.pop()

else:

game_over =True

        # 画食物

        if not game_over:

'''

rect(Surface,color,Rect,width=0)

  第一个参数指定矩形绘制到哪个Surface对象上

第二个参数指定颜色

  第三个参数指定矩形的范围(left,top,width,height)

  第四个参数指定矩形边框的大小(0表示填充矩形)

  例如绘制三个矩形:pygame.draw.rect(screen, BLACK, (50, 50, 150, 50), 0)

pygame.draw.rect(screen, BLACK, (250, 50, 150, 50), 1)

pygame.draw.rect(screen, BLACK, (450, 50, 150, 50), 10)

'''

        # 避免 GAME OVER 的时候把 GAME OVER 的字给遮住了

        pygame.draw.rect(screen, food_style[1], (food[0] * Size, food[1] * Size, Size, Size),0)

# 画蛇

        for sin snake:

pygame.draw.rect(screen, Dark, (s[0] * Size + Line_Width, s[1] * Size + Line_Width,

Size - Line_Width *2, Size - Line_Width *2),0)

Print_Txt(screen, font1,30,7,f'速度: {score //100}')

Print_Txt(screen, font1,450,7,f'得分: {score}')

# 画GameOver

        if game_over:

if game_start:

# print('GameOver')

                Print_Txt(screen, font2, (Screen_Width - fwidth) //2, (Screen_Height - fheight) //2,'GAME OVER', Red)

pygame.display.update()

`

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容