Calc. Bowling score2
ボウリングのアベレージを算出しリスト表示するプログラムを変更しました。
スペア率、ストライク率を算出するようにしました。
【画面構成】
手書きで見栄えが良くないですがご了承ください。
Sp%,St%がスペア、ストライク率です。
SpNum,StNum.は、各ゲームのスペア、ストライク数です。
【基本動作】
プログラムを実行すると、まず、csvファイル(ゲーム番号、スコア、スペア数、ストライク数)を読み込み、それをリスト表示します。
画面上部の新しいスコア入力部に、スコア、スペア数、ストライク数を入力し、「add data」ボタンをクリックすると、新しいゲームデータを追加し表示します。同時に、csvファイルにも追記します。
【ソースコード】
srctohtmlのて変換しましたが、インデントが少しずれていますのでご了承ください。
- #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
- ret = [(”,”,”,”)] * G_MAX
- def initData():
- for i in range(0,G_MAX):
- spr_lst[i] = 0
- str_lst[i] = 0
- 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
- 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()
- 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
- 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.
- 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()
【csvファイル】
28ゲーム分を入力した後のcsvファイルです。
数ゲーム分入力しておいて、残りはこのプログラムを使用して、1ゲームずつ画面入力し、csvファイルを更新していきました。
注意)
まだデバグが十分でありませんが、実用上、これで使えそうなので、ここまでで公開します。
不具合がある場合は、適宜修正してお使いください。