DXライブラリを用いてビンゴ用ルーレットソフトを作る

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
you3749
記事: 34
登録日時: 13年前

DXライブラリを用いてビンゴ用ルーレットソフトを作る

#1

投稿記事 by you3749 » 13年前

DXライブラリを用いてビンゴ用ルーレットソフトを作っています。
作ろうとしているソフトのイメージは
画像
このような感じです。
ボタンは
画像を表示

指定範囲(画像が表示されている所)をクリックしたらルーレットを回す/止める/リセットする
で表現しようと思っています。
画像表示はなんとかうまくいったのですが、
指定範囲のクリックが全くうまく行きません。
int posX,posY;
if(posX >= 39 && posX <= 245 && posY >= 423 && posY <= 454){
if( (GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ) {
DrawString( 20, 50, "マウス左ボタンが押されています", white );
}
}
試しに上のように打って走らせても反応しません。
この点で詰まっているため、それ以外の箇所もまったく見当がつきません。
どうかアドバイスお願いします。
添付ファイル
bingo.png
bingo.png (15.88 KiB) 閲覧数: 17550 回

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#2

投稿記事 by h2so5 » 13年前

posX,posYにマウス座標が代入されていないのでは?

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#3

投稿記事 by you3749 » 13年前

h2so5さんへ
GetMousePoint(&posX,&posY);
を挟んでも反応しません・・・

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#4

投稿記事 by h2so5 » 13年前

全体のソースを見せてください

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#5

投稿記事 by you3749 » 13年前

コード:

#include "DxLib.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1) return -1;

	int mojicol = GetColor(255,255,255);
	DrawFormatString(280,30,mojicol,"ルーレット");//題字


	SetMouseDispFlag(TRUE);//マウスを表示状態にする
	//ここからボタン表示
	int roulette = LoadGraph("roulette.png");
	GraphFilter( roulette, DX_GRAPH_FILTER_DOWN_SCALE, 2 ) ;
	DrawGraph(40,430,roulette,FALSE);		

	int reset = LoadGraph("reset.png");
	GraphFilter(reset, DX_GRAPH_FILTER_DOWN_SCALE,2);
	DrawGraph(399,430,reset,FALSE);
	//ボタン表示ここまで
	int posX,posY;
	int white = GetColor(255,255,255);
	while(CheckHitKey( KEY_INPUT_ESCAPE)==0){
		ClearDrawScreen();
		if( ProcessMessage() == -1){
                        break;
		}
		GetMousePoint(&posX,&posY);
		if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
			DrawString(20,20,"押されてる",white);
		}
   


	}

	
	DxLib_End();
	return 0;
}
まだボタン役の画像(ルーレットとリセット2つ)のみです・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#6

投稿記事 by softya(ソフト屋) » 13年前

メインループは、このカタチにしたほうが良いでしょう。
あと描画はメインループに全て入れて下さい。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]  1.9章 ゲームプログラムの骨格の完成」
http://dixq.net/g/01_09.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#7

投稿記事 by you3749 » 13年前

softyaさんへ

コード:

