プチコンまとめWiki (初代/mkII)

Sample の変更点

パンくずリスト


#title(サンプルプログラム集)
初心者にも役に立つかもしれないサンプル的、および部品的なプログラムをここに集積しましょう。

#contentsx(depth=1:2)

// ================================================================================

* BASIC の基本 [#ka0b9a22]

// --------------------------------------------------------------------------------

** こんにちは、世界 [#y1a6f30b]
最初の一歩。文字列を表示する場合はダブルクォーテーションで囲む必要があります。&br;
なお、ダブルクォーテーションはコンソールに表示されません。
#basic{{
PRINT "Hello,world!"
}}

** ダブルクォーテーションの表示 [#s0ce9da3]
ダブルクォーテーションをコンソールに表示する場合は&basic{CHR$()};関数を使用する必要があります。
#basic{{
PRINT CHR$(34)
}}

// --------------------------------------------------------------------------------

** 個人情報を抽出 [#s592fbdf]
プチコンが個人情報を抽出して喜ぶプログラムです。
#basic{{
INPUT "あなたの なまえは" ; NAME$
INPUT "おとしは いくつですか" ; AGE
PRINT "あなたの なまえは " ; NAME$ ; " で"
PRINT "おとしは " ; AGE ; " さい ですね"
PRINT "こじんじょうほうを おいしく いただきました、 ククク"
WAIT 30
}}

// --------------------------------------------------------------------------------

** ひたすら数える [#pfe34d29]
524287まで0から順に数えていきます。
#basic{{
@LOOP
PRINT A
A=A+1
GOTO @LOOP
}}

// --------------------------------------------------------------------------------

** 時計 [#beacf805]
現在の時間を表示するだけのプログラム。
#basic{{
@TIME
LOCATE 0,0:PRINT"Р";TIME$
VSYNC 60
GOTO @TIME
}}

**ボタン入力待ち [#z843bf7f]
一行でAボタンの入力をまつプログラム。
16のところをいじると、どのボタンの入力待ちでも出来ます。
#basic{{
FOR I=0 TO 1:I=BUTTON()==16:NEXT
}}

**ブロックIFの代わり [#a3b36d29]
FOR文を用いてブロックIFを実装しています。

#basic{{
FOR I=1 TO A
 ?"Block IF"
NEXT
}}
この場合、&basic{A};の部分が条件式となり、&basic{?"Block IF"};の部分が処理となります。

// ================================================================================

** 下画面にスプライト表示 [#t28b78a3]
下画面にスプライトを表示するサンプルは以下の通り。付属のエディタ等で CHR リソースを作成しておく必要あり。(例ではファイル名 "TCHR01")

#basic{{
VISIBLE 1,1,1,1,1,1
PNLTYPE "OFF"
SPPAGE 1
LOAD"SPS0:TCHR01",FALSE
SPSET 0,0,0,0,0,0
SPOFS 0,100,100
VSYNC 600
}}

// ================================================================================

**超簡易ランチャー [#gb007a4c]
INPUTで文字列を取得し、それでEXECするプログラム。

#basic{{
INPUT A$
EXEC A$
}}

// --------------------------------------------------------------------------------

**少し違う無限ループ [#u4ca82d9]
ライオネルさんの「[[新しい無限ループ>Toukou/新しい無限ループ]]」と同じです。
#basic(hiragana){{
'---------------------------
'ループないのしょりをかく
'---------------------------
EXEC"このプログラムのファイルめい"
}}
*使用例 [#ub1508d9]
ファイル名は「&basic{PRG:TEST};」にしてください。~
#basic(hiragana){{
PRINT A
A=A+1
EXEC"TEST"
}}

