ループ文について

 投稿者:たこす  投稿日:2016年12月 8日(木)06時45分41秒
  初めまして、たこすと申します。
よろしくお願いします。

最近10進basicを始めまして、ちょっとつまずいてしまった所があります。

図形をキーボードのiキーが押される度に図形を1マスずつ上に動かし、
5マス上に動かしたらそこでループが終了というプログラムを作っています。
iキーが押されたら図形が描画される所までは上手くいったのですが、
ループ文を記述したらiキーを押しても描画されません。
どのように記述すれば上手くいくでしょうか。
ご返答よろしくお願いします。



SET bitmap SIZE 300,300
SET WINDOW -10,10,-10,10

20 CLEAR
   DRAW grid
   CHARACTER INPUT nowait: a$

   PICTURE ao
      SET COLOR 2
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE

   LET A=0

   DO WHILE A<6
      IF a$="i" THEN DRAW ao WITH SHIFT(0,A+1)
   LOOP

   FOR ti=0 TO 5000000
   NEXT ti
   goto 20
END
 

Re: ループ文について

 投稿者:たろさ  投稿日:2016年12月 8日(木)08時32分29秒
  > No.4176[元記事へ]

たこすさんへのお返事です。

> 初めまして、たこすと申します。
> よろしくお願いします。

私、2年生です。思いつくまま凄く適当です。

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
20
   CHARACTER INPUT  A$
   IF A$="i"  THEN
      CLEAR
      DRAW grid
      LET A=A+1
      DRAW ao WITH SHIFT(0,A)
      IF A=5 THEN GOTO 30
      GOTO 20
   END IF

   PICTURE ao
      SET COLOR 2
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE
30

END
-----------------------------
上から下へ

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=5
DO
   CHARACTER INPUT  A$
   IF A$="i"  THEN
      CLEAR
      DRAW grid0
      LET A=A-1
      DRAW ao WITH SHIFT(0,A)
   END IF
LOOP UNTIL A=0
PICTURE ao
   SET COLOR 2
   PLOT AREA:3,0;3,1;1,1;1,0
   PLOT AREA:-1,0;-1,1;-3,1;-3,0
END PICTURE

END

-----------------------------------------

応用して円板も入れた。

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=5
LET B=-5
DO
   CHARACTER INPUT  A$
   IF A$="i"  THEN
      CLEAR
      DRAW grid0
      LET A=A-1
      LET B=B+1
      SET COLOR 3
      DRAW disk WITH SCALE(1)*SHIFT(-2,B)
      SET COLOR 4
      DRAW disk WITH SCALE(1)*SHIFT(2,B)
      DRAW ao WITH SHIFT(0,A)
   END IF
LOOP UNTIL A=0
PICTURE ao
   SET COLOR 2
   PLOT AREA:3,0;3,1;1,1;1,0
   PLOT AREA:-1,0;-1,1;-3,1;-3,0
END PICTURE
END


--------------------------------------
タイマーに連動させました。iの入力はできませんが

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=7
LET B=-8.35
10
   DO
      LET t1=TIME
      IF MOD(IP(t1/10+ta),2)=0 THEN
         LET ta=ta+1
         CLEAR
         DRAW grid0
         LET A=A-1
         LET B=B+1
         SET COLOR 3
         DRAW disk WITH SCALE(1)*SHIFT(SIN(b)*2,COS(b)*2)
         SET COLOR 4
         DRAW disk WITH SCALE(1)*SHIFT(COS(a)*2,SIN(a)*2)
         DRAW ao WITH SHIFT(0,A)
         GOTO 10
      END IF
   LOOP UNTIL A=0
   PICTURE ao
      SET COLOR 2
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE
END



http://blogs.yahoo.co.jp/donald_stinger

 
 

Re: ループ文について

 投稿者:nagram  投稿日:2016年12月 8日(木)11時23分1秒
  たこすさんへのお返事です。

こんなのはどうでしょうか。

SET ECHO "OFF"   ! 出力ウインドウに"i"を表示させない
SET bitmap SIZE 300,300
SET WINDOW -10,10,-10,10
DRAW grid
DRAW ao   ! 初期画面に四角が不要なら削除

FOR A=1 TO 5
   DO
      CHARACTER INPUT a$
   LOOP UNTIL a$="i"
   CLEAR
   DRAW grid
   DRAW ao WITH SHIFT(0,A)
   WAIT DELAY 1    !  1秒待機
NEXT A

PICTURE ao
   SET COLOR 2
   PLOT AREA:3,0;3,1;1,1;1,0
   PLOT AREA:-1,0;-1,1;-3,1;-3,0
END PICTURE

END
 

Re: ループ文について

 投稿者:たこす  投稿日:2016年12月 8日(木)14時30分8秒
  > No.4177[元記事へ]

たろささんありがとうございます。
どのプログラムも大変勉強になりました。
タイマー機能を最終的に実装したいなと思っていた所でしたので、
このプログラムはドンピシャでした。

