您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:python实现双人贪吃蛇小游戏

51自学网 2021-10-30 22:23:28
  python
这篇教程python实现双人贪吃蛇小游戏写得很实用,希望能帮到您。

小编今天要给大家分享的是双人贪吃蛇,大家可以和自己的兄弟,姐妹,爸爸,妈妈等一起玩哟!我先介绍一下游戏:

运行游戏,进入初始界面,按下空格键。

玩家(1):w,a,s,d

玩家(2):↑,←,↓,→

玩家要争夺7个实物,直到吃完为止

游戏结束。

下面是小编写的代码:

import mathimport randomimport pygamefrom pygame.locals import * running = Falseplaying = Falsescreen = Nonetimer = Nonesnk1 = Nonesnk2 = Nonefoods = NoneremainFoods = 7radiusFood = 8 '''链表节点'''class Node:    def __init__(self, data, prev = None, next = None):        self.data = data        self.prev = prev        self.next = next     def insert_front(self, node):        if self.prev:            node.prev = self.prev            self.prev.next = node            self.prev = node            node.next = self        else:            self.prev = node            node.next = self        return node     def insert_back(self, node):        if self.next:            node.next = self.next            self.next.prev = node            self.next = node            node.prev = self        else:            self.next = node            node.prev = self        return node        def remove(self):        if self.next:            self.next.prev = self.prev        if self.prev:            self.prev.next = self.next '''蛇'''class Snack:     def __init__(self, surface, color, start_pos, end_pos, face):        self.color = color        self.surface = surface        self.head = Node(start_pos)        self.tail = Node(end_pos)        self.head.insert_back(self.tail)        self.length = self.distanceBetween(start_pos, end_pos)        self.face = face        self.speed = 120        self.eat = 0        self.grow = 0        self.mapAngle = [            [0, math.pi * 3 / 2, math.pi / 2],            [0, math.pi * 7 / 4, math.pi / 4],            [math.pi, math.pi * 5 / 4, math.pi * 3 / 4]        ]     '''坐标取整'''    def intPos(self, pos):        return (int(pos[0]), int(pos[1]))     '''坐标转角度'''    def pos2Angle(self, pos):        return self.mapAngle[pos[0]][pos[1]]     '''极坐标位移'''    def polarPos(self, pos, angle, dis):        xx = pos[0] + dis * math.cos(angle)        yy = pos[1] + dis * math.sin(angle)        return (xx, yy)     '''计算两点间距离'''    def distanceBetween(self, pos1, pos2):        dx = pos2[0] - pos1[0]        dy = pos2[1] - pos1[1]        return math.sqrt(dx*dx + dy*dy)        '''计算两点间角度'''    def angleBetween(self, pos1, pos2):        dx = pos2[0] - pos1[0]        dy = pos2[1] - pos1[1]        return math.atan2(dy, dx)     '''改变面向'''    def changeFace(self, newFace):        if newFace[0] == 0 and newFace[1] == 0:            return        if newFace == self.face:            return        xx = self.face[0] + newFace[0]        yy = self.face[1] + newFace[1]        if xx == 0 and yy == 0:            return        self.face = newFace        self.head = self.head.insert_front(Node(self.head.data))     '''吃到食物'''    def eatFood(self, grow):        self.grow = grow        self.eat += 1     '''绘制蛇身'''    def draw(self):        node = self.head        pygame.draw.circle(self.surface, self.color, self.intPos(node.data), 6, 6)        while node:            n2 = node.next             if not n2:                break            pygame.draw.line(self.surface, self.color, self.intPos(node.data), self.intPos(n2.data), 6)            node = node.next        '''每帧移动'''    def walk(self, delta):        dis = self.speed * delta / 1000        self.head.data = self.polarPos(self.head.data, self.pos2Angle(self.face), dis)        if self.grow >= dis:            self.grow -= dis        else:            dis -= self.grow            self.grow = 0            self.cutTail(dis)        '''收缩尾巴'''    def cutTail(self, length):        node = self.tail        while length > 0:            n2 = node.prev            dis = self.distanceBetween(n2.data, node.data)            angle = self.angleBetween(node.data, n2.data)            if dis > length:                node.data = self.polarPos(node.data, angle, length)                length = 0            else:                self.tail = node.prev                node.remove()                length -= dis             node = node.prev '''屏幕指定位置绘制文字'''def printText(surface, str, pos, size = 24, color = (255, 255, 255)):    global screen    font = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", size)    text = font.render(str, True, color)    w = text.get_width()    h = text.get_height()    surface.blit(text, (pos[0] - w / 2, pos[1] - h / 2)) '''添加食物'''def addFood():    global screen, snk1, snk2, foods, remainFoods    if remainFoods <= 0:        return    w = screen.get_width()    h = screen.get_height()    while True:        posX = random.randint(5, w - 5)        posY = random.randint(5, h - 5)        color = tuple(screen.get_at((posX, posY)))        if color != snk1.color and color != snk2.color:            break    remainFoods -= 1    if not foods:        foods = Node((posX, posY))    else:        foods = foods.insert_front(Node((posX, posY))) '''删除食物'''def removeFood(node):    global foods    if node == foods:        foods = foods.next    else:        node.remove() '''检测吃到食物'''def checkEatFood():    global foods, radiusFood, snk1, snk2    node = foods    while node:        if snk1.distanceBetween(snk1.head.data, node.data) < (radiusFood + 4):            snk1.eatFood(50)            removeFood(node)            addFood()            break        elif snk2.distanceBetween(snk2.head.data, node.data) < (radiusFood + 4):            snk2.eatFood(50)            removeFood(node)            addFood()            break        else:            node = node.next '''游戏初始界面'''def logo():    global screen, remainFoods    w = screen.get_width()    h = screen.get_height()    printText(screen, "Snack V1.0", (w / 2, h / 3), 48)    printText(screen, "任意键继续", (w / 2, h / 2), 24, (55, 255, 55))    printText(screen, str(remainFoods) + "个食物,抢完即止", (w / 2, h * 2 / 3), 32)    def quit():    pygame.font.quit() '''检测游戏结束'''def checkGameOver():    global remainFoods, snk1, snk2, foods, playing, screen    if remainFoods == 0 and foods == None:        playing = False        screen.fill((0,0,0))        w = screen.get_width()        h = screen.get_height()        if snk1.eat > snk2.eat:            printText(screen, "玩家1 胜利", (w / 2, h / 2), 48)        elif snk1.eat < snk2.eat:            printText(screen, "玩家2 胜利", (w / 2, h / 2), 48)        else:            printText(screen, "平局", (w / 2, h / 2), 48) '''键盘按键转换成面向角度'''def cmd():    global snk1, snk2    keys = pygame.key.get_pressed()    x1 = x2 = y1 = y2 = 0    if keys[pygame.K_RIGHT]:        x2+=1    if keys[pygame.K_LEFT]:        x2-=1    if keys[pygame.K_UP]:        y2+=1    if keys[pygame.K_DOWN]:        y2-=1    if keys[pygame.K_d]:        x1+=1    if keys[pygame.K_a]:        x1-=1    if keys[pygame.K_w]:        y1+=1    if keys[pygame.K_s]:        y1-=1    snk1.changeFace((x1, y1))    snk2.changeFace((x2, y2)) '''游戏每帧更新'''def play(delta):    global playing, snk1, snk2    if not playing:        return    cmd()    snk1.walk(delta)    snk2.walk(delta)    checkEatFood()    checkGameOver() '''绘制'''def draw():    global snk1, snk2, playing, screen, radiusFood, remainFoods    if not playing:        return    screen.fill((0,0,0))    snk1.draw()    snk2.draw()    node = foods    while node:        color = (255, 255, 255)        if remainFoods == 0:            color = (255, 0, 0)        pygame.draw.circle(screen, color, node.data, radiusFood, radiusFood // 2 + 1)        node = node.next def start(width = 800, height = 600, fps = 60):    global running, screen, timer, playing, snk1, snk2    pygame.init()    pygame.font.init()    font = pygame.font.SysFont("microsoftyaheimicrosoftyaheiui", 20)    pygame.display.set_caption("Snack V1.0")    screen = pygame.display.set_mode((width, height))        logo()    snk1 = Snack(screen, (0, 150, 200), (100, 100), (0, 100), (1, 0))    snk2 = Snack(screen, (255, 100, 0), (width * 5 // 6, height // 2), (width * 5 // 6 + 100, height // 2), (-1, 0))    for i in range(3):        addFood()     timer = pygame.time.Clock()    running = True    while running:        delta = timer.tick(fps)        play(delta)        draw()        for event in pygame.event.get():            if event.type == pygame.QUIT:                running = False            elif event.type == pygame.KEYDOWN:                if event.key == pygame.K_SPACE and playing == False:                    screen.fill((0,0,0))                    playing = True         pygame.display.flip()     if __name__ == "__main__":    start()    quit()

以上就是双人贪吃蛇的代码啦!

教大家pygame的安装方式

在终端输入

pip install pyame,然后回车键进行安装

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持51zixue.net。


python切片中内存的注意事项总结
如何利用python脚本自动部署k8s
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。