#include "DxLib.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1) return -1;

	int mojicol = GetColor(255,255,255);
	DrawFormatString(280,30,mojicol,"ルーレット");//題字


	SetMouseDispFlag(TRUE);//マウスを表示状態にする

	int posX,posY;
	int white = GetColor(255,255,255);
	while(CheckHitKey( KEY_INPUT_ESCAPE)==0 && ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
		
		if( ProcessMessage() == -1){
                        break;
		}


			//ここからボタン表示
	int roulette = LoadGraph("roulette.png");
	GraphFilter( roulette, DX_GRAPH_FILTER_DOWN_SCALE, 2 ) ;
	DrawGraph(40,430,roulette,FALSE);		

	DrawFormatString(300,430,mojicol,"リセット");

	int stop = LoadGraph("stop.png");
	GraphFilter(stop, DX_GRAPH_FILTER_DOWN_SCALE,2);
	DrawGraph(500,430,stop,FALSE);
	//ボタン表示ここまで

		
		GetMousePoint(&posX,&posY);
		if(posX >= 39 && posX <= 245 && posY >= 423 && posY <= 454){ 
			if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"ルーレットボタンを押している",white);
			}
		}else if(posX >= 270 && posX <= 300 && posY >= 470 && posY <= 480){
			if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"リセットボタンを押している",white);
			}
		}else if(posX >= 340 && posX <= 400 && posY >= 500 && posY >= 550){
			if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"ストップボタンを押している",white);
			}
		}
		
   


	}

	
	DxLib_End();
	return 0;
}
ルーレットボタンは反応するようになりましたが、
隣のボタン(リセットボタンは画像が変に映るので文字で代用しました)が反応しません
各ボタンのif文の直前にGetMousePointを置いても同様です

ルーレットボタンで中央に大きく表示される数字がパカパカとランダムでアニメーション(分かりにくいですが・・)
具体的に言うと、マリオカートのアイテム欄のような感じで数字が動き、
ストップボタンでそれを止め、
次にルーレットボタンを押した時には中央下に出た数字を(2,5,12...)←このような感じに表示するものを想定しています。
※リセットボタンを押すまでは出た数字は重複しないようにしたい

ランダムに数字を取得するのはsrandを使えばいいのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#8

投稿記事 by softya(ソフト屋) » 13年前

「ゲームプログラミングの館」は全部読まれましたか?
LoadGraphをメインループに入れるのは良くない(ハングアップする)と書かれているはずですが。

それとインデントが出鱈目なのでバグの原因となります。修正をお願いします。
「mixcpp/投稿前チェックリスト - PukiWiki」 チェック3 : インデントを揃えよう
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

問題点を列挙します。
1)題字がメインループにない。
2)グラフィック初期化がメインループにある。LoadGraphやGraphFilter
3)ProcessMessageが2つある。
4)インデントが間違っている。
5)リセットとストップ押された座標の判定が下すぎる。縦は480までしか無いので posY >= 470 && posY <= 480 や posY >= 500 && posY >= 550は下過ぎです。
座標がよく分からないなら、DrawBoxで表示して確認してみて下さい。
以上をまず直して下さい。

【補足】
乱数はDXライブラリの int GetRand( int RandMax ) ;を使って下さい。
「int GetRand( int RandMax ) ;」
http://homepage2.nifty.com/natupaji/DxL ... html#R10N1
srandは不要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#9

投稿記事 by you3749 » 13年前

コード:

#include "DxLib.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>

int WINAPI WinMain(HINSTANCE hI, HINSTANCE hP, LPSTR lpC, int nC){
	ChangeWindowMode(TRUE);
	if(DxLib_Init() == -1) return -1;

	int mojicol = GetColor(255,255,255);
	//ここからボタン用画像をロード
	int roulette = LoadGraph("roulette.png");
	GraphFilter( roulette, DX_GRAPH_FILTER_DOWN_SCALE, 2 ) ;

	int stop = LoadGraph("stop.png");
	GraphFilter(stop, DX_GRAPH_FILTER_DOWN_SCALE,2);

	int reset = LoadGraph("reset.png");
	GraphFilter(reset,DX_GRAPH_FILTER_DOWN_SCALE,2);
	//ここまでボタン用画像ロード

	SetMouseDispFlag(TRUE);//マウスを表示状態にする

	int posX,posY;
	int white = GetColor(255,255,255);
	while(CheckHitKey( KEY_INPUT_ESCAPE)==0 && ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0  ){
		DrawFormatString(280,30,mojicol,"ルーレット");//題字
		
		//ここからボタン表示	
		DrawGraph(40,430,roulette,FALSE);		
		DrawGraph(300,430,reset,FALSE);
		DrawGraph(500,430,stop,FALSE);
		//ボタン表示ここまで

		DrawBox(470,400,600,450,white,TRUE);
		GetMousePoint(&posX,&posY);
		if(posX >= 39 && posX <= 245 && posY >= 400 && posY <= 450){ 
			if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"ルーレットボタンを押している",white);
			}
		}else if(posX >= 270 && posX <= 450 && posY >= 400 && posY <= 450){
			if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"リセットボタンを押している",white);
			}
		}else if(posX >= 470 && posX <= 600 && posY >= 400 && posY <= 450){
			if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"ストップボタンを押している",white);
			}
		}
	}
	DxLib_End();
	return 0;
}
直しました!
確かに範囲が下過ぎて反応しなかったようです。
次は肝心の乱数ですが

