python&pygame贪吃蛇源代码

caidan_youxi.py

import sys

import pygame
from PyQt5.QtWidgets import QApplication, QMainWindow

import login

if __name__ == '__main__':
    pygame.init()
    pygame.mixer.init()
    pygame.mixer.music.load('C:/Users/ShiWe/Desktop/计算机软件技术实习/tanchishe/bgm.mp3')  # 加载歌曲
    pygame.mixer.music.play()  # 播放
    app = QApplication(sys.argv)
    win = QMainWindow()
    loginUi = login.Ui_MainWindow()
    loginUi.setupUi(win)
    win.show()
    sys.exit(app.exec_())

youxi.py


f = open("speed.txt", mode='r')
speed = f.read()
f.close()
score = 0

import pygame as py
import random


class Point:
    def __init__(self, row=0, col=0):
        self.row = row
        self.col = col

    def copy(self):
        return Point(self.row, self.col)


# 定义显示窗口的W(宽) H(高)
W = 800
H = 800
snakes = []  # 定义蛇身列表

flag=False#是否暂停

def ge_food():
    while True:
        pos = Point(random.randint(0, ROW - 1), random.randint(0, COL - 1))
        is_collide = False
        if pos.row == head.row and pos.col == head.col:  # 与蛇头重合
            is_collide = True
        # 与蛇身碰撞
        for snake in snakes:
            if (snake.row == pos.row and snake.col == pos.col):
                is_collide = True
                break
        if not is_collide:
            return pos


ROW = 20  # 行数
COL = 20  # 列数
size = (W, H)
py.init()  # 初始化界面
window = py.display.set_mode(size)
py.display.set_caption("贪吃蛇大作战")
bak_color = (255, 255, 255)
# 定义蛇头
head = Point(row=int(ROW / 2), col=int(COL / 2))
head_color = (0, 128, 128)
# 定义食物
food = ge_food()
food_color = (255, 255, 0)

snake_color = (128, 128, 128)
direct = 'left'


def rect(point, color):
    cell_width = W / COL
    cell_height = H / ROW
    left = point.col * cell_width
    top = point.row * cell_height
    py.draw.rect(
        window, color,
        (left, top, cell_width, cell_height)
    )


image = py.image.load("huiworf.jpg")
new = py.transform.scale(image, (40, 40))
window.blit(new, (0, 0))

image = py.image.load("lan.jpg")
new1 = py.transform.scale(image, (40, 40))
window.blit(new1, (0, 0))

image = py.image.load("lan1.jpg")
new2 = py.transform.scale(image, (40, 40))
window.blit(new2, (0, 0))


def rect1(point):
    cell_width = W / COL
    cell_height = H / ROW
    left = point.col * cell_width
    top = point.row * cell_height
    # py.draw.rect(
    #     window, color,
    #     (left, top, cell_width, cell_height)
    # )
    window.blit(
        new,
        (left, top)
    )


def rect2(point):
    cell_width = W / COL
    cell_height = H / ROW
    left = point.col * cell_width
    top = point.row * cell_height
    # py.draw.rect(
    #     window, color,
    #     (left, top, cell_width, cell_height)
    # )
    window.blit(
        new1,
        (left, top)
    )


def rect3(point):
    cell_width = W / COL
    cell_height = H / ROW
    left = point.col * cell_width
    top = point.row * cell_height
    # py.draw.rect(
    #     window, color,
    #     (left, top, cell_width, cell_height)
    # )
    window.blit(
        new2,
        (left, top)
    )


