2014年9月22日月曜日

リーグ戦の組み合わせ作成プログラム

;hsp3.21
;league.as 03.12.29
;リーグ戦組み合わせ表
;#include "debug.as"
 font "MS ゴシック",16: objmode 2
 file="league.txt" ;出力ファイル
 mes "チーム数を入力してください。"
 input nteam
 button "OK",*l_ok
*l_reinput
 objsel 0: c=-1: sendmsg objinfo(0,2),177,0,varptr(c)
 repeat: wait 1
  stick c,,1
  if c==32 {
   break
  }
 loop

*l_ok
 if nteam\2|(nteam<4)|(nteam>98) {
  dialog "4~98の偶数を入力してください"
  goto *l_reinput
 }
 cls
 mes "このウィンドウに表示されるのは進捗状況です。"
 mes "結果は"+file+"に出力されます。"
 mes "表は、例えば、第0日の第1試合はチーム0とチーム1が対戦するという意味です"
 mes "途中で終了させても、そこまでの結果は出力されます"
 ;nteam=6   ;チーム数
 days=nteam-1  ;日数
 ngame=nteam/2  ;1日の試合数
 sdim buf,(days*6+2)*(ngame+2)+100
 sdim s,days*6+1
 bsave file,buf,1
 ;↑後のbsaveはファイルがないとエラーになるので、とりあえずファイルを作る
 dim teamA,days,ngame ;第i日第j試合の対戦チームA
 dim teamB,days,ngame ;第i日第j試合の対戦チームB
 dim taisen,nteam,nteam ;対戦済みフラグ
 dim use,days,nteam  ;その日にチームを使ったことのフラグ
 ;taisen初期化(i==jについて1にする)
 repeat nteam: taisen.cnt.cnt=1: loop
 ;表示
 gosub *l_head
 repeat days,1
  if cnt>9 { s=" " } else { s="  " }
  buf+=" 0-"+cnt+s
 loop
 mes buf
 ;メイン
 iday=0
 repeat  ;日付ごとのループ
  title "iday="+iday+" 解数="+nsol
  if flg!=2 {  ;正解が見つかって戻ったのでなければ
   ;第0試合を固定する(常にteamA.iday.0=0)
   c=iday+1
   teamB.iday.0=c ;0の相手は常にiday+1
   use.iday.0=1: use.iday.c=1: taisen.0.c=1: taisen.c.0=1
   base=1: igame=1
   ;第1試合以降
  }
  repeat ;1試合ごとのループ
   await
   if flg!=2 { ;次の試合から戻ったのでなければ
    ;teamAを探す(使ってないだけで十分)
    flg=0
    repeat: if base>=nteam {
     break
    }
     if use.iday.base==0 {
      flg=1
      a=base ;仮のteamA
      break
     }
     base++
    loop
   }
   if flg { ;teamAが見つかったとき
    flg=0
    ;teamBを探す(使っていず、aと対戦していないチーム)
    repeat: base++: if base>=nteam {
     break
    }
     if use.iday.base==0 { if taisen.a.base==0 {
      flg=1
      break
     } }
    loop
    if flg { ;teamBが見つかったとき
     teamA.iday.igame=a
     teamB.iday.igame=base
     use.iday.a=1: use.iday.base=1
     taisen.a.base=1: taisen.base.a=1
     ;表示
     x=iday*48+8: y=igame*16+96
     color 255,255,255: boxf x,y,x+40,y+15
     color: pos x,y: mes ""+a+"-"+base
     ;次の試合の準備
     igame++
     if igame>=ngame {
      break
     }
     base=a+1 ;次の試合のteamAはこの試合のteamAの次から探す
     ;↑この試合のteamBに使えなくても次の試合のteamAには
     ;↑使えるかもしれない。
    } else { ;teamBが見つからなかったとき
     base=a+1 ;この試合のteamAを探し直す
    }
   } else {  ;teamAを終わりまで調べたとき
    igame--
    if igame>=1 {
     ;前の試合に戻る
     gosub *l_clrgame
    } else {
     iday--
     if iday>=0 {
      ;前の日の最後の試合に戻る
      igame=ngame-1
      gosub *l_clrgame
     } else {
      buf="組み合わせ数="+nsol+"\n"
      l=strlen(buf)
      bsave file,buf,l,fp
      pos 0,ngame*16+112: mes "組み合わせ数="+nsol
      mes "終了しました"
      stop
     }
    }
   }
  loop
  iday++
  if iday>=days {  ;正解発見
   gosub *l_head
   i=0
   repeat ngame
    repeat days
     if teamA.cnt.i>9 { s=" " } else { s="  " }
     if teamB.cnt.i>9 { t="-" } else { t="- " }
     buf+=s+teamA.cnt.i+t+teamB.cnt.i
    loop
    buf+="\n"
    i++
   loop
   buf+="\n"
   l=strlen(buf)
   bsave file,buf,l,fp: fp+=l
   nsol++
   ;最終日の最後の試合に戻る
   iday--
   igame=ngame-1
   gosub *l_clrgame
  }
 loop
