python指令碼實現開心消消樂的遊戲

賀子_DBA時代發表於2021-04-06

編寫一個指令碼, 實現如下的2 個功能 :

1. 執行指令碼時隨機生成一個 關卡

返回:  8⾏ 字串 表⽰關卡初始佈局,對應棋盤中的 8⾏,每⾏包括 8 個字元。每個字元表⽰一種 糖果 ,對應關係為: (B 普通 糖果 H 橫炸 糖果 V 豎炸 糖果 S方炸 糖果 )

2. 一次消除操作

/move .sh <row0>   <col0>   <row1>   <col1>

引數:

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<len:
                    flag_list_name=f'flag_list{i}'
                    flag_list_name=['']*len
                    j=0
                    while j<len:
                            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<num and  0<=j<num:
            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:
            num_j=0
            while   num_j<num:
                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,空格分割 ):')

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2766771/,如需轉載,請註明出處,否則將追究法律責任。

相關文章