* サブルーチン [#t92afc58]
サブルーチンは単独では動きません。自作のプログラムに混ぜて使います。

// --------------------------------------------------------------------------------

** ボタン入力 [#pe064d24]

*** 変数表 [#l954b06b]
- &basic{BTN}; : ボタン状態
- &basic{TRG}; : トリガ
- &basic{REP}; : リピート

*** プログラムリスト [#q009c994]
#basic{{
@GETBTN
BTN=BUTTON()
TRG=(NOT OLD_BTN)AND BTN
OFFTRG=OLD_BTN AND(NOT BTN)
REP=0
REPCNT=REPCNT+1
IF OLD_BTN!=BTN THEN REPCNT=0
IF REPCNT==0 THEN REP=BTN:GOTO @_GETBTN0
IF REPCNT<30 GOTO @_GETBTN0
IF (REPCNT-30)%5==0 THEN REP=BTN
@_GETBTN0
OLD_BTN=BTN
RETURN
}}

*** 使用例 [#u2084a0f]
#basic{{
CLEAR:CLS:S=0
@LOOP
 GOSUB @GETBTN
 IF (REP AND 8) THEN S=(S+1)%70
 IF (REP AND 4) THEN S=(S-1+70)%70
 IF (TRG AND 16) THEN BEEP S
 LOCATE 0,0:PRINT S;"  "
 VSYNC 1
GOTO @LOOP
}}

// --------------------------------------------------------------------------------

** 文字列を置き換える [#m54dd726]

*** 使い方 [#a0185095]
+ 置き換えたい文字列が入った文字列を &basic{H1$}; に入れる
+ 置き換えたい文字列を &basic{H2$}; に入れる
+ 置き換後の文字列を &basic{H3$}; に入れる
+ &basic{GOSUB @OKIKAE}; でサブルーチンを呼び出す
すると変換された文字列が &basic{H1$}; に入って帰ってくる。

*** プログラムリスト [#u0a2154d]
#basic{{
@OKIKAE
L1$=H1$:L2$=H2$:L3$=H3$
S1=LEN(L2$):S2=LEN(L3$)
FOR RI=0 TO LEN(L1$)-1
M1$=MID(L1$,RI,1)
M2$=MID(L2$,S3,1)
IF M1$!=M2$ THEN S3=0:M3$=""
IF M1$==M2$ THEN S3=S3+1:M3$=M3$+M1$
IF M3$==L2$ THEN F1=1
IF F1 THEN M4$=MID$(L1$,0,RI-LEN(L2$)+1):S4=LEN(M4$+L2$):S5=LEN(L3$)-LEN(L2$):M5$=MID$(L1$,S4,255)
IF F1 THEN M6$=M4$+L3$+M5$:L1$=M6$:RI=RI+S5-1:F1=0
NEXT
R1$=L1$
RETURN
}}

*** 使用例 [#k45ca7b8]
#basic{{
CLEAR:CLS
H1$="アカン"
H2$="ア"
H3$="オ"
GOSUB @OKIKAE
?R1$
}}

// --------------------------------------------------------------------------------

** 文字列の指定位置に文字列を挿入する [#h5b73e70]

*** 使い方 [#e9f543ad]
+ 文字列を &basic{H1$}; に入れる
+ 位置を  &basic{H2$}; に入れる
+ 位置に挿入する文字列を  &basic{H3$}; に入れる
+ &basic{@MIDL}; を呼び出す。すると &basic{R1$}; に変換された文字列が入って帰ってくる

*** プログラムリスト [#xb9f0f8f]
#basic{{
@MIDL
L1$=H1$:L2$=H2$:L3$=H3$
S1=VAL(L2$)
S2=LEN(L1$)
M1$=MID$(L1$,0,S1)
FOR RI=0 TO S1-S2-1
M1$=M1$+" "
NEXT RI
M2$=MID$(L1$,S1+1,255)
M3$=M1$+L3$+M2$ 
R1$=M3$
RETURN
}}

*** 使用例 [#ge802354]
#basic{{
CLEAR:CLS
H1$="たらこ"
H2$="1"
H3$="バス"
?H1$
GOSUB @MIDL
?R1$
}}

// --------------------------------------------------------------------------------

** それぞれのボタンの入力フレーム数を取得する [#re830b88]

*** 使い方 [#q26d91f5]
まず、このサブルーチンを呼ぶ前に &basic{DIM B(12)}; と配列を宣言しておいてください。

- &basic{IF B(0)==1 THEN};

などとすることで、上ボタンが押された瞬間だけ &basic{THEN}; 以降を実行するということもできます。

*** プログラムリスト [#yc2817f7]
#basic{{
@BTN
B=BUTTON():BA=1
FOR I=0 TO 11
IF B AND BA THEN B(I)=B(I)+1
IF (B AND BA)==0 THEN B(I)=0
BA=BA*2:NEXT:RETURN
}}

*** 使用例 [#h5bc05f1]
#basic{{
CLEAR:CLS
DIM B(12)
@LOOP
VSYNC 1
GOSUB @BTN
FOR I=0 TO 11
LOCATE 0,I:?B(I);"     "
NEXT
GOTO @LOOP
}}

// --------------------------------------------------------------------------------

** ' , ' で区切った文字列を分割する [#gd59d85f]

*** 使い方 [#a0bdd94f]
- &basic{H$}; に &basic{"A,B,C"}; のように文字列を区切って入れます。
- そして &basic{@BNKT}; を呼び出すと &basic{L$(0~9)}; にそれぞれ分割された文字列が入ります。

*** プログラムリスト [#kf601325]
#basic{{
@BNKT
F1=0:S1=0:M3$=""
FOR RI=0 TO LEN(H$)-1
F1=0
IF M1$==","THEN L$(S1)=M3$:S1=S1+1:M3$="":F1=1
M1$=MID$(H$,RI+1,1)
M2$=MID$(H$,RI,1)
IF F1==0 THEN M3$=M3$+M2$
NEXT
L$(S1)=M3$:S1=S1+1:M3$="":F1=1
H$=""
RETURN
}}

// --------------------------------------------------------------------------------

** 指定位置から文字列に上書き [#j8789f00]

*** 使い方 [#oe9e2c74]
- すぐ上に書いた「' , ' で区切った文字列を分割する」のサブルーチンの内容が、プログラムのどこかに必要です。
- &basic{H$}; に "文字列 , 開始位置 , 書き込む文字列" と入れて &basic{@MIDL2}; を呼び出すと、&basic{R1$}; に上書きされた文字列が入って帰ってきます。

*** プログラムリスト [#z7735e0d]
#basic{{
@MIDL2
GOSUB @BNKT
M1$=MID$(L$(0),0,VAL(L$(1)))
FOR RI=LEN(M1$) TO VAL(L$(1))-1
M1$=M1$+" "
NEXT
M2$=MID$(L$(0),LEN(M1$)+LEN(L$(2)),255)
M3$=M1$+L$(2)+M2$
R1$=M3$
RETURN
}}

*** 使用例 [#n8500b01]
#basic{{
CLEAR:CLS
H$="あいうえお,2,してる"
GOSUB @MIDL2
?R1$
@LOOP
GOTO @LOOP
}}

** カラーパレットを白黒化 [#colbw]

*** 使い方 [#oe9e2c74]
- &basic{@COLBW}; を呼び出すと、カラーパレットが白黒になります。

*** プログラムリスト [#colbw-List]
#basic{{
@COLBW
FOR P=0 TO 1
BGPAGE P
SPPAGE P
GPAGE P
FOR I=0 TO 255
COLREAD("SP",I),R,G,B
COLSET "SP",I,HEX$(FLOOR((R+G+B)/3),2)*3
COLREAD("BG",I),R,G,B
COLSET "BG",I,HEX$(FLOOR((R+G+B)/3),2)*3
COLREAD("GRP",I),R,G,B
COLSET "GRP",I,HEX$(FLOOR((R+G+B)/3),2)*3
NEXT
NEXT
RETURN
}}

** 楕円の描画 [#SinCosRing]

*** 使い方 [#SinCosUse]
- 変数を設定して&basic{@RING};を呼び出すと、だ円を描くことができます
--プチコン標準機能の&basic{GCIRCLE};は、だ円を描くことができません。このプログラムでは、三角関数を利用してだ円を含む円を描くことができます。

*** 変数リスト [#SinCosVar]
|変数|意味|
|X|始点X|
|X2|終点X|
|Y|始点Y|
|Y2|終点Y|
*** プログラムリスト [#SinCosList]
#basic{{
X2=0
X=0
Y2=0
Y=0

'--------------------

@RING

BX=0:BY=0
HANKEIX=ABS(X2−X)
HANKEIY=ABS(Y2−Y)
XS=HANKEIX/2
YS=HANKEIY/2

FOR G=0 TO 360
 X4=COS(RAD(G))*(XS)+X+XS
 Y4=SIN(RAD(G))*(YS)+Y+YS
 IF BX==0 AND BY==0 THEN BX=X4:BY=Y4
 GLINE BX,BY,X4,Y4,COL
 BX=X4:BY=Y4
NEXT

X4=COS(RAD(0))*(XS)+X+XS
Y4=SIN(RAD(0))*(YS)+Y+YS

GLINE BX,BY,X4,Y4,COL

RETURN
}}

** GPUTCHRで文字を表示する [#o52af76f]
*** 使い方 [#qe36a8a3]
&basic{PUT$};に文字列、&basic{PUTX};,&basic{PUTY};に位置(1ドット単位)&basic{PUTC};に文字色を入れて呼び出すと文字列をグラフィック面に描画します。

*** プログラムリスト [#nd16d5f6]
#basic{{
PUT$="HELLO WORLD!"
PUTX=80:PUTY=96
GOSUB @PUTSTR
END

@PUTSTR
DRAWX=PUTX:DRAWY=PUTY:DRAWC=PUTC
FOR I=0 TO LEN(PUT$)-1
 GPUTCHR DRAWX,DRAWY,"BGF",ASC(MID$(PUT$,I,1)),DRAWC,1
 DRAWX=DRAWX+8
 IF DRAWX>248 THEN DRAWX=DRAWX-248:DRAWY=DRAWY+8
NEXT
RETURN
}}

** 連想配列のようなもの [#e027ad13]

*** 使い方 [#h37b9b21]
使用している変数やラベル名は全てHT_*
-プログラム開始時に@HT_INITを呼ぶ
-HT_K$にキー, HT_V$に値を入れて@HT_SETを呼ぶと代入
-HT_K$にキーを入れて@HT_GETを呼ぶとHT_V$に値が戻ってくる

*** プログラムリスト [#p9367450]
前半部分はサンプル
#basic{{
ACLS:CLEAR:GOSUB@HT_INIT

HT_K$="AHO":HT_V$="HAGE"
GOSUB@HT_SET
HT_K$="HAHAHA":HT_V$="AHYA"
GOSUB@HT_SET

HT_K$="HAHAHA"
GOSUB@HT_GET
?HT_V$
HT_K$="AHO"
GOSUB@HT_GET
?HT_V$

END

@HT_INIT
 HT_P=0:HT_M=3000
 DIM HT_K$[HT_M],HT_V$[HT_M]
RETURN

@HT_INDEX 'HT_I=HT_K$
 HT_I=-1
 FOR HT_INDEX_I=0 TO HT_P-1
  IF HT_K$[HT_INDEX_I]==HT_K$ THEN HT_I=HT_INDEX_I
 NEXT
RETURN

@HT_NEWKEY 'HT_K$
 HT_K$[HT_P]=HT_K$
 HT_I=HT_P:HT_P=HT_P+1
RETURN

@HT_GET 'HT_V$=HT_K$
 HT_V$=CHR$(0)
 GOSUB@HT_INDEX
 IF HT_I!=-1 THEN HT_V$=HT_V$[HT_I]
RETURN

@HT_SET 'HT_K$,HT_V$
 GOSUB@HT_INDEX
 IF HT_I==-1 THEN GOSUB@HT_NEWKEY
 HT_V$[HT_I]=HT_V$
RETURN
}}

**デバッグルーチン [#ea6f9104]
ヤッフーさんの「[[デバッグルーチン>Toukou/デバッグルーチン]]」と同じです。
***使い方 [#z08b48f1]
三行目まで、プログラムの始めに、四行目からプログラムの最後に入れます。
やり方は、DEBUG$に、ルーチン名を入れて、GOSUBします。それだけで出来ます!
三行目までをプログラムの始めに、四行目からプログラムの最後に入れます。
そして、プログラム内でDEBUG$にルーチン名を入れてGOSUBします。

***プログラムリスト [#ga54e007]
#basic{{
DEBUG$=""
GOSUB @DEBUG
END

@DEBUG
IF DEBUG$=="@" OR DEBUG$=="" THEN RETURN
IF DEBUG$!="@" THEN DEBUG2$="@"+DEBUG$
GOTO DEBUG2$
RETURN
}}

表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.005 秒 | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30