Program of Calc. Bowling score update
1.プログラム更新
ボウリングスコア算出プログラムを更新しました。
前回までの機能に加え、ハイスコアトップ3を表示するようにしました。
前回までのプログラムは下記リンクを参照願います。
ゲーム数が多くなってきたので、ハイスコアは覚えていますが、その次とかは忘れてしまうし、探すのも大変なので、プログラムを改訂しました。
2.ソースコード
ソースコードは下記の通りです。
コメントがずれているところがありますがご了承ください。
今回追加したコードはイタリック体にしました。
注意)
ハイスコアベスト3を検出する処理はデバッグ不十分で、新しいデータ入力時、正しく動作するか否かは今後確認します。
もし不具合が見つかった場合は適宜修正する予定です。
- #A program that calculates the average score of bowling games
- #Input_file name is “b_score2.csv” (csv_file)
- #Don’t add new_line to final_data.
- import ui
- import csv
- new_score = 0
- t_sc = 0 #total score
- a_sc = 0 #average score
- g_num = 0 #number of games
- G_MAX = 500 #Max. game nums
- gn_lst = [0] * G_MAX #game num. list
- sc_lst = [0] * G_MAX #score list
- ts_lst = [0] * G_MAX #total score
- av_lst = [0] * G_MAX #average list
- sp_lst = [0] * G_MAX #spare num. list
- st_lst = [0] * G_MAX #strike num. list
- spr_lst = [0] * G_MAX #spare ratio list
- str_lst = [0] * G_MAX #strike ratio list
- top1 = 0 #Top score = Highest
- top2 = 0 #Second score
- top3 = 0 #3rd score
- ret = [(”,”,”,”)] * G_MAX
- def initData():
- for i in range(0,G_MAX):
- spr_lst[i] = 0
- str_lst[i] = 0
- def checkHighScore(sc):
- global top1,top2,top3
- if top3 < sc:
- if top2 < sc:
- if top1 < sc:
- top1 = sc
- else:
- top2 = sc
- else:
- top3 = sc
- def displayHighScore():
- top1_tf.text = str(top1)
- top2_tf.text = str(top2)
- top3_tf.text = str(top3)
- def readData():
- global g_num
- global ret
- fr = open(“b_score2.csv”) #open file
- rp = csv.reader(fr) #for read csv
- for rd in rp:
- print(rd)
- if rd == []:
- break
- else:
- if g_num > G_MAX: #check Max num.(for mem.)
- break
- print(rd[0], rd[1], rd[2],rd[3])
- ret[(g_num)*4] = rd[0] #for check
- ret[(g_num)*4+1] = rd[1] #for check
- ret[(g_num)*4+2] = rd[2]
- ret[(g_num)*4+3] = rd[3]
- gn_lst[g_num] = rd[0] #set game num. list
- sc_lst[g_num] = rd[1] #set score list
- sp_lst[g_num] = rd[2] #set spare list
- st_lst[g_num] = rd[3] #set strike list
- g_num += 1
- checkHighScore(int(rd[1]))
- fr.close()
- return ret
- def renewTableView(tv,lst):
- lstdata = ui.ListDataSource(“”) #clear list
- tmp_lst = [‘0’] * (g_num) #malloc table
- for i in range(0,g_num): #include title
- tmp_lst[i] = lst[i] #data copy
- lstdata.items = tmp_lst #set items of game number list
- tv.data_source = lstdata #set source
- tv.reload_data() #display data
- #Display game num. and score
- def displayGameAndScore():
- #Game Number
- renewTableView(gn_tv, gn_lst)
- renewTableView(sc_tv, sc_lst)
- #Display total score and average
- def displayAverage():
- #calc. total_score and Average
- for i in range(0,g_num): #to LastData
- if i == 0: #first data
- ts_lst[0] = sc_lst[0]
- av_lst[0] = sc_lst[0] #same top data
- else: #2nd.—
- ts_lst[i] = str(int(ts_lst[i-1]) + int(sc_lst[i]))
- av_lst[i] = str(round(int(ts_lst[i]) / (i+1)))
- #Total Score to tableview
- renewTableView(total_tv, ts_lst)
- #Average to tableview
- renewTableView(ave_tv, av_lst)
- print(“game_num=”,g_num) #for check
- def displaySpareAndStrike():
- renewTableView(sp_tv, sp_lst)
- renewTableView(st_tv, st_lst)
- def displaySpareAndStrikeRatio():
- global g_num
- #calc. Ratio
- tsp = 0
- tst = 0
- for i in range(0,g_num): #to LastData
- if i == 0: #first data
- spr_lst[0] = int(sp_lst[0])*10 #num/10*100=num*10(%)
- str_lst[0] = int(st_lst[0])*10 #num/10*100=num*10(%)
- tsp = int(sp_lst[0])
- tst = int(st_lst[0])
- else: #2nd.—
- spr_lst[i] = str(round((tsp + int(sp_lst[i]))*10/(i+1)))
- str_lst[i] = str(round((tst + int(st_lst[i]))*10/(i+1)))
- tsp += int(sp_lst[i])
- tst += int(st_lst[i])
- #SpareRatio to tableview
- renewTableView(spr_tv, spr_lst)
- #StrikeRatio to tableview
- renewTableView(str_tv, str_lst)
- def writeData(nd, sp, st):
- global g_num
- print(“g_num before write=”, g_num)
- fw = open(‘b_score2.csv’,’a’)
- wp = csv.writer(fw,lineterminator=’\n’)
- ad_data = [”,”,”,”] #append data
- gn_lst[g_num] = ad_data[0] = str(g_num+1)
- sc_lst[g_num] = ad_data[1] = nd
- sp_lst[g_num] = ad_data[2] = sp
- st_lst[g_num] = ad_data[3] = st
- ts_lst[g_num] = str(int(ts_lst[g_num-1]) + int(sc_lst[g_num]))
- av_lst[g_num] = str(round(int(ts_lst[g_num]) / (g_num+1)))
- g_num += 1 #increment here. because for display 0 to g_num-1
- renewTableView(gn_tv, gn_lst)
- renewTableView(sc_tv, sc_lst)
- renewTableView(total_tv, ts_lst)
- renewTableView(ave_tv, av_lst)
- displaySpareAndStrike()
- displaySpareAndStrikeRatio()
- displayHighScore()
- print(“game num after write=”,g_num) #for check
- print(“add data=”, ad_data[0],ad_data[1],ad_data[2],ad_data[3]) #for check
- wp.writerow(ad_data)
- fw.close()
- #Add new data proc.
- def addData(sender):
- res = 0 #input data is OK
- nd = nd_tf.text
- if nd == ”: #check blank
- print(“Input new score!”)
- res = -10
- else:
- if int(nd) == 0: #check zero
- print(“Input-score is 0!”)
- res = -20
- else:
- if int(nd) > 300: #check over 300
- print(“Input score is over 300”)
- res = -30
- checkHighScore(int(nd))
- sp = nsp_tf.text
- if sp == ”: #check blank
- print(“Input new spareNum!”)
- res = -110
- else:
- if int(sp) > 10: #check over 10
- print(“Input spareNum is over 10”)
- res = -130
- st = nst_tf.text
- if st == ”: #check blank
- print(“Input new strikeNum!”)
- res = -210
- else:
- if int(st) > 12: #check over 300
- print(“Input strikeNum is over 12”)
- res = -230
- print(nd, sp, st)
- if res == 0:
- writeData(nd,sp,st) #display new data and write to file
- v = ui.load_view()
- v.present(‘sheet’)
- nd_tf = v[‘textfield1’] #text field1 for new score
- nsp_tf = v[‘textfield2’] #text field1 for new spareNum.
- nst_tf = v[‘textfield3’] #text field1 for new strikeNum.
- top1_tf = v[‘textfield4’] #text field1 for TOP1 score
- top2_tf = v[‘textfield5’] #text field1 for TOP2 score
- top3_tf = v[‘textfield6’] #text field1 for TOP3 score
- gn_tv = v[‘tableview1’] #table_view1 for display game_num
- sc_tv = v[‘tableview2’] #table_view1 for display score
- sp_tv = v[‘tableview3’] #table_view1 for display spare
- st_tv = v[‘tableview4’] #table_view1 for display strike
- total_tv = v[‘tableview5’] #table_view1 for display total score
- ave_tv = v[‘tableview6’] #table_view1 for display average
- spr_tv = v[‘tableview7’] #table_view1 for display spare ratio
- str_tv = v[‘tableview8’] #table_view1 for display strike ratio
- initData()
- r_data = readData() #read csv-file and set data
- print(r_data)
- displayGameAndScore() #display game-score to tableview
- displayAverage() #display total-score and average to tableview
- displaySpareAndStrike() #display num. and % of spare and strike
- displaySpareAndStrikeRatio()
- displayHighScore()
3.画面(UI)
画面には、ハイスコア表示用のテキストフィールドを追加しました。
4.実行結果
実行結果は以下の通りです。
※自動スクロールはしないので、最新のデータ部を見るには各列を手動でスクロールする必要があります。
5.開発環境
下記だけです。
(1)iPad Air (第3世代)
(2)Pythonista