mirror of
				https://github.com/LiteyukiStudio/LiteyukiBot.git
				synced 2025-11-04 15:46:23 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			103 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from nonebot import require
 | 
						|
 | 
						|
from ...utils.ly_typing import T_Bot, T_MessageEvent
 | 
						|
from ...utils.message import send_markdown
 | 
						|
 | 
						|
require("nonebot_plugin_alconna")
 | 
						|
from .game import Minesweeper
 | 
						|
 | 
						|
from nonebot_plugin_alconna import Alconna, on_alconna, Subcommand, Args, Arparma
 | 
						|
 | 
						|
minesweeper = on_alconna(
 | 
						|
    Alconna(
 | 
						|
        ["minesweeper", "扫雷"],
 | 
						|
        Subcommand(
 | 
						|
            "start",
 | 
						|
            Args["row", int, 8]["col", int, 8]["mines", int, 10],
 | 
						|
            alias=["开始"],
 | 
						|
 | 
						|
        ),
 | 
						|
        Subcommand(
 | 
						|
            "end",
 | 
						|
            alias=["结束"]
 | 
						|
        ),
 | 
						|
        Subcommand(
 | 
						|
            "reveal",
 | 
						|
            Args["row", int]["col", int],
 | 
						|
            alias=["展开"]
 | 
						|
 | 
						|
        ),
 | 
						|
        Subcommand(
 | 
						|
            "mark",
 | 
						|
            Args["row", int]["col", int],
 | 
						|
            alias=["标记"]
 | 
						|
        ),
 | 
						|
    ),
 | 
						|
)
 | 
						|
 | 
						|
minesweeper_cache: list[Minesweeper] = []
 | 
						|
 | 
						|
 | 
						|
def get_minesweeper_cache(event: T_MessageEvent) -> Minesweeper | None:
 | 
						|
    for i in minesweeper_cache:
 | 
						|
        if i.session_type == event.message_type:
 | 
						|
            if i.session_id == event.user_id or i.session_id == event.group_id:
 | 
						|
                return i
 | 
						|
    return None
 | 
						|
 | 
						|
 | 
						|
@minesweeper.handle()
 | 
						|
async def _(event: T_MessageEvent, result: Arparma, bot: T_Bot):
 | 
						|
    game = get_minesweeper_cache(event)
 | 
						|
    if result.subcommands.get("start"):
 | 
						|
        if game:
 | 
						|
            await minesweeper.finish("当前会话不能同时进行多个扫雷游戏")
 | 
						|
        else:
 | 
						|
            try:
 | 
						|
                new_game = Minesweeper(
 | 
						|
                    rows=result.subcommands["start"].args["row"],
 | 
						|
                    cols=result.subcommands["start"].args["col"],
 | 
						|
                    num_mines=result.subcommands["start"].args["mines"],
 | 
						|
                    session_type=event.message_type,
 | 
						|
                    session_id=event.user_id if event.message_type == "private" else event.group_id,
 | 
						|
                )
 | 
						|
                minesweeper_cache.append(new_game)
 | 
						|
                await minesweeper.send("游戏开始")
 | 
						|
                await send_markdown(new_game.board_markdown(), bot, event=event)
 | 
						|
            except AssertionError:
 | 
						|
                await minesweeper.finish("参数错误")
 | 
						|
    elif result.subcommands.get("end"):
 | 
						|
        if game:
 | 
						|
            minesweeper_cache.remove(game)
 | 
						|
            await minesweeper.finish("游戏结束")
 | 
						|
        else:
 | 
						|
            await minesweeper.finish("当前没有扫雷游戏")
 | 
						|
    elif result.subcommands.get("reveal"):
 | 
						|
        if not game:
 | 
						|
            await minesweeper.finish("当前没有扫雷游戏")
 | 
						|
        else:
 | 
						|
            row = result.subcommands["reveal"].args["row"]
 | 
						|
            col = result.subcommands["reveal"].args["col"]
 | 
						|
            if not (0 <= row < game.rows and 0 <= col < game.cols):
 | 
						|
                await minesweeper.finish("参数错误")
 | 
						|
            if not game.reveal(row, col):
 | 
						|
                minesweeper_cache.remove(game)
 | 
						|
                await send_markdown(game.board_markdown(), bot, event=event)
 | 
						|
                await minesweeper.finish("游戏结束")
 | 
						|
            await send_markdown(game.board_markdown(), bot, event=event)
 | 
						|
            if game.is_win():
 | 
						|
                minesweeper_cache.remove(game)
 | 
						|
                await minesweeper.finish("游戏胜利")
 | 
						|
    elif result.subcommands.get("mark"):
 | 
						|
        if not game:
 | 
						|
            await minesweeper.finish("当前没有扫雷游戏")
 | 
						|
        else:
 | 
						|
            row = result.subcommands["mark"].args["row"]
 | 
						|
            col = result.subcommands["mark"].args["col"]
 | 
						|
            if not (0 <= row < game.rows and 0 <= col < game.cols):
 | 
						|
                await minesweeper.finish("参数错误")
 | 
						|
            game.board[row][col].flagged = not game.board[row][col].flagged
 | 
						|
            await send_markdown(game.board_markdown(), bot, event=event)
 | 
						|
    else:
 | 
						|
        await minesweeper.finish("参数错误")
 |