TDJの隠れ家♪ トップ>HSP >Scripts>オセロ続き

オセロ続き

続きです。
2.hsp

*set  ;諸設定
  dim chip,10,10  ;ボードを設定 一つ目横 二つ目縦
  ;0無し 1黒 2白 3端
  dim chip2,10,10  ;仮想ボードを設定
  c=0        ;カウント用変数
  repeat 10
    chip(0,c)=3 : chip(9,c)=3 : c+=1
  loop
  c=1
  repeat 9
    chip(c,0)=3 : chip(c,9)=3 : c+=1
  loop
  chip(4,4)=2 : chip(4,5)=1 : chip(5,4)=1 : chip(5,5)=2
  buffer 1,,, : picload "chip1.bmp" : buffer 2,,, : picload "chip2.bmp" : buffer 3,,, : picload "chip3.bmp"
  player=2    ;プレイヤー変数
  point1=2
  gsel 0

内容は"osero.hsp"の始めとほとんど変わりません。

;メインループ
*main
  cls
  gosub *scan : gosub *check
  if point1 ! point1a : gosub *change
  pos 300,30 : mes "白:"+point2 : mes "黒:"+point1
  if player=2 : mes "あなたの番です" : else : mes "CPUの番です"
  button "パス",*pass
  if player=1 : goto *cpu
  goto *click

こちらも少ししか変わりません。相手がCPUなだけです。

*pass
  if player=2 : player=1 : else : player=2
  goto *main

パスしたときに実行される部分です。
プレーヤー変数の値を入れ替えます。

*check    ;ボードを作成
  c=1 : point1a=0 : point2=0
  repeat 8 : c1=1
    repeat 8
      if chip(c,c1)=0 : pos 30*c,30*c1 : gcopy 1
      if chip(c,c1)=1 : pos 30*c,30*c1 : gcopy 2 : point1a+=1
      if chip(c,c1)=2 : pos 30*c,30*c1 : gcopy 3 : point2+=1
      c1+=1
    loop : c+=1
  loop : return

これもあまり変わりません。

*change    ;プレイヤーチェンジ
  point1=point1a
  if player=2 : player=1:else : player=2
  return
*cpu

dim count,100
;dim chip3,10,10

c=0 : c1=0 : ka=0
*checkloop
  if chip2(c,c1)=1 : gosub *think
  c1+=1 : if c1=10 : c1=0 : c+=1
  if c=10 : goto *loopend
  ka+=1
  goto *checkloop

ここからが新たな部分です。

*think
  x=1 : n=0
  repeat    ;1
  if (chip(c+x,c1)=0)|(chip(c+x,c1)=3) : break
  if chip(c+x,c1)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c+n,c1)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;2
  if (chip(c-x,c1)=0)|(chip(c-x,c1)=3) : break
  if chip(c-x,c1)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c-n,c1)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;3
  if (chip(c+x,c1+x)=0)|(chip(c+x,c1+x)=3) : break
  if chip(c+x,c1+x)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c+n,c1+n)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;4
  if (chip(c-x,c1+x)=0)|(chip(c-x,c1+x)=3) : break
  if chip(c-x,c1+x)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c-n,c1+n)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;5
  if (chip(c-x,c1-x)=0)|(chip(c-x,c1-x)=3) : break
  if chip(c-x,c1-x)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c-n,c1-n)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;6
  if (chip(c+x,c1-x)=0)|(chip(c+x,c1-x)=3) : break
  if chip(c+x,c1-x)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c+n,c1-n)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;7
  if (chip(c,c1+x)=0)|(chip(c,c1+x)=3) : break
  if chip(c,c1+x)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c,c1+n)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;8
  if (chip(c,c1-x)=0)|(chip(c,c1-x)=3) : break
  if chip(c,c1-x)=player:{
    n=x-1
    if n<=0:break
    ;chip(c,c1)=player
    count(ka)+=1
    repeat n
      ;chip(c,c1-n)=player
      count(ka)+=1
      n-=1
    loop : break}
    x+=1
  loop
  return

*loopend
  c=0
  sortval count,1
  sortget max,0
  repeat
    if max>10 : max-=10 : c+=1 :else : break
  loop
  wait 50
  if count.0=0 : goto *pass
  mx=c : my=max : goto *reverse1

以下はまたほとんど同じです。

*scan    ;チップが置けるかどうか
  dim chip2,10,10
  c=1
  repeat 8 : c1=1
    repeat 8 : n=1
      repeat 2
        if (chip(c,c1)=n)&(chip(c,c1+1)=0) : chip2(c,c1+1)=1
        if (chip(c,c1)=n)&(chip(c,c1-1)=0) : chip2(c,c1-1)=1
        if (chip(c,c1)=n)&(chip(c+1,c1+1)=0) : chip2(c+1,c1+1)=1
        if (chip(c,c1)=n)&(chip(c-1,c1+1)=0) : chip2(c-1,c1+1)=1
        if (chip(c,c1)=n)&(chip(c-1,c1-1)=0) : chip2(c-1,c1-1)=1
        if (chip(c,c1)=n)&(chip(c+1,c1)=0) : chip2(c+1,c1)=1
        if (chip(c,c1)=n)&(chip(c-1,c1)=0) : chip2(c-1,c1)=1
        if (chip(c,c1)=n)&(chip(c+1,c1-1)=0) : chip2(c+1,c1-1)=1
        n+=1
      loop : c1+=1
    loop : c+=1
  loop : return

*click
  repeat
    stick k : if k=256 : break
    wait 1
  loop : goto *click2
*click2
  if (mousex<300)&(mousey<300):goto *click3 : else : goto *click
*click3
  if chip2(mousex/30,mousey/30)=1:{
      mx=mousex/30 : my=mousey/30
      goto *reverse1}
    else : goto *click
*reverse1    ;裏返しチェック
  x=1 : n=0
  repeat    ;1
  if (chip(mx+x,my)=0)|(chip(mx+x,my)=3) : break
  if chip(mx+x,my)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx+n,my)=player : n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;2
  if (chip(mx-x,my)=0)|(chip(mx-x,my)=3) : break
  if chip(mx-x,my)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx-n,my)=player
      n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;3
  if (chip(mx+x,my+x)=0)|(chip(mx+x,my+x)=3) : break
  if chip(mx+x,my+x)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx+n,my+n)=player : n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;4
  if (chip(mx-x,my+x)=0)|(chip(mx-x,my+x)=3) : break
  if chip(mx-x,my+x)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx-n,my+n)=player : n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;5
  if (chip(mx-x,my-x)=0)|(chip(mx-x,my-x)=3) : break
  if chip(mx-x,my-x)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx-n,my-n)=player : n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;6
  if (chip(mx+x,my-x)=0)|(chip(mx+x,my-x)=3) : break
  if chip(mx+x,my-x)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx+n,my-n)=player : n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;7
  if (chip(mx,my+x)=0)|(chip(mx,my+x)=3) : break
  if chip(mx,my+x)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx,my+n)=player : n-=1
    loop : break}
    x+=1
  loop
  x=1 : n=0
  repeat    ;8
  if (chip(mx,my-x)=0)|(chip(mx,my-x)=3) : break
  if chip(mx,my-x)=player:{
    n=x-1
    if n<=0:break
    chip(mx,my)=player
    repeat n
      chip(mx,my-n)=player : n-=1
    loop : break}
    x+=1
  loop
  goto *main

1つ目を理解した人ならある程度分かると思います。
見た通り、非常に無駄が多いスクリプトとなっております。
いくらでも改善の余地はあると思いますが、こんな考え方もあるのだと、割り切って見てください。