HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0614
tentun数字が入力されている入力ボックスだけ、無効にしたい3解決


tentun

リンク

2012/6/14(Thu) 12:03:44|NO.47259

はじめまして。HSPというかプログラム初心者です。
文章の表現方法含めご指導いただければと思います。よろしくお願いいたします。

9×9のマス(将棋盤のようなもの)を作り、数字1文字を一部のマスに入力し、
ボタンによって、入力があるマスのみを無効にしたいのです。

一応スクリプトを書いてみたんですが、すべてのマスが無効になってしまいます。

マスのスクリプトは以下のように1マス1マス指定してます。
(リピートが上手く使えませんでした)
1−1段目というのは、9×9のマスを1グループ3×3ずつ分割したうちの
1つ目のグループの1段目ということです。


x=20 : y=50 : a=52 ; x,y:最初のボックスの位置 a:間隔 objsize 50 , 50, 2 ; 入力ボックスのサイズ ;1−1段目 pos x,y : num="" : input num , , , 1 pos x+a,y : num="" : input num , , , 1 pos x+a*2,y : num="" : input num , , , 1 ;1−2段目 pos x,y+a : num="" : input num , , , 1 pos x+a,y+a : num="" : input num , , , 1 ・・・中略・・・ pos x+a*7+10,y+a*7+10: num="" : input num , , , 1 pos x+a*8+10,y+a*7+10: num="" : input num , , , 1 ;9−3段目 pos x+a*6+10,y+a*8+10: num="" : input num , , , 1 pos x+a*7+10,y+a*8+10: num="" : input num , , , 1 pos x+a*8+10,y+a*8+10: num="" : input num , , , 1 ;数字固定ボタン objsize 220 , 50, 2 : pos 275 , 570 : button "数字を固定する" , *hold ;消去ボタン objsize 220 , 50, 2 : pos 20 , 570 : button "数字を全て消す" , *erase stop ;数字固定 *hold dialog "数字を固定します。", 2 , "確認" ;「はい」ボタンを押した場合・・・ if stat = 6 { repeat 81 , 1 if strlen(  ) = 0 : objenable cnt , 0 : else : objenable cnt , 1 loop } stop

一応、repeat、strlen、cntなどを使うと思って作ってみたのですが、
わからなくて最後のstrlenの部分は空欄になってます(T_T)
昨日始めたばかりで、基本から理解不足は否めないんですが、
よろしくお願いいたします。
マスの効率的な作り方も教えていただきたいです。

過去ログを検索したんですが、同様のものは見つからず…
もし、過去ログにあるようなら、そちらを教えていただければと思います。



この記事に返信する


kino

リンク

2012/6/14(Thu) 12:18:25|NO.47260

>9×9のマス(将棋盤のようなもの)を作り、数字1文字を一部のマスに入力し、
>ボタンによって、入力があるマスのみを無効にしたいのです。

自分なりの解釈でちょっと書いてみましたー
間違っていたらごめんなさい。


screen 0,640,640 x=20 : y=50 : a=52 ; x,y:最初のボックスの位置 a:間隔 objsize 50 , 50, 2 ; 入力ボックスのサイズ dim num,81 repeat 9 ya=cnt repeat 9 xa=cnt pos x+a*xa,y+a*ya : num(c)="" : input num(c) , , , 1 c++ loop loop ;数字固定ボタン objsize 220 , 50, 2 : pos 275 , 570 : button "数字を固定する" , *hold ;消去ボタン ; objsize 220 , 50, 2 : pos 20 , 570 : button "数字を全て消す" , *erase stop ;数字固定 *hold dialog "数字を固定します。", 2 , "確認" ;「はい」ボタンを押した場合・・・ if stat = 6 { repeat 81 if num(cnt)!="" : objenable cnt , 0 : else : objenable cnt , 1 loop } stop



玄冬

リンク

2012/6/14(Thu) 13:05:01|NO.47261

>kinoさん
それだと数値以外を誤入力した時も固定されてしまいますよ


#const S 52 ;S:間隔 screen 0, 508,560 sdim a_num, 1, 81 ;マスごとの値を管理する配列 repeat 81 pos 20 + (cnt\9) * S, 20 + (cnt/9) * S input a_num(cnt), 50, 50, 1 loop objsize 208 , 50, 2 pos 20 , 488 : button "数字を全て消す" , *erase ;消去ボタン pos 280, 488 : button "数字を固定する" , *hold ;固定ボタン stop *hold dialog "数字を固定します。", 2 , "確認" if stat = 6 { ;「はい」ボタンを押した場合・・・ repeat 81 if a_num(cnt) = int(a_num(cnt)) : objenable cnt , 0 ;値が数値であればばマスを無効にする loop } stop *erase sdim a_num, 1, 81 ;マスごとの値を初期化 repeat 81 objprm cnt, a_num(cnt) ;マスごとの値を画面に反映 objenable cnt , 1 ;マスを有効にする loop stop

数字と仰られているので、範囲は0〜9にしましたが、
もし1〜9にしたい場合は*hold中の条件式を
a_num(cnt) = int(a_num(cnt)) から 0 < int(a_num(cnt))
に変更して下さい。

初心者だということですので少し、丁寧に解説しておくと
変数は代入されると前の値は破棄されるので、numという変数ひとつで81マスを管理することはできません。
マスと同じだけの変数が必要になります。
とは言え一々81個も変数書く必要はなく、配列という物を利用すれば楽に管理できます。

>マスの効率的な作り方
ですが、kinoさんのように二重ループを用いる方法と
割り算の商と余りを利用する方法があります。
0÷9→商0余0
1÷9→商0余1
2÷9→商0余2

9÷9→商1余0
10÷9→商1余1
11÷9→商1余2

78÷9→商8余6
79÷9→商8余7
80÷9→商8余8

余りを横、商を縦に用いると長方形に並べることができます。
※HSPでは/が割り算の商、\が余りを求める計算記号になっています。

この割り算法も二重ループ法も一長一短あるので、ご自分で使い分けて下さい。



tentun

リンク

2012/6/14(Thu) 14:55:04|NO.47262

ありがとうございました!
解決しました。
プログラムって、同じ処理でも人によって違うスクリプトをかかれるので、
面白いですね。お二人ともすごい参考になりました!
また質問させていただきたいです。
今後もよろしくお願いします。



ONION software Copyright 1997-2023(c) All rights reserved.