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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1218
ぜろうまくいきません4解決


ぜろ

リンク

2016/12/18(Sun) 14:31:30|NO.77634

もうよくわからなくなってこれ以上進みません、どうすればいいでしょうか。

//将棋の特殊ルールのゲームを作る
//歩1 角2 飛車3 香車4 桂馬5 銀6 金7 王8 無0
//第一フェイズで王様の場所を決める 自陣内 お互いの画面が見える 10秒間
//第二フェイズですべての駒の配置を決める 自陣内 駒は手持ちの銭で好きなものを買える 強い駒ほど銭が高い 例えばすべて香車でも可能
//戦闘開始 敵を倒すと銭が手に入る 戦闘フェイズでも駒を買える 駒の配置は無制限 農民から米を搾取しているので 1ターンごとに銭が一定額手に入る
//駒は合体ができる ただし小さい駒が大きい駒に乗ることができる 合体すると両方の効きマスに移動できる 倒されるときは同時に両方 降りることもできる
//戦争が長引くと農民が疲弊して搾取量が減り最後には0になる
//搾取量は自分で決めるが農民一揆ゲージがありそれを超えて搾取すると農民一揆がおきて搾取が5ターン使えなくなる
//一手15秒 変動する 銭で時間を買える
//事件が起きてゲームバランスを変動する 侵略的目的で意図的に起こすこともできる 例 キリスト教伝来 鉄砲伝来 物価高騰
//事件は3つくらいがじゃんけんくらいの関係になってちょうどいい
//あくまで3手読みの範囲で将棋を楽しめるバランスにしたい


*top
//ロード
screen 0,1000,700,0,200,0//id,xsize,ysize,type,ichix,ichiy

mmload "button19.mp3",0,0
mmload "button68.mp3",1,0

key_kingphase = 0
key_militaryphase = 0

dim chosen,9,9
for x,0,9,1

for y,0,9,1

chosen(x,y) = 0

next

next

dim MOTIGOMA,4,4
MOTIGOMA(0,0)=1
MOTIGOMA(0,1)=2
MOTIGOMA(0,2)=3
MOTIGOMA(0,3)=4
MOTIGOMA(1,0)=0
MOTIGOMA(1,1)=0
MOTIGOMA(1,2)=0
MOTIGOMA(1,3)=0
MOTIGOMA(2,0)=5
MOTIGOMA(2,1)=6
MOTIGOMA(2,2)=7
MOTIGOMA(2,3)=8
MOTIGOMA(3,0)=0
MOTIGOMA(3,1)=0
MOTIGOMA(3,2)=0
MOTIGOMA(3,3)=0

dim MOTIGOMA_chosen,4,4
for x,0,4,1

for y,0,4,1

MOTIGOMA_chosen(x,y) =0

next

next

chosen = 0
sentaku_x = 0
sentaku_y = 0
left_click = 0
inhand = -1
secondphase_button = 0
tukandatoko_x=0
tukandatoko_y=0
motigomadai_x = 0
motigomadai_y = 0

//二次元配列作成 すべてに0を代入 配列KOMAには駒の数値をいれる
dim KOMA,9,9
for x,0,9,1

for y,0,9,1

KOMA(x,y) = 0

next

next

KOMA (7,6) = 1
KOMA (0,0) = 5
KOMA (3,4) = 7
//ボードの表示位置
coordinate_x=100
coordinate_y=100

//フレームカウンター
framecounter=1600


x=0;初期化
y=0

//ロード終了

goto *セレクト画面

*before_main_hitori
cls 4

*main_hitori

redraw 0;仮想画面

color 0,0,0;画面消去 clsを使うとちらつくらしい
boxf 0,0,1000,700




if key_kingphase == 0 {;一度のみとおる
goto *王様の配置決定
}

; if key_militaryphase == 0 {;一度のみとおる
; goto *兵隊の配置決定
; key_militaryphase++
;}


gosub *タイマー