end  ;ここには来ない

*l_head
 buf="": s=""
 repeat days
  if cnt>9 { t="  " } else { t="   " }
  buf+=t+cnt+"  "
  s+="------"
 loop
 buf+="\n"+s+"\n"
return

*l_clrgame
 flg=2
 ;別のteamBを探す
 a=teamA.iday.igame
 base=teamB.iday.igame
 ;useとtaisenを戻す
 use.iday.a=0: use.iday.base=0
 taisen.a.base=0: taisen.base.a=0
return

 ;試し表示
 iday=0: base=0
 repeat days
  n=base
  repeat ngame
   teamA.iday.cnt=n: n++
   teamB.iday.cnt=n: n++
   if n>9 {
    n=0
   }
  loop
  iday++: base+=2: if base>9 {
   base=0
  }
 loop
 mes "  0  1  2  3  4  5  6  7  8"
 mes "---------------------------"
 i=0: y=32
 repeat ngame: x=0
  repeat days
   pos x,y: mes " "+teamA.cnt.i+teamB.cnt.i
   x+=24
  loop
  i++: y+=16
 loop
stop
8チーム以上だと遅くなります

カレンダー(一部バグあり)


;hsp3.21
;
#include "anthspex3.as"

 ;↓added by hsp2to3
 dim br,16
 sdim s,64
 sdim t,64
 sdim u,64
 ;↑added by hsp2to3

;このカレンダーは、以下のことを事実と考えて作られています
;・紀元前46年からユリウス暦(したがって、それ以前の動作は未定義)
;・紀元前44年から紀元前8年まで、誤って3年ごとに13の閏年が設けられた
;・上記の誤りを正すため、紀元前5年、紀元前1年、西暦4年は閏年にしなかった
;・紀元前1年の翌年は西暦1年
;・1582年10月4日の翌日は10月15日で、この日からグレゴリオ暦
; (実際の採用は国によって異なる)
;※日本については1873年1月1日から有効

 fsize=16
 hw=fsize+4  ;1日分の高さ
 bday=fsize+8 ;1日分の横幅
 bmon=bday*7+8 ;1月分の横幅
 ;各月の日数
 dim mday,13
 ;mday.2(2月の日数)は後で書き換える
 mday=0,31,28,31,30,31,30,31,31,30,31,30,31
 ;国民の祝日
 nholiday=15
 dim holidaym,nholiday
 dim holidayd,nholiday
 dim holidayw,nholiday
 dim holidayy,nholiday
 ;↓後で年による修正が行なわれる
 ;        0 1  2 3  4 5 6 7 8 9 10 11 12 13 14
 holidaym=1,1, 2,3, 4,5,5,5,7,9, 9,10,11,11,12
 holidayd=1,0,11,0,29,3,4,5,0,0, 0, 0, 3,23,23
 holidayw=0,2, 0,0, 0,0,0,0,3,3, 0, 2, 0, 0, 0
 ;holidayd=0 は春分・秋分・第n月曜
 ;holidaywは第何月曜か
 ;有効開始年
 ;        正月 成人 建国 春分 昭和 憲法 みど 子供 海   敬老 秋分 体育 文化 勤労 天皇
 ;        0    1    2    3    4    5    6    7    8    9    10   11   12   13   14
 holidayy=1873,1948,1873,1948,1912,1948,1985,1948,1996,1966,1948,1966,1873,1948,1989
 ;画面
 wid=bmon*4+16: heit=(8*3+3)*hw
 screen 0,wid,heit,,(ginfo_dispx-wid)/2,(ginfo_dispy-heit)/2
 title "-46年(日本では1873年)から有効なカレンダー"
 getsyscolor br,15: if br==192 {
  br--
 }
 dup bg,br.1: if bg==192 {
  bg--
 }
 dup bb,br.2: if bb==192 {
  bb--
 }
 color br,bg,bb: boxf
 font "MS ゴシック",fsize: color
 year=gettime(0)
 wyear=fsize*2+10: hyear=fsize
 objh=fsize+8
 btw=fsize+8: objsize btw
 x=(wid-(btw*2+wyear+44))/2: y=8
 pos x,y: button "←", *l_back: x+=btw+4: btleft=oid: oid++
 inyear=""+year
 xyear=x: yyear=y+4
 pos x,y: input inyear,wyear,objh,4: x+=wyear: inid=oid: oid++
 pos x,y+4: mes "年": x+=fsize+4
 pos x,y: button "→", *l_forw: x+=btw+4: btrit=oid: oid++
 begy=y+32
