python脚本实现开心消消乐的游戏

编写一个脚本, 实现如下的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=f'flag_list{i}'
                    flag_list_name=['']*len
                    j=0
                    while j                            flag=self.get_random_flag()  
                            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            flag=flag_list[i][j]
            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            num_j=0
            while   num_j                if flag_list[num_i][num_j]=='T':
                    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,空格分割 ):')

请使用浏览器的分享功能分享到微信等