如何用deepseek写游戏(思路教程分享)【附图文】

先看成品《用Python+PyGame开发双人生存游戏!源码解析+完整开发思路分享》-CSDN博客

总计四百多行,以前自己写个这种类吸血鬼的游戏要一整天,现在只需要一小时即可。

1.先对自己的环境进行确认

2.对他说出你想做的游戏

 3.让他在这基础上修改

4.如果你自己没有思路,还可以提问,让他来给出意见

 5.在这个基础上不断的修改

 在这基础上不断地修改,例如加入双人模式,精英怪经验条等需求。

最后就可以得到这样一个游戏
代码如下

# -*- coding: utf-8 -*-
import os
import pygame
import random
import math
from datetime import datetime

# 初始化路径
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
IMAGE_DIR = os.path.join(BASE_DIR, 'image')

RESOURCES = {
    'role1': os.path.join(IMAGE_DIR, 'role1.png'),
    'role2': os.path.join(IMAGE_DIR, 'role2.png'),
    'enemy': os.path.join(IMAGE_DIR, 'enemy.png'),
    'bullet': os.path.join(IMAGE_DIR, 'bullet.png'),
    'exp_orb': os.path.join(IMAGE_DIR, 'exp_orb.png'),
    'background': os.path.join(IMAGE_DIR, 'background.png')
}

pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

# 颜色定义
WHITE = (255, 255, 255)
GRAY = (100, 100, 100)
BUTTON_COLOR = (50, 150, 50)
HOVER_COLOR = (70, 170, 70)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)

font = pygame.font.Font(None, 24)

def load_image(path, default_size=(30, 30)):
    try:
        image = pygame.image.load(path).convert_alpha()
        return pygame.transform.scale(image, default_size)
    except:
        surf = pygame.Surface(default_size)
        surf.fill(RED)
        return surf

GAME_IMAGES = {
    'role1': load_image(RESOURCES['role1']),
    'role2': load_image(RESOURCES['role2']),
    'enemy': load_image(RESOURCES['enemy'], (20, 20)),
    'bullet': load_image(RESOURCES['bullet'], (10, 10)),
    'exp_orb': load_image(RESOURCES['exp_orb'], (10, 10)),
    'background': load_image(RESOURCES['background'], (WIDTH, HEIGHT))
}

class Button:
    def __init__(self, text, x, y, w, h):
        self.rect = pygame.Rect(x, y, w, h)
        self.text = text
        self.color = BUTTON_COLOR
        self.hover = False

    def draw(self, surface):
        color = HOVER_COLOR if self.hover else BUTTON_COLOR
        pygame.draw.rect(surface, color, self.rect, border_radius=5)
        text_surf = font.render(self.text, True, WHITE)
        text_rect = text_surf.get_rect(center=self.rect.center)
        surface.blit(text_surf, text_rect)

    def check_hover(self, mouse_pos):
        self.hover = self.rect.collidepoint(mouse_pos)