*l_restart
 if year<0 {
  if year<-7 { ;-8年以前
   if year\3==-2 {
    mday.2=29
   } else {
    mday.2=28
   }
  } else {  ;~-1年
   mday.2=28
  }
 } else { if year\4!=0 {  ;4の倍数でない
  mday.2=28
 } else { if year\400==0 { ;400の倍数
  mday.2=29
 } else { if year\100==0 { ;100の倍数
  if year<1582 {
   mday.2=29
  } else {
   mday.2=28
  }
 } else { if year!=4 {  ;4年でない
  mday.2=29
 } else {     ;4年
  mday.2=28
 } } } } }
 if year>1872 {
  ;春分の日・秋分の日の計算
  d=year-2000
  e=d*2421904
  holidayd.3 =(e+6911500)/10000000-(d/4)+(d/100)-(d/400)+20
  holidayd.10=(e+ 900000)/10000000-(d/4)+(d/100)-(d/400)+23
  ;祝日
  repeat nholiday
   if holidayw.cnt>0 {
    ;第 n 月曜の祝日の日付確定
    getweek c,year,holidaym.cnt,1
    d=holidayw.cnt*7
    if c<2 { ;1日が日曜か月曜のとき
     holidayd.cnt=d-5-c
    } else { ;1日が火曜~土曜のとき
     holidayd.cnt=d+2-c
    }
   }
  loop
  if 1912<=year&(year<=1913) { holidaym.4=8: holidayd.4=31 } ;天長節(大正)
  else { if 1914<=year&(year<=1926) { holidaym.4=10: holidayd.4=31 } ;同上
  else { if 1927<=year { holidaym.4=4: holidayd.4=29 } } } ;昭和天皇誕生日
  if 1948<=year {
   if year<=1999 {
    holidayd.1=15 ;成人の日
   }
  }
  if 1948<=year&(year<1966) { holidayd.2=0 } ;建国記念の日
  else { holidayd.2=11 }
  if year>=1966 {
   if year<=1999 {
    holidayd.11=10 ;体育の日
   }
   if year<=2002 {
    holidayd.9=15: holidayd.8=20 ;敬老の日、海の日
   }
  }
 }
 ;1月1日の曜日
 if year>=1582 { ;1582年~
  getweek week,year,1,1
  if year==1582 {
   week=(week+3)\7
  }
 } else { if year>4 { ;5~1581
  week=(year*365+((year-1)/4)+5)\7
 } else { if year>0 { ;1~4
  week=(year*365+6)\7
 } else { if year>-8 { ;-7~-1
  week=(year+84)*365\7
 } else {    ;-44~-8
  week=((year+84)*365+((year+85)/3)+2)\7
 } } } }
 ;カレンダー表示
 by=begy: mon=1
 color br,bg,bb: boxf 16,by,wid,heit
 repeat 12
  ;月の表示
  bx=(mon-1)\4*bmon+16: y=by
  color: pos (bday*7-32)/2+bx,y: mes ""+mon+"月"
  ;曜日の表示
  x=bx: y+=hw
  digit s,""+year,'0',4: digit t,""+mon,'0',2
  s+=t
  if s!"187300">0&(s!"187603"<0) { color }
  else { color 255,0,0 }
  pos x,y: mes "日": x+=bday
  color: pos x,y: mes "月 火 水 木 金": x+=bday*5
  if year>=1873&(s!"187603"<0)|(year<1850) { ;~1850,1873/1~1876/2
   color
  } else { ;1872年以前と1876/3~
   if s!"199204">0 { color 255,0,0 } ;1992/5~
   else { color 0,0,255 }
  }
  pos x,y: mes "土"
  ;日付の表示
  day=1-week: y+=hw
  repeat 6
   x=bx
   w=0
   repeat 7
    if day>0 {
     ;祝日判定
     flg=0 ;祝日フラグ
     repeat nholiday
      if holidayd.cnt==day {
       if holidaym.cnt==mon {
        ;日本では1873年1月1日より太陽暦。
        ;それ以前の祝日は意味なし
        if year>1872 { if year>=holidayy.cnt {
         flg=1
         if year>2007 {
          ;祝日の間の日は休日(敬老と秋分の差が2日の場合)
          if cnt==9 {
           if day+2==holidayd.10 {
            furikae=1
           }
          }
         }
        } }
       }
      }
     loop
     r=0: b=0
     digit s,""+year,'0',4: digit t,""+mon,'0',2: digit u,""+day,'0',2
     s+=t+u
     if year>=1873&(s!"18760312"<0) { ;1873年~1876年3月11日
      if day\5==1 {
       if day!=31 {
        r=255
       }
      }
     } else {   ;1872年以前と1876年3月12日以降
      if (cnt==6) {   ;土曜
       if s!"19920500">0|flg { r=255 }
       else { if year>=1850 { b=255 } }
      } else { if cnt==0 { ;日曜
       r=255
       if flg {
        if s!"19730412">=0 {
         furikae=1
        }
       }
      } else { ;土日以外
       r=0
       if flg {
        r=255
       } else {
        if furikae {
         r=255: furikae=0
        }
       }
      } }
     }
     ;日付の表示
     color r,0,b
     pos x,y
     astr s,day,2,' '
     mes s
    }
    day++
    if year==1582 {
     if mon==10 {
      if day==5 {
       day=15
      }
     }
    }
    if day>mday.mon {
     week=(cnt+1)\7 ;翌月1日の曜日
     break
    }
    x+=bday
    w++
   loop
   if day>mday.mon {
    break
   }
   y+=hw
  loop
  mon++
  if (mon-1)\4==0 {
   by+=hw*8
  }
 loop
 objsel inid: objselstr inid,0,-1
 ;キー入力待ち
 repeat: wait 10
  stick key,,1
  if key&37 {
   break ;←,→,Enter
  }
  prmx=ginfo_act: prmy=ginfo_sel
  if act!=prmx {
   if prmx==0 {
    objsel inid: objselstr inid,0,-1
   }
   act=prmx
  }
 loop
 if key==1 {
  goto *l_back ;←
 }
 if key==4 {
  goto *l_forw ;→
 }
 ;Enter
 year=0+inyear
 if year==0 {
  year=1: goto *l_setyear
 }
 goto *l_restart