コード:

int GetRandom(int min,int max);

int main(void)
{
	int i;
	
	for (i = 0;i < 10;i++) {
		printf("%d\n",GetRandom(1,6));
	}
		
	return 0;
}

int GetRandom(int min,int max)
{
	return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}      
1から6の乱数を得る場合、苦Cでは上のように挙げられていましたが、なかなか実装できません・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#10

投稿記事 by softya(ソフト屋) » 13年前

ビンゴ用の配列を作る関数を作りましょう。
ビンゴだと同じ数字が出てはいけないので配列にまず1から上限値まで数値を並べて、それを乱数でシャッフルします。
そうすれば同じ数字が出ることは無いわけです。
この時点で、数値を表示する順番は確定しているわけですが、配列は表示しない限り見えないので抽選を待つ人には分かりません。
抽選表示する時は既に決まっている配列要素の0番目1番目と順番に取り出して、さもルーレットで決まったかのように表示するだけとなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#11

投稿記事 by you3749 » 13年前

配列にまず1から上限値まで数値を並べるというのは、1~72までの数字を格納する配列をbingo[72]とした時に、

コード:

int bingo[72];
int b;
for(b=1;b<=72;b++){
bingo[b] = b;
}
このような感じでしょうか?
それとも

コード:

int bingo[72];
bingo[1] = 1;
bingo[2] = 2;
....
bingo[72] = 72;
といった感じでしょうか?
また、乱数の取得と表示も
http://homepage2.nifty.com/natupaji/DxL ... html#R10N1
を見てもどう応用したらいいのか見当がつきません・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#12

投稿記事 by softya(ソフト屋) » 13年前

これは、どちらかと言うとC言語の基礎なのですが配列を使うのは初めてでしょうか?
C言語では配列の添字は0から始まりますので、72個の要素の場合添字は71までとなります。
初期化に関してはループでOKです。

あとGetRand(71)とすれば0から71までの乱数が得られます。
その後の処理は出来れば考えてもらいたいのですがサンプル改造以外ので簡単なものでもプログラムを組まれた経験は無いのでしょうか?

[補足]
すこし実力知りたいので回答をネットで探さずに次の問題を解いてみて下さい。

・1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ソースコードと動作させて確認まで掛かった時間も教えて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#13

投稿記事 by you3749 » 13年前

ソフトを作るのはこれが初めてです。

コード:

#include<stdio.h>
int main(){
	int i;
	int array[100];
	for(i=1;i<=100;i++){
		if(i % 3 == 0){
			printf("Fizz\n");
			
		}else if(i % 5 == 0){
			printf("Buzz\n");
		}else if(i % 15 == 0){
			printf("FizzBuzz\n");
		}else{
			printf("%d",i);
		}
	}
	return 0;
}
ここまでで15分くらいかかりました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#14

投稿記事 by softya(ソフト屋) » 13年前

15分で組めるのなら、とりあえず組めそうだとは思います。
ただ、C言語の文法レベルが怪しいの入門書も確認しながら進めて下さい。

とりあえず、入門書を見ながらで良いので
bingo配列に初期値を入れる専用の初期化関数を書いてみて下さい。
後々を考えて
#define BINGO_MAX (72)
int bingo[BINGO_MAX]; //ビンゴ数値の配列。
としてBINGO_MAXを活用して書いてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#15

投稿記事 by you3749 » 13年前

コード:

#define BINGO_MAX(72)
int bingo_shokika(){
int bingo[BINGO_MAX];
int i;
for(i=0;i<BINGO_MAX;i++){
bingo[i] = i+1;
}
}
初期化で調べたページに沿って作りました。
手探りです・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#16

投稿記事 by softya(ソフト屋) » 13年前

あっFizzBuzzのバグに気づきました。
%15が最初じゃないとマズイはずですが。
検証してみて下さい。

それとネット検索に頼りすぎずC言語の入門書をまず使ってくださいね。
繰り返すと、何処に何が書いてあるか覚えるぐらいまで頭に入ってくるはずです。

bingo_shokika()は、int bingo[BINGO_MAX];をローカル変数にしてしまっているので関数を抜けるとせっかくの配列が消滅します。
関数外に書いてグローバル変数にして下さい。あとインデントに気をつけてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#17

投稿記事 by you3749 » 13年前

コード:

for(i=1;i<=100;i++){
		if(i % 15 == 0){
			printf("FizzBuzz\n");
			
		}else if(i % 3 == 0){
			printf("Fizz\n");
		}else if(i % 5 == 0){
			printf("Buzz\n");
		}else{
			printf("%d",i);
		}
	}
うまくいきました・・・

コード:

#define BINGO_MAX(72)
int bingo[BINGO_MAX];
int bingo_shokika(){
	int i;
	for(i=0;i<BINGO_MAX;i++){
		bingo[i] = i +1;
	}
}
int bingo[BIINGO_MAX]を外に出しました。
ここから乱数を取得する場合、

コード:

		int random = GetRand(BINGO_MAX);
		DrawString(318,250,"%d",random,white);
bingo_shokika関数をmainの外に置き、bingo[BINGO_MAX]をグローバルで定義している状態で上を
mainの中に置いて実行しても「'bingo_shokika' : 値を返さなければいけません」と出てしまいます・・・
また、bingo_shokikaを削って実行した場合はコンパイラは通るのですが、ランダムに表示されるはずの数字が表示されません・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#18

投稿記事 by softya(ソフト屋) » 13年前

まだまだ、これからです。
int bingo_shokika(){
は戻り値を返さないので
void bingo_shokika(){
じゃないとダメですね。

こういうこと調べられるC言語の入門書は何を使っていますか?もし無ければ、出来れば購入して欲しいです。
それとDrawStringは関数の使い方が間違っています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#19

投稿記事 by you3749 » 13年前

コード:

int random = GetRand(BINGO_MAX);
		void bingo_shokika();
		char random2[72];
		itoa(random,random2,10);
		DrawString(318,250,random2,white);
itoa関数を使うと、イメージ通りに数字がクルクル周り始めました。
これを最初に難儀して作ったstopボタンで止め、
さらにresetボタンでまたクルクル回し、
出た数をボタンの上に横一行で(2,18,23,...)といった感じで表示させるようにしたいのです。

教本はCの絵本、明解C言語 入門編を使っています。

nil
記事: 428
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#20

投稿記事 by nil » 13年前

itoa関数の使用は推奨されていません。
DXライブラリにはDrawFormatString関数があるのでそれを使用したほうが良いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#21

投稿記事 by softya(ソフト屋) » 13年前

教本はCの絵本、明解C言語 入門編を使っています。
それは良い本です。
悩んだらまず、その本たちを眺めるようにして下さい。
サンプルに頼っているといつまでも組めるようになりません。

でまず、先に作るのはビンゴ数値のシャフル関数です。
bingo_shokikaに機能を追加してシャッフルしましょう。

乱数を使って配列をシャッフルをするには、どういう方法があると思いますか?
現実のトランプなら手でやるシャッフルを配列に置き換えて考えてみて下さい。
とりあえず考えるだけ考えて分かることだけを書きだして見ましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#22

投稿記事 by you3749 » 13年前

コード:

if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"ストップボタンを押している",white);
				WaitTimer(50000);
				int kiroku = random;
}
DrawFormatStringに変更しました!
さらに、WaitTimerを使って回る数字をストップボタンで止まるように意図して書き加えました。
ルーレットとしては一応これでいいのですが、出た数字を記録、表示、リセットボタンで帳消しをするにはどうすればいいのでしょうか・・・
DrawFormatStringを上のif文の中に置いても、ボタンを押して放す一瞬だけしか表示されません・・・

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#23