もう一つ質問があるのですが、青色の図形を変数が0になるまで移動したら、今度は赤色の図形を変数が1になるまで移動させようと思っています。この時に赤色の図形の移動にうつる時に、青色の図形が消えてしまいます。

最終的に移動した青色の図形を残しつつ、赤色の図形を移動させるにはどのように記述すれば良いでしょうか。

よろしくお願い致します。


SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=10
LET B=10

10
   DO
      LET t1=TIME
      IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
         LET ta=ta+1
         CLEAR
         DRAW grid
         LET A=A-1
         DRAW ao WITH SHIFT(0,A)
         GOTO 10
      END IF
   LOOP UNTIL A=0

20
   DO
      LET t1=TIME
      IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
         LET ta=ta+1
         CLEAR
         DRAW grid
         LET B=B-1
         DRAW aka WITH SHIFT(0,B)
         GOTO 20
      END IF
   LOOP UNTIL B=1

   PICTURE ao
      SET COLOR 2
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE

   PICTURE aka
      SET COLOR 4
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE
END
 

Re: ループ文について

 投稿者:たこす  投稿日:2016年12月 8日(木)14時43分17秒
  > No.4178[元記事へ]

nagramさんありがとうございます。

大変勉強になり、当初に望んでいた通りの表現ができました。
本当にありがとうございます。
今たろささんがタイマー機能を活用して、ループ文を考えています。
最初のループ文が終わった直後にDRAW aoを指定しても消えてしまうのは、
次のループ文が始まり、自動的にDRAW aoが消されてしまうからなのでしょうか。

当初の質問内容と少しずれでしまいましたが、お時間があるときで大丈夫ですので、
ご返答頂けると幸いです。よろしくお願い致します。
 

Re: ループ文について

 投稿者:たろさ  投稿日:2016年12月 8日(木)17時41分28秒
  > No.4179[元記事へ]

たこすさんへのお返事です。


> このプログラムはドンピシャでした。

私、超能力ある?

私、日本語苦手なので、説明も下手です。段階を追って、3つ書きました。

--------------------------------------
SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=10

10
   DO
      LET t1=TIME
      IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
         LET ta=ta+1
         CLEAR
         DRAW grid
         LET A=A-1
         SET COLOR 2
         DRAW ao WITH SHIFT(0,A)
         SET COLOR 4
         DRAW ao WITH SHIFT(0,A+1)
         GOTO 10
      END IF
   LOOP UNTIL A=0

   PICTURE ao
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE

END
----------------------------------------

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=10

10
   DO
      LET t1=TIME
      IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
         LET ta=ta+1
         CLEAR
         DRAW grid
         LET A=A-1
         IF MOD(A,2)=0 THEN
            SET COLOR 2
            DRAW ao WITH SHIFT(0,A)
         ELSE
            SET COLOR 4
            DRAW ao WITH SHIFT(0,A+1)
         END IF
         GOTO 10
      END IF
   LOOP UNTIL A=0

   PICTURE ao
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE

END
------------------------------------


SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=10
LET B=10

DO
   LET t1=TIME
   IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
      LET ta=ta+1
      CLEAR
      DRAW grid
      LET A=A-1
      IF A<0 THEN
         LET B=B-1
         SET COLOR 2
         DRAW ao WITH SHIFT(0,0)
         SET COLOR 4
         DRAW ao WITH SHIFT(0,B)
      ELSE
         SET COLOR 2
         DRAW ao WITH SHIFT(0,A)
      END IF
   END IF
LOOP UNTIL B<2

PICTURE ao
   PLOT AREA:3,0;3,1;1,1;1,0
   PLOT AREA:-1,0;-1,1;-3,1;-3,0
END PICTURE

END

--------------------------

ご依頼のタイプは3番目のプログラムだと思われます。


少し遊んで見ました。

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=10
LET B=10
LET C=10
DO
   LET t1=TIME
   IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
      LET ta=ta+1
      CLEAR
      DRAW grid
      LET A=A-1
      IF A<0 THEN
         LET B=B-1
         SET COLOR 2
         DRAW ao WITH SHIFT(0,0)
         SET COLOR 4
         DRAW ao WITH SHIFT(0,B)
      END IF
      IF B<0 THEN
         LET C=C-1
         SET COLOR 2
         DRAW ao WITH SHIFT(0,0)
         SET COLOR 4
         DRAW ao WITH SHIFT(0,1)
         SET COLOR 3
         DRAW ao WITH SHIFT(0,C)
      ELSE
         SET COLOR 2
         DRAW ao WITH SHIFT(0,A)
      END IF
   END IF
LOOP UNTIL C=2

PICTURE ao
   PLOT AREA:3,0;3,1;1,1;1,0
   PLOT AREA:-1,0;-1,1;-3,1;-3,0
END PICTURE

END


http://blogs.yahoo.co.jp/donald_stinger

 

Re: ループ文について

 投稿者:nagram  投稿日:2016年12月 8日(木)19時30分32秒
  > No.4180[元記事へ]

たこすさんへのお返事です。