*l_back
 year--
 if year==0 {
  year=-1
 }
goto *l_setyear

*l_forw
 year++
 if year==0 {
  year=1
 }
*l_setyear
 s=""+year
 objprm inid,s
goto *l_restart
たまにバグあり。

戦車ゲーム


基本設定

ゲームスピード
game_speed


弾MAX
ball_max
*/

/*
弾設定

弾の種類
ball_type
1 自分の弾
2 敵の弾
3 味方の弾

弾の角度(radian)
ball_angle_radian

弾の位置
ball_posx
ball_posy

弾の存在・弾の種類など保存
ball_life
*/

/*
自機設定

自機の角度
mainbody_angle

自機の角度(radian)
mainbody_angle_radian

自機の位置
mainbody_posx
mainbody_posy
*/
;自機のスピード
mainbody_acc_speed  =4

;自機の回転スピード
mainbody_acc_anglespeed =int(2.2 * mainbody_acc_speed)
/**/


;初期設定
game_speed=50 ;ゲームスピード
ball_max=50  ;計算できるすべての弾の合計
ball_type=3  ;弾の種類数


;すべて小数点を扱えるようにする(弾丸)
dimtype ball_angle_radian,vartype("double"),ball_max;弾の角度(ラジアン)
dimtype ball_posx,vartype("double"),ball_max  ;弾の位置
dimtype ball_posy,vartype("double"),ball_max
dimtype ball_life,vartype("int"),ball_max,2   ;弾が飛ぶ時間
dimtype ball_type_vol,vartype("int"),ball_type  ;弾の種類別の量

