猫史档案馆


游戏 复原方块

用户:小麦做的面包小麦做的面包查看:0 回复:1 评论:0 创建时间:2023-04-01T10:39:10


game.py

import json
from arcade import *
from easygui import choicebox,fileopenbox,filesavebox
import os,sys
from pyautogui import press

class Game(arcade.Window):
    def __init__(self, width, height, title):
        super().__init__(width, height, title)
        self.setup()

    def setup(self):
        set_background_color(color.WHITE)
        self.running=False    

    def game_setup(self):
        self.sizex = self.game_map['size'][0]
        self.sizey = self.game_map['size'][1]
        self.info = self.game_map['info']
        self.info_len=len(self.info.split('\n'))
        width = max(200+150*self.sizex, 850)
        height = min(150+150*self.sizey+self.info_len*26, 1080)
        self.set_location((2000-width)//2, (1120-height)//2)
        self.set_size(width, height)
        self.boxs = self.game_map['init']
        self.target = self.game_map['target']
        self.hinder = self.game_map['hinder']
        self.one_way = self.game_map['one_way']
        self.running = True
        self.select = None
        self.move = 0
        try:
            self.best_move = self.game_map['move']
        except Exception:
            self.best_move = '-'
        self.debug_win=False
        

    def on_update(self,delta_time):
        if not self.running:
            with open('maps.json') as f:
                maps = json.load(f)
            name = choicebox('请选择关卡', title, choices=list(maps))
            if not name:
                self.running=True
                return
            self.name = name
            self.game_map = maps[self.name]
            self.game_setup()
        elif not self.judge_game():
            if not self.debug_win:
                with open('maps.json') as f:
                    maps = json.load(f)
                try:
                    if self.move < maps[self.name]['move']:
                        maps[self.name]['move'] = self.move
                except Exception:
                    maps[self.name]['move'] = self.move
                with open('maps.json', 'w') as f:
                    json.dump(maps, f)


    def on_draw(self):
        start_render()
        draw_rectangle_outline(80+75*self.sizex, 80+75*self.sizey, 150*self.sizex, 150*self.sizey, color.BLACK,2)
        draw_text(f'      关卡{self.name}\n{self.info}',
                  80, 90+150*self.sizey, color.BLACK, font_name=('simhei', 'PingFang'), font_size=26)
        draw_text(f'已移动次数:{self.move}  历史最少移动次数:{self.best_move}',
                  80, 20, color.BLACK, font_name=('simhei', 'PingFang'), font_size=26)
        for one_way in self.one_way:
            x,y=self.conv(one_way)
            dire=one_way[2]
            if dire==1:
                draw_line(x,y-50,x,y+62,color.GREEN,8)
                draw_line(x+30,y+30,x,y+60,color.GREEN,8)
                draw_line(x-30,y+30,x,y+60,color.GREEN,8)
            elif dire==3:
                draw_line(x,y+50,x,y-62,color.GREEN,8)
                draw_line(x+30,y-30,x,y-60,color.GREEN,8)
                draw_line(x-30,y-30,x,y-60,color.GREEN,8)
            elif dire==2:
                draw_line(x-50,y,x+62,y,color.GREEN,8)
                draw_line(x+30,y+30,x+60,y,color.GREEN,8)
                draw_line(x+30,y-30,x+60,y,color.GREEN,8)
            else:
                draw_line(x+50,y,x-62,y,color.GREEN,8)
                draw_line(x-30,y+30,x-60,y,color.GREEN,8)
                draw_line(x-30,y-30,x-60,y,color.GREEN,8)
        for box in self.target:
            x, y = self.conv(box)
            d = box[2]
            if d == 1:
                draw_rectangle_outline(x, y, 120, 120, color.RED, 4)
            elif 2 <= d <= 5:
                draw_rectangle_outline(x, y, 120, 120, color.YELLOW, 4)
            elif d == 6:
                draw_rectangle_outline(x, y, 120, 120, color.BLUE, 4)
            if d == 2:
                draw_line(x-66, y+60, x+66, y+60, color.RED, 4)
            if d == 3:
                draw_line(x+60, y+66, x+60, y-66, color.RED, 4)
            if d == 4:
                draw_line(x+66, y-60, x-66, y-60, color.RED, 4)
            if d == 5:
                draw_line(x-60, y-66, x-60, y+66, color.RED, 4)
        for box in self.boxs:
            x, y = self.conv(box)
            d=box[2]
            if d==1:
                draw_rectangle_filled(x, y, 120, 120, color.RED)
            elif 2 <= d <= 5:
                draw_rectangle_filled(x, y, 120, 120, color.YELLOW)
            elif d == 6:
                draw_rectangle_filled(x, y, 120, 120, color.BLUE)
            if d == 2:
                draw_line(x-66, y+60, x+66, y+60, color.RED, 10)
            if d == 3:
                draw_line(x+60, y+66, x+60, y-66, color.RED, 10)
            if d == 4:
                draw_line(x+66, y-60, x-66, y-60, color.RED, 10)
            if d == 5:
                draw_line(x-60, y-66, x-60, y+66, color.RED, 10)
            try:
                if self.boxs[self.select] == box:
                    draw_point(x, y, color.BLACK, 80)
            except Exception:
                pass
        for box in self.hinder:
            x, y = self.conv(box)
            draw_rectangle_filled(x, y, 120, 120, color.BLACK)
        if not self.judge_game():
            draw_text('游戏成功!', self.width//2-150, self.height//2-25,
                      color.GREEN, font_name=('simhei', 'PingFang'), font_size=50)
            draw_text('按alt键或任意点击选择关卡,按回车键下一关', self.width//2-266, self.height//2-75,
                      color.GREEN, font_name=('simhei', 'PingFang'), font_size=25)
            


    def on_mouse_press(self, x, y, buttom, mod):
        if self.judge_game():
            for box in self.boxs:
                cx,cy=self.conv(box)
                if cx-60 < x < cx+60 and cy-60 < y <cy+60:
                    if self.select==self.boxs.index(box):
                        self.select=None
                    else:
                        self.select=self.boxs.index(box)
        else:
            self.running=False

    def on_key_press(self, symbol, modifiers):
        if self.judge_game():
            if not self.select is None:
                select_box=self.boxs[self.select]
                if symbol in [key.RIGHT,key.D] and select_box[0] < self.sizex-1:
                    for box in self.boxs+self.hinder:
                        if select_box[0]+1 == box[0] and select_box[1] == box[1]:
                            return
                    for box in self.one_way:
                        if select_box[0]+1 == box[0] and select_box[1] == box[1] and box[2]==4:
                            return
                        if select_box[0] == box[0] and select_box[1] == box[1] and box[2]!=2:
                            return
                    self.move+=1
                    select_box[0]+=1
                    c = select_box[2]
                    if c==1:
                        select_box[2] = 3
                    elif c == 3:
                        select_box[2] = 6
                    elif c == 5:
                        select_box[2] = 1
                    elif c == 6:
                        select_box[2] = 5
                elif symbol in [key.LEFT, key.A] and select_box[0] > 0:
                    for box in self.boxs+self.hinder:
                        if select_box[0]-1 == box[0] and select_box[1] == box[1]:
                            return
                    for box in self.one_way:
                        if select_box[0]-1 == box[0] and select_box[1] == box[1] and box[2]==2:
                            return
                        if select_box[0] == box[0] and select_box[1] == box[1] and box[2]!=4:
                            return
                    self.move += 1
                    select_box[0] -= 1
                    c = select_box[2]
                    if c == 1:
                        select_box[2] = 5
                    elif c == 3:
                        select_box[2] = 1
                    elif c == 5:
                        select_box[2] = 6
                    elif c == 6:
                        select_box[2] = 3
                elif symbol in [key.UP, key.W] and select_box[1] < self.sizey-1:
                    for box in self.boxs+self.hinder:
                        if select_box[1]+1 == box[1] and select_box[0] == box[0]:
                            return
                    for box in self.one_way:
                        if select_box[1]+1 == box[1] and select_box[0] == box[0] and box[2]==3:
                            return
                        if select_box[1] == box[1] and select_box[0] == box[0] and box[2]!=1:
                            return
                    self.move += 1
                    select_box[1] += 1
                    c = select_box[2]
                    if c == 1:
                        select_box[2] = 2
                    elif c == 2:
                        select_box[2] = 6
                    elif c == 4:
                        select_box[2] = 1
                    elif c == 6:
                        select_box[2] = 4
                elif symbol in [key.DOWN, key.S] and select_box[1] > 0:
                    for box in self.boxs+self.hinder:
                        if select_box[1]-1 == box[1] and select_box[0] == box[0]:
                            return
                    for box in self.one_way:
                        if select_box[1]-1 == box[1] and select_box[0] == box[0] and box[2]==1:
                            return
                        if select_box[1] == box[1] and select_box[0] == box[0] and box[2]!=3:
                            return
                    self.move += 1
                    select_box[1] -= 1
                    c = select_box[2]
                    if c == 1:
                        select_box[2] = 4
                    elif c == 2:
                        select_box[2] = 1
                    elif c == 4:
                        select_box[2] = 6
                    elif c == 6:
                        select_box[2] = 2
        if not self.judge_game() or self.debug:
            if symbol == key.ENTER:
                with open('maps.json') as f:
                    maps = json.load(f)
                try:
                    self.name = self.names[self.names.index(self.name)+1]
                except IndexError:
                    self.name = self.names[0]
                self.game_map = maps[self.name]
                self.game_setup()
            if symbol == key.TAB:
                self.debug_win=True
                self.boxs=self.target
        if symbol == key.ESCAPE:
            os._exit(0)
        if symbol in [key.LALT,key.RALT]:
            self.running = False
        if symbol == key.R:
            with open('maps.json') as f:
                game_map=json.load(f)[self.name]
            self.boxs = game_map['init']
            self.move = 0
            try:
                self.best_move = game_map['move']
            except Exception:
                self.best_move = '-'
        if symbol in [key.LCTRL, key.RCTRL]:
            if self.select is None:
                self.select = 0
            elif self.select == len(self.boxs)-1:
                self.select = 0
            else:
                self.select += 1
        

    def judge_game(self):
        for target_box in self.target:
            same=0
            for box in self.boxs:
                if target_box==box:
                    same=1
                    break
            if not same:
                return 1
        return 0
    
    def conv(self,box):
        return 155+box[0]*150, 155+box[1]*150

if __name__ == '__main__':
    with open('maps.json') as f:
        maps = json.load(f)
    title = '复原方块'
    name = choicebox('请选择关卡', title, choices=list(maps))
    if not name:
        os._exit(0)
    game = Game(1, 1,title)
    game.debug=True
    game.name=name
    game.game_map = maps[name]
    game.names=list(maps)
    game.game_setup()
    press('shift')
    # print('游戏玩法:左键选中方块后使用方向键滚动方块,方块有三种面(红,黄,蓝)(黄占4面),把所有方块按正确朝向放到空心方块内胜利,黑色方块是障碍物')
    run()
    # 这是用来凑300行的

setup.py

import json

def clear():
    with open('maps.json', 'w') as f:
        json.dump({}, f)

def makemap(name, init: list, target: list,size,info='',hinder=[],one_way=[]):  # [[,,],[,,]],[[,,],[,,]]
    try:
        with open('maps.json') as f:
            maps=json.load(f)
    except:
        maps={}
    info_lines = len(info1.split('\n'))
    add_map = {'init': init, 'target': target,'hinder': hinder, 'one_way': one_way, 'size': size,'info':info}
    maps[name]=add_map
    with open('maps.json','w') as f:
        json.dump(maps,f)

info1 = '左键选中方块后使用方向键滚动方块\n方块红色面是正面,蓝色面是反面,4个黄色面是侧面\n把所有方块按正确朝向放到空心方块内胜利'

info2 = '在2x2的范围内转圈可以改变方块的朝向(3圈一循环)'

info3 = '在黄色面朝上时向侧面滚动不会改变方块的方向'

info4 = '先让方块向上倒(黄色面朝上)再向侧面滚动'

info5 = '多个方块会互相阻挡'

info6 = '在2x2的范围内转圈只能改变3种方向\n但是同时在2x2和4x4范围内转圈可以改变6种方向'

info7 = '黑色方块是障碍物'

info8 = '使用左边唯一一个可以改变方块方向的空隙'

info9 = '方块不能向箭头相反的方向滚动'

clear()

makemap('1-1 教程:游戏玩法', [[0, 0, 1]],
        [[4, 0, 1]], 
        (5, 1),info1)
makemap('1-2 教程:绕圈-1', [[0, 0, 5]],
       [[0, 0, 1]],
       (2,2),info2)
makemap('1-3 教程:躺平-1', [[0, 0, 2]],
       [[4, 0, 2]],
       (5, 1),info3)
makemap('1-4 教程:躺平-2', [[0, 0, 1]],
        [[5, 0, 1]],
       (6, 2),info4)
makemap('1-5 两个方块', [[0, 0, 1],[1,0,1]],
       [[0,1,1],[1,1,1]],
       (3, 2),info5)
makemap('1-6', [[0, 1, 1], [2, 1, 1]],
       [[1, 0, 1], [1, 2, 1]],
       (3, 3))
makemap('1-7', [[0, 0, 4], [0, 1, 2]],
       [[1, 0, 1], [2, 0, 1]],
       (3, 2))
makemap('1-8(困难)', [[0, 0, 2], [0, 1, 4]],
       [[1, 0, 1], [2, 0, 1]],
       (3, 2))
makemap('1-9 四个方块', [[1, 1, 2], [2, 1, 2], [1, 2, 4], [2, 2, 4]],
        [[1, 1, 3], [2, 1, 5], [1, 2, 3], [2, 2, 5]],
        (4, 4))
makemap('1-10 绕圈-2', [[1, 1, 5], [2, 1, 4], [1, 2, 2], [2, 2, 3]],
        [[1, 1, 1], [2, 1, 1], [1, 2, 1], [2, 2, 1]],
        (4, 4),info6)
makemap('1-11', [[1, 1, 3], [2, 1, 2], [1, 2, 4], [2, 2, 5]],
        [[1, 1, 5], [2, 1, 4], [1, 2, 2], [2, 2, 3]],
        (4, 4))
makemap('1-12', [[0, 1, 1],  [1, 1, 1], [2, 1, 1], [3, 1, 1]],
        [[1, 0, 1], [2, 0, 1], [1, 1, 1], [2, 1, 1]],
        (4, 2))
makemap('1-13(困难)', [[1, 0, 4], [2, 0, 4], [1, 1, 2], [2, 1, 2]],
        [[1, 0, 1], [2, 0, 1], [1, 1, 1], [2, 1, 1]],
        (4, 2))
makemap('2-1 教程:障碍物', [[0, 0, 1]],
        [[6, 0, 6]],
        (7, 3),info7,[[1, 0], [1, 1], [3, 1], [3, 2], [5, 0], [5, 1]])
makemap('2-2 转几圈?', [[2, 2, 6]],
        [[5, 0, 1]],
        (6, 6),'',
        [[4, 3], [4, 4], [3, 4], [2, 4], [1, 4], [1, 3], [1, 2], [1, 1], [2, 1], [3, 1], [4, 1], [5, 1]])

makemap('2-3', [[0, 0, 5], [2, 2, 4]], 
        [[0, 0, 1], [2, 2, 6]],
        (3, 3), '',
        [[1,0], [2, 0], [2, 1]])

makemap('2-4', 
        [[0,0,4],[6,0,2]],
        [[1,0,6],[5,0,1]],
        (7, 2),'',
        [[2,0],[3,0],[4,0]])
makemap('2-5 十字路口(困难)',
        [[1, 2, 3], [3, 4, 6], [5, 2, 5], [3, 0, 1]],
        [[1, 2, 6], [3, 4, 2], [5, 2, 1], [3, 0, 4]],
        (6, 5),info8,
        [[0, 4], [1,4],[2,4],[2,3],
         [4, 3], [4,4],[5,3],
         [0,1], [1,1],[2,1],[2,0],
         [4, 0], [4,1],[5,1],])

makemap('2-6 教程:单行道', [[0, 1, 1]],
        [[4, 1, 1]],
        (5,3),info9,
        [[1,1],[2,1],[3,1]],
        [[1,0,2],[3,0,4],[1,2,2],[3,2,2]])

安装方式:把game.py和setup.py保存在同一个文件夹内,运行setup.py

运行方式:运行game.py


回复

上一页1 页 / 共 1下一页
小麦做的面包小麦做的面包

python乐园都没人了吗?以前有很多大佬的

点赞0


评论