gosub *ボードの線表示 //9x9のボードを線で表示する
gosub *持ち駒の台を線で表示
gosub *駒を選ぶ置く
gosub *ボードの点表示 //9x9のボードを点で表示する 後から一つの変数の変更だけでボードのサイズを変えられるようにする(保留) 画像だとできない
redraw 1;実際の画面に表示

wait 1;10ms止まる



goto *main_hitori

*ボードの点表示





color 255,255,255;white
//ボードの一番左上の座標が100,100
//50ドットづつ間隔を開ける

//ここを文字で表示すれば駒を表示できる

for x,0,9,1 ;二次元配列をひとつづつあたっていく

for y,0,9,1

if KOMA(x,y)==0{

pos ((x+1)*50)-7+50,((y+1)*50)-10+50
mes "";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==1{

pos ((x+1)*50)-7+50,((y+1)*50)-10+50
color 255 - chosen(x,y),255,255-chosen(x,y)
mes "歩";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==2{

pos ((x+1)*50)-7+50,((y+1)*50)-10+50
color 255-chosen(x,y),255,255-chosen(x,y)
mes "角";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==3{

color 255-chosen(x,y),255,255-chosen(x,y)
pos ((x+1)*50)-7+50,((y+1)*50)-10+50
mes "飛";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==4 {

color 255-chosen(x,y),255,255-chosen(x,y)
pos ((x+1)*50)-7+50,((y+1)*50)-10+50
mes "香";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==5{

color 255-chosen(x,y),255,255-chosen(x,y)
pos ((x+1)*50)-7+50,((y+1)*50)-10+50
mes "桂";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==6{

color 255-chosen(x,y),255,255-chosen(x,y)
pos ((x+1)*50)-7,((y+1)*50)-10
mes "銀";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==7{

color 255-chosen(x,y),255,255-chosen(x,y)
pos ((x+1)*50)-7+50,((y+1)*50)-10+50
mes "金";このメッセージの内容を二次配列から取得する

}
if KOMA(x,y)==8{

color 255-chosen(x,y),255,255-chosen(x,y)
pos ((x+1)*50)-7+50,((y+1)*50)-10+50
mes "王";このメッセージの内容を二次配列から取得する

}
next
next

//持ち駒の台のほう
for x,0,4,1 ;二次元配列をひとつづつあたっていく

for y,0,4,1

if MOTIGOMA(x,y) == 1 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "歩"
}
if MOTIGOMA(x,y) == 2 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "角"
}
if MOTIGOMA(x,y) == 3 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "飛"
}
if MOTIGOMA(x,y) == 4 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "香"
}
if MOTIGOMA(x,y) == 5 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "桂"
}
if MOTIGOMA(x,y) == 6 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "銀"
}
if MOTIGOMA(x,y) == 7 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "金"
}
if MOTIGOMA(x,y) == 8 {
color 255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y),255,255-MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y)
pos 600+(x*50),350+(y*50)
mes "王"
}

next

next

return






*ボードの線表示




color 255,255,255;white

//line 終点x,終点y,始点x,始点y
for coordinate_x,100,600,50

for coordinate_y,100,600,50

line 525,coordinate_y-25,75,coordinate_y-25

next

line coordinate_x-25,525,coordinate_x-25,75

next

return

*タイマー

framecounter--;wait 1なので10ms(0.01秒)ごとに1ディクリメント framecounterが100の時に一秒
pos 0,0
;font "ゴシック体",40,1
mes framecounter

if framecounter == 299 : mmplay 0
if framecounter == 199 : mmplay 0
if framecounter == 99 : mmplay 0


if framecounter==0 : goto *gameover



return

*セレクト画面

cls 4

color 0,0,0;画面消去 clsを使うとちらつくらしい
boxf 0,0,1000,700

pos 400,200
font "ゴシック体",80,0
color 255,255,255
mes "将棋"
pos 440,400
button goto "ひとり",*before_main_hitori
pos 440,450
button goto "ふたり",*before_main_hutari