showWindow = True
clock = py.time.Clock()  # 时钟控制
while showWindow:
    # 处理事件
    for event in py.event.get():
        if event.type == py.QUIT:
            showWindow = False
        if event.type == py.KEYDOWN:
            if event.key == py.K_UP:
                if direct == 'left' or direct == 'right':
                    direct = "top"
            elif event.key == py.K_DOWN:
                if direct == 'left' or direct == 'right':
                    direct = "down"
            elif event.key == py.K_LEFT:
                if direct == 'top' or direct == 'down':
                    direct = 'left'
            elif event.key == py.K_RIGHT:
                if direct == 'top' or direct == 'down':
                    direct = 'right'
        if event.type == py.KEYDOWN:
            if event.key == py.K_r:
                head = Point(row=int(ROW / 2), col=int(COL / 2))
                snakes=[]
                score = 0


            if event.key == py.K_q:
                flag=True
                while flag:
                    for event0 in py.event.get():
                        if event0.type == py.KEYDOWN:
                            if event0.key == py.K_s:

                                flag=False
                            if event.type == py.QUIT:
                                showWindow = False
                                break


    # 判断蛇是否吃到东西
    eat = False
    if head.row == food.row and head.col == food.col:  # 蛇吃到食物
        eat = True
    if eat:  # 吃到食物就要产生新的食物
        food = ge_food()
        score = score + 1
    # 将蛇头插入到snakes列表中
    snakes.insert(0, head.copy())
    # 将最后一个元素删除
    if not eat:
        snakes.pop()
    # 移动蛇头
    if direct == 'left':
        head.col -= 1  # 注意 direct = 'left'与head.col-=1不能写在一起 因为蛇头要一直移动
    elif direct == 'right':
        head.col += 1
    elif direct == 'top':
        head.row -= 1
    else:
        head.row += 1
    # 判断蛇是否死亡
    dead = False
    # 判断蛇是否撞墙
    if head.col < 0 or head.row < 0 or head.row >= ROW or head.col >= COL:

        dead = True
    # 判断蛇是否撞蛇身
    for snake in snakes:
        if snake.row == head.row and snake.col == head.col:
            dead = True
            break
    if dead:
        with open(file=r"Paihang.txt", mode="r", encoding="utf-8") as fb:
            bt = fb.readlines()
        diyi=int(bt[0].strip('\n'))
        dier=int(bt[1].strip('\n'))
        disan=int(bt[2].strip('\n'))
        if score>diyi:
            disan=dier
            dier=diyi
            diyi=score
            with open(file=r"Paihang.txt", mode="w", encoding="utf-8") as fb:
                fb.write(str(diyi) + '\n' + str(dier) + '\n' + str(disan))
            break
        if score > dier:
            disan = dier
            dier = score
            with open(file=r"Paihang.txt", mode="w", encoding="utf-8") as fb:
                fb.write(str(diyi) + '\n' + str(dier) + '\n' + str(disan))
            break

        if score>disan:
            disan = score
            with open(file=r"Paihang.txt", mode="w", encoding="utf-8") as fb:
                fb.write(str(diyi) + '\n' + str(dier) + '\n' + str(disan))
            break

        with open(file=r"Paihang.txt", mode="w", encoding="utf-8") as fb:
            fb.write(str(diyi)+'\n'+str(dier)+'\n'+str(disan))
        showWindow = False
    # 页面渲染
    py.draw.rect(window, bak_color, (0, 0, W, H))
    # 这里需要注意 绘制食物与蛇头要在绘制背景之后 因为黑色的背景颜色会覆盖一切

    image = py.image.load("caoyuan.jpg")
    new0 = py.transform.scale(image, (800, 800))
    window.blit(new0, (0, 0))

    # 画蛇头
    rect1(head)
    # 画蛇身
    for snake in snakes:
        rect3(snake)
    # 画食物
    rect2(food)

    font = py.font.Font("HYShangWeiShouShuW.ttf", 30)
    text=font.render("分数"+str(score)+'\t'+"q:暂停  s:开始  r:重启",True,(0,0,0))
    window.blit(text,(0,0))



    py.display.flip()  # 更新整个待显示的Surface对象到屏幕上
    clock.tick(int(speed))  # 设置帧频 可以用来控制蛇头移动的速度


test.py

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow

import loginPaihang

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = QMainWindow()
    loginUi = loginPaihang.Ui_MainWindow()
    loginUi.setupUi(win)
    win.show()
    sys.exit(app.exec_())

login.py

# -*- coding: utf-8 -*-
import os

# Form implementation generated from reading ui file 'login.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
from matplotlib.backends.backend_qt import MainWindow