投稿記事 by you3749 » 13年前

トランプのシャッフルであれば、Tranp[(上からの枚数)]とすると、
Tranp[1] = ハートの1
Tranp[2] = ハートの2
Tranp[3] = ハートの3
が、
Tranp[1] = ハートの2
Tranp[2] = ハートの3
Tranp[3] = ハートの1
となるように、配列の中の数字をランダムに交換するようなイメージが浮かびましたが、
C言語で具体的にどう書けるかと言われるとピンときません・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#24

投稿記事 by softya(ソフト屋) » 13年前

you3749 さんが書きました:

コード:

if((GetMouseInput() & MOUSE_INPUT_LEFT) != 0){
				DrawString(20,20,"ストップボタンを押している",white);
				WaitTimer(50000);
				int kiroku = random;
}
DrawFormatStringに変更しました!
さらに、WaitTimerを使って回る数字をストップボタンで止まるように意図して書き加えました。
ルーレットとしては一応これでいいのですが、出た数字を記録、表示、リセットボタンで帳消しをするにはどうすればいいのでしょうか・・・
DrawFormatStringを上のif文の中に置いても、ボタンを押して放す一瞬だけしか表示されません・・・
それはやってはいけない処理ですね。
「補足資料.11章 書いてはいけない4つの処理」
http://dixq.net/g/h_11.html

もっと、ちゃんと組まないと今のように困ることになります。
ビンゴマシンの処理は色々と制御しないと思った処理をしてくれないんで初心者には結構複雑なんですよ。

今後の方針。まだ頭の部分ってことですね。

(1)ビンゴ数値の配列のシャフルを作る。
(2)ルーレットに表示する数値をビンゴ数値の配列から行うようにする。表示する配列の位置は乱数で決定。
(3)停止した回数のカウンタを用意して、ストップボタンを押す度に増えるようにする。
(4)ビンゴ数値の配列から停止した回数のカウンタの数だけ、ビンゴ数値を表示するようにする。
(5) (2)のルーレットを停止した回数のカウンタの次の要素(停止表示されていない要素)から最後までの間になるように配列の添字を変える。
(6)スタートボタンを押さない限り、ルーレットが回らないように回転フラグを追加。回転フラグはスタートボタンでON、ストップボタンでOFF。
(7)ストップボタンは回転中じゃないと押せないように機能追加。
あとはリセット機能ぐらいでしょうかね。
演出はまったく考えていない状態で。このぐらいは作業があります。
you3749 さんが書きました:トランプのシャッフルであれば、Tranp[(上からの枚数)]とすると、
Tranp[1] = ハートの1
Tranp[2] = ハートの2
Tranp[3] = ハートの3
が、
Tranp[1] = ハートの2
Tranp[2] = ハートの3
Tranp[3] = ハートの1
となるように、配列の中の数字をランダムに交換するようなイメージが浮かびましたが、
C言語で具体的にどう書けるかと言われるとピンときません・・・
じゃあ、こう考えてみて下さい。
文字が読めるがシャッフルを知らない人に文章だけで手順を説明するとします。
カードは机に上に1枚づつ別の箱に中に入って置かれています。 → 配列のイメージです。
動かす時は手には1枚しか持ってはいけません。
箱を追加するのは自由です。
さぁ、このルールの中でシャッフルする手順を書いてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#25

