【写在前面】
之前帮助一个留学生朋友完成了一个利用Python的2维列表实现一个类似消消乐的小游戏,其中综合运用了python语言的列表、判断语句、循环以及函数等语法知识,很适合初学者用来练手并且检验自己的学习效果。
【要求说明】 2D-list说明文档
【代码】
import copy import random SIZE = 7 # Define the global variable SIZE and assign a value LEN = 5 # Define the global variable LEN and assign a value ''' Creates a 2D-list board of SIZE x SIZE. With probability ~33% each cell of board stores a symbol from the set ($, #, *). Finally returns the board. ''' def create_board(SIZE): board = [] for _ in range(SIZE): row = [] for _ in range(SIZE): if random.randint(1,10) > 7: row.append("$") elif random.randint(1,10) > 3: row.append("#") else: row.append("*") board.append(row) return board ## Add (and test) all required functions here ## # ---------------------------------------------- def print_rules(): # Print game rules print(" *** Match the Symbols *** ") print("Rules:") print("** Find a horizontal/vertical line of length at least {} consisting of the same symbols.".format(LEN)) print("-- Select 'M'/'m' to enter the position 'row/col' of the starting symbol of that line.") print("-- Score 1 point for each symbol on that line.") print("-- Also score points for all horizontal/vertical neighbours (symbols identical to point at 'row/col').") print("** Can't find a matching line and want to change an existing symbol?") print("-- Select 'C'/'c' to enter the new symbol, but you will lose 2 points each time.") print("-- If you can finish the board you'll get 10 additional points.") print("** You can quit anytime by selecting 'Q'/'q'.") print("--------------------------------------------------------------------------------------------------------------\n") def print_board(board_create): # Print your board print("Your Board:\n") head = [str(i) for i in range(SIZE)] print(" " + " " + "".join(head) + " " + " ") print("-" * (SIZE + 4)) # Use the loop to print out the 2-Dimentional lists in accordance with the format for i in range(SIZE): print(str(i) + "|" + "".join(board_create[i]) + "|" + str(i)) print("-" * (SIZE + 4)) print(" " + " " + "".join(head) + " " + " ") def take_input(): row = input("row: ") while True: # Determine if the row entered by the user is valid row = int(row) if ((row < 0) or (row > (SIZE-1))): print("Invalid row selected") row = input("row: ") else: break col = input("col: ") while True: # Determine if the column entered by the user is valid col = int(col) if ((col < 0) or (col > (SIZE-1))): print("Invalid column selected") col = input("col: ") else: break return (row, col) def check_matching(row, col, board): new_board = copy.deepcopy(board) # Make a deep copy of the original board rrow = row ccol = col original_rrow = copy.deepcopy(rrow) original_ccol = copy.deepcopy(ccol) string = board[original_rrow][original_ccol] # Gets the character specified by the user count = 0 count_top = 1 count_under = 1 count_left = 1 count_right = 1 rrow = original_rrow - 1 while (rrow >= 0): # Looks to the top of the user-specified character if new_board[rrow][original_ccol] == string: count_top = count_top + 1 rrow = rrow - 1 else: break rrow = original_rrow + 1 while (rrow <= (SIZE - 1)): # Looks to the under of the user-specified character if new_board[rrow][original_ccol] == string: count_under = count_under + 1 rrow = rrow + 1 else: break ccol = original_ccol - 1 while (ccol >= 0): # Looks to the left of the user-specified character if new_board[original_rrow][ccol] == string: count_left = count_left + 1 ccol = ccol - 1 else: break ccol = original_ccol + 1 while (ccol <= (SIZE - 1)): # Looks to the right of the user-specified character if new_board[original_rrow][ccol] == string: count_right = count_right + 1 ccol = ccol + 1 else: break # Determine whether horizontal or vertical line of length LEN has started from that given location and replaces them if ((count_top >= LEN) or (count_under >= LEN) or (count_left >= LEN) or (count_right >= LEN)): count = count + 1 count_top = 0 count_under = 0 count_left = 0 count_right = 0 rrow = original_rrow - 1 while (rrow >= 0): if new_board[rrow][original_ccol] == string: new_board[rrow][original_ccol] = '.' count_top = count_top + 1 rrow = rrow - 1 else: break count = count + count_top rrow = original_rrow + 1 while (rrow <= (SIZE - 1)): if new_board[rrow][original_ccol] == string: new_board[rrow][original_ccol] = '.' count_under = count_under + 1 rrow = rrow + 1 else: break count = count + count_under ccol = original_ccol - 1 while (ccol >= 0): if new_board[original_rrow][ccol] == string: new_board[original_rrow][ccol] = '.' count_left = count_left + 1 ccol = ccol - 1 else: break count = count + count_left ccol = original_ccol + 1 while (ccol <= (SIZE - 1)): if new_board[original_rrow][ccol] == string: new_board[original_rrow][ccol] = '.' count_right = count_right + 1 ccol = ccol + 1 else: break count = count + count_right new_board[original_rrow][original_ccol] = "." print("You successfully matched {} symbols at this step!".format(count)) return (True, count, new_board) else: print("No {} matching symbols in any direction! You lost 2 points.".format(LEN)) count = count - 2 return (False, count, board) def is_board_finished(board): num = 0 for i in range(SIZE): for j in range(SIZE): if board[i][j] != ".": num = num + 1 # Determine if the player has completed the board if (num == (SIZE * SIZE)): print("Good job! You finished the board!") print("You got 10 more points!!") return True else: return False # ---------------------------------------------- def main(): # add logics and call functions as required print_rules() board_create = create_board(SIZE) print_board(board_create) sum = 0 copy_board = copy.deepcopy(board_create) choose = input("[M]atch the symbols, [C]hange a symbol, or [Q]uit the game? ") while True: if ((choose == 'm') or (choose == 'M')): input_row, input_col = take_input() matching_score = check_matching(input_row, input_col, copy_board) if matching_score[0]: sum = sum + matching_score[1] print("Your new score: {}".format(sum)) print_board(matching_score[2]) copy_board = matching_score[2] if is_board_finished(copy_board): print("Your final score is {}".format(sum + 10)) break choose = input("[M]atch the symbols, [C]hange a symbol, or [Q]uit the game? ") else: sum = sum + matching_score[1] print("Your new score: {}".format(sum)) print_board(matching_score[2]) choose = input("[M]atch the symbols, [C]hange a symbol, or [Q]uit the game? ") elif ((choose == 'c') or (choose == 'C')): input_row, input_col = take_input() input_symbol = input("symbol? ") while True: if input_symbol == ".": print("Invalid symbol, try again!") input_symbol = input("symbol? ") else: print("You've successfully changed a symbol, but you lost 2 points.") sum = sum - 2 print("Score: {}".format(sum)) break copy_board[input_row][input_col] = input_symbol print_board(copy_board) choose = input("[M]atch the symbols, [C]hange a symbol, or [Q]uit the game? ") elif ((choose == 'q') or (choose == 'Q')): print("Board is not finished yet!") print("Your final score is {}".format(sum)) break else: print("Invalid selection, try again!") choose = input("[M]atch the symbols, [C]hange a symbol, or [Q]uit the game? ") # ----------------------------------------------- #----------------- Do not change --------------------# ''' Ensures that the main() function is called when a3.py is executed as a stand-alone program''' # ---------------------------------------------------- if __name__ == "__main__": main()
【效果演示】(注:长截屏过程中,有部分内容被折叠,读者可以将代码复制到IDE中自己运行,观察效果)