class Ui_MainWindow(object):
    a=2

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 1000)

        MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(100, 40, 800, 800))
        self.label.setStyleSheet("border-image: url(:/images/images/caoyuan.jpg);\n"
"border-top-left-radius:5px;\n"
"border-bottom-left-radius:5px;\n"
"border-top-right-radius:5px;\n"
"border-bottom-right-radius:5px;")
        self.label.setText("")
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(440, 150, 171, 61))
        font = QtGui.QFont()
        font.setFamily("Bahnschrift SemiBold Condensed")
        font.setPointSize(27)
        font.setBold(False)
        font.setItalic(True)
        font.setUnderline(True)
        font.setWeight(50)
        font.setStrikeOut(True)
        self.label_2.setFont(font)
        self.label_2.setStyleSheet("color: rgb(85, 85, 127);")
        self.label_2.setObjectName("label_2")
        self.comboBox = QtWidgets.QComboBox(self.centralwidget)
        self.comboBox.setGeometry(QtCore.QRect(540, 310, 101, 71))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(50)
        self.comboBox.setFont(font)
        self.comboBox.setStyleSheet("background-color: rgba(255, 255, 255, 80);\n"
"")
        self.comboBox.setFrame(False)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(330, 310, 171, 71))
        font = QtGui.QFont()
        font.setPointSize(18)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(420, 470, 181, 51))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(50)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("#pushButton{\n"
"background-color: rgb(255, 255, 255,80);\n"
"color:rgb(0,0,0);\n"
"border:3px solid rgb(255,255,255,80);\n"
"border-radius:7px;\n"
"}\n"
"#pushButton:hover{\n"
"background-color: rgb(0, 0, 0,80);\n"
"color:rgb(255,255,255);\n"
"}\n"
"#pushButton:pressed{\n"
"padding-top:5px;\n"
"padding-left:5px\n"
"}\n"
"\n"
"")
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(420, 560, 181, 51))
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setItalic(True)
        self.pushButton_2.setFont(font)
        self.pushButton_2.setStyleSheet("#pushButton_2{\n"
"background-color: rgb(255, 255, 255,80);\n"
"color:rgb(0,0,0);\n"
"border:3px solid rgb(255,255,255,80);\n"
"border-radius:7px;\n"
"}\n"
"#pushButton_2:hover{\n"
"background-color: rgb(0, 0, 0,80);\n"
"color:rgb(255,255,255);\n"
"}\n"
"#pushButton_2:pressed{\n"
"padding-top:5px;\n"
"padding-left:5px\n"
"}\n"
"\n"
"")
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(870, 40, 31, 31))
        self.pushButton_3.setStyleSheet("border-image: url(:/icons/icons/close.png);\n"
"background-color: rgba(255, 255, 255, 0);")
        self.pushButton_3.setText("")
        self.pushButton_3.setObjectName("pushButton_3")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.pushButton_3.clicked.connect(MainWindow.close) # type: ignore
        self.pushButton_3.clicked.connect(self.Speed)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "狼抓羊"))
        self.comboBox.setItemText(0, _translate("MainWindow", "简单"))
        self.comboBox.setItemText(1, _translate("MainWindow", "中等"))
        self.comboBox.setItemText(2, _translate("MainWindow", "困难"))
        self.label_3.setText(_translate("MainWindow", "难度选择:"))
        self.pushButton.setText(_translate("MainWindow", "开始游戏"))
        self.pushButton_2.setText(_translate("MainWindow", "排行榜"))

        self.comboBox.currentIndexChanged[str].connect(self.nandu)
        self.pushButton.clicked.connect(self.Kaishi)
        self.pushButton_2.clicked.connect(self.Paihang)

    def nandu(self, i):
        self.a=2
        if i == "简单":
            self.a = 2
        elif i == "中等":
            self.a = 6
        elif i == "困难":
            self.a = 8
        else:
            self.a = 2
        f = open("speed.txt", mode='w')
        f.writelines(str(self.a))
        f.close()



    def Kaishi(self):
        os.system("youxi.py")

    def Paihang(self):
        os.system("test.py")

    def Speed(self):
        f = open("speed.txt", mode='w')
        f.writelines(str(2))
        f.close()




import resource_rc

