Help us understand the problem. What is going on with this article?

Javaでルーレットを作った.

More than 1 year has passed since last update.

Javaでルーレットゲームを作成した話

はじめに

SLP KBIT Advent Calendar 2018 12/5
大学の実験でJavaを用いてルーレットを作ったので,それを紹介する.GitHub
本来は,別の成果物を紹介する予定だったが,あまりにも時間が無く,完成に漕ぎ着けれなかった.

ルーレットとは

カジノにあるやつ.Wikipedia
アメリカ式とヨーロッパ式がある.
アメリカ式は,1~36の数字に追加して0/00が存在する.ヨーロッパ式は,0のみである.
今回は,プログラミングの都合上,偶数の方が都合がいいと考え,アメリカ式を採用した.

言語

Java>=9で動作を確認している.
何故,Javaを使った理由としては,実験で指定されたからである.重い.

オリジナルルール

作成する上で簡略化するために,一部のルールを簡略化している.

  • ディーラーが破産したら勝ち,自分が破産したら負けである.
  • 掛け金がなくなるか,胴元の破産で終了.
  • 線の上には掛けない.

ゲームの流れ

  1. プレイヤーが賭ける場所と金額を設定
  2. 抽選
  3. 支払い処理
  4. 破産判定 if(破産) goto 6
  5. goto 1.
  6. 終了

独自設計

ルーレットには,SMALLやREDなど,特殊な場所がある.これは以下の値を用いることでint型で表現する.
そのうち,enumに置き換えたい.

数字
0 0
... ...
36 36
37 00
38 SMALL
39 MIDDLE
40 LARGE
41 LOW
42 HIGH
43 PARILLINEN(偶数)
44 PARITON(奇数)
45 RED
46 BLACK

動作中の様子

  1. ベットテーブル
    picTable.png

  2. ルーレットの円盤
    picBall.png

クラス設計

Progress

  • ゲームの全体進行を行う
  • Mainメソッドはここ.

InforMation

  • ゲームの説明をする.
  • ベットできる残り時間を表示する.

AnyNumMoney

以下の変数がある.

  • 初期化用変数
  • 賭けた場所
  • 賭金

また,Static変数として,賭けた場所とお金の回数を別々に保存する.
これを配列として,扱うことで,何処に幾ら賭けているのかを取り扱うことができ,次の値を配列の何番目に保存するのかが取得できる.
publicメソッドとして,resetがある.これは,全ての値を初期化する.

Table

  • ユーザが賭ける場所と金額を設定する.
  • JButtonを多用

anyNumNomeyNormailizeメソッドにより,AnyNumMoney配列の正規化を行う.
これは,賭ける場所のみや,お金のみを保存していて,もう片方を保存していない要素は無駄であるため,取り消すためである.
publicメソッドには,以下のものがある.

  1. void setLock(beelean)
    ベットを行えなくなる.実際のカジノでは,時間制限によりベットができなくなる.それを実現する.

  2. beelean getLock()
    現在,ベットが行えるかを取得する.

  3. AnyNumMoney[] getNumMoney()
    現在,何処に幾ら賭けているかを保存した配列を返す.

Number

  • enum定義や,NumbersTableの値の取得メソッド

NumbersTable

  • ArrayListで,番号,SML,色を保存する.
  1. public static SpecialNumbers getSpecialNumberByAddress(int)
    値を投げて,特殊な場所のenumを取る.

Roulette

  • 乱数生成をする.
  1. int getIntRouletteValue()
    intで取る.

  2. String getStringRouletteValue()
    Stringで取る.

MyColor

Color型を返す.

Ball

  • 乱数によって決まった値まで,ボールを円盤状で流すアニメーション
  • コンストラクタの引数で,止める数字を取る.

BallMainクラスをWindowとして呼び出す.
BallMainのWindowは,別スレッドで動作するため,Mainメソッドから直接呼び出すと,ルーレットが終わる前に,Mainメソッドの処理が進んでしまう.
これを防ぐために, ckDoingBallMain() メソッドを用いて,現在,アニメーションが途中なのか確認する.
終了したら,Windowを閉じて,Mainメソッドに処理を戻る.

Private クラスとして以下を用いる.つか,構造体をくれ.

dPoint

public として,double型のx,y変数を持つ.

iPoint

dPointと同様にint型のx,y変数を持つ.

Cast

dPoint中のx,yをそれぞれ四捨五入して,iPointにする.

NumOrder

円盤の配置を保存する.ルーレット円盤は, 0,1,2,... ではなく 5,22,34,... の規則性の低い順番で決まっている.それを保存するクラス.

  1. int search(int)
    引数の値が何番目に存在するかを返すメソッド.例として, search(5) ならば, 0 が返る.

BallMain

  • 円盤状でボールを回すクラス.
  • ボールを回すアニメーション自体には,スレッドにより動作する.
  • コンストラクタの引数に,止める値と縦横のサイズを取る.
  • 止める値は,円盤状の何番目か, NumOrder.search(int) で求める.
  • 黒魔術コードで絶妙に止まる.
  1. beelean getThreadStatus()
    スレッドが現在動作しているかを,T/Fで返す.

Payment

ユーザやディーラーに対して,金銭的な処理を行う.

  1. void calcEach(Player, Player, int)
    ユーザが賭けた場所を舐めて計算する.

  2. void clac(Player, Player, int, AnyNumMoney)
    ユーザが賭けた場所に対して,インサイドベット,アウトサイドベットの判定を行う.

Wallet

Playerやディーラーの所持金を保存.

  1. Wallet(int)
    所持金を設定.

  2. int getCache()
    所持金を取得.

  3. void Cache(int)
    支払いを行う.所持金から引数額分引かれる.

  4. boolean isInsolvency()
    破産しているかをT/Fで返す.

Player

Playerやディーラーについてのクラス.

Dealer

Playerを継承してるだけ.

ファイルリスト

ファイルリスト
.
├── ButtonIMG/  # そのうちボタンを置き換える用の画像ファイル
├── README.md   
└── roulette/
    ├── Makefile  # Build,実行用
    ├── bin/  # 生成される.classが自動で配置される
    └── src/  # ソースファイル
        ├── AnyNumMoney.java
        ├── Ball.java
        ├── Dealer.java
        ├── InforMation.java
        ├── MyColor.java
        ├── Number.java
        ├── NumbersTable.java
        ├── Payment.java
        ├── Player.java
        ├── Progress.java
        ├── Roulette.java
        ├── Table.java
        ├── Wallet.java
        └── WalletTest.java

Makefile

git clone 後に, cd roulette でDirectoryを移動する.
その後,行いたい動作について,以下を実行する.

コンパイルと実行両方
$ make
コンパイル
$ make class
実行
$ make exe
Classファイルを消す
$ make clean
jarファイルの生成
$ make jar

今後の展望

  • インターネット対戦の実装.
  • テーブルやルーレット円盤のリアリティを高める.

まとめ

作成したルーレットAppについて,紹介した.
実行中の画像とか,そのうち貼ります.
一応,プレイは可能なので,遊んで欲しい.
何かレビューをくれると,とても喜びます.

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした