Python實現(xiàn)拼字游戲與代碼重構

有位文豪說得好:“看一個作家的水平,不是看他發(fā)表了多少文字,而要看他的廢紙簍里扔掉了多少。” 我覺得同樣的理論適用于編程。好的程序員,他們刪掉的代碼,比留下來的還要多很多。如果你看見一個人寫了很多代碼,卻沒有刪掉多少,那他的代碼一定有很多垃圾。 ----摘自《編程的智慧》

今天在OpenHatch上找到一個涉及到幾個Python知識點的小項目,需求是編寫一個帶評分功能的英文填字圖版游戲。

詳細需求:

practice breaking down a problem and solving it in Python from scratch
practice command line argument parsing
practice reading from files
practice working with dictionaries and for loops 

項目需求鏈接:
http://webcache.googleusercontent.com/search?q=cache:xcsq7ruu3NoJ:wiki.openhatch.org/Scrabble_challenge+&cd=9&hl=zh-CN&ct=clnk&gl=cn

涉及到的Python知識點:

1.文件操作
2.argparse庫的使用(個人選擇,用sys.argv效果類似)
3.collections中Counter類的高級應用
4.列表解析的應用
5.其他若干小的函數應用

首次編碼:

#!/usr/bin/env python

from __future__ import print_function
import argparse


SCORES = {"a":1,"c":3,"b":3,"e":1,"d":2,"g":2,"f":4,"i":1,
"h":4,"k":5,"j":8,"m":3,"l":1,"o":1,"n":1,"q":10,"p":3,
"s":1,"r":1,"u":1,"t":1,"w":4,"v":4,"y":4,"x":8,"z":10}


def get_sowpod():
    word_list = []
    with open('/Users/gaoxing/Desktop/sowpods.txt')as f:
        for line in f:
            word_list.append(line.strip().lower())
    return word_list


def argparse_arg():
    argparser = argparse.ArgumentParser()
    argparser.add_argument('args')
    res_arg = argparser.parse_args()
    return vars(res_arg)


def arg_proc():
    arg_dict = argparse_arg()
    arg_list = []
    for w in(arg_dict.values()[0]):
        if w not in arg_list:
            arg_list.append(w)
    return arg_list


def scrab():
    word_list = get_sowpod()
    source_list = arg_proc()
    target_list = []
    for line in word_list:
        tmp_list = []
        for word in line:
            if word not in tmp_list:
                tmp_list.append(word)
        if set(tmp_list).issubset(set(source_list)):
            target_list.append(line)
    return target_list


def get_score(words):
    dict_score = {}
    for word in words:
    dict_score[word] = sum(SCORES[c] for c in word)
    return dict_score


def sort_dict(d):
    dict1 = sorted(zip(d.values(), d.keys()), reverse=True)
    for key, val in dict1:
        print(key,',',val)


if __name__  == '__main__':
    d = get_score(scrab())
    print(sort_dict(d))

效果圖:

運行效果

開始代碼重構:
存在的問題:
1.函數概念不突出,沒有main函數,很多情況都是直接用一個函數調用另一個函數,沒有輸入參數
2.對此腳本輸入大寫參數如 ZAEFIEE時,程序無任何輸出結果
3.不輸入參數時,得不到需求要求的效果圖,
需求:

要求效果圖

本腳本:
我的效果圖

4.函數scrab()過于復雜

進行修改:
修改內容:
1.把argparse_arg()函數和 arg_proc()合并,并改名為get_user();
2.增加main函數,分別接受用戶輸入,構建核對列表,調用scrab()函數并進行評分和排序;
3.對于問題4, collections庫中有個計數器叫做Counter,可以進行加減法運算,直接運用這個類和列表解析式來代替多個for循環(huán)和復雜的if判斷
4.修改大寫參數無輸出結果問題
5.若干細節(jié)修改
修改后的代碼:

#!/usr/bin/env python

from __future__ import print_function
import argparse
from collections import Counter


SCORES = {"a": 1, "c": 3, "b": 3, "e": 1, "d": 2, "g": 2,
          "f": 4, "i": 1, "h": 4, "k": 5, "j": 8, "m": 3,
          "l": 1, "o": 1, "n": 1, "q": 10, "p": 3, "s": 1,
          "r": 1, "u": 1, "t": 1, "w": 4, "v": 4, "y": 4,
          "x": 8, "z": 10}


def get_sowpod():
    word_list = []
    with open('/Users/gaoxing/Desktop/sowpods.txt') as f:
        for line in f:
            word_list.append(line.strip())
    return word_list


def get_user():
    argparser = argparse.ArgumentParser()
    argparser.add_argument('[RACK]')
    res_arg = argparser.parse_args()

    arg_dict = vars(res_arg)
    return arg_dict.values()[0]


def scrab_plus(source, target):
    source_counter = Counter(target)
    return [ word.lower() for word in source if not (Counter(word) - source_counter) ]


def get_score(words):
    dict_score = {}
    for word in words:
        dict_score[word] = sum(SCORES[c] for c in word)
    return dict_score


def sort_dict(d):
    dict1 = sorted(zip(d.values(), d.keys()), reverse=True)
    for key, val in dict1:
        print(key, ',', val)


def main():
    sowpod_list = get_sowpod()
    user_list = get_user()
    target_list = scrab_plus(sowpod_list, user_list.upper())
    sort_dict(get_score(target_list))


if __name__ == '__main__':
    main()

運行效果圖:


新的運行效果

歡迎各位指出這個腳本可以再改進的地方!

若需轉載請聯(lián)系本人!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 4,044評論 0 7
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評論 19 139
  • 不努力不行 只要有空,總愛看看手機,朋友圈里全是滿滿的正能量,一個個如同打了雞血。工作奮起直追,生活活色生香,各種...
    云之風舞閱讀 543評論 2 2
  • 人家說:小丑很傻。 小丑說:我不后悔 脫下面具, 平常的面孔, 不一樣的眼淚。 那么干凈 ,那么干凈……
    任夢醒閱讀 328評論 0 0
  • 在學習AutoLayout時看過很多小技巧,但是很少有介紹基礎的教程,最近總結這類文章,看到一篇國外的文章極佳,特...
    阿豐在長春閱讀 3,197評論 1 4

友情鏈接更多精彩內容