class Player(pygame.sprite.Sprite):
    def __init__(self, controls, role_type, pos_offset=0, is_player2=False):
        pygame.sprite.Sprite.__init__(self)
        self.role_type = role_type
        self.image = GAME_IMAGES['role2' if role_type == 2 else 'role1']
        self.rect = self.image.get_rect(center=(WIDTH//2 + pos_offset, HEIGHT//2))
        self.speed = 5
        self.health = 100
        self.exp = 0
        self.level = 1
        self.max_exp = 100
        self.kills = 0
        self.controls = controls

    def update(self, keys):
        if keys[self.controls['up']]:
            self.rect.y -= self.speed
        if keys[self.controls['down']]:
            self.rect.y += self.speed
        if keys[self.controls['left']]:
            self.rect.x -= self.speed
        if keys[self.controls['right']]:
            self.rect.x += self.speed
        self.rect.clamp_ip(screen.get_rect())

    def get_attack_directions(self):
        if self.role_type == 1:
            return ["up", "down", "left", "right"]
        else:
            return ["up_left", "up_right", "down_left", "down_right"]

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y, direction):
        pygame.sprite.Sprite.__init__(self)
        self.image = GAME_IMAGES['bullet']
        self.rect = self.image.get_rect(center=(x, y))
        self.speed = 8
        self.start_pos = (x, y)
        self.max_distance = 300
        self.penetration = 2

        self.dx, self.dy = 0, 0
        dir_mapping = {
            "up": (0, -1),
            "down": (0, 1),
            "left": (-1, 0),
            "right": (1, 0),
            "up_left": (-math.sqrt(0.5), -math.sqrt(0.5)),
            "up_right": (math.sqrt(0.5), -math.sqrt(0.5)),
            "down_left": (-math.sqrt(0.5), math.sqrt(0.5)),
            "down_right": (math.sqrt(0.5), math.sqrt(0.5))
        }
        dx_mult, dy_mult = dir_mapping[direction]
        self.dx = dx_mult * self.speed
        self.dy = dy_mult * self.speed

    def update(self):
        self.rect.x += self.dx
        self.rect.y += self.dy
        if math.hypot(self.rect.x - self.start_pos[0], self.rect.y - self.start_pos[1]) > self.max_distance:
            self.kill()

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = GAME_IMAGES['enemy']
        self.rect = self.image.get_rect(
            center=(random.choice([-100, WIDTH+100]), random.randint(0, HEIGHT))
        )
        self.speed = 2

    def update(self, targets):
        if not targets: return
        nearest = min(targets, key=lambda t: math.hypot(t.rect.x-self.rect.x, t.rect.y-self.rect.y))
        dx = nearest.rect.x - self.rect.x
        dy = nearest.rect.y - self.rect.y
        dist = math.hypot(dx, dy)
        if dist != 0:
            self.rect.x += dx / dist * self.speed
            self.rect.y += dy / dist * self.speed

class ExpOrb(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = GAME_IMAGES['exp_orb']
        self.rect = self.image.get_rect(center=(x, y))
        self.float_timer = 0

    def update(self):
        self.float_timer += 1
        self.rect.y += math.sin(self.float_timer * 0.1) * 0.5

def draw_hud(surface, players, time_left):
    time_text = font.render("Time: {:02}:{:02}".format(time_left//60, time_left%60), True, WHITE)
    surface.blit(time_text, (WIDTH//2 - 60, 10))
    
    for i, player in enumerate(players):
        y_offset = 40 + i*80
        pygame.draw.rect(surface, GRAY, (10, y_offset, 100, 10))
        health_width = int((player.health / 100.0) * 100)
        pygame.draw.rect(surface, RED, (10, y_offset, health_width, 10))
        
        pygame.draw.rect(surface, GRAY, (10, y_offset+20, 100, 10))
        exp_width = int((player.exp / float(player.max_exp)) * 100)
        pygame.draw.rect(surface, YELLOW, (10, y_offset+20, exp_width, 10))
        
        info_text = font.render("P{} Lv{} K{}".format(i+1, player.level, player.kills), True, WHITE)
        surface.blit(info_text, (10, y_offset+40))

def role_selection_menu(player_count):
    roles = []
    buttons = []
    descriptions = [
        "Role 1: 4-Direction Attack",
        "Role 2: Diagonal Attack"
    ]
    
    for i in range(player_count):
        y_base = 150 + i*150
        buttons.append([
            Button("Player{} Role1".format(i+1), WIDTH//2-250, y_base, 200, 50),
            Button("Player{} Role2".format(i+1), WIDTH//2+50, y_base, 200, 50)
        ])
    
    confirm_btn = Button("Start Game", WIDTH//2-100, HEIGHT-100, 200, 50)
    
    while True:
        screen.fill((30, 30, 30))
        mouse_pos = pygame.mouse.get_pos()
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return []
            if event.type == pygame.MOUSEBUTTONDOWN:
                for i, pair in enumerate(buttons):
                    for j, btn in enumerate(pair):
                        if btn.rect.collidepoint(mouse_pos):
                            if len(roles) <= i:
                                roles.append(j+1)
                            else:
                                roles[i] = j+1
                if confirm_btn.rect.collidepoint(mouse_pos) and len(roles) == player_count:
                    return roles
        
        desc_y = 100
        for desc in descriptions:
            text = font.render(desc, True, WHITE)
            screen.blit(text, (WIDTH//2 - text.get_width()//2, desc_y))
            desc_y += 30
        
        for i, pair in enumerate(buttons):
            for j, btn in enumerate(pair):
                btn.check_hover(mouse_pos)
                btn.draw(screen)
                if i < len(roles) and roles[i] == j+1:
                    pygame.draw.rect(screen, YELLOW, btn.rect.inflate(10,10), 3, border_radius=7)
        
        confirm_btn.check_hover(mouse_pos)
        confirm_btn.draw(screen)
        
        pygame.display.flip()
        clock.tick(30)

def main_menu():
    buttons = [
        Button("1 Player", WIDTH//2-100, HEIGHT//2-50, 200, 50),
        Button("2 Players", WIDTH//2-100, HEIGHT//2+20, 200, 50)
    ]
    
    while True:
        screen.fill((30, 30, 30))
        mouse_pos = pygame.mouse.get_pos()
        
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                return (0, [])
            if event.type == pygame.MOUSEBUTTONDOWN:
                for i, btn in enumerate(buttons):
                    if btn.rect.collidepoint(mouse_pos):
                        selected = i+1
                        roles = role_selection_menu(selected)
                        if roles:
                            return (selected, roles)
        
        title = font.render("Vampire Survivors", True, WHITE)
        screen.blit(title, (WIDTH//2 - title.get_width()//2, 100))
        
        for btn in buttons:
            btn.check_hover(mouse_pos)
            btn.draw(screen)
        
        pygame.display.flip()
        clock.tick(30)

def game_loop(player_count, roles):
    background = GAME_IMAGES['background']
    controls = [
        {'up': pygame.K_w, 'down': pygame.K_s, 'left': pygame.K_a, 'right': pygame.K_d},
        {'up': pygame.K_UP, 'down': pygame.K_DOWN, 'left': pygame.K_LEFT, 'right': pygame.K_RIGHT}
    ]
    
    players = pygame.sprite.Group()
    for i in range(player_count):
        player = Player(
            controls=controls[i],
            role_type=roles[i],
            pos_offset=-50 + i*100,
            is_player2=(i==1)
        )
        players.add(player)
    
    all_sprites = pygame.sprite.Group(players)
    enemies = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
    exp_orbs = pygame.sprite.Group()
    
    enemy_spawn_timer = 0
    attack_timer = 0
    start_ticks = pygame.time.get_ticks()
    time_limit = 300

    running = True
    while running:
        screen.blit(background, (0, 0))
        keys = pygame.key.get_pressed()
        
        elapsed_seconds = (pygame.time.get_ticks() - start_ticks) // 1000
        time_left = max(time_limit - elapsed_seconds, 0)
        if time_left <= 0:
            running = False

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False

        enemy_spawn_timer += 1
        if enemy_spawn_timer >= 60 - (sum(p.level for p in players)*2):
            enemy = Enemy()
            enemies.add(enemy)
            all_sprites.add(enemy)
            enemy_spawn_timer = 0

        attack_timer += 1
        if attack_timer >= 30:
            for player in players:
                directions = player.get_attack_directions()
                for direction in directions:
                    bullet = Bullet(player.rect.centerx, player.rect.centery, direction)
                    bullets.add(bullet)
                    all_sprites.add(bullet)
            attack_timer = 0

        for player in players:
            player.update(keys)
        enemies.update(players)
        bullets.update()
        exp_orbs.update()

        for bullet in bullets:
            hits = pygame.sprite.spritecollide(bullet, enemies, False)
            if hits:
                bullet.penetration -= 1
                for enemy in hits:
                    enemy.kill()
                    exp_orb = ExpOrb(enemy.rect.centerx, enemy.rect.centery)
                    exp_orbs.add(exp_orb)
                    all_sprites.add(exp_orb)
                    for player in players:
                        if math.hypot(player.rect.x-enemy.rect.x, player.rect.y-enemy.rect.y) < 100:
                            player.kills += 1
                if bullet.penetration <= 0:
                    bullet.kill()

        for player in players:
            hits = pygame.sprite.spritecollide(player, exp_orbs, True)
            if hits:
                player.exp += 10 * len(hits)
                if player.exp >= player.max_exp:
                    player.level += 1
                    player.exp -= player.max_exp
                    player.max_exp = int(player.max_exp * 1.5)
                    player.speed += 0.5

        alive_players = [p for p in players if p.health > 0]
        for player in alive_players:
            if pygame.sprite.spritecollide(player, enemies, True):
                player.health -= 10

        if len(alive_players) == 0 or time_left <= 0:
            running = False

        all_sprites.draw(screen)
        draw_hud(screen, players, time_left)
        pygame.display.flip()
        clock.tick(30)

    pygame.quit()

if __name__ == "__main__":
    player_count, roles = main_menu()
    if player_count > 0:
        game_loop(player_count, roles) 

 仅供学习参考,用于前期快速给出框架,后续的细节可以自己来做,增加参与感

<think>好的,用户想要一个关于Deepseek本地部署的详细图教程。首先,我需要明确Deepseek是什么。根据之前的对话记录,Deepseek可能是一个类似ChatGPT的大语言模型,或者是某个具体的企业级应用。不过考虑到用户之前询问过本地部署,可能是指深度求索公司开发的某个AI模型,比如DeepSeek-R1或者对话模型。 接下来,我需要确定用户的技术背景。用户可能有一定的技术基础,但需要详细的步骤指导,包括环境配置、依赖安装、模型下载、部署步骤以及验证方法。图教程意味着需要字说明配合图片,比如命令行操作截图、配置件示例等。 然后,我需要考虑用户可能遇到的常见问题,例如环境配置错误、依赖冲突、模型路径问题、显存不足等,应该在教程中提前给出解决方案或注意事项。 由于无法提供实时图片,我应该用字描述每个步骤,并提示用户参考哪些截图或示意图,例如配置件修改的部分、终端命令执行后的输出示例等。同时,要确保步骤清晰,分点列出,便于用户跟随操作。 还要检查是否需要区分不同操作系统,比如Linux和Windows,但考虑到大模型通常部署在Linux服务器上,可能重点放在Linux环境,但也要提及其他系统的可能性。此外,硬件要求,如GPU显存、CUDA版本等,也需要详细说明。 最后,确保教程结构合理,包括准备工作、安装步骤、配置调整、运行和验证、常见问题等部分。语言要简洁明了,避免专业术语过多,或在必要时解释术语,确保用户能够理解。以下是</think> **DeepSeek 大模型本地部署的详细图教程**(由于无法直接展示图片,将以字描述关键步骤,并标注配图位置说明): --- ### **一、准备工作** 1. **硬件要求** - **GPU**:建议NVIDIA显卡(显存≥16GB,如3090/4090/A100) - **内存**:≥32GB - **存储**:至少50GB可用空间(用于存放模型件) *(配图:硬件配置截图示例)* 2. **软件环境** - 操作系统:Linux(推荐Ubuntu 20.04+)或 Windows WSL2 - 安装Python 3.8+、CUDA 11.7+、cuDNN - 安装PyTorch(建议2.0+版本) ```bash # 示例:安装PyTorch conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia ``` --- ### **二、获取模型件** 1. **申请模型权限** - 访问[深度求索官方网站](https://www.deepseek.com/)或Hugging Face仓库,申请模型下载权限(需注册账号)。 *(配图:官网模型申请页面)* 2. **下载模型权重** - 通过官方提供的链接或`git lfs`下载模型件(如 `deepseek-7b-chat`): ```bash git lfs install git clone https://huggingface.co/deepseek-ai/deepseek-7b-chat ``` --- ### **三、部署环境配置** 1. **创建虚拟环境** ```bash conda create -n deepseek python=3.10 conda activate deepseek ``` 2. **安装依赖库** ```bash pip install transformers accelerate sentencepiece uvicorn fastapi ``` 3. **验证CUDA可用性** ```python import torch print(torch.cuda.is_available()) # 应输出True ``` --- ### **四、运行模型推理** 1. **编推理脚本(`inference.py`)** ```python from transformers import AutoTokenizer, AutoModelForCausalLM model_path = "./deepseek-7b-chat" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, device_map="auto") prompt = "你好,请介绍一下你自己。" inputs = tokenizer(prompt, return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=100) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ``` 2. **启动推理** ```bash python inference.py ``` *(配图:终端运行输出示例,显示生成结果)* -- ### **五、部署API服务(可选)** 1. **创建FastAPI接口(`api.py`)** ```python from fastapi import FastAPI from pydantic import BaseModel from inference import model, tokenizer # 导入已有模型和分词器 app = FastAPI() class Request(BaseModel): prompt: str @app.post("/chat") def chat(request: Request): inputs = tokenizer(request.prompt, return_tensors="pt").to("cuda") outputs = model.generate(**inputs, max_new_tokens=100) response = tokenizer.decode(outputs[0], skip_special_tokens=True) return {"response": response} ``` 2. **启动API服务** ```bash uvicorn api:app --host 0.0.0.0 --port 8000 ``` *(配图:API测试截图,如Postman发送请求示例)* --- ### **六、常见问题** 1. **显存不足** - 启用量化(4/8-bit加载): ```python model = AutoModelForCausalLM.from_pretrained(model_path, load_in_4bit=True) ``` 2. **依赖冲突** - 使用官方指定版本的`transformers`库(如4.33+)。 --- ### **七、参考链接** - 官方档:[DeepSeek GitHub](https://github.com/deepseek-ai) - Hugging Face模型库:[DeepSeek Models](https://huggingface.co/deepseek-ai) --- 如需更详细的配置截图或代码示例,可参考官方档或私信具体问题!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值