stop


*gameover

pos 400,400
objsize 150,50
button goto "時間切れです",*top

stop




*王様の配置決定 //第一フェイズ

redraw 0;仮想画面

color 0,0,0;画面消去 clsを使うとちらつくらしい
boxf 0,0,1000,700
gosub *タイマー


gosub *ボードの線表示 //9x9のボードを線で表示する
gosub *持ち駒の台を線で表示
gosub *駒を選ぶ置く
gosub *ボードの点表示 //9x9のボードを点で表示する 後から一つの変数の変更だけでボードのサイズを変えられるようにする(保留) 画像だとできない



pos 30,550
color 255,255,255
mes "この第一フェイズで王の配置を決めます"
mes "右の持ち駒台から王を選んでフィールドに配置してください"
mes "1手15カウントです"


redraw 1;実際の画面に表示

wait 1;10ms止まる

goto *王様の配置決定

*兵隊の配置決定 //第二フェイズ ここが終わると*main_hitoriへいく
redraw 0;仮想画面

color 0,0,0;画面消去 clsを使うとちらつくらしい
boxf 0,0,1000,700

gosub *タイマー

gosub *ボードの線表示 //9x9のボードを線で表示する
gosub *持ち駒の台を線で表示
gosub *駒を選ぶ置く
gosub *ボードの点表示 //9x9のボードを点で表示する 後から一つの変数の変更だけでボードのサイズを変えられるようにする(保留) 画像だとできない

pos 30,550
color 255,255,255
mes "この第二フェイズで兵隊の配置を決めます"
mes "準備ができたらボタンを押してください"
objsize 100,50

if secondphase_button = 0 {;一回だけ表示
button goto "第二フェイズ完了",*before_main_hitori
secondphase_button++
}


redraw 1;実際の画面に表示

wait 1;10ms止まる
goto *兵隊の配置決定


*持ち駒の台を線で表示//駒が8種類ある 歩x3 のように表記する 4x4のボックスをつくる 駒も表示する

color 255,255,255;white
coordinate_x = 575
coordinate_y = 375
//screen 0,1000,700
for coordinate_x,625,875,50;650から825ふくむまで50づつ増える

for coordinate_y,375,600,50;350から550ふくむまで50づつ増える
//line 終点x,終点y,始点x,始点y
line 775,coordinate_y-50,575,coordinate_y-50 ;x始点終点は変わらない y始点終点が変動

next

line coordinate_x-50,525,coordinate_x-50,350-25

next

return

//以下未実装 ふたりモード
*before_main_hutari
cls 4

pos 300,200
;font "MS 明朝",50,0
color 255,255,255
mes "未実装です"

wait 200

goto *top

*main_hutari
goto *main_hutari


*駒を選ぶ置く
//ここはマウスからsentaku とmotigomadai の座標を取得するばしょ
//ここから
pos 100,0
mes "マウスx"+mousex
pos 200,0
mes "マウスy"+mousey

pos 300,0
mes "sentaku_x"+sentaku_x
pos 400,0
mes "sentaku_y"+sentaku_y

pos 550,0
mes "motigomadai_x"+motigomadai_x
pos 700,0
mes "motigomadai_y"+motigomadai_y
//ここまで座標確認用

//盤面から駒を選ぶ ここではクリックしない 問題なし
for z,0,9,1
//盤面の座標を取得
if 75+(z*50)<mousex & mousex<125+(z*50) : sentaku_x = (z+1);sentakuは盤面の座標左上が11 なのでzに1をたす
if 75+(z*50)<mousey & mousey<125+(z*50) : sentaku_y = (z+1)
//盤面外の座標にマウスがあるとき-9をいれる
if mousex<75 | mousey<75 {;マウスが盤面の左か上にあるとき-9をsentakuにいれる
sentaku_x = -9
sentaku_y = -9
}
if mousex>525 | mousey>525 {;マウスが盤面の右か下にあるとき-9をsentakuにいれる
sentaku_x = -9
sentaku_y = -9
}

