本文へスキップ

Clamini library

計算1分勝負

 HSPでプログラミングの練習がてら作ってみた、ちょっとした脳トレ計算ゲームです。内容はシンプルで、1分間ひたすら答えが1桁になる加算・減算・除算を解いていくスタイル。 集中力と反射神経が試されるので、頭のウォーミングアップになります!

ゲーム画面

計算1分勝負

概要

タイトル計算1分勝負
ジャンル脳トレ計算
プレイ人数1人
動作環境Windows11 (64bit)

操作方法

1から9キー解答する

使い方

ダウンロード


 下のリンクからファイルをダウンロードできます。

 ※ZIP形式で圧縮されてるので、使う前に解凍してね! keisan.zip

遊び方


 ゲームを起動すると、まずタイトル画面が表示されます。
いずれかのキーを押すと、いよいよスタート!

 表示されるのは、答えが1桁になる足し算、引き算と割り算。
出てきた問題に対して、正しい数字キーをポチッと押していきましょう。
テンキーを使う場合は、NumLockがオンになってるか確認してね。

 制限時間は1分!その間にどれだけ多く正解できるかチャレンジしてみてください。
時間が切れるとゲーム終了→タイトル画面に戻ります。集中力勝負です…!

ソースコード


#packopt name "keisan"
    title "計算1分勝負 - High Speed Math"
    randomize

*start
    cls
    mode = 0 : score = 0 : number = 0 : siki = ""
    ans_key = 0      ; 回答した数字を保持する変数
    result_flag = 0  ; 0:通常 1:正解 2:不正解
    
    ; --- タイトル画面 ---
    repeat
        redraw 0
        gradf 0, 0, ginfo_winx, ginfo_winy, 1, $000044, $000000
        color 255, 255, 255 : font msgothic, 60, 1 : pos 140, 150 : mes "計算1分勝負"
        font msgothic, 25, 1 : pos 170, 280
        if (cnt / 30) \ 2 : color 200, 200, 200 : else : color 50, 50, 50
        mes "PRESS ANY KEY TO START"
        redraw 1
        stick k, 0, 1
        if k != 0 : break 
        wait 2
    loop
    wait 20

    start_total_sec = gettime(4)*3600 + gettime(5)*60 + gettime(6)
    limit_sec = 60 

*main
    current_total_sec = gettime(4)*3600 + gettime(5)*60 + gettime(6)
    passed_sec = current_total_sec - start_total_sec
    if passed_sec < 0 : passed_sec += 86400
    time = limit_sec - passed_sec
    if time <= 0 : time = 0 : goto *gameover

    if mode = 0 : gosub *sikisakusei

    redraw 0
    gosub *draw_ui
    redraw 1
    
    gosub *key_check
    wait 2
    goto *main

; --- UIの描画 ---
*draw_ui
    gradf 0, 0, ginfo_winx, ginfo_winy, 1, $222222, $000000
    color 40, 40, 40 : boxf 0, 0, 640, 80
    color 0, 200, 255 : line 0, 80, 640, 80
    
    font msgothic, 30, 1
    pos 40, 25 : color 200, 200, 200 : mes "SCORE:"
    pos 140, 25 : color 255, 255, 255 : mes strf("%04d", score)
    pos 380, 25 : color 200, 200, 200 : mes "TIME:"
    if time <= 10 : color 255, 50, 50 : else : color 255, 255, 255
    pos 470, 25 : mes strf("%02d", time) + "s"
    
    color 60, 60, 60 : boxf 100, 150, 540, 350
    color 0, 200, 255 : line 100, 150, 540, 150 : line 540, 150, 540, 350
    line 540, 350, 100, 350 : line 100, 350, 100, 150
    
    if mode = 1 {
        ; 式の表示用文字列を作成
        display_siki = siki
        if result_flag > 0 : display_siki += str(ans_key) ; 回答済みなら数字を足す
        
        font msgothic, 100, 1
        ; 影
        pos 124, 204 : color 0, 0, 0 : mes display_siki
        ; 本体
        pos 120, 200 : color 255, 255, 255 : mes display_siki
        
        ; 正誤の重ね表示
        if result_flag > 0 {
            font msgothic, 200, 1
            pos 220, 150
            if result_flag = 1 : color 0, 255, 0 : mes "〇"
            if result_flag = 2 : color 255, 0, 0 : mes "×"
        }
    }
    return

; --- キー入力判定 ---
*key_check
    if result_flag > 0 : return 
    a = 0
    repeat 9, 1
        getkey k1, cnt + 48 : getkey k2, cnt + 96
        if k1 | k2 : a = cnt : break
    loop
    if a = 0 : return 

    ans_key = a ; どの数字キーを押したか記録
    if a == number {
        score += 100
        result_flag = 1
    } else {
        result_flag = 2
    }
    
    ; 回答数字を含めて再描画
    redraw 0 : gosub *draw_ui : redraw 1
    wait 25
    
    result_flag = 0
    mode = 0
    return

; --- 問題作成 ---
*sikisakusei
    ans = rnd(9) + 1 : type = rnd(3)
    if type = 0 : x = rnd(ans) : y = ans - x : siki = str(x) + "+" + str(y) + "="
    if type = 1 : y = rnd(10) : x = ans + y : siki = str(x) + "-" + str(y) + "="
    if type = 2 : y = rnd(9) + 1 : x = ans * y : siki = str(x) + "÷" + str(y) + "="
    number = ans : mode = 1
    return

; --- ゲームオーバー ---
*gameover
    ; --- リザルト演出 ---
    screen 0, 640, 480
    buffer 1, 640, 480 : color 0, 0, 0 : boxf ; 黒いフェード用のバッファを作成

    gsel 0 ; 操作先をメインウィンドウに戻す

    repeat 50
       redraw 0
    
       ; 1. 背景と文字を先に描画
       color 255, 255, 255 : boxf ; 背景クリア
       color 255, 50, 50 : font msgothic, 80, 1
       pos 180, 200 : mes "TIME UP!"
    
       ; 2. 上から黒い画像を重ねてフェードアウトさせる
       ; gmode 3, 幅, 高さ, 輝度(0-256)
       gmode 3, 640, 480, cnt * 5
       pos 0, 0
       gcopy 1, 0, 0 ; バッファ1(黒)をコピー
    
       redraw 1
       wait 5
    loop
    wait 50

    ; スコアに応じたランク判定
    rank_msg = ""
    if score < 500   : rank_msg = "見習い計算員"
    if score >= 500  : rank_msg = "一人前計算員"
    if score >= 1500 : rank_msg = "計算マスター"
    if score >= 2500 : rank_msg = "暗算の達人"
    if score >= 3500 : rank_msg = "人間計算機"

    ; 最終結果表示
    redraw 0
    color 0, 0, 0 : boxf
    
    ; 金色の枠線
    color 255, 215, 0 : line 50, 50, 590, 50 : line 590, 50, 590, 430
    line 590, 430, 50, 430 : line 50, 430, 50, 50
    
    color 255, 255, 255 : font msgothic, 30, 1
    pos 100, 100 : mes "=== 最終結果発表 ==="
    
    font msgothic, 50, 1 : pos 120, 180
    color 200, 200, 200 : mes "SCORE:"
    color 255, 255, 255 : pos 300, 180 : mes strf("%04d", score)
    
    font msgothic, 40, 1 : pos 120, 260
    color 200, 200, 200 : mes "RANK :"
    color 255, 255, 0   : pos 300, 260 : mes rank_msg
    redraw 1

    ; ウェイト
    wait 1000
    goto *start