Hotdog 热狗大战

本文介绍了作者受金山打字通启发,使用Python开发的一款名为“Hotdog Conflict”的小游戏。文章详细讲述了项目的创作背景、整体思路以及准备工作,包括环境搭建、窗口设置和事件处理类型。作者还分享了如何通过类来封装功能,实现游戏元素的动态显示,并展示了项目成果。
摘要由CSDN通过智能技术生成

HOTDOG CONFLICT

废话介绍 背景介绍

创作背景

19号磨磨蹭蹭地在重庆考完了雅思,终于有机会打开积灰已久的CSDN记录一下“代码人生"了哈哈哈。未来的一个月还要同时进行AP的学习,加油啊啊啊!

项目背景

这个项目是寒假参加“发现杯”前的复习项目,觉得还不错就想把它搬上来分享分享。
【声明】非原创,受小学时候玩的“金山打字通”接苹果游戏、和wsc吃热狗的启发
嘿嘿嘿,先上一张图


整体思路

  • 准备工作(搭建环境,例如导入库、设置标题、窗框大小坐标等等)
  • 设置处理事件类型
  • 通过“类”的方式创造组件,并进行调用
  • 后台处理

准备工作

导入库大家都应该很熟练,这里我们也很熟练地操作一下~
(玄武黑,感觉比简约白更高级炫酷欸哈哈哈,高光也很棒orz)

# coding:utf-8
import pygame
from pygame.locals import *
import time, random
import sys
import os

接下来的一步,创建窗口和设置标题我们在Time Management里面也见到过,这里不难也比较标准,不用过多进行思维上的理解。
值得一提的是,最后一行(255,255,255)表示的是边框的颜色,分别对应“红黄蓝”三原色的占比(此处代表白色),(0, 0, 0)的配比则是黑色。

# 初始化pygame环境
pygame.init()

# 创建一个长宽分别为1300/700窗口
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d,%d" % (100, 25)
canvas = pygame.display.set_mode((1000, 625))
canvas.fill((255, 255, 255))

窗口标题的设置也很常规~

# 设置窗口标题
pygame.display.set_caption("热狗大战")

(哈哈哈说一句题外话,我真的好喜欢Markdown:)
在完成外框的设置之后,我们就要开始逐步传输图片了。我们事先会将图片储存在同级别的文件夹里,运用调动相对路径的方式将它们传输上去。
(如何区分相对路径和绝对路径呢?
绝对路径跟快递收货地址很像,就像是卫星定位一样,需要提供确切的位置。在电脑中的绝对路径就相当于“C盘 XXX文件夹”
而相对路径适用于描述某个相邻的事物,例如当你知道我的位置时,我通知你来到我的邻居家,你也能很方便清晰地找到它。)

# 加载图片
bg = pygame.image.load("images/bg.jpg")
h = pygame.image.load("images/hotdog.png")
player = pygame.image.load("images/hero.png")
end = pygame.image.load("images/end.jpg")
bullet_tip = pygame.image.load("images/bullet_tip.png")
time_tip = pygame.image.load("images/time_tip.png")

到此为止准备任务就到此结束啦,我们接下来进行事件处理类型的设置。

下一步是对用户操作动作的设置,例如如果按下了移动箭头的按键,程序会进行怎样的变化。用到的是比较简单的if-elif-else语句,所以也很便于理解~

# 处理事件
def handleEvent():
    for event in pygame.event.get():  # 循环出事件列表中的每个事件对象
        if event.type == QUIT:  # 如果事件的类型是退出类型
            pygame.quit()  # pygame游戏框的退出方法
            sys.exit()  # 系统程序结束方法
        if event.type == KEYDOWN:  # 如果事件类型是键盘被按下
            if event.key == 276:  # 通过key属性查看是不是左箭头被按下
                Var.wsc.x -= 40  # 如果是,王思聪x轴左移动40
            if event.key == 275:  # 通过key属性查看是不是右箭头被按下
                Var.wsc.x += 40  # 如果是,王思聪x轴右移动40
            if Var.wsc.x < 0:  # 如果王思聪的x轴比0小
                Var.wsc.x = 0  # 那么还是把这个值赋值为0
            if Var.wsc.x > 1000 - Var.wsc.width:  # 如果王思聪的x轴最右边
                Var.wsc.x = 1000 - Var.wsc.width  # 那x值赋值为最右边的值

