diff --git a/csquiz.rb b/csquiz.rb new file mode 100755 index 0000000..c9d1d61 --- /dev/null +++ b/csquiz.rb @@ -0,0 +1,210 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +# 通常バージョンです +# 改良しようとしたけどやばいことになったのでやばい方は避難させといた + + +require 'csv' +require 'roo' + +ods = Roo::Spreadsheet.open("quizod.ods") #odsをもってくる +neta = CSV.parse(ods.to_csv, :headers => true) #odsをcsvにする + +fuseikai = 0 +def wrong() + puts"不正解!" + sleep(0.5) + +end + + # ans = answer,opt = row["オプション"],san = santaku,seikai = row["答え"],fu = fuseikaiと書きたいけど無理だった +def isRightAns(ans,opt,san,seikai,fu) + + ansIsA = (ans == san[0]) # この変数群 + ansIsB = (ans == san[1]) # カッコ付きはTF、カッコ無しはその他の値 + ansIsC = (ans == san[2]) # A,B,Cは選択肢の文字を仮で表している + + alreadySantaku = (fu >= 3) + ansIs1 = (ans == "1") + ansIs2 = (ans == "2") + ansIs3 = (ans == "3") + + ansAry = ans.chars + ansIsEmpty = (ansAry.empty?) + ansLength = ans.length + santakuNumbers = ["1","2","3"] + santakuTotalLength = san.join.length + + ansHasA = (ans.include?(san[0]))if san[0] # sanにnilがあるとinclude?で + ansHasB = (ans.include?(san[1]))if san[1] # エラーになるのでこうなった + ansHasC = (ans.include?(san[2]))if san[2] + + # ansIs123わかりにくくてすいません。回答に123が1個ずつあればOKを表しています + ansIs123 = ((ansAry + santakuNumbers).tally == {"1" =>2,"2" =>2,"3" =>2}) + ansIsABC = (ansHasA && ansHasB && ansHasC && ansLength == santakuTotalLength) + #ansIs順不同 + + selectNumber = (ans.to_i)-1 + select = san[selectNumber] + + #文字で答えた場合 || 番号で答えた場合 + if opt =~/(すべて)/ + return (ansIsABC) || + (ansIs123 && alreadySantaku) + + elsif opt =~ /(どれかひとつ)/ + return ([ansIsA,ansIsB,ansIsC].one?) || + ([ansIs1,ansIs2,ansIs3].one?) + + else #通常の三択 + return false if ans == "" + return (ans == seikai) || (select == seikai && alreadySantaku) + + end + +end + + +def putAnswer(row,santaku) + if row["答え"] != nil # 正解表示(通常) + printf("正解は%sでした。\n",row["答え"]) + return + end + # 以下では row["答え"] = nil + if row["オプション"] =~ /(すべて)/ # 正解表示(すべて) + printf("正解は%s,%s,%sすべてでした。\n",santaku[0],santaku[1],santaku[2]) + return + + elsif row["オプション"] =~ /(どれかひとつ)/ # 正解表示(どれか) + printf("正解は%s,%s,%sの中からひとつでした。\n",santaku[0],santaku[1],santaku[2]) + return + end +end + + +setumei = ["カスタムクイズ", + " 説明", + "専用のodsを使うことで、自由にクイズを作ることができます。", + "odsでつくったクイズが出題されるクイズです。", + "選択肢を出す場合、今は出せる選択肢は3つのみとなっております。", + "odsでの操作はodsに書いているのでそちらを見てください。", + "enterを押すと始まります。" + ] + +for i in setumei + puts i +end +gets + +countAns = 0 +countRight = 0 + +count = 0 # 今何問目なのか +print("\e[2J") +print("\e[H") + +startTime = Time.now.to_i +neta.each{|row| + + if row["オプション"] == "表示物" + printf("%s\n",row["問題"]) + gets + print("--------------------------\n") + next + end + count += 1 + dasita = 0 + comeback = 0 + printf("第%d問\n",count) + printf("%s\n", row["問題"]) + santaku = [row["三択1"], row["三択2"], row["三択3"]] + fuseikai = 0 # fuseikai >= 3で三択表示 + kaitou = nil + + while true + + #入力と三択システム + if comeback == 1 + wrong + + end + if row["オプション"] =~ /(三択なし)/ # 意地悪問題がいい人へ + dasita = 1 + + elsif ( fuseikai == 3 || row["オプション"] =~ /(三択)/ ) && + dasita != 1 + if row["オプション"] =~ /(三択)/ + fuseikai = 3 + end + num = 1 # 選択肢の番号 + for i in santaku + printf("%d => %s\n",num,i) + num += 1 + end + dasita = 1 # dasitaが1 =「三択出した」 2回以上の三択表示を防ぐ + end + + print"答えを入力..." + kaitou = gets.chomp + countAns += 1 + + if row["オプション"] !~ /(判定なし)/ + if isRightAns(kaitou,row["オプション"],santaku,row["答え"],fuseikai) + puts"正解!!" + countRight += 1 + sleep(0.5) + break + else + fuseikai += 1 + wrong + if row["オプション"] !~ /(1回だけ)/ + print("\e[2A") # 2行上 + print("\e[J") # 下のやつを消す + end + end + end + if row["オプション"] =~ /(正解を出す)/ + putAnswer(row,santaku) + end + if row["オプション"] =~ /(1回だけ|判定なし)/ + break + end + + end + if row["解説"] + printf("%s\n",row["解説"]) + gets + print"\e[1A" + end + + print("--------------------------\n") #何個でもいい仕切りの機能 + } + +# 終了時演出の変数の準備 +finishTime = Time.now.to_i + +text = neta["変更テキスト"][0] +finish = neta["終了時演出"][0] + +seitouritu = (((countRight.to_f)/(countAns.to_f))*100).truncate(1) +keikajikan = (finishTime - startTime) +heikinjikan = ((keikajikan.to_f)/(count.to_f)).truncate(1) + + +# 終了時演出の表示 + printf("正解数: %d回/%d回中 ",countRight,countAns)if finish =~ /(結果表示)/ + + printf("正答率: #{seitouritu}%% ")if finish =~ /(正答率)/ +print"\n" if finish =~ /(正解表示|正答率)/ + printf("経過時間: %d秒 ",keikajikan)if finish =~ /(経過時間)/ + + printf("平均回答時間: #{heikinjikan}秒 ")if finish =~ /(平均時間)/ + +print"\n" +if text + printf("%s\n",text)if text != "なし" +else + puts"終了!!おつかれさまでした!" +end +# おつかれさまでした!! diff --git a/happyou/csquiz.rb b/happyou/csquiz.rb deleted file mode 100755 index c9d1d61..0000000 --- a/happyou/csquiz.rb +++ /dev/null @@ -1,210 +0,0 @@ -#!/usr/bin/env ruby -# -*- coding: utf-8 -*- - -# 通常バージョンです -# 改良しようとしたけどやばいことになったのでやばい方は避難させといた - - -require 'csv' -require 'roo' - -ods = Roo::Spreadsheet.open("quizod.ods") #odsをもってくる -neta = CSV.parse(ods.to_csv, :headers => true) #odsをcsvにする - -fuseikai = 0 -def wrong() - puts"不正解!" - sleep(0.5) - -end - - # ans = answer,opt = row["オプション"],san = santaku,seikai = row["答え"],fu = fuseikaiと書きたいけど無理だった -def isRightAns(ans,opt,san,seikai,fu) - - ansIsA = (ans == san[0]) # この変数群 - ansIsB = (ans == san[1]) # カッコ付きはTF、カッコ無しはその他の値 - ansIsC = (ans == san[2]) # A,B,Cは選択肢の文字を仮で表している - - alreadySantaku = (fu >= 3) - ansIs1 = (ans == "1") - ansIs2 = (ans == "2") - ansIs3 = (ans == "3") - - ansAry = ans.chars - ansIsEmpty = (ansAry.empty?) - ansLength = ans.length - santakuNumbers = ["1","2","3"] - santakuTotalLength = san.join.length - - ansHasA = (ans.include?(san[0]))if san[0] # sanにnilがあるとinclude?で - ansHasB = (ans.include?(san[1]))if san[1] # エラーになるのでこうなった - ansHasC = (ans.include?(san[2]))if san[2] - - # ansIs123わかりにくくてすいません。回答に123が1個ずつあればOKを表しています - ansIs123 = ((ansAry + santakuNumbers).tally == {"1" =>2,"2" =>2,"3" =>2}) - ansIsABC = (ansHasA && ansHasB && ansHasC && ansLength == santakuTotalLength) - #ansIs順不同 - - selectNumber = (ans.to_i)-1 - select = san[selectNumber] - - #文字で答えた場合 || 番号で答えた場合 - if opt =~/(すべて)/ - return (ansIsABC) || - (ansIs123 && alreadySantaku) - - elsif opt =~ /(どれかひとつ)/ - return ([ansIsA,ansIsB,ansIsC].one?) || - ([ansIs1,ansIs2,ansIs3].one?) - - else #通常の三択 - return false if ans == "" - return (ans == seikai) || (select == seikai && alreadySantaku) - - end - -end - - -def putAnswer(row,santaku) - if row["答え"] != nil # 正解表示(通常) - printf("正解は%sでした。\n",row["答え"]) - return - end - # 以下では row["答え"] = nil - if row["オプション"] =~ /(すべて)/ # 正解表示(すべて) - printf("正解は%s,%s,%sすべてでした。\n",santaku[0],santaku[1],santaku[2]) - return - - elsif row["オプション"] =~ /(どれかひとつ)/ # 正解表示(どれか) - printf("正解は%s,%s,%sの中からひとつでした。\n",santaku[0],santaku[1],santaku[2]) - return - end -end - - -setumei = ["カスタムクイズ", - " 説明", - "専用のodsを使うことで、自由にクイズを作ることができます。", - "odsでつくったクイズが出題されるクイズです。", - "選択肢を出す場合、今は出せる選択肢は3つのみとなっております。", - "odsでの操作はodsに書いているのでそちらを見てください。", - "enterを押すと始まります。" - ] - -for i in setumei - puts i -end -gets - -countAns = 0 -countRight = 0 - -count = 0 # 今何問目なのか -print("\e[2J") -print("\e[H") - -startTime = Time.now.to_i -neta.each{|row| - - if row["オプション"] == "表示物" - printf("%s\n",row["問題"]) - gets - print("--------------------------\n") - next - end - count += 1 - dasita = 0 - comeback = 0 - printf("第%d問\n",count) - printf("%s\n", row["問題"]) - santaku = [row["三択1"], row["三択2"], row["三択3"]] - fuseikai = 0 # fuseikai >= 3で三択表示 - kaitou = nil - - while true - - #入力と三択システム - if comeback == 1 - wrong - - end - if row["オプション"] =~ /(三択なし)/ # 意地悪問題がいい人へ - dasita = 1 - - elsif ( fuseikai == 3 || row["オプション"] =~ /(三択)/ ) && - dasita != 1 - if row["オプション"] =~ /(三択)/ - fuseikai = 3 - end - num = 1 # 選択肢の番号 - for i in santaku - printf("%d => %s\n",num,i) - num += 1 - end - dasita = 1 # dasitaが1 =「三択出した」 2回以上の三択表示を防ぐ - end - - print"答えを入力..." - kaitou = gets.chomp - countAns += 1 - - if row["オプション"] !~ /(判定なし)/ - if isRightAns(kaitou,row["オプション"],santaku,row["答え"],fuseikai) - puts"正解!!" - countRight += 1 - sleep(0.5) - break - else - fuseikai += 1 - wrong - if row["オプション"] !~ /(1回だけ)/ - print("\e[2A") # 2行上 - print("\e[J") # 下のやつを消す - end - end - end - if row["オプション"] =~ /(正解を出す)/ - putAnswer(row,santaku) - end - if row["オプション"] =~ /(1回だけ|判定なし)/ - break - end - - end - if row["解説"] - printf("%s\n",row["解説"]) - gets - print"\e[1A" - end - - print("--------------------------\n") #何個でもいい仕切りの機能 - } - -# 終了時演出の変数の準備 -finishTime = Time.now.to_i - -text = neta["変更テキスト"][0] -finish = neta["終了時演出"][0] - -seitouritu = (((countRight.to_f)/(countAns.to_f))*100).truncate(1) -keikajikan = (finishTime - startTime) -heikinjikan = ((keikajikan.to_f)/(count.to_f)).truncate(1) - - -# 終了時演出の表示 - printf("正解数: %d回/%d回中 ",countRight,countAns)if finish =~ /(結果表示)/ - - printf("正答率: #{seitouritu}%% ")if finish =~ /(正答率)/ -print"\n" if finish =~ /(正解表示|正答率)/ - printf("経過時間: %d秒 ",keikajikan)if finish =~ /(経過時間)/ - - printf("平均回答時間: #{heikinjikan}秒 ")if finish =~ /(平均時間)/ - -print"\n" -if text - printf("%s\n",text)if text != "なし" -else - puts"終了!!おつかれさまでした!" -end -# おつかれさまでした!! diff --git a/happyou/tyouseityuu.rb b/happyou/tyouseityuu.rb new file mode 100755 index 0000000..3ec7cc6 --- /dev/null +++ b/happyou/tyouseityuu.rb @@ -0,0 +1,224 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +#調整中happyou + +require"curses" +require"csv" + +include Curses + +def delete + dy = 0 + while not dy == cols + dx = 0 + while not dx == lines + setpos(dy,dx) + delch + dx += 0.03125 / 2 + end + dy += 1 + end + refresh +end + +def loding(ld,lu) + printf("\e[0;1m") + delete + curs_set(0) + lx = 0 + srand() + ly = rand(ld..lu) + while not lx == ly + setpos(lines - 1,cols - 13) + addstr"読み込み中" + refresh + ldot = 0 + lx += 1 + sleep(0.6) + while not ldot == 3 + addch"." + refresh + ldot += 1 + sleep(0.5) + end + delete + refresh + end +end + +def cprint(cc,cy,cx,ct) + setpos(cy,cx) + printf("\e[m%s",cc) + addstr(sprintf("%s",ct)) + refresh +end + +def choice(cu,cd,cn) + x = cols / 2 + cn + y = 4 + sentaku = 1 + while 1 #1 + printf("\e[1;37m") + setpos(y,x) + addstr(">") + refresh + input = getch + setpos(y,x) + addch(" ") + refresh + case input + when Curses::KEY_UP + if y != cu + y -= 2 + sentaku -= 1 + end + when Curses::KEY_DOWN + if y != cd + y += 2 + sentaku += 1 + end + when Curses::KEY_RIGHT + break + end + end + delete + return sentaku +end + +sentaku = 0 +init_screen +begin + while 1#2 + delete + curs_set(0) + noecho + stdscr.keypad(true) + cprint("\e[1;21;33m",1,cols / 2 -5,"学習ゲーム") + cprint("\e[91m", 4,cols / 2 -5,"タイピング") + cprint("\e[94m", 6,cols / 2 -2,"計算") + cprint("\e[92m", 8,cols / 2 -5,"豆知識辞典") + cprint("\e[95m",10,cols / 2 -2,"電卓") + cprint("\e[96m",12,cols / 2 -5,"理科・社会") + cprint("\e[m" ,14,cols / 2 -2,"終了") + sentaku = choice(4,14,-7) + if sentaku == 6 # 終了 + break + end + loding(1,2) + if sentaku == 1 # タイピング + close_screen + system("ruby chinamini.rb") + init_screen +=begin + while 1#3 + delete + refresh + cprint("\e[1;4;31m",1,cols / 2 -5,">-=未定=-<") + cprint("\e[33m",4,cols / 2 -2,"未定") + cprint("\e[33m",6,cols / 2 -2,"未定") + cprint("\e[33m",8,cols / 2 -2,"未定") + cprint("\e[m",10,cols / 2 -2,"戻る") + sentaku = choice(4,10,-4) + if sentaku == 4 + break + end + cprint("\e[1;37m",lines / 2,cols / 2 -14,"どれかのキーを押してスタート") + getch + delete + if sentaku == 1 + elsif sentaku == 2 + elsif sentaku == 3 + end + end + loding(1,2) + redo +=end + elsif sentaku == 2 # 計算 + while 1#4 + delete + cprint("\e[1;4;34m",1,cols / 2 -5,">-=計算=-<") + cprint("\e[34m",4,cols / 2 -7,"足し算・引き算") + cprint("\e[34m",6,cols / 2 -7,"掛け算・割り算") + cprint("\e[34m",8,cols / 2 -2,"設定") + cprint("\e[m",10,cols / 2 -2,"戻る") + sentaku = choice(4,10,-9) + if sentaku == 3 + redo + elsif sentaku == 4 + break + end + cprint("\e[1;37m",lines / 2,cols / 2 -14,"どれかのキーを押してスタート") + getch + delete + keisan_kaisi = Time.now + keisan_mondai = 20 + keisan_toketa = 0 + keisan_tokenai = 0 + while keisan_mondai != keisan_toketa + cprint("\e[94m",1,1,sprintf("当たった問題数 %-2s問",keisan_toketa)) + if sentaku == 1 # +- + srand() + keisan_1 = rand(1..20) + keisan_2 = rand(1..20) + keisan_type = rand(1..2) + if keisan_type == 1 + keisan_ans = keisan_1 + keisan_2 + cprint("\e[1m",lines / 2 - 1,cols / 2 - 3.5,sprintf("%2d + %2d",keisan_1,keisan_2)) + elsif keisan_type == 2 + keisan_ans = keisan_1 - keisan_2 + cprint("\e[1m",lines / 2 - 1,cols / 2 - 3.5,sprintf("%2d - %2d",keisan_1,keisan_2)) + end + + elsif sentaku == 2 # */ + end + setpos(lines / 2 + 1,cols / 2 - 1) + echo + player_ans1 = getch + player_ans2 = getch if keisan_ans.to_s.length >= 2 + player_ans3 = getch if keisan_ans.to_s.length >= 3 + player_ans = [player_ans1,player_ans2,player_ans3].compact.join + if keisan_ans.to_s == player_ans + keisan_toketa += 1 + else + keisan_tokenai += 1 + end + delete + player_ans1,player_ans2,player_ans3 = nil,nil,nil + end + end + loding(1,2) + redo + elsif sentaku == 3 # 豆知識辞典 + close_screen + print"\e[m" + system("ruby j2114_last.rb") + init_screen +=begin + while 1#5 + delete + cprint("\e[1;4;32m",1,cols / 2 - 5,">-=未定=-<") + cprint("\e[m",4,cols / 2 -2,"戻る") + sentaku = choice(4,4,-4) + if sentaku == 1 + break + end + end + loding(1,2) +=end + elsif sentaku == 4 # 電卓 + close_screen + print"\e[m" + system("ruby j2124_last.rb") + init_screen + elsif sentaku == 5 # 理科・社会 + close_screen + print"\e[m" + system("ruby ume_quiz.rb") + init_screen + end + end + delete + ensure + close_screen +end diff --git a/happyou/ume_happyou.rb b/happyou/ume_happyou.rb index 0e45209..d7533e0 100755 --- a/happyou/ume_happyou.rb +++ b/happyou/ume_happyou.rb @@ -1,8 +1,7 @@ #!/usr/bin/env ruby # -*- coding: utf-8 -*- -#happyo---da-- -#おっし移植気合い入れるどお +#ちょっとかっこよくなったhappyou require"curses" require"csv" @@ -144,7 +143,6 @@ cprint("\e[34m",8,cols / 2 -2,"設定") cprint("\e[m",10,cols / 2 -2,"戻る") sentaku = choice(4,10,-9) - addstr sentaku.to_s if sentaku == 3 redo elsif sentaku == 4 @@ -159,38 +157,34 @@ keisan_tokenai = 0 while keisan_mondai != keisan_toketa cprint("\e[94m",1,1,sprintf("当たった問題数 %-2s問",keisan_toketa)) - if sentaku == 1 + if sentaku == 1 # +- srand() keisan_1 = rand(1..20) keisan_2 = rand(1..20) keisan_type = rand(1..2) - if keisan_type = 1 + if keisan_type == 1 keisan_ans = keisan_1 + keisan_2 - elsif keisan_type = 2 + cprint("\e[1m",lines / 2 - 1,cols / 2 - 3.5,sprintf("%2d + %2d",keisan_1,keisan_2)) + elsif keisan_type == 2 keisan_ans = keisan_1 - keisan_2 + cprint("\e[1m",lines / 2 - 1,cols / 2 - 3.5,sprintf("%2d - %2d",keisan_1,keisan_2)) end - cprint("\e[1m",lines / 2 - 1,cols / 2 - 3.5,sprintf("%2d + %2d",keisan_1,keisan_2)) - elsif sentaku == 2 + + elsif sentaku == 2 # */ end setpos(lines / 2 + 1,cols / 2 - 1) echo - if keisan_ans.to_s.length == 2 - player_ans1 = getch - player_ans2 = getch - if keisan_ans.to_s[0] == player_ans1 && keisan_ans.to_s[1] == player_ans2 - keisan_toketa += 1 - else - keisan_tokenai += 1 - end + player_ans1 = getch + player_ans2 = getch if keisan_ans.to_s.length >= 2 + player_ans3 = getch if keisan_ans.to_s.length >= 3 + player_ans = [player_ans1,player_ans2,player_ans3].compact.join + if keisan_ans.to_s == player_ans + keisan_toketa += 1 else - player_ans1 == getch - if keisan_ans.to_s[0] == player_ans1 - keisan_toketa += 1 - else - keisan_tokenai += 1 - end + keisan_tokenai += 1 end delete + player_ans1,player_ans2,player_ans3 = nil,nil,nil end end loding(1,2)