投稿記事 by you3749 » 13年前

WaitTimerはダメでしたか・・

3つ箱があり、その中に一枚ずつ入っているなら、もう一つ箱を用意して
横に箱を並べているのならば、一番左(右)のカードを用意した箱に入れるような感じでしょうか?
1,2,3が2,3,1になるようなイメージです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#26

投稿記事 by softya(ソフト屋) » 13年前

you3749 さんが書きました:WaitTimerはダメでしたか・・

3つ箱があり、その中に一枚ずつ入っているなら、もう一つ箱を用意して
横に箱を並べているのならば、一番左(右)のカードを用意した箱に入れるような感じでしょうか?
1,2,3が2,3,1になるようなイメージです。
それは手順として曖昧ですよね。なんか作業する人にお任せしますの部分があります。
もっと厳しいルールを守らない人を許さないような手順書として書いてみて下さい。

最終的には追加した箱ではなく、元の箱のどれかに戻すってルールを追加しておきます。
元が3つの箱なら元の3つの箱に戻すということです。
それと箱は1つのカードしか入れてはいけません。これも追加ルールです。

ちなみに毎回並びがランダムなる手順書を書く必要があります。
これはプログラムを書く訓練なので非常に細かくなっていますが、こういうことを考えるのがプログラムを書くと言うことです。

【参考】
4つの箱に1枚づつ入ったランダムなカードの中で一番大きな数値のカードを得る処理手順。

0.「一番大きな数値を入れる箱」を用意する。
1.1番と2番の箱のカードを見比べて大きな数字の方を「一番大きな数値を入れる箱」に移動する。
2.3番と「大きな数値を入れる箱」を比べて3番が大きければ、「一番大きな数値を入れる箱」のカードを破棄して3番の箱からカードを移動する。
3.4番と「大きな数値を入れる箱」を比べて4番が大きければ、「一番大きな数値を入れる箱」のカードを破棄して4番の箱からカードを移動する。
4.この時点で「一番大きな数値を入れる箱」に入っているカードは一番大きな数値です。

これは箱が増えたら、2や3の処理手順を増やしていくだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#27

投稿記事 by you3749 » 13年前

3枚のカードをシャッフルする方法として、
0.新しい箱を用意する。
[1][2][3][ ]←このような感じです
1.一番左のカードを用意した箱に入れる。
[ ][2][3][1]
2.左から二番目のカードを一番左の箱に移動します。
[2][ ][3][1]
3.右から二番目のカードを左から二番目の箱に移動します。
[2][3][ ][1]
4.一番右のカードを右から二番目の箱に移動します。
[2][3][1][ ]

0から4を繰り返すことで3枚のカードを順にシャッフルします。
[参考]に沿って書きましたが、どうでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#28

投稿記事 by softya(ソフト屋) » 13年前

それを4つだとしてみて下さい。
何時まで経ってもランダムにならないと思います。
簡単に出てくる順番が予測できませんか?
ここが乱数の使い時ですよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#29

投稿記事 by you3749 » 13年前

コード:

