鱼C论坛

 找回密码
 立即注册
查看: 1355|回复: 1

[技术交流] 自己写的贪吃蛇程序+_+

[复制链接]
发表于 2020-5-10 13:13:16 | 显示全部楼层 |阅读模式

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

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

x
有两个bug,一个是有时快速的按两个方向键,会闪退。
还一个是有时贪吃蛇会走出屏幕外,不会传到另一边。实在不知道错在哪了
import pygame, sys , random

pygame.init() #pygame模块初始化
win = pygame.display.set_mode((400,600))
pygame.display.set_caption("pygame事件处理")
fclock = pygame.time.Clock()
RED = pygame.Color("red")
BLACK=0,0,0
fps = 4
Stime = pygame.time.Clock()
napp = 3
applex = [375, 350, 150, 125, 100, 75, 50, 25, 0] #随机数
appley = [225, 200, 175, 150, 125, 100, 75, 50, 25, 275, 300, 325, 350, 375, 400, 425, 450, 475, 500, 525, 550, 575]
def Apple():
    applexy = [random.sample(applex,1)[0],random.sample(appley,1 )[0],20 ,20]#生成苹果的坐标
    return applexy

class Snake():
    snakelong = [1,2,3]
    Snakebody =[[150, 300, 20, 20], [150, 325, 20, 20], [150,350,20,20]]
    i2 = 3

    def __init__(self,direction = "up"):#up down left right 上 下 左 右
        self.direction = direction

    def generateSnakeboy(self):

        for i in self.snakelong:#自动创建蛇身列表

            if i == 1 or i == 2 or i == 3:
                pass
            elif self.i2 > i:
                pass
            elif self.i2 < i:
                self.i2 += 1
                if self.i2 == i:#判断增加的体块的方向,真tm恐怖-_-
                    if self.Snakebody[-2][0] == self.Snakebody[-1][0] and self.Snakebody[-2][1] < self.Snakebody[-1][1]:
                        self.Snakebody.append([self.Snakebody[-1][0],self.Snakebody[-1][1]+25,20,20])#当尾巴在下

                    elif self.Snakebody[-2][0] == self.Snakebody[-1][0] and self.Snakebody[-2][1] > self.Snakebody[-1][1]:
                        self.Snakebody.append([self.Snakebody[- 1][0], self.Snakebody[- 1][1] - 25, 20, 20])#尾当上

                    elif self.Snakebody[- 2][0] < self.Snakebody[- 1][0] and self.Snakebody[- 2][1] == self.Snakebody[-1][1]:
                        self.Snakebody.append([self.Snakebody[- 1][0]-25, self.Snakebody[- 1][1] , 20, 20])#尾当左

                    elif self.Snakebody[- 2][0] > self.Snakebody[- 1][0] and self.Snakebody[- 2][1] == self.Snakebody[-1][1]:
                        self.Snakebody.append([self.Snakebody[- 1][0] + 25, self.Snakebody[- 1][1] , 20, 20])



    def snackanim(self):#实现蛇爬行

        i1=len(self.Snakebody)-1

        self.Snakebody[- 1] = self.Snakebody[- 2]
        pygame.time.delay(50)
        for z in self.Snakebody[1:-1]:
            i1 -= 1
            self.Snakebody[i1] = self.Snakebody[i1 - 1]
        if self.direction == "up":
            self.Snakebody[0] = [self.Snakebody[0][0], self.Snakebody[0][1] - 25, 20, 20] #如果蛇头碰壁,则穿越到对面墙壁上
            if self.Snakebody[0][1] < 0:
                self.Snakebody[0][1] = 575
        elif self.direction == "down":
            self.Snakebody[0] = [self.Snakebody[0][0], self.Snakebody[0][1] + 25, 20, 20]
            if self.Snakebody[0][1] >600:
                self.Snakebody[0][1] = 0
        elif self.direction == "left":
            self.Snakebody[0] = [self.Snakebody[0][0] -25, self.Snakebody[0][1] , 20, 20]
            if self.Snakebody[0][0] < 0:
                self.Snakebody[0][0] = 375
        elif self.direction == "right":
            self.Snakebody[0] = [self.Snakebody[0][0] + 25, self.Snakebody[0][1] , 20, 20]
            if self.Snakebody[0][0] > 400:
                self.Snakebody[0][0] = 0
        pygame.time.delay(50)
        return self.Snakebody


apple = Apple()
f = Snake()

 #只能用这种方法来增加体块

while True:#游戏主程序死循环
    for event in pygame.event.get([pygame.QUIT,pygame.KEYUP]):#pygame事件判断
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_UP or event.key == pygame.K_w:
                if f.direction == "down":
                    pass
                else:
                    f.direction = "up"
            if event.key == pygame.K_DOWN or event.key == pygame.K_s:
                if f.direction == "up":
                    pass
                else:
                    f.direction = "down"
            if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                if f.direction == "right":
                    pass
                else:
                    f.direction = "left"
            if event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                if f.direction == "left":
                    pass
                else:
                    f.direction = "right"
    win.fill(BLACK)
    if apple == f.Snakebody[0]:
        napp += 1
        f.snakelong.append(napp)
        f.generateSnakeboy()
        apple = Apple()
    else:
        app = pygame.draw.rect(win, RED, apple)


    for sbody in f.snackanim():  # 绘制蛇蛇身
        newrect = pygame.draw.rect(win, RED, sbody)
    for j in f.Snakebody[1:]:
        if f.Snakebody[0] == j :
            sys.exit()


    pygame.display.update()#刷新屏
    Stime.tick(fps)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-10 13:18:42 | 显示全部楼层
支持一下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 06:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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