;すべて小数点を扱えるようにする(自機)
dimtype mainbody_angle_radian,vartype("double"),1 ;自機の角度(ラジアン)
dimtype mainbody_posx,vartype("double"),1   ;自機の位置
dimtype mainbody_posy,vartype("double"),1

screen 0,400,400,0:gsel 0,2
mainbody_posx=ginfo(12)/2
mainbody_posy=ginfo(13)/2

gosub *gos_loadsound ;音を読み込む



*mainrepeat   ;メインリピート始まり

redraw 1:await game_speed:redraw 0

gosub *gos_keyget   ;ボタン感知
gosub *gos_mainbody  ;自機関係
gosub *gos_ball   ;弾関係

goto *mainrepeat  ;リピート戻る




;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;弾丸関係

*gos_ball
 gosub *gos_ball_acc  ;弾の計算
 gosub *gos_ball_draw ;弾の表示
 return

*gos_ball_acc ;/////////弾の計算/////////

repeat ball_max
 if ball_life(cnt,1)=0{continue}

 switch ball_life(cnt,0)        ;タイプ別に スピードと飛距離を設定
 case 1 :ball_acc_speed=8 :ball_acc_life=15 :swbreak
 swend

 ball_life(cnt,1)+=1         ;弾がどのくらいで消えるか(飛距離)
 if ball_life(cnt,1) > ball_acc_life {    ;弾消去
  ball_life(cnt,1) = 0
  ball_type_vol(ball_life(cnt,0)) -=1    ;タイプ別の弾の合計数を減らす
            ;弾爆発音
  }
   
 ball_posx(cnt)=ball_posx(cnt)+(sin(ball_angle_radian(cnt))*ball_acc_speed) ;弾の場所を計算
 ball_posy(cnt)=ball_posy(cnt)+(cos(ball_angle_radian(cnt))*ball_acc_speed)
 loop
 return


*gos_ball_add ;/////////弾発行/////////
;弾発行 例
;ball_pub_type=1
;ball_pub_angle=rnd(360)
;ball_pub_posx=100   ;rnd(ginfo(12))
;ball_pub_posy=100   ;rnd(ginfo(13))

;弾の合計数を調節(例 自分の弾は合計4発までしか発行できないなど)
ball_type_max_ch=0:switch ball_pub_type
  case 1
 if ball_type_vol(ball_pub_type)=4:ball_type_max_ch=1
  swbreak
  swend
 if ball_type_max_ch=1:return
 
;弾発行
repeat ball_max
 if ball_life(cnt,1)!0{continue}
 ball_life(cnt,0)=ball_pub_type          ;タイプ発行
 ball_type_vol(ball_life(cnt,0)) +=1         ;タイプ別の弾の合計数を増やす
 ball_life(cnt,1)=1             ;消えるまでのタイム用
 ball_angle_radian(cnt)=3.14159265 * ball_pub_angle / (180.0)  ;ラジアンをここで計算
 ball_posx(cnt)=double(ball_pub_posx)        ;弾の初期位置を実数にして代入
 ball_posy(cnt)=double(ball_pub_posy)
                ;弾発射音
 break
 loop

 return


*gos_ball_draw ;/////////弾の摸写/////////

repeat ball_max
 if ball_life(cnt,1)=0{continue}
 pset int(ball_posx(cnt)),int(ball_posy(cnt))
 loop
 
 return

;弾丸関係
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
;自機関係


*gos_mainbody
 gosub *gos_mainbody_acc  ;自機の計算
 gosub *gos_mainbody_draw ;自機の表示
 gosub *gos_mainbody_keyget ;自機から発射される弾のキー調査
 return

*gos_mainbody_acc
 mainbody_angle_radian = 3.14159265 * double(mainbody_angle) / (180.0)
 mainbody_posx=mainbody_posx + ((sin(mainbody_angle_radian(cnt))*mainbody_acc_speed) ) * mainbody_move
 mainbody_posy=mainbody_posy + ((cos(mainbody_angle_radian(cnt))*mainbody_acc_speed) ) * mainbody_move
 return

*gos_mainbody_draw
 pset int(mainbody_posx),int(mainbody_posy)
 return

*gos_mainbody_keyget ;弾発射ボタン
 getkey mainbody_ball,90:if mainbody_ball=1{mainbody_ball_ch=1} ;Z
 getkey mainbody_ball,88:if mainbody_ball=1{mainbody_ball_ch=1} ;X

 if mainbody_ball_ch=1{
  ;弾発行手続き
  ball_pub_type=1
  ball_pub_angle=mainbody_angle
  ball_pub_posx=mainbody_posx
  ball_pub_posy=mainbody_posy
  ;弾発射
  gosub *gos_ball_add
  mainbody_ball_ch=0
  }
 return


