Python 代码,困兽围斗的面积填充,搜索不太行
  • 板块学术版
  • 楼主__K2FeO4
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/2/10 14:20
  • 上次更新2023/10/28 09:02:40
查看原帖
Python 代码,困兽围斗的面积填充,搜索不太行
565450
__K2FeO4楼主2022/2/10 14:20

我想编《最强大脑》中的游戏“困兽围斗”

搜索是我的致命弱点,请大佬指点

import pygame
from pygame.locals import *
pygame.init()

screen=pygame.display.set_mode((1000,780),RESIZABLE)
image1=pygame.image.load('蜂窝.png')
font_title=pygame.font.Font('C:/Users/dell/Desktop/fzwxz.ttf',50)
font_passage=pygame.font.Font('C:/Users/dell/Desktop/fzwxz.ttf',20)
font_result=pygame.font.Font('C:/Users/dell/Desktop/fzwxz.ttf',100)

side=7
sidelen=108
mode=0
flag=0
step1=4
step2=0
put1=0
put2=0
score1=0
score2=0

pygame.display.set_caption('困兽围斗')
pygame.display.set_icon(image1)
color=[(0,0,0),(200,200,200),(255,255,255),
       (210,230,250),(100,150,200),(230,210,250),(150,100,200)]
title1=font_title.render('困兽围斗',1,color[2])
title2=font_title.render('请选定n(即方阵边长)',1,color[2])
passage_list=['双方选手的烧脑侠将在n*n的方阵中','各占一个角落,每回合可走0~3步。',
              '每走一回合,选手必须在烧脑侠四周的一处','放置一个隔离墙,烧脑侠将无法穿越隔离墙。',
              '当两个烧脑侠完全被隔开时,','该烧脑侠所占领的面积即为该选手的得分。']
tip_list=['p1','p2','请放置','隔离墙','请移动',"按'1'转","按'0'转",'放置档','剩余步数:']
num_list=['1','2','3']
result=font_title.render('平局',1,color[0])
result1=font_title.render('P1胜',1,color[0])
result2=font_title.render('P2胜',1,color[0])
choice_list=[font_title.render('%2d'%i,1,color[0]) for i in range(7,16,2)]
key1=[K_1,K_w,K_a,K_s,K_d]
key2=[K_0,K_UP,K_LEFT,K_DOWN,K_RIGHT]
passage1=[]
tip1=[]
num1=[]
for i in passage_list:
    passage1.append(font_passage.render(i,1,color[2]))
tip1.append(font_title.render(tip_list[0],1,color[3]))
tip1.append(font_title.render(tip_list[1],1,color[5]))
for i in tip_list[2:]:
    tip1.append(font_passage.render(i,1,color[2]))
for i in num_list:
    num1.append(font_title.render(i,1,color[2]))

def ask(event):
    global side
    screen.fill(color[0])
    screen.blit(title1,(400,100))
    screen.blit(title2,(280,200))
    screen.blit(title1,(1010,100))
    for i in range(6):
        screen.blit(passage1[i],(1010,200+i*20))
    for i in range(5):
        pygame.draw.rect(screen,color[1],(i*150+150,500,100,100))
        pygame.draw.rect(screen,color[2],(i*150+160,510,80,80))
        screen.blit(choice_list[i],(i*150+175,520))
        if Rect(i*150+150,500,100,100).collidepoint(pygame.mouse.get_pos())\
        and event.type==MOUSEBUTTONDOWN:
            side=i*2+7
            return 1
    return 0

def init2():
    global block,side,sidelen,wall,pos1,pos2,mode,judge
    mode=1
    sidelen=756/side
    block=[[0 for j in range(side)] for i in range(side)]
    judge=[[0 for j in range(side)] for i in range(side)]
    wall=[[[0,0] for j in range(side)] for i in range(side)]
    for i in range(side):
        wall[i][-1][1]=1
        wall[-1][i][0]=1
    #最后一组多出的是为了防止下标越界,前面的可以跳过来
    #i=line,j=col,所以坐标先j后i,下标先i后j
    #第三下标0南墙,1东墙
    pos1=[0,0]
    pos2=[side-1,side-1]
    block[0][0]=1
    block[side-1][side-1]=2
    
