编写一个脚本, 实现如下的2 个功能 :
1. 运行脚本时随机生成一个 关卡
返回: 8⾏ 字符串 表⽰关卡初始布局,对应棋盘中的 8⾏,每⾏包括 8 个字符。每个字符表⽰一种 糖果 ,对应关系为: (B 普通 糖果 ,H 横炸 糖果 ,V 竖炸 糖果 ,S方炸 糖果 )
2. 一次消除操作
/move
.sh
参数:
row0, col0, row1, col1: 表⽰一次操作的左上角和右下角的 糖果 坐标,
⽐如 :row0=0 col1=1 row1=2 clo2 =2
返回:8⾏⽂本,表⽰消除结束且完成下落后的局⾯。
举例: /move .sh 1 0 1 2
具体实现如下,采用python脚本实现!注意其中关于s炸可以采用for i in (row-1 row+1): 然后for j in (col-1,col+1)两个简单的for循环!,然后下移函数算法可以采用冒泡的思想,把所有的T都和上一行的值对比
#!/usr/bin/python3
# -*- coding: UTF-8 -*-
import random
import argparse
import sys
class PlayGame():
def __init__(self,row0,col0,row1,col1):
self.row0=row0
self.col0=col0
self.row1=row1
self.col1=col1
def get_random_flag(self,):
'''
得到一个随机糖果
'''
flags=['B','B','H','B','B','V','B','B','S','B','B']
i=len(flags)-1
num=random.randint(0,i)
flag=flags[num]
return flag
def get_flag_list(self,len=8):
'''
得到一个len行len列的列表,返回的是一个列表 例如len=3 则返回类似于[['B','H','S'],['B','H','S'],['B','H','S']]的列表
'''
flag_list=[]
i=0
while i
flag_list_name=['']*len
j=0
while j
flag_list_name[j]=flag
j=j+1
flag_list.append(flag_list_name)
i=i+1
return(flag_list)
def get_choose_flags(self,flag_list,i,j):
'''
首先flag_list为一个列表,类似于[['B','H','S'],['B','H','S'],['B','H','S']],根据输入的数组找到对应方阵的flag, 例如如输入(0,0)则返第1行第1列的flag值
注意i和j的值需要小于flag_list的长度
'''
num=len(flag_list)
if 0<=i
return(flag)
else:
return('')
def Fall_Flags(self,flag_list,r,c):
'''
特定位置的数组的flag爆炸,之后该flag正上面的所有flag都下移,一直到最后行标号为0的位置上从新生成一个flag
'''
if r==0:
flag_list[r][c]=self.get_random_flag()
else:
while r>0:
flag_list[r][c]=flag_list[r-1][c]
r=r-1
if r==0:
flag_list[0][c]=self.get_random_flag()
return (flag_list)
def Meet_H(self,flag_list,r_h,c_h):
'''
当遇到横炸的时候,除了需要判断的flag(也就是在左下方和右上方区域的flag)之外同一行的flag都要爆炸,先设置成T
'''
flag_list[r_h][c_h]='T'
r=0
while r<8:
col_h=r
if flag_list[r_h][col_h]=='B':
flag_list[r_h][col_h]='T'
elif flag_list[r_h][col_h]=='H':
self.Meet_H(flag_list=flag_list,r_h=r_h,c_h=col_h)
elif flag_list[r_h][col_h]=='S':
self.Meet_S(flag_list=flag_list,r_s=r_h,c_s=col_h)
elif flag_list[r_h][col_h]=='V':
self.Meet_V(flag_list=flag_list,r_v=r_h,c_v=col_h)
else:
pass
r=r+1
return (flag_list)
def Meet_V(self,flag_list,r_v,c_v):
'''
当遇到竖炸的时候,逐个判断是否需要爆炸
自己先设置为T
'''
flag_list[r_v][c_v]='T'
v=0
while v<8:
row_v=v
if flag_list[row_v][c_v]=='B':
flag_list[row_v][c_v]='T'
elif flag_list[row_v][c_v]=='H':
self.Meet_H(flag_list=flag_list,r_h=row_v,c_h=c_v)
elif flag_list[row_v][c_v]=='S':
self.Meet_S(flag_list=flag_list,r_s=row_v,c_s=c_v)
elif flag_list[row_v][c_v]=='V':
self.Meet_V(flag_list=flag_list,r_v=row_v,c_v=c_v)
else:
pass
v=v+1
return (flag_list)
def Meet_B(self,flag_list,r_b,c_b):
flag_list[r_b][c_b]='T'
return (flag_list)
def Meet_S(self,flag_list,r_s,c_s):
'''
当遇到方炸的时候,逐个判断是否需要继续炸,首先把自己设置成T
'''
flag_list[r_s][c_s]='T'
row=r_s
col=c_s
if row-1>=0 and col-1>=0:
flag_list[row-1][col-1]='T'
if flag_list[row-1][col-1]=='B':
flag_list[row-1][col-1]='T'
elif flag_list[row-1][col-1]=='H':
self.Meet_H(flag_list=flag_list,r_h=row-1,c_h=col-1)
elif flag_list[row-1][col-1]=='S':
self.Meet_S(flag_list=flag_list,r_s=row-1,c_s=col-1)
elif flag_list[row-1][col-1]=='V':
self.Meet_V(flag_list=flag_list,r_v=row-1,c_v=col-1)
else:
pass
else:
pass
if row-1>=0 and col>=0:
if flag_list[row-1][col]=='B':
flag_list[row-1][col]='T'
elif flag_list[row-1][col]=='H':
self.Meet_H(flag_list=flag_list,r_h=row-1,c_h=col)
elif flag_list[row-1][col]=='S':
self.Meet_S(flag_list=flag_list,r_s=row-1,c_s=col)
elif flag_list[row-1][col]=='V':
self.Meet_V(flag_list=flag_list,r_v=row-1,c_v=col)
else:
pass
else:
pass
if row-1>=0 and col+1<8:
if flag_list[row-1][col+1]=='B':
flag_list[row-1][col+1]='T'
elif flag_list[row-1][col+1]=='H':
self.Meet_H(flag_list=flag_list,r_h=row-1,c_h=col+1)
elif flag_list[row-1][col+1]=='S':
self.Meet_S(flag_list=flag_list,r_s=row-1,c_s=col+1)
elif flag_list[row-1][col+1]=='V':
self.Meet_V(flag_list=flag_list,r_v=row-1,c_v=col+1)
else:
pass
else:
pass
if row>=0 and col-1>=0:
if flag_list[row][col-1]=='B':
flag_list[row][col-1]='T'
elif flag_list[row][col-1]=='H':
self.Meet_H(flag_list=flag_list,r_h=row,c_h=col-1)
elif flag_list[row][col-1]=='S':
self.Meet_S(flag_list=flag_list,r_s=row,c_s=col-1)
elif flag_list[row][col-1]=='V':
self.Meet_V(flag_list=flag_list,r_v=row,c_v=col-1)
else:
pass
else:
pass
flag_list[row][col]='T'
if row>=0 and col+1<8:
if flag_list[row][col+1]=='B':
flag_list[row][col+1]='T'
elif flag_list[row][col+1]=='H':
self.Meet_H(flag_list=flag_list,r_h=row,c_h=col+1)
elif flag_list[row][col+1]=='S':
self.Meet_S(flag_list=flag_list,r_s=row,c_s=col+1)
elif flag_list[row][col+1]=='V':
self.Meet_V(flag_list=flag_list,r_v=row,c_v=col+1)
else:
pass
else:
pass
if row+1<8 and col-1>0:
if flag_list[row+1][col-1]=='B':
flag_list[row+1][col-1]='T'
elif flag_list[row+1][col-1]=='H':
self.Meet_H(flag_list=flag_list,r_h=row+1,c_h=col-1)
elif flag_list[row+1][col-1]=='S':
self.Meet_S(flag_list=flag_list,r_s=row+1,c_s=col-1)
elif flag_list[row+1][col-1]=='V':
self.Meet_V(flag_list=flag_list,r_v=row+1,c_v=col-1)
else:
pass
else:
pass
if row+1<8 and col<8:
if flag_list[row+1][col]=='B':
flag_list[row+1][col]='T'
elif flag_list[row+1][col]=='H':
self.Meet_H(flag_list=flag_list,r_h=row+1,c_h=col)
elif flag_list[row+1][col]=='S':
self.Meet_S(flag_list=flag_list,r_s=row+1,c_s=col)
elif flag_list[row+1][col]=='V':
self.Meet_V(flag_list=flag_list,r_v=row+1,c_v=col)
else:
pass
else:
pass
if row+1<8 and col+1<8:
if flag_list[row+1][col+1]=='B':
flag_list[row+1][col+1]='T'
elif flag_list[row+1][col+1]=='H':
self.Meet_H(flag_list=flag_list,r_h=row+1,c_h=col+1)
elif flag_list[row+1][col+1]=='S':
self.Meet_S(flag_list=flag_list,r_s=row+1,c_s=col+1)
elif flag_list[row+1][col+1]=='V':
self.Meet_V(flag_list=flag_list,r_v=row+1,c_v=col+1)
else:
pass
else:
pass
return (flag_list)
def Set_T_Flags(self,flag_list):
'''
把需要爆炸的flag设置为T,都用row0和col0为起始值来判断,只接row0<=row1以及col0<=col1的情况
'''
row_num= abs(self.row0-self.row1)
col_num=abs(self.col0-self.col1)
if self.row0<=self.row1 and self.col0<=self.col1:
i=0
while i<=row_num:
j=0
row=self.row0+i
while j<=col_num:
col=self.col0+j
flag=self.get_choose_flags(flag_list,row,col)
if flag=='B':
flag_list=self.Meet_B(flag_list=flag_list,r_b=row,c_b=col)
elif flag=='H':
flag_list=self.Meet_H(flag_list=flag_list,r_h=row,c_h=col)
elif flag=='V':
flag_list=self.Meet_V(flag_list=flag_list,r_v=row,c_v=col)
elif flag=='S':
flag_list=self.Meet_S(flag_list=flag_list,r_s=row,c_s=col)
j=j+1
i=i+1
else:
print('请输入col0<=col1并且row0<=row1的值! 程序退出!')
exit()
return flag_list
def change_flags(self,flag_list):
'''
遍历指定列表,遇到T就开始下移
'''
num=len(flag_list)
num_i=0
while num_i
while num_j
flag_list=self.Fall_Flags(flag_list,num_i,num_j)
num_j=num_j+1
num_i=num_i+1
return flag_list
if __name__ == '__main__':
game=PlayGame(3,4,4,5)
print('<<初始方阵>>')
flag_list=game.get_flag_list(len=8)
for i2 in flag_list:
print(i2)
count=1
while True:
try:
row0,col0,row1,col1 = (input("请输入四个整数(范围0到7,空格分割 ):").split())
except ValueError:
print('数字之间请加上空格')
if 0<=int(row0)<8 and 0<=int(col0)<8 and 0<=int(row1)<8 and 0<=int(col1)<8:
info=f'<<第{count}次炸替换成T之后方阵>>'
print(info)
game=PlayGame(row0=int(row0),col0=int(col0),row1=int(row1),col1=int(col1))
flag_list=game.Set_T_Flags(flag_list=flag_list)
for i3 in flag_list:
print(i3)
info1=f'<<第{count}次炸下移之后方阵,也就是第{count+1}爆炸的起始方阵>>'
print(info1)
count=count+1
flag_list=game.change_flags(flag_list)
for i4 in flag_list:
print(i4)
else:
print('请输入符合要求的四个整数,(范围0到7,空格分割 ):')