这时 重点就来了!!!
一般我们想用某个库/工具包里的功能时,我们直接用库名.方法名() 的方法进行调用;但如果此时我们想调用的功能还没有被创建出来,但每一次书写都特别麻烦时,我们就可以用def的方法自己创造工具包。
例如这里,我们想创造一个“字体”方法,之后设置字体的时候就可以直接调用 。

# 工具方法-写文字方法
def fillText(text, position, view=canvas):
    # 设置字体样式和大小
    my_font = pygame.font.Font("my_font/font1.ttf", 30)
    # 渲染文字
    text = my_font.render(text, True, (255, 255, 255))
    view.blit(text, position)
  • 第一排括号里的(text, position, view=canvas)是形式参数,相当于只是一个名字而已,没有任何实际意义。之后在调用这个方法时,再将实际参数传输进去。
  • 第二行代码是进行字体的设置,前者是字体类型,后者是字体大小
  • 下一行的第一个元素代表内容;第二个元素True代表“抗锯齿效果”,如果设置为False或者忽略设置,就会看到一群马赛克在晃动;后面的3个255我们在前面已经提到过啦~)</
这个问题可以通过编写代码并进行实验来回答。以下是使用PyTorch实现AlexNet模型在Hotdog数据集上进行训练和测试的示例代码。 ```python import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torchvision.datasets import ImageFolder from torch.utils.data import DataLoader # 定义超参数 batch_size = 32 num_epochs = 15 learning_rate = 0.001 # 定义数据预处理 transform = transforms.Compose([ transforms.Resize((227, 227)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载Hotdog数据集 train_dataset = ImageFolder('./hotdog/train', transform=transform) test_dataset = ImageFolder('./hotdog/test', transform=transform) # 创建数据加载器 train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) # 定义AlexNet模型 class AlexNet(nn.Module): def __init__(self): super(AlexNet, self).__init__() self.features = nn.Sequential( nn.Conv2d(3, 96, kernel_size=11, stride=4, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(96, 256, kernel_size=5, stride=1, padding=2), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), nn.Conv2d(256, 384, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 384, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.Conv2d(384, 256, kernel_size=3, stride=1, padding=1), nn.ReLU(inplace=True), nn.MaxPool2d(kernel_size=3, stride=2), ) self.avgpool = nn.AdaptiveAvgPool2d((6, 6)) self.classifier = nn.Sequential( nn.Dropout(), nn.Linear(256 * 6 * 6, 4096), nn.ReLU(inplace=True), nn.Dropout(), nn.Linear(4096, 4096), nn.ReLU(inplace=True), nn.Linear(4096, 2), ) def forward(self, x): x = self.features(x) x = self.avgpool(x) x = torch.flatten(x, 1) x = self.classifier(x) return x # 定义损失函数和优化器 net = AlexNet().cuda() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(net.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): running_loss = 0.0 correct = 0 total = 0 for i, (images, labels) in enumerate(train_loader): images = images.cuda() labels = labels.cuda() optimizer.zero_grad() outputs = net(images) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() train_loss = running_loss / len(train_loader) train_acc = 100 * correct / total # 测试模型 net.eval() with torch.no_grad(): running_loss = 0.0 correct = 0 total = 0 for images, labels in test_loader: images = images.cuda() labels = labels.cuda() outputs = net(images) loss = criterion(outputs, labels) running_loss += loss.item() _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item() test_loss = running_loss / len(test_loader) test_acc = 100 * correct / total print('Epoch [%d/%d], Train Loss: %.4f, Train Acc: %.2f%%, Test Loss: %.4f, Test Acc: %.2f%%' % (epoch + 1, num_epochs, train_loss, train_acc, test_loss, test_acc)) ``` 在这个例子中,我们使用了PyTorch框架来实现AlexNet模型,并在Hotdog数据集上进行训练和测试。我们使用了数据增强和归一化来增强模型的鲁棒性。我们使用Adam优化器和交叉熵损失函数。 对于不同的迭代次数和学习率的影响,我们可以尝试不同的设置并观察模型的表现。通常来说,较低的学习率和更多的迭代次数可以提高模型的准确度,但是会增加训练时间。需要注意的是,如果迭代次数过多,模型可能会发生过拟合,导致在测试集上的准确率下降。 在我们的示例中,我们使用了15个epochs来训练模型。如果模型过拟合,我们可以观察到在测试集上的准确率下降。如果模型没有过拟合,我们应该能够在测试集上获得良好的准确率。我们也可以通过监视训练集和测试集的损失函数的变化来判断是否发生了过拟合。如果训练集的损失函数一直下降,而测试集的损失函数升高,则很可能发生了过拟合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值