def background():
    screen.fill(color[0])
    pygame.draw.rect(screen,color[2],(110,0,780,780))
    pygame.draw.rect(screen,color[4],(0,0,110,780))
    pygame.draw.rect(screen,color[6],(890,0,110,780))
    screen.blit(title1,(1010,100))
    screen.blit(tip1[0],(35,35))
    screen.blit(tip1[1],(920,35))
    if put1==0 and step1>=1:
        if step1>1:
            screen.blit(tip1[4],(25,185))
            screen.blit(tip1[8],(10,260))
            screen.blit(num1[step1-2],(25,285))
        screen.blit(tip1[5],(25,210))
        screen.blit(tip1[7],(25,235))
    elif step1==1:
        screen.blit(tip1[2],(25,185))
        screen.blit(tip1[3],(25,210))
    if put2==0 and step2>=1:
        if step2>1:
            screen.blit(tip1[4],(910,185))
            screen.blit(tip1[8],(895,260))
            screen.blit(num1[step2-2],(910,285))        
        screen.blit(tip1[6],(910,210))
        screen.blit(tip1[7],(910,235))
    elif step2==1:
        screen.blit(tip1[2],(910,185)) 
        screen.blit(tip1[3],(910,210))
    for i in range(6):
        screen.blit(passage1[i],(1010,200+i*20))    
    block=[[0 for j in range(side)] for i in range(side)]
    block[pos1[0]][pos1[1]]=1
    block[pos2[0]][pos2[1]]=2
    for i in range(side):
        for j in range(side):
            pos=(127+j*sidelen,17+i*sidelen,sidelen*0.9,sidelen*0.9)
            pygame.draw.rect(screen,color[block[i][j]*2+1],pos)
    for i in range(side):
        for j in range(side):            
            if wall[i][j][0] and i!=side-1:
                pos3=(123+j*sidelen,13+(i+1)*sidelen)
                pos4=(123+(j+1)*sidelen,13+(i+1)*sidelen)
                pygame.draw.line(screen,color[wall[i][j][0]*2+2],pos3,pos4,int(sidelen*0.1))
            if wall[i][j][1] and j!=side-1:
                pos3=(123+(j+1)*sidelen,13+i*sidelen)
                pos4=(123+(j+1)*sidelen,13+(i+1)*sidelen)   
                pygame.draw.line(screen,color[wall[i][j][1]*2+2],pos3,pos4,int(sidelen*0.1))

def chess():
    pos=(127+(pos1[1]+0.45)*sidelen,12+(pos1[0]+0.5)*sidelen)
    pygame.draw.circle(screen,color[4],pos,sidelen*0.3)
    pos=(127+(pos2[1]+0.45)*sidelen,12+(pos2[0]+0.5)*sidelen)
    pygame.draw.circle(screen,color[6],pos,sidelen*0.3)    