next



//持ち駒の台から駒をえらぶ ここではクリックしない 問題なし
for z,0,4,1
;持ち駒の台の中の座標を取得
if 575+(z*50)<mousex & mousex<625+(z*50) : motigomadai_x = (z+1)
if 325+(z*50)<mousey & mousey<375+(z*50) : motigomadai_y = (z+1)
;持ち駒の台の外にマウスがあるときmotigomaに−9をいれる
if mousex<575 | mousey<325 {
motigomadai_x = -9
motigomadai_y = -9
}
if mousex>775 | mousey>525 {
motigomadai_x = -9
motigomadai_y = -9
}

next

stick left_click,0 //問題あり
//はなすとき 盤面上のこまを盤面におくときと持ち駒台のこまを盤面におく
if inhand != -1{;駒の数値をもっているときに
if left_click & 256 {;置いた




if KOMA(x,y) != 0{;そのマスにほかの駒があるなら //余計な操作をしたときに一手とみなすかどうかの判定をする

inhand = -1;手持ちの駒をはなして もとの場所にもどす 手の中は無になる
chosen(sentaku_x-1,sentaku_y-1) = 0;色を白に戻す
MOTIGOMA_chosen(motigomadai_x-1,motigomadai_y-1) = 0
;goto *王様の配置決定

}

if KOMA(x,y) == 0{;そのマスが無なら
KOMA(x,y) = inhand;手の駒をそこに置く
inhand = -1
chosen(sentaku_x-1,sentaku_y-1) = 0;色を白に戻す
MOTIGOMA_chosen(motigomadai_x-1,motigomadai_y-1) = 0

KOMA(tukandatoko_x,tukandatoko_y) = 0 ;もってきたところの駒を無にする
mmplay 1
}

framecounter = 1600;一手ごとにカウントをリセットするのだけどこのやりかただとうまくいかない

if key_kingphase = 0 {
key_kingphase++
goto *兵隊の配置決定
}
}
}
//つかむとき 盤面

if (sentaku_x == -9) | (sentaku_y == -9): goto *jump ;マウスが盤面外ならなにもせずに*jumpへ
if inhand == -1 {
if left_click & 256 {


tukandatoko_x=sentaku_x -1
tukandatoko_y=sentaku_y -1

if KOMA(sentaku_x-1,sentaku_y-1) == 0 : goto *jump ;自分が何も持っていなくて何も置いてない場所をつかんでも何も起きない
inhand = KOMA(sentaku_x-1,sentaku_y-1) ; レフトクリックで駒を手に持つ
chosen(tukandatoko_,tukandatoko_y) = 255
*jump

}
}

//つかむとき 持ち駒の台
if (motigomadai_x == -9) | (motigomadai_y == -9): goto *jump1 ;マウスが盤面外ならなにもせずに*jumpへ
if inhand == -1 {//なにももっていないときに 持ち駒の台の上で
if left_click & 256 {//クリックすると



tukandatoko_x=motigomadai_x -1
tukandatoko_y=motigomadai_x -1

inhand = MOTIGOMA(motigomadai_x-1,motigomadai_y-1) ; レフトクリックで駒を手に持つ
MOTIGOMA_chosen(tukandatoko_x,tukandatoko_y) = 255
*jump1
}
}



return



この記事に返信する


ぜろ

リンク

2016/12/18(Sun) 14:36:29|NO.77635

さっきは駒を動かすのはできてたのに それもできなくなってしまいました。



スペース

リンク

2016/12/18(Sun) 14:39:11|NO.77636

>>どうすればいいでしょうか。
処理の流れを改めて考えて、プログラムを0から書き直してください。



ぜろ

リンク

2016/12/18(Sun) 16:21:28|NO.77639

やってみます



ぜろ

リンク

2016/12/19(Mon) 00:11:59|NO.77643

できました。アドバイスありがとうございました。



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