loginPaihang.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'loginPaihang.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1000, 1000)

        MainWindow.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(100, 40, 800, 800))
        self.label.setStyleSheet("border-image: url(:/images/images/caoyuan.jpg);\n"
"border-top-left-radius:5px;\n"
"border-bottom-left-radius:5px;\n"
"border-top-right-radius:5px;\n"
"border-bottom-right-radius:5px;")
        self.label.setText("")
        self.label.setObjectName("label")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(870, 40, 31, 31))
        self.pushButton_3.setStyleSheet("border-image: url(:/icons/icons/close.png);\n"
"background-color: rgba(255, 255, 255, 0);")
        self.pushButton_3.setText("")
        self.pushButton_3.setObjectName("pushButton_3")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(161, 181, 200, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(160, 280, 100, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        self.label_3.setFont(font)
        self.label_3.setStyleSheet("")
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(160, 380, 100, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        self.label_4.setFont(font)
        self.label_4.setStyleSheet("")
        self.label_4.setObjectName("label_4")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(160, 480, 100, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        self.label_5.setFont(font)
        self.label_5.setStyleSheet("")
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(260, 280, 300, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        self.label_6.setFont(font)
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(260, 380, 300, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        self.label_7.setFont(font)
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(260, 480, 300, 100))
        font = QtGui.QFont()
        font.setPointSize(27)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.pushButton_3.clicked.connect(MainWindow.close) # type: ignore
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label_2.setText(_translate("MainWindow", "排行榜"))
        self.label_3.setText(_translate("MainWindow", "1."))
        self.label_4.setText(_translate("MainWindow", "2."))
        self.label_5.setText(_translate("MainWindow", "3."))

        with open(file=r"Paihang.txt", mode="r", encoding="utf-8") as fb:
            bt = fb.readlines()
        diyi=bt[0].strip('\n')
        dier=bt[1].strip('\n')
        disan=bt[2].strip('\n')

        self.label_6.setText(_translate("MainWindow", str(diyi)))
        self.label_7.setText(_translate("MainWindow", str(dier)))
        self.label_8.setText(_translate("MainWindow", str(disan)))
import resource_rc

pygame是一个流行的Python库,用于创建2D游戏,其中包括著名的贪吃蛇游戏。编写一个基本的贪吃蛇游戏的源代码可能会包含以下几个主要部分: 1. **导入模块**: ```python import pygame import sys ``` 2. **初始化pygame**: ```python pygame.init() screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("贪吃蛇") clock = pygame.time.Clock() ``` 3. **定义贪吃蛇类 (Snake)**: ```python class Snake: def __init__(self): self.body = [[100, 100], [90, 100], [80, 100]] # 初始位置和长度 self.direction = [0, 1] # 默认向右移动 def move(self): new_head = [self.body + self.direction, self.body + self.direction] self.body.insert(0, new_head) # 在头部添加新位置 if new_head in self.body[1:]: game_over = True # 如果头撞到身体,则游戏结束 else: self.body.pop() # 移除蛇尾 return not game_over ``` 4. **绘制贪吃蛇和食物(Food)**: ```python def draw_snake(screen, snake): for pos in snake.body: pygame.draw.rect(screen, (0, 255, 0), pygame.Rect(pos, pos, 10, 10)) def place_food(snake): while True: food_pos = [random.randint(0, screen.get_width() // 10) * 10, random.randint(0, screen.get_height() // 10) * 10] if food_pos not in snake.body: break return food_pos ``` 5. **主游戏循环**: ```python snake = Snake() food_pos = place_food(snake) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() keys_pressed = pygame.key.get_pressed() if keys_pressed[pygame.K_UP] and snake.direction != [0, -1]: snake.direction = [-1, 0] elif keys_pressed[pygame.K_DOWN] and snake.direction != [0, 1]: snake.direction = [1, 0] elif keys_pressed[pygame.K_LEFT] and snake.direction != [1, 0]: snake.direction = [0, 1] elif keys_pressed[pygame.K_RIGHT] and snake.direction != [-1, 0]: snake.direction = [0, -1] snake.move() screen.fill((0, 0, 0)) # 清屏 draw_snake(screen, snake) draw_rect(screen, food_pos, (255, 0, 0)) # 绘制食物 pygame.display.flip() clock.tick(10) # 控制帧率 ``` 完整代码会包括更多的细节,如碰撞检测、得分计算等。如果你想深入了解整个源代码,请查阅相关的pygame教程或搜索在线示例。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值