int array[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
int random = GetRand(5);
[tab=30]int cl = GetColor(255,255,255);
for(int i=0;i<=3;i++){
[tab=30]DrawFormatString(0,0,cl,"%d\n",array[i]);
}
array[0] = array[random];
array[1] = array[random];
array[2] = array[random];
array[3] = array[random];
for(int j=0;j<=3;j++){
[tab=30]DrawFormatString(0,100,cl,"%d\n",array[j]);
}
こういうことでしょうか?
入れ替えと言えば入れ替えという気もしますが、今ひとつ表せていない気がします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#30

投稿記事 by softya(ソフト屋) » 13年前

なんどか書いてますがインデントをお願いします。
とりあえずインデント修正版をお待ちしています。
※ ソースコードを書く時にVC++上でインデントしてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#31

投稿記事 by you3749 » 13年前

コード:

int array[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
int random = GetRand(5);
int cl = GetColor(255,255,255);
for(int i=0;i<=3;i++){
	DrawFormatString(0,0,cl,"%d\n",array[i]);
}
array[0] = array[random];
array[1] = array[random];
array[2] = array[random];
array[3] = array[random];
for(int j=0;j<=3;j++){
	DrawFormatString(0,100,cl,"%d\n",array[j]);
}
タブインデントボタンはインデントされないんですね、すいませんでした

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#32

投稿記事 by softya(ソフト屋) » 13年前

これで動作確認してますか? エラーが出ると思いますが。
その他バグがあります。

それとアルゴリズム的に同じ数字が出るのでビンゴの抽選には役立ちません。

パッと目についたバグ2箇所。アルゴリズム的な問題1つ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#33

投稿記事 by you3749 » 13年前

コード:

int array[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
int random = GetRand(5);
	int cl = GetColor(255,255,255);
for(int i=0;i<=3;i++){
	DrawFormatString(0,0,cl,"%d\n",array[i]);
}
array[0] = array[random];
array[1] = array[random];
array[2] = array[random];
array[3] = array[random];
for(int j=0;j<=3;j++){
	DrawFormatString(0,100,cl,"%d\n",array[j]);
}
何度も申し訳ありません。
これでどうでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#34

投稿記事 by softya(ソフト屋) » 13年前

int cl = GetColor(255,255,255);のインデントがおかしくなっただけで何も変わっていませんが貼り間違いでは?

あと勉強のためには日本語で書くことをおすすめします(イメージを明確にするため)、
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#35

投稿記事 by you3749 » 13年前

遅れてすみませんでした。
3枚のカードをシャッフルする方法として、
0.新しい箱を用意する。
[1][2][3][ ]←このような感じです
1.一番左のカードを用意した箱に入れる。
[ ][2][3][1]
2.左から二番目のカードを一番左の箱に移動します。
[2][ ][3][1]
3.右から二番目のカードを左から二番目の箱に移動します。
[2][3][ ][1]
4.一番右のカードを右から二番目の箱に移動します。
[2][3][1][ ]
確かにカードの位置が予想できますね。
では、
1.ランダムで選んだカードを用意した箱に入れる。
[1][ ][3][2]
2.1.で選んだカードが入れてあった箱に、ランダムで選んだカードを入れる。
[ ][1][3][2]
3.1と2を指定回数繰り返す。

でシャッフルされることにはならないでしょうか・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#36

投稿記事 by softya(ソフト屋) » 13年前

ここ曖昧なんですよね。

> 2.1.で選んだカードが入れてあった箱に、ランダムで選んだカードを入れる。

そのランダムの選び方は条件がつきますよね? そこも明確にしてください。
あと場所を覚えておく場合はXXの場所をメモすると言うのも書き添えておいてください。そうしないと空いた場所も覚えられませんので。
同様に乱数も3面(現実にはないですが)サイコロで出た数字をメモRにメモると書いてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#37

投稿記事 by you3749 » 13年前

はい。
それでは、
1.ランダムで箱を選び、その中のカードを用意した箱に入れ、選んだ箱を記録する。
[1][ ][3][2]
2.またランダムで箱を選び、その中のカードを1.で記録した箱に入れる。選んだ箱は記録する。
[ ][1][3][2]
もしランダムで選ばれた箱が、1.のプロセスで空になった箱だった場合、もう一度ランダムで選びなおす。

こういう感じでしょうか・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#38

投稿記事 by softya(ソフト屋) » 13年前

そういう事です!

>もしランダムで選ばれた箱が、1.のプロセスで空になった箱だった場合、もう一度ランダムで選びなおす。
ただし、これはもう一度空の箱になる可能性があるので何度でもって事になります。

と言うわけで手順を整理しましょう。次の点に気をつけてください。
1)それと選んだ箱と一次置き場の箱がややこしいので、名前をわかりやすくしてくだださいね。
2)もっと番号を細かく分けてください。これはプログラム化への伏線でもあります。「ランダムに箱を選ぶ」だけで1つの番号になっていたほうが良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#39

投稿記事 by you3749 » 13年前

ありがとうございます。
もっと細分化してみると、
※{ }が用意した空箱です。
1.ランダムで箱を選ぶ。
[1][2][3]{ }

2. その中のカードを箱から出す。
[1][ ][3]{ }
2
3.選んだ箱を記録する。
『選んだ箱=左から2番目』

4.取り出したカードを、空箱に入れる。
[1][ ][3]{2}
5.1.に戻る。(もし、『選んだ箱=左から2番目』なら、もう一度ランダムで選びなおす。)
といった感じでしょうか。
C言語に起こしてみようとしましたが、

コード:

	int hako[2];
	int kara[0];
	hako[0] = 1;
	hako[1] = 2;
	hako[2] = 3;
ここまできて、空箱の役割の配列karaは
kara[0] = NULL;
となるのでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#40

投稿記事 by softya(ソフト屋) » 13年前

問題点としては
1) 2と4は一度に行います。
2) 取り出す処理と戻す処理は別です。
3) 何回行うかが制御されていません。