;自機関係
;|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

;基本的なキー操作取得
*gos_keyget
 stick key,1+2+4+8
 mainbody_move=0
 if key&1:mainbody_angle+=mainbody_acc_anglespeed  ;回転
 if key&2:mainbody_move+=1        ;前進
 if key&4:mainbody_angle-=mainbody_acc_anglespeed  ;回転
 if key&8:mainbody_move-=1        ;後進
 return

;音声ファイルの読み込み
*gos_loadsound
 ;発射
 ;爆発
 return
戦車ゲームです。
画像は適当に。

山田ウイルス防護プログラム

#uselib "ADVAPI32.DLL"
#cfunc global RegCloseKey "RegCloseKey" sptr
#cfunc global RegOpenKeyExA "RegOpenKeyExA" sptr,sptr,sptr,sptr,sptr
#cfunc global RegDeleteValueA "RegDeleteValueA" sptr,sptr
#define HKEY_CURRENT_USER  $80000001
#define KEY_SET_VALUE    $00000002
#define NULL     0

TitleName ="山田ウィルスチェッカー.exe 2つのレジストリだけ削除"
sdim SubKey,128,3:sdim ValueName,128,3
SubKey ="Software\\Microsoft\\Windows\\CurrentVersion\\Explorer","Software\\Microsoft\\Windows\\CurrentVersion\\Run"
ValueName="Count","SVCHOST",""

screen 0,400,200,2
title TitleName
syscolor 15:boxf:sysfont 17:syscolor 7
mes "山田チェッカーに書き換えられたレジストリを削除します。\n(現在2つのキーのみ対応。)"
objsize ginfo(12),ginfo(15)+10
button gosub "スクリーンショットした回数のレジストリを削除",*regdel
button gosub "自動実行のレジストリを削除",*regdel
width ,ginfo(23):gsel 0,1
stop

*regdel
 id=stat
 flg=RegOpenKeyExA(HKEY_CURRENT_USER,varptr(SubKey(id)),0,KEY_SET_VALUE,varptr(hkey))
 if flg{dialog "キーをオープン出来ませんでした。":return}
 flg=RegDeleteValueA(hkey,varptr(ValueName(id)))
 if flg{dialog "キーから値を削除出来ませんでした。":flg=RegCloseKey(hkey):return}
 flg=RegCloseKey(hkey):dialog "キーから値を削除しました。"
 return
が山田ウイルス防護プログラムです
ちなみに数年前に流行った糞プロです

2014年9月9日火曜日

コードとか色々

;
; ヨッパライゲームサンプル
; onitama / WEB+DB PRESS 2011/6
;
#packopt name "yopparai"
#pack "chr.bmp"

#module
#deffunc fprt str _p1
; fprt "message"
; (画像を使用したフォント表示を行ないます)
; "message" : 表示するメッセージ
; 表示座標は、posで指定した位置から
;
i=0:st=_p1

repeat
a1=peek(st,i):i++:if a1=0 : break
if a1=13 {
a1=peek(st,i)
if a1=10 : i++
continue ; 改行
} else {
celput 1,a1
}
loop
return

#deffunc putscore
gmode 0
pos 0,0:fprt "SCORE "+score@
return

#global

title "Yopparai"
randomize
screen 0,640,480
celload "chr.bmp",1
celdiv 1,16,16,0,0
*start
cls 4

pos 210,128
fprt "Y O P P A R A I"
pos 234,300
fprt "PRESS ENTER"
putscore

repeat
stick key
if key&$30 : break
if key&128 : end
await 24
loop

level=2
score=0

*go
cls 4
color 255,255,255
boxf 0,20,20,480
boxf 620,20,640,480
repeat level*4+8
y=rnd(8)*32+64
x=rnd(16)*32+64
boxf x,y,x+32,y+32
loop

x=320.0:y=440:px=0.0:dir=0.0
*main
redraw 0
color 0,0,0
boxf 0,0,640,16
boxf x,y,x+32,y+32

stick key,15
if key&1 : dir=-0.5
if key&4 : dir=0.5
if key&128 : end
px=limitf(px+dir,-10,10)
x=x+px
y=y-1
score++

