• ベストアンサー
  • すぐに回答を!

正規表現の表現方法について

  • 質問No.9675556
  • 閲覧数44
  • ありがとう数0
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 0% (0/1)

じゃんけんの手を正規表現での表現方法について。
それぞれの手を定数で表現しています。場にじゃんけんの手が012と出たときに並び替えた120や210もパターン認識させたいと考えています。
正規表現の記述について教えていただきたいです。

現在のコード
package game;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
// ユーザーの手を格納する変数
private static int playerhand;
private static int user1hand;
private static int user2hand;
// 各々の勝数
private static int playercount = 0;
private static int user1count = 0;
private static int user2count = 0;
// ジャンケンの手を表す定数を宣言する
private static final int STONE = 0;
private static final int SCISSORS = 1;
private static final int PAPER = 2;
// 判定する文字列
private static String checkhand = null;
public static void main(String[] args) {
// ここでじゃんけんさせる
playerhand = STONE;
user1hand = PAPER;
user2hand = STONE;
// 判定する文字列
checkhand = String.valueOf(playerhand) + String.valueOf(user1hand) + String.valueOf(user2hand);
System.out.println(checkhand);

// 判定するパターンを用意

// 引き分けパターン
Pattern draw = Pattern.compile("([0]&[1]&[2])|([0]&[0]&[0])|([1]&[1]&[1])|([2]&[2]&[2])");
// 2人勝ちパターン
Pattern win2 = Pattern.compile("([0]&[0]&[1])|([1]&[1]&[2])|([2]&[2]&[0])");
// 1人勝ちパターン
Pattern win1 = Pattern.compile("([0]&[1]&[1])|([1]&[2]&[2])|([2]&[0]&[0])");
// パターンとの一致を確認するための準備
Matcher checkdraw = draw.matcher(checkhand);
Matcher checkwin2 = win2.matcher(checkhand);
Matcher checkwin1 = win1.matcher(checkhand);
if (checkdraw.find()) {
System.out.println("引き分けパターン");
} else if (checkwin2.find()) {
System.out.println("2人勝ちのパターン");
checkWin2();
} else if (checkwin1.find()) {
System.out.println("1人勝ちのパターン");
checkWin1();
}
}
/**
* 1人勝ちで勝者の勝数を増やすメソッド
*
*/
public static void checkWin1() {
if (playerhand == user1hand) {
user2count++;
} else if (user1hand == user2hand) {
playercount++;
} else {
user1hand++;
}
}
/**
* 2人勝ちで勝者の勝数を増やすメソッド
*/
public static void checkWin2() {
if (playerhand == user1hand) {
playercount++;
user1count++;
} else if (user1hand == user2hand) {
user1hand++;
user2hand++;
} else {
playercount++;
user2count++;
}
}
}


※OKWAVEより補足:「Webシステム開発」についての質問です。

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 45% (199/435)

今、じゃんけんの参加者は3人のようですがもっと増えたらその都度、
新たに正規表現を考えるのでしょうか。
正規表現の勉強をするなら別ですが、もっとシンプルに考えたほうがいいのでは?
たとえばこんな感じ。
-----------------------------------------------------------------------------
//'g','c','p'を要素としてじゃんけんをし、
//勝ったもののインデックスの配列を返す。
//あいこなら空配列。
function janken( hands ){
//出された手を手ごとのインデックス配列を格納する連想配列に取り込む
var handHash={
'g':[],
'c':[],
'p':[]
}
for( var i=0,len=hands.length; i<len; i++ ){
handHash[ hands[i] ].push(i)
}

var gFlag=(handHash.g.length > 0)? 1:0
var cFlag=(handHash.c.length > 0)? 1:0
var pFlag=(handHash.p.length > 0)? 1:0
//手が3つに分かれたら空配列を返す(あいこ)
if ( gFlag * cFlag * pFlag ){
return []
}
//手が1つだけなら空配列を返す(あいこ)
if ( gFlag + cFlag + pFlag == 1 ){
return []
}
//チョキvsパー
if ( !gFlag ){
return handHash.c
}
//パーvsグー
if ( !cFlag ){
return handHash.p
}
//グーvsチョキ
if ( !pFlag ){
return handHash.g
}
}
-----------------------------------------------------------------------------
※javaでなくjavascriptですが意味は分かると思います。
補足コメント
sima9985

お礼率 0% (0/1)

ballvilleさん

回答ありがとうございます。
連想配列を使用すれば、3人以上も対応出来るんですね。

今回は人数は3人で人数を固定してじゃんけんをするという仕様です。
if文やswicth文で対応しようとすると条件分岐が多くなるので
講義で習った正規表現で条件を記述できないかと考えている所です。
投稿日時:2019/11/06 14:28
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