ちなみに配列定義時の数値は配列要素の個数ですので0はエラーです。
1とすれば、添字は0で、2とすれば、添字は0と1となります。

【補足】
kara[0] = NULL;
kara[0]は配列要素への代入ですので、NULLポインタを代入するのはルール違反です。
※ C言語の規格上は0と見なされるのでエラーは出ないでしょうが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

you3749
記事: 34
登録日時: 13年前

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#41

投稿記事 by you3749 » 13年前

直しました。
※{ }が用意した空箱です。
1.ランダムで箱を選ぶ。
[1][2][3]{ }

2. その中のカードを箱から出す。
[1][ ][3]{ }
2
同時に、取り出したカードを空箱に入れる。
[1][ ][3]{2}

3.選んだ箱を記録する。
『選んだ箱=左から2番目』

4.1.から3.を3回繰り返す。
もし、1.の段階で前回と同じ箱を選んだ場合、もう1度ランダムで選びなおす。
繰り返しの数には特に意味はありませんが、カード3枚の場合であったらこれくらいで十分シャッフルされていると思います。

コード:

#include<stdio.h>
#include<stdlib.h>
int GetRandom(int min,int max);
int main(){
	int hako[3];
	int kara[1];
	hako[0] = 1;
	hako[1] = 2;
	hako[2] = 3;
	int i=0;
	printf("[%d] [%d] [%d]\n",hako[0],hako[1],hako[2]);
	
	int gr = GetRandom(1,3);
	
	do{
		hako[gr] = kara[0];
		kara[0] = hako[gr];
		int kiroku = gr;
	}for(i=0;i<2;i++){
		int gr2 = GetRandom(1,3);
		if(kiroku = gr2){
			printf("同じ箱が選ばれました。\n");
			break;
		}
		hako[gr2] = hako[gr];
		hako[gr] = hako[gr2];
		
	}
		
	return 0;
}
int GetRandom(int min,int max)//苦Cさんのランダム関係のページからコピーさせてもらいました
{
	return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
以上をできる限り組んでみましたが、EasyIDECという環境では『「・」が19行目にない』とエラーが出ました・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: DXライブラリを用いてビンゴ用ルーレットソフトを作る

#42

投稿記事 by softya(ソフト屋) » 13年前

日本で書いてあった物とプログラムが全然違ってしまっています。
今この時点のプログラムを日本語で書いてみてください。違いが分かると思います。
面倒だと思われているでしょうが、肝心の事が分かっていないのでプログラムをちゃんと組めていない状況です。
ここを理解しないと何時まで経ってもプログラムが組めるようにならないんですよ。

※ 私は、日本語で書けないものはプログラムにすることは出来ないと思っています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る