> 最初のループ文が終わった直後にDRAW aoを指定しても消えてしまうのは、
> 次のループ文が始まり、自動的にDRAW aoが消されてしまうからなのでしょうか。

最初のループ文が終わった直後にDRAW aoを実行しても、すぐ次のループが実行されCLEAR文で画面がすべて消去されてしまうからです。
PICTURE aoを再描画する必要があります。

SET bitmap SIZE 600,600
SET WINDOW -10,10,-10,10
LET A=10
LET B=10

10
   DO
      LET t1=TIME
      IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
         SET DRAW MODE HIDDEN  ! チラつき防止
         LET ta=ta+1
         CLEAR
         DRAW grid
         LET A=A-1
         DRAW ao WITH SHIFT(0,A)
         SET DRAW MODE EXPLICIT  ! チラつき防止
         !  GOTO 10  この行は不要です
      END IF
   LOOP UNTIL A=0

20
   DO
      LET t1=TIME
      IF MOD(IP(t1/ 0.5+ta),2)=0 THEN
         SET DRAW MODE HIDDEN  ! チラつき防止
         LET ta=ta+1
         CLEAR   ! 画面消去
         DRAW grid
         DRAW ao WITH SHIFT(0,A)  ! aoの再描画
         LET B=B-1
         DRAW aka WITH SHIFT(0,B)
         SET DRAW MODE EXPLICIT  ! チラつき防止
         !  GOTO 20  この行は不要です
      END IF
   LOOP UNTIL B=1

   PICTURE ao
      SET COLOR 2
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE

   PICTURE aka
      SET COLOR 4
      PLOT AREA:3,0;3,1;1,1;1,0
      PLOT AREA:-1,0;-1,1;-3,1;-3,0
   END PICTURE
END

aoとakaで重複している部分も多いので、それをまとめると、たろささんの3番目のプログラムになります。
 

Re: ループ文について

 投稿者:たろさ  投稿日:2016年12月 8日(木)22時31分30秒
  > No.4182[元記事へ]

nagramさんへのお返事です。

何時もお世話になります。皆様に教えて頂いた内容をまとめて、1分間のタイマーに仕立てました。

LET t0=TIME
SET bitmap SIZE 600,600
LET W=11
SET WINDOW -w,w,-w,w
SET TEXT FONT "MS ゴシック",20
LET A=11
DO
   WAIT DELAY .5
   LET t2=t2+1
   LET A=A-1
   SET AREA COLOR 1
   PLOT AREA:-W,-W;-W,W;W,W;W,-W
   IF MOD(A,2)=0 THEN
      LET t1=t1+1
      SET COLOR 6
      DRAW ao WITH SHIFT(0,A)
      SET TEXT COLOR 5
      PLOT TEXT ,AT -.2, A: STR$(ABS(A))
      PLOT TEXT ,AT -7, -7: STR$(t1-1)
   ELSE
      SET COLOR 5
      DRAW ao WITH SHIFT(0,A)
      SET TEXT COLOR 6
      PLOT TEXT ,AT -.2, A: STR$(ABS(A))
      PLOT TEXT ,AT -7, -7: STR$(t1-1)
   END IF
   IF A<-9 THEN
      LET A=11
      LET B=B+1
   END IF
LOOP UNTIL t2=>120-4

PICTURE ao
   PLOT AREA:3,0;3,1;1,1;1,0
   PLOT AREA:-1,0;-1,1;-3,1;-3,0
END PICTURE

LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END

本当はアナログ時計にしたかったのですが、私の力不足です。


後で気になって、


DECLARE EXTERNAL SUB Analog
OPTION ANGLE DEGREES
LET t0=TIME
CALL Analog(360)
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"
END

EXTERNAL SUB Analog (t3)
OPTION ANGLE DEGREES
SET bitmap SIZE 600,600
LET W=15
SET WINDOW -w,w,-w,w
SET TEXT FONT "MS ゴシック",40
LET B=0
DO
   SET DRAW MODE HIDDEN
   WAIT DELAY .98
   SET COLOR 2
   DRAW disk WITH SCALE(12)*SHIFT(0,0)
   SET COLOR 0
   DRAW disk WITH SCALE(11)*SHIFT(0,0)
   ! DRAW GRID0
   SET COLOR 2
   PLOT TEXT ,AT -1.4,8: STR$(12)
   PLOT TEXT ,AT 8.5,-1.5: STR$(3)
   PLOT TEXT ,AT -.85,-11: STR$(6)
   PLOT TEXT ,AT -10.5,-1.5: STR$(9)
   ! PLOT TEXT ,AT -1.3,-1.5: STR$(b/6+1)
   LET B=B+6
   SET COLOR 3
   DRAW disk WITH SCALE(.5)*SHIFT(SIN(b)*7,COS(b)*7)
   SET DRAW MODE EXPLICIT
LOOP UNTIL B=>t3
END SUB


BASIC Acc で動作してます。

http://blogs.yahoo.co.jp/donald_stinger

 

戻る