pget x+8,y-1:hit=ginfo_r
pget x+16,y-1:hit+=ginfo_r
pget x+24,y-1:hit+=ginfo_r

color 255,255,255
circle x+8,y+26,x+24,y+42
gmode 2
pos x,y:celput 1,$21,2,2

putscore
redraw 1
await 24

if hit : goto *miss
if y>20 : goto *main

pos 320,0:fprt "GOOD!"
level++
wait 300

goto *go

*miss
repeat 32
redraw 0
color 0,0,0
boxf x,y,x+32,y+32
gmode 2
pos x,y:celput 1,$21+(cnt&3),2,2
redraw 1
await 96
loop

goto *start
↑のコードは酔っ払いゲーム。左右ボタンで操作。
;
; IEコンポーネントを使ったブラウザ
;
#define DIID_DWebBrowserEvents2     "{34A715A0-6587-11D0-924A-0020AFC7AC4D}"
#define DISPID_NAVIGATECOMPLETE2    252
cls 1
sdim url,512
url="http://hsp.tv/"
objsize 600,24
pos 0,2:mes "URL:"
pos 0,26:mes "WEB Browser Sample"
pos 40,0:input url
objsize 120,24
pos 520,24:button "移動",*wow
pos 400,24:button "進む",*go_f
pos 280,24:button "戻る",*go_b
pos 0,48
axobj ie, "Shell.Explorer.2",640,480-48
num=stat
comevent ie_event, ie, "{34A715A0-6587-11D0-924A-0020AFC7AC4D}",*event ; DIID_DWebBrowserEvents2    
ie->"Navigate" url
*main
stop
*event
; COMイベント処理
dispid = comevdisp(ie_event)
if dispid = DISPID_NAVIGATECOMPLETE2 : gosub *OnNavigateComplete2
return

*OnNavigateComplete2
name = ie("LocationURL")
objprm 0,name
pDoc = ie("Document")
name = pDoc("Title")
title name
delcom pDoc
return
*wow
ie->"Navigate" url
goto *main
*go_f
ie->"GoForward"
goto *main
*go_b
ie->"GoBack"
goto *main
↑はウェブブラウザです。
;
; SQL serverのバージョンと現在時刻を得る
; (MySQL+MyODBCで確認)
;
#include "hspdb.as"

sdim buf,1024
sdim dsn,256
dsn="TEST"

; ODBC環境の初期化
dbini
if stat : dialog "ODBC環境がありません。終了します。("+stat+")" : end

screen 0,320,200:cls 1
objmode 1,1:objsize 320,24
mes "DSN名:"
input dsn
button "接続",*start
stop

*start

clrobj 1

; DBドライバに接続します
; ODBCのDSN設定であらかじめデータベースを準備しておく必要があります。
dbopen "DSN="+dsn
if stat : dialog "DB接続できませんでした。終了します。("+stat+")" : end

; 接続が成功したら、後はSQLを自由に送信することができます。
; SQLの送信はdbsend、結果はdbgetsで取得してください。

mes "QUERY VERSION:"
dbsend "SELECT VERSION();"
if stat : dialog "SQL送信に失敗しました。("+stat+")" : goto *over
gosub *resput

mes "QUERY NOW:"
dbsend "SELECT NOW();"
if stat : dialog "SQL送信に失敗しました。("+stat+")" : goto *over
gosub *resput

*over

dbclose ; DBとの接続を切ります

stop

*resput ; 結果の表示

; SQLの結果を取得します。多くの場合すぐに終了します。
; 結果が長い場合やネットワーク越しの場合は時間がかかることがあります。
;
repeat
dbgets buf ; 結果の取得
if stat : break ; すべて取得したらループから抜ける
mes buf
loop
return
↑は時計。









*notepad



*paint



*calc



*owari
screen 0,200,200:title "タイルランチャ"

objsize 100,100
pos 0 ,0 :button "メモ帳",*notepad
pos 100,0 :button "ペイント",*paint
pos 0 ,100:button "電卓",*calc
pos 100,100:button "終了",*owari
stop

;メモ帳を起動する
exec "notepad.exe"
stop

;ペイントを起動する
exec "mspaint.exe"
stop

;電卓を起動する
exec "calc.exe"
stop

;プログラムを終了する
end
↑はタイルランチャー。

みんな使えよ!

いろんなソースコード