我想编《最强大脑》中的游戏“困兽围斗”
搜索是我的致命弱点,请大佬指点
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
注释的是因为我不会