ルーレットについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazu

ルーレットについて

#1

投稿記事 by kazu » 18年前

失礼します。わからない事があるので質問させていただきます。
以前にも同じような内容で投稿したのですが、あれから色々といじったので
新スレで投稿する事にしました。すいませんm(__)m
ルーレットの処理についてです。

#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#include "dossys.h"
char_far gvram;      /*画面*/
char_far r_pbmp;      /*ルーレットビットマップ*/
char_far bb;        /*バックバッファ*/
char_far kazubmp;     /*スコアビットマップ*/
int endflg=0;

/*スコア表示関数*/
void draw_number(int x,int y,int kazu)
{
    int s,i=100,cnt=0;
     for(cnt=0;cnt<3;cnt++){
       s=kazu/i;
       dg_box(bb,x+29*cnt,y,29,21,1,RGB(0,0,0));
       dg_drawbmp3(bb,x+29*cnt,y,29,21,kazubmp,s*29,0,RGB(224,224,128));
       kazu=kazu%i;
       i/=10;
     }
     return;
}

/*前準備*/
void init(void)
{
    srand(time(0));
    kazubmp=dg_loadbmp("数.bmp");      /*スコアビットマップロード*/
    r_pbmp=dg_loadbmp("rulet.bmp");     /*ルーレットビットマップロード*/
    bb=dg_createBB();
    return;
}

/*キー処理&ルーレット回る関数*/
int ki(void)
{
    int key,k,r,j;
    static int i=0;    /*一度だけiを0に*/
    if(kbhit()){
        key=getch();
        if(key==0){key=getch();}
        if(key=='e'){endflg=1;}
    }
     r=rand()%7;        /*0~6の乱数を求めてrに格納*/
     if(i>=8){i=0;}       /*iが8以上で0に戻す*/
     dg_drawbmp3(bb,0,100,100,100,r_pbmp,i*100,0,RGB(224,0,128));/*i番目の数を表示*/

     if(key=='d'){
       k=r+i;         /*dを押した時のiの数とrの値をkに格納*/
       if(k>8){
         k=k%8;       /*kが8以上なら0~の値に変更*/
       }
       if(k==0){
         k=8;
       }
       j=i+1;         /*i+1の数をjに格納*/
       if(j>8){
         j%=8;        /*jが8以上なら0~の値に変更*/
       }

     do{
        wait(50000000);
        dg_drawbmp3(bb,0,100,100,100,r_pbmp,j*100,0,RGB(224,0,128));  /*j番目の数を表示*/
        j++;
     }while(j<k);         /*jがkの大きさを越えるまで繰り返す*/

     draw_number(0,0,k+1);     /*kを表示*/
     return i+1;
     getch();
    }
    i++;
    return i;
}

/*後始末*/
void end(void)
{
    getch();
    dg_deletebmp(r_pbmp);
    dg_deletebmp(kazubmp);
    dg_deleteBB(bb);
}

/*メイン関数*/
main()
{
    int i,cnt=0,key,x=124,y=68;
    int rnd;
    srand(time(0));
    init();
    do{
       rnd=ki();
       draw_number(0,21,rnd);  /*iを表示*/
       dg_flip(gvram,bb);
       wait(8000000);
       ML();
    }while(!endflg);
       end();
}


少々わかりにくいかもしれませんが・・・
i番目のルーレットが順に表示され、8まで表示されたらまた1に戻り、
'd'のキーを押すとそこで一時的に処理(i)を止め、
計算で求めた数字=k番目までルーレットをゆっくり進め、
kが表示されたらそこで止まる。
・・・というプログラムにしたいのですが、
この処理では無理なようで・・・

どなたか理解できる方、アドバイスをお願いしますm(__)m

バグ

Re:ルーレットについて

#2

投稿記事 by バグ » 18年前

とりあえず、環境が分からないので、私のところの環境で動く簡単な物を作ってみました。ビットマップ表示はできていませんので、DrawRoulette関数の中身を書き換えてみて下さい。
参考になればよいのですが…(^_^;)
ちなみに開発環境はBCCです。
#include	<stdio.h>
#include	<time.h>
#include	<conio.h>
#include	<windows.h>

void	DrawRoulette( int );
int	StopRoulette( int );

int	main()
{
	// 前準備
	srand( ( unsigned )time( NULL ) );

	// 変数準備
	int	i , nCount , nKey , nRnd;

	nCount = rand() % 9;

	while( 1 )
	{
		while( !kbhit() )
		{
			nCount = ( nCount + 1 ) % 9;
			DrawRoulette( nCount );
			Sleep( 50 );
		}
		
		nKey = getch();
		
		if( nKey == 'd' || nKey == 'D' )
		{
			nCount = StopRoulette( nCount );
			break;
		}
	}

	printf( "\nルーレットの数値は%dです\n" , nCount );
	return( 0 );
}

// ルーレットの数字を表示
void	DrawRoulette( int nCount )
{
	switch( nCount )
	{
		case	0:
		printf( "0\r" );
		break;

		case	1:
		printf( "1\r" );
		break;

		case	2:
		printf( "2\r" );
		break;

		case	3:
		printf( "3\r" );
		break;

		case	4:
		printf( "4\r" );
		break;

		case	5:
		printf( "5\r" );
		break;

		case	6:
		printf( "6\r" );
		break;

		case	7:
		printf( "7\r" );
		break;

		case	8:
		printf( "8\r" );
		break;

		default:
		break;
	}
}

/* ルーレットを止める処理 */
int	StopRoulette( int nCount )
{
	int	i , nOffset;

	/* ボタンを押した後のルーレットが動く回数を決める。5~ 25回 */
	nOffset = rand() % 21 + 5;

	for( i = 0 ; i < nOffset ; i++ )
	{
		/* Waitを段々と大きくしていって、ルーレットの動きを徐々にゆっくりにする */
		Sleep( 50 + i * 50 );
		nCount = ( nCount + 1 ) % 9;
		DrawRoulette( nCount );
	}
	
	/* 最終的なルーレットの数値を返す */
	return( nCount );
}

kazu

Re:ルーレットについて

#3

投稿記事 by kazu » 18年前

>バグさん

解答ありがとうございます。
プログラムをよく読むと、main関数内のiとnRndは
使用されていませんね。実際必要ないようですが・・
こちら側で参考にして、色々といじってみようと思います。

まだわからない事があるかもしれませんが、
その時はまたよろしくお願いしますm(__)m

バグ

Re:ルーレットについて

#4

投稿記事 by バグ » 18年前

>>プログラムをよく読むと、main関数内のiとnRndは使用されていませんね。

うわ、本当ですね(;^_^A
消し忘れみたいです。消しておいてください。失礼しましたm(__)m

kazu

Re:ルーレットについて

#5

投稿記事 by kazu » 18年前

>バグさん

いえいえ。気にしないでください(^^)
おかげでルーレットも完成させることができました。
わかりやすいプログラム&助言ありがとうございましたm(__)m

閉鎖

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