def move(player,event):
    global step1,step2,pos1,pos2,put1,put2
    if player=='p1':
        if step1>1:
            if event.key==K_w:
                if wall[pos1[0]-1][pos1[1]][0] or (pos1[0]-1==pos2[0] and pos1[1]==pos2[1]):
                    return
                else:
                    pos1[0]-=1
                    step1-=1
            elif event.key==K_a:
                if wall[pos1[0]][pos1[1]-1][1] or (pos1[1]-1==pos2[1] and pos1[0]==pos2[0]):
                    return
                else:
                    pos1[1]-=1
                    step1-=1
            elif event.key==K_s:
                if wall[pos1[0]][pos1[1]][0] or (pos1[0]+1==pos2[0] and pos1[1]==pos2[1]):
                    return
                else:
                    pos1[0]+=1
                    step1-=1
            elif event.key==K_d:
                if wall[pos1[0]][pos1[1]][1] or (pos1[1]+1==pos2[1] and pos1[0]==pos2[0]):
                    return
                else:
                    pos1[1]+=1
                    step1-=1
            elif event.key==K_1 :   
                step1=1
                put1=1
                return
        elif event.key==K_1 and step1==1:    
            put1=1
            return        
        elif put1==1:
            if event.key==K_w:
                if wall[pos1[0]-1][pos1[1]][0]:
                    return
                else:
                    wall[pos1[0]-1][pos1[1]][0]=1
            elif event.key==K_a:
                if wall[pos1[0]][pos1[1]-1][1]:
                    return
                else:
                    wall[pos1[0]][pos1[1]-1][1]=1
            elif event.key==K_s:
                if wall[pos1[0]][pos1[1]][0]:
                    return
                else:
                    wall[pos1[0]][pos1[1]][0]=1
            elif event.key==K_d:
                if wall[pos1[0]][pos1[1]][1]:
                    return
                else:
                    wall[pos1[0]][pos1[1]][1]=1
            else:
                return
            put1=0
            step1=0
            step2=4
    else:
        if step2>1:
            if event.key==K_UP:
                if wall[pos2[0]-1][pos2[1]][0] or (pos2[0]-1==pos1[0] and pos1[1]==pos2[1]):
                    return
                else:
                    pos2[0]-=1
                    step2-=1
            elif event.key==K_LEFT:
                if wall[pos2[0]][pos2[1]-1][1] or (pos2[1]-1==pos1[1] and pos1[0]==pos2[0]):
                    return
                else:
                    pos2[1]-=1
                    step2-=1
            elif event.key==K_DOWN:
                if wall[pos2[0]][pos2[1]][0] or (pos2[0]+1==pos1[0] and pos1[1]==pos2[1]):
                    return
                else:
                    pos2[0]+=1
                    step2-=1
            elif event.key==K_RIGHT:
                if wall[pos2[0]][pos2[1]][1] or (pos2[1]+1==pos1[1] and pos1[0]==pos2[0]):
                    return
                else:
                    pos2[1]+=1
                    step2-=1
            elif event.key==K_0:
                step2=1
                put2=1
                return            
        elif event.key==K_0 and step2==1:
            put2=1
            return                    
        elif put2==1:
            if event.key==K_UP:
                if wall[pos2[0]-1][pos2[1]][0]:
                    return
                else:
                    wall[pos2[0]-1][pos2[1]][0]=2
            elif event.key==K_LEFT:
                if wall[pos2[0]][pos2[1]-1][1]:
                    return
                else:
                    wall[pos2[0]][pos2[1]-1][1]=2
            elif event.key==K_DOWN:
                if wall[pos2[0]][pos2[1]][0]:
                    return
                else:
                    wall[pos2[0]][pos2[1]][0]=2
            elif event.key==K_RIGHT:
                if wall[pos2[0]][pos2[1]][1]:
                    return
                else:
                    wall[pos2[0]][pos2[1]][1]=2
            else:
                return
            put2=0
            step2=0
            step1=4

def search1(sx,sy,ex,ey):
    global judge,side,score1,flag
    block[sx][sy]=1
    if sx==ex and sy==ey:
        flag=1
        return 1
    for i in range(4):
        x=sx+direcblock[i][0]
        y=sy+direcblock[i][1]
        xw=sx+direcwall[i][0]
        yw=sy+direcwall[i][1]
        if x<0 or x>side-1 or y<0 or y>side-1 \
        or wall[xw][yw][direcwall[i][2]] or judge[x][y]:
            continue
        score1+=1
        judge[x][y]=1
        search1(x,y,ex,ey)
    return flag

def check(player):
    global score1,score2
    score1=0
    score2=0
    if player=='p1':
        sx,sy=pos1
        ex,ey=pos2
        return search1(sx,sy,ex,ey)
    else:
        sx,sy=pos2
        ex,ey=pos1   
        return search2(sx,sy,ex,ey)

def win(player='tie'):
    if player=='p1':
        screen.blit(result1,(300,300))
    elif player=='p2':
        screen.blit(result2,(300,300))
    else:
        screen.blit(result,(300,300))            
        
try:
    while True:
        event=pygame.event.poll()
        if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
            pygame.quit()
        if ask(event):
            break
        pygame.display.update()    
    init2()
    while True:
        background()
        chess()
        event=pygame.event.poll()
        if event.type==QUIT or (event.type==KEYDOWN and event.key==K_ESCAPE):
            pygame.quit()
        if mode==1 and event.type==KEYDOWN:
            for i in key1:
                if i==event.key:
                    move('p1',event)
            for i in key2:
                if i==event.key:
                    move('p2',event)
        
        #if not check('p1'):
            #check('p2')
            #mode=2
            #if score1==score2:
                #win()
            #elif score1>score2:
                #win('p1')
            #else:
                #win('p2') 
        
        pygame.display.update()
except pygame.error:
    pass

注释的是因为我不会

2022/2/10 14:20
加载中...