昨日は体調が良くなくて、何度かトライしてみましたが、パソコンに5分と向かい合っていられない状態だったので、サボりました。
今日も元気モリモリとは言えませんが、ラストスパート頑張りました。
"CReel_reel.png"
[album]891[/album]
"Class_CReel_100.h"
//*************************************************
// CReel Class Ver. 1.00 2014.11.16 by V30
//*************************************************
#ifndef CLASS_CREEL_100
#define CLASS_CREEL_100
#define CHARACTER_MAX 21 //最大図柄数
#define SHOW_SEGMENT_MAX 3 //最大表示コマ数
//リール表示クラス[縦1列表示型] ver. 1.00
class CReel
{
public:
//リール状態列挙体
enum ReelState
{
RS_STOP, //停止中
RS_ROUND, //回転中(停止受付中)
RS_RECIEVE, //回転中(停止受付後)
RS_CONTROL, //回転中(停止制御中)
RS_AFTER //停止制御後
};
private:
int i_character_height; //リール図柄1コマ縦サイズ
int i_dest_lower_top; //下部抽出画像描画y座標
int i_dest_upper_top; //上部抽出画像描画y座標
BOOL B_divide_draw; //分割描画フラグ
int i_half_margin; //表示サイズの高さ増分(上下均等配分)[array → 0 = 上下合計値, 1 = 片側分]
int i_handle; //リール画像ハンドル
int i_height; //リール画像縦サイズ
int i_last_position; //前フレームのリール位置(上段リール図柄番号)
int i_left; //リール窓内画像の表示位置(左上x座標)
int i_now_image_type; //表示リール画像タイプ
int i_now_position; //リールの現在位置(上段リール図柄番号)
int i_show_segment; //表示コマ数
int i_speed; //リール回転速度(1フレーム当たりの縦スクロールサイズ)
int i_src_left; //表示画像抽出位置基本x座標
int i_src_lower_height; //下部抽出画像縦サイズ
int i_src_top; //表示画像抽出位置基本y座標
int i_src_upper_height; //上部抽出画像縦サイズ
ReelState RS_state; //リール状態
int i_stop_position; //リール停止予定位置(上段リール図柄番号)
int i_top; //リール窓内画像の表示位置(左上y座標)
int i_total_character; //リール図柄総数
int i_total_image_type; //リール画像保持数
int i_total_margin; //表示サイズの高さ増分(上下均等配分)[array → 0 = 上下合計値, 1 = 片側分]
int i_width; //リール横サイズ
//初期化
void Initialize();
//メッセージ表示(*message = "メッセージ")
void Message(const TCHAR *message);
public:
//コンストラクタ
CReel();
//コンストラクタ[初期設定用](left = 描画x座標, top = 描画y座標, totalcharacter = 1リールのコマ数(行数), totalimagetype = リール画像保持数(列数), reelimagehandle = 画像ハンドル, showsegment = 表示コマ数, marginsize = 表示サイズの高さ増分[上下均等配分・最大1コマ分の縦サイズ], speed = 回転速度, nowcharacternumber = 現在の図柄位置番号)
CReel(int left, int top, int totalcharacter, int totalimagetype, int reelimagehandle, int showsegment, int marginsize, int speed, int nowcharacternumber);
//描画
void Draw();
//表示リール画像取得
int GetImageType();
//現在位置[図柄番号]取得
int GetNowPosition();
//表示コマ数取得
int GetShowSegment();
//速度取得
int GetSpeed();
//状態取得
ReelState GetState();
//指定停止位置[図柄番号]取得
int GetStopPosition();
//リール横サイズ取得
int GetWidth();
//図柄番号範囲外補正[値代入版]
int ReviseCharacterNumber(int characternumber);
//リール描画基本位置設定(left = 左上x座標, top = 左上y座標)
void SetDrawPosition(int left, int top);
//表示リール画像変更(imagetype = リール画像タイプ)
void SetImageType(int imagetype);
//リール位置強制移動(characternumber = 上段図柄番号)
void SetNowPosition(int characternumber);
//リール画像設定(totalcharacter = 図柄コマ数(行数), totalimagetype = 画像タイプの保持数(列数), reelimagehandle = 画像ハンドル)[自由サイズ。但し、縦のサイズは図柄のコマ数で割り切れる事!]
void SetReelImage(int totalcharacter, int totalimagetype, int reelimagehandle);
//表示サイズの高さ増分設定(marginsize = 上下合計延長サイズ[上下均等配分・最大1コマ分の縦サイズ])
void SetShowMargin(int marginsize);
//表示コマ数設定(showsegment = 表示コマ数)
void SetShowSegment(int showsegment);
//リール回転速度設定(speed = リール回転速度[1フレーム当たりの縦スクロールサイズ])
void SetSpeed(int speed);
//状態設定
void SetState(ReelState statenumber);
//停止位置指定(characternumber = 上段図柄番号)
void SetStopPosition(int characternumber);
//リール回転スタート
void Start();
//リール回転強制停止
void Stop();
//アップデート
void Update();
};
#endif //!CLASS_CREEL_100
//*************************************************
// CReel Class Ver. 1.00 2014.11.16 by V30
//*************************************************
#include
#include
//private:
void CReel::Initialize()
{
i_character_height = 1; //リール図柄1コマ縦サイズ
i_dest_lower_top = 0; //下部抽出画像描画y座標
i_dest_upper_top = 0; //上部抽出画像描画y座標
B_divide_draw = FALSE; //分割描画フラグ
i_half_margin = 0; //表示サイズの高さ増分(ハーフサイズ)
i_height = 1; //リール画像縦サイズ
i_last_position = 0; //前フレームのリール位置(上段リール図柄番号)
i_left = 0; //リール窓内画像の表示位置(左上x座標)
i_now_image_type = 0; //表示リール画像タイプ
i_now_position = 1; //リールの現在位置(上段リール図柄番号)
i_show_segment = 1; //表示コマ数
i_speed = 0; //リール回転速度(1フレーム当たりの縦スクロールサイズ)
i_src_left = 0; //表示画像抽出位置基本x座標
i_src_lower_height = 0; //下部抽出画像縦サイズ
i_src_top = 0; //表示画像抽出位置基本y座標
i_src_upper_height = 0; //上部抽出画像縦サイズ
RS_state = RS_STOP; //リール状態
i_stop_position = 1; //リール停止予定位置(上段リール図柄番号)
i_top = 0; //リール窓内画像の表示位置(左上y座標)
i_total_character = 2; //リール図柄総数
i_total_image_type = 1; //リール画像保持数
i_total_margin = 0; //表示サイズの高さ増分(上下均等配分)
i_width = 0; //リール横サイズ
}
void CReel::Message(const TCHAR *message)
{
MessageBox(NULL, _T(message), _T("確認"), MB_OK | MB_ICONWARNING); //確認のみ
}
//public:
CReel::CReel()
{
Initialize(); //初期化
}
CReel::CReel(int left, int top, int totalcharacter, int totalimagetype, int reelimagehandle, int showsegment, int marginsize, int speed, int nowcharacternumber)
{
Initialize(); //初期化
SetDrawPosition(left, top); //描画位置設定(left = 左上x座標, top = 左上y座標)
SetReelImage(totalcharacter, totalimagetype, reelimagehandle); //リール画像設定(totalcharacter = 図柄コマ数(行数), totalimagetype = 画像保持数(列数), reelimagehandle = 画像ハンドル)[自由サイズ。但し、縦(高さ)のサイズは図柄のコマ数で割り切れる事!]
SetShowSegment(showsegment); //表示コマ数設定(showsegment = 表示コマ数)
SetShowMargin(marginsize); //表示サイズの高さ増分設定(marginsize = 合計延長サイズ[上下均等配分・最大1コマ分の縦サイズ])
SetSpeed(speed); //リール回転速度設定(speed = リール回転速度[1フレーム当たりの縦スクロールサイズ])
SetNowPosition(nowcharacternumber); //リール位置強制移動(characternumber = 上段図柄番号)
}
void CReel::Draw()
{
//分割描画
if (B_divide_draw)
{
DrawRectGraph(i_left, i_dest_upper_top, i_src_left, i_src_top, i_width, i_src_upper_height, i_handle, TRUE, FALSE); //上部抽出画像描画
DrawRectGraph(i_left, i_dest_lower_top, i_src_left, 0, i_width, i_src_lower_height, i_handle, TRUE, FALSE); //下部抽出画像描画
}
//一括描画
else
{
DrawRectGraph(i_left, i_dest_upper_top, i_src_left, i_src_top, i_width, i_src_upper_height, i_handle, TRUE, FALSE); //抽出画像描画
}
}
int CReel::GetImageType()
{
return i_now_image_type; //表示リール画像タイプ返還
}
int CReel::GetNowPosition()
{
return i_now_position; //リールの現在位置(上段リール図柄番号)返還
}
int CReel::GetShowSegment()
{
return i_show_segment; //表示コマ数返還
}
int CReel::GetSpeed()
{
return i_speed; //リール回転速度(1フレーム当たりの縦スクロールサイズ)返還
}
CReel::ReelState CReel::GetState()
{
return RS_state; //リール状態返還
}
int CReel::GetStopPosition()
{
return i_stop_position; //リール停止予定位置(上段リール図柄番号)返還
}
int CReel::GetWidth()
{
return i_width; //リール横サイズ返還
}
int CReel::ReviseCharacterNumber(int characternumber)
{
if ((characternumber %= i_total_character) i_total_character)
{
Message("class CReel::SetNowPosition()-->図柄番号の指定値が範囲外です!"); //エラーメッセージ
return; //呼び出し元に修正させる為、スルー
}
i_now_position = characternumber; //リールの現在位置セット
i_src_top = i_character_height * (i_now_position - 1) - i_half_margin; //表示画像抽出位置基本y座標算出
if ((i_src_top %= i_height) グラフィックハンドルが不正です!"); //エラーメッセージ
return; //現設定のまま続行
}
//リール図柄総数範囲未満の時の処理
if (totalcharacter 図柄数の指定値が小さすぎます!"); //エラーメッセージ
totalcharacter = i_show_segment + 1; //リール図柄総数範囲外補正
}
//リール図柄総数範囲超過の時の処理
if (totalcharacter > CHARACTER_MAX)
{
Message("class CReel::SetReelImage()-->図柄数の指定値が大きすぎます!"); //エラーメッセージ
totalcharacter = CHARACTER_MAX; //リール図柄総数範囲外補正
}
//リール画像保持数範囲未満の時の処理
if (totalimagetype 画像保持数の指定値が小さすぎます!"); //エラーメッセージ
totalimagetype = 1; //リール画像保持数範囲外補正
}
//リール画像保持数範囲超過の時の処理
if (totalimagetype > width)
{
Message("class CReel::SetReelImage()-->画像保持数の指定値が大きすぎます!"); //エラーメッセージ
totalimagetype = width; //リール画像保持数範囲外補正
}
i_handle = reelimagehandle; //リール画像ハンドルセット
i_total_character = totalcharacter; //リール図柄総数セット
i_total_image_type = totalimagetype; //リール画像保持数セット
i_width = width / i_total_image_type; //リール横サイズ算出
i_character_height = i_height / i_total_character; //リール図柄1コマ縦サイズ算出
SetShowMargin(i_total_margin); //表示サイズの高さ増分上限補正(SetShowMargin関数利用)
i_src_left = i_now_image_type * i_width; //表示画像抽出位置基本x座標セット
}
void CReel::SetShowMargin(int marginsize)
{
if (marginsize i_character_height) marginsize = i_character_height; //表示サイズの高さ増分範囲外補正2
i_half_margin = marginsize / 2; //表示サイズの高さ増分(ハーフサイズ[端数切捨て])セット
i_total_margin = i_half_margin * 2; //表示サイズの高さ増分(偶数補正値)セット
i_dest_upper_top = i_top - i_half_margin; //上部抽出画像描画y座標セット
}
void CReel::SetShowSegment(int showsegment)
{
if (showsegment SHOW_SEGMENT_MAX) showsegment = SHOW_SEGMENT_MAX; //範囲外補正2
if (showsegment > i_total_character - 1)
{
Message("class CReel::SetShowSegment()-->図柄数以上の設定は受け付けできません!"); //エラーメッセージ
return; //呼び出し元に修正させる為、スルー
}
i_show_segment = showsegment; //表示コマ数セット
}
void CReel::SetSpeed(int speed)
{
if (speed i_character_height) speed = i_character_height; //速度制限(順回転時)
i_speed = speed; //リール回転速度セット
}
void CReel::SetState(ReelState reelstate)
{
RS_state = reelstate; //リール状態列挙子セット
}
void CReel::SetStopPosition(int characternumber)
{
if (characternumber i_total_character)
{
Message("class CReel::SetNowPosition()-->図柄番号の指定値が範囲外です!"); //エラーメッセージ
return; //呼び出し元に修正させる為、スルー
}
i_stop_position = characternumber; //停止予定位置セット
RS_state = RS_CONTROL; //リール状態を指定図柄停止制御中にする
}
void CReel::Start()
{
i_stop_position = 0; //指定停止位置リセット
RS_state = RS_ROUND; //リール状態を回転開始にセット
}
void CReel::Stop()
{
RS_state = RS_STOP; //リール状態を回転停止にセット
}
void CReel::Update()
{
//リール回転時の処理
if (RS_state == RS_ROUND || RS_state == RS_RECIEVE || RS_state == RS_CONTROL)
{
i_src_top -= i_speed; //回転(スクロール)
if ((i_src_top %= i_height) 0) nextposition = ReviseCharacterNumber(i_stop_position - 1); //次番号設定(順回転時)
if (i_now_position == nextposition)
{
SetNowPosition(i_stop_position); //正位置に調える
RS_state = RS_AFTER; //リール状態を停止制御完了にする
}
}
}
i_last_position = i_now_position; //図柄番号の保存
//抽出画像設定(一括描画時)
if (i_src_top
#include
#define WINDOW_WIDTH 1280 //ウインドウサイズ
#define WINDOW_HEIGHT 720 //ウインドウ高さ
#define WINDOW_DEPTH 32 //ビット深度
#define WINDOW_TITLE "CReel Class - Tester" //ウインドウタイトル
#define FONT_COLOR 0xff8800 //フォントカラー
//ミニゲーム用変数宣言
int i_bet[1001][3]; //投票枚数
int i_framecount = 0; //画面更新数
int i_ghandle_chara[3]; //リール図柄1コマ画像ハンドル
int i_medal = 1000; //所持メダル
int i_payout = 0; //配当枚数
int i_rate[3]; //配当倍率(10培値)
int i_result[10]; //結果履歴
int i_selectnumber = 0; //投票選択枠番号
int i_stopcharacter = 0; //確定図柄
//ミニゲーム用関数プロトタイプ
void ComputeRate();
void InitializeBet();
void OthersBet();
void Payout();
//***アプリケーション本体***
int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC)
{
SetOutApplicationLogValidFlag(FALSE); //ログ出力OFF
ChangeWindowMode(TRUE); //ウインドウモード変更[FALSE・全文省略(デフォルト)は、全画面モード]
SetGraphMode(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_DEPTH); //ウインドウサイズ&ビット深度設定
SetWindowSizeChangeEnableFlag(TRUE); //ウインドウサイズ変更可能フラグ設定
SetWindowTextA(WINDOW_TITLE); //ウインドウタイトル設定
if (DxLib_Init() == -1) return -1; //DxLibを初期化→DxLibが異常なら、アプリを異常終了
SetDrawScreen(DX_SCREEN_BACK); //描画画面を裏画面に切り替え
//変数宣言
CReel reel; //CReelクラスオブジェクト
int i_fhandle; //フォントハンドル
int i_ghandle_reel; //リール画像ハンドル
int i_key; //最新入力キー
int i_lastkey; //前回入力キー
LONGLONG LL_frametime; //フレーム時間計測用
LONGLONG LL_starttime; //処理時間計測用
//変数初期化
i_fhandle = CreateFontToHandle("MS明朝", 16, -1); //フォントハンドル作成
i_ghandle_reel = LoadGraph("Data\\CReel_reel.png"); //リール画像読み込み
i_lastkey = 0; //前回入力キー初期化
LL_frametime = 0; //フレーム時間初期化
LL_starttime = 0; //処理開始時刻初期化
//CReelクラスオブジェクト個別設定(コンストラクタで一括設定も可能)
reel.SetReelImage(12, 3, i_ghandle_reel); //画像設定
reel.SetDrawPosition(560, 120); //表示位置設定
reel.SetShowSegment(1); //表示コマ数設定
reel.SetImageType(2); //画像タイプ設定
reel.SetSpeed(10); //速度設定
reel.SetNowPosition(1); //初期停止位置設定
//ミニゲーム用初期設定
for (int i = 0; i 180)
{
reel.SetStopPosition(i_stopcharacter); //停止位置指定
}
//払い出し処理
if (reel.GetState() == CReel::RS_AFTER)
{
Payout();
reel.SetState(CReel::RS_STOP);
}
i_key = GetJoypadInputState(DX_INPUT_KEY_PAD1); //キーボードとジョイパッド1の状態取得
//キー入力処理(前回の入力と違う場合&リール回転前停止中のみ)
if (i_key != i_lastkey && reel.GetState() == CReel::RS_STOP)
{
//↓キー入力時処理
if (i_key == PAD_INPUT_DOWN)
{
i_stopcharacter = GetRand(11) + 1; //停止図柄番号抽選
i_payout = 0; //払い出し枚数リセット
i_framecount = 0; //フレームカウンタリセット
reel.Start(); //リール回転開始
}
//←キー入力時処理
else if (i_key == PAD_INPUT_LEFT)
{
i_selectnumber--; //選択枠左移動
if (i_selectnumber 2) i_selectnumber = 0; //選択枠番号範囲外補正
}
//↑(A)キー入力時処理
else if (i_key == PAD_INPUT_UP || i_key == PAD_INPUT_4)
{
i_medal -= 100; //メダル-100
i_bet[1][i_selectnumber] += 100; //100BET
ComputeRate(); //配当倍率計算
}
//Xキー入力時処理
else if (i_key == PAD_INPUT_2)
{
i_medal -= 1000; //メダル-1000
i_bet[1][i_selectnumber] += 1000; //1000BET
ComputeRate(); //配当倍率計算
}
}
//ESCキー入力時処理
else if (i_key == PAD_INPUT_9)
{
break; //アプリ終了
}
i_lastkey = i_key; //入力キー保存
reel.Update(); //リールアップデート
//グラフィック描画
DrawBox(795 + 100 * i_selectnumber, 115, 885 + 100 * i_selectnumber, 205, 0xff0000, TRUE); //選択枠描画
reel.Draw(); //リール描画
for (int i = 0; i -1) DrawExtendGraph(635 + 45 * i, 60, 675 + 45 * i, 100, i_ghandle_chara[i_result[i]], TRUE); //履歴図柄描画
}
//文字表示
DrawStringToHandle(1045, 40, "NEW", FONT_COLOR, i_fhandle); //NEW表示
DrawStringToHandle(560, 68, "RESULT→", FONT_COLOR, i_fhandle); //RESULT表示
DrawStringToHandle(750, 220, "RATE", FONT_COLOR, i_fhandle); //RATE表示
DrawStringToHandle(754, 260, "BET", FONT_COLOR, i_fhandle); //BET表示
for (int i = 0; i 0) i_rate[i] = (int)(totalbet * 7.5f / i_bet[0][i]); //投票があれば、配当倍率(10培値)を計算
else i_rate[i] = 10; //投票0の時は、配当倍率(10培値)を10にする
if (i_rate[i] < 10) i_rate[i] = 10; //配当倍率(10培値)が10未満の時は、10に補正する
}
}
//全投票数初期化
void InitializeBet()
{
for (int i = 0; i < 1001; i++)
{
for (int j = 0; j < 3; j++)
{
i_bet[i][j] = 0; //投票数初期化
}
}
}
//他人の投票
void OthersBet()
{
InitializeBet(); //全投票数初期化
int m = 10 + GetRand(990); //自分以外の参加者数決定
for (int i = 2; i <= m; i++)
{
for (int j = 0; j < 3; j++)
{
i_bet[i][j] = 100 * GetRand(10); //各図柄へランダム投票
}
}
}
//払い出し
void Payout()
{
int r = (i_stopcharacter - 1) % 3; //結果番号算出
i_payout = i_rate[r] * i_bet[1][r] / 10; //払い出し枚数算出
i_medal += i_payout; //払い出し枚数獲得
for (int i = 0; i < 9; i++)
{
i_result[i] = i_result[i + 1]; //履歴シフト
}
i_result[9] = r; //最新履歴セット
for (int i = 0; i < 3; i++) i_bet[1][i] = 0; //BET枚数リセット
OthersBet(); //他人の投票
ComputeRate(); //配当倍率計算
}
動作に問題がありましたら、ご一報下さると有り難いです。ご意見、ご感想も受付いたします。
今後は、加速スタート・減速停止・バウンド停止等、徐々に機能を追加して行く予定です。
ミニゲームは、公営競技的な物になりました。
自身、公営競技は数年に一度しかやらないし、そういうジャンルのゲームもやらないので上手くできているのか分かりませんが、
基本知識はありますから、それっぽくできていると思います。
十字キーだけで遊べます。左右で選んで、上でBETして、下でスタート、になります。BETしなくても、スタートできます。
ジョイパッドにも対応しています。ジョイパッドの2番ボタンかキーボードのXキーで、10倍BETできます。
やればやるほど、マイナスになります。まさにこれが、公営競技の縮図です。
倍々ゲーム方式で、メダルを確実に増やせるものなら増やしてみて下さい。
たくさん賭ければ、その分に比例して胴元が儲かるだけです。
どうしても勝ちたい人は、プログラムをイジって、イカサマして下さい。
全5回くらいで終わらせたかったのですが、のんびりとここまでやって来ました。
初心者の方の何かの礎になってもらえたら、幸いです。
かけだしだったのが、日記を一週間ほど書いただけで何だか上級者になっちゃいましたが、ご覧の通り、まだまだ初心者です。
今後も気が向いたら、何か日記に書きます。