解答・コメントを送る方法
コメントを送るには2つの方法があります。
- 匿名でコメントを書くログインせずにコメントを書くことができます。 名前は「匿名」となります。
- アカウントを作成してコメントを書くアカウントを作成すると、記名での投稿ができます。 また、プロフィールページが作成され、 簡単なプロフィールや 統計情報が表示されるようになります。
投稿ボタンを押す前に以下の文章を確認してください
- 当サイトへの投稿は クリエイティブ・コモンズ・ライセンス BY(表示)および、その解釈に同意するものとみなされます。各ページには下のようにライセンス表示が行われます。
- あなたの投稿したコード・コメント・トピックが再利用・添削されることを望まない場合は、投稿をお控えください。
- 自分が書いていない、ウェブサイトや書籍などからの無断コピーは著作権の侵害です。著作権者の了解を得るか、自分で0から書いてください。
- 著作権の侵害、名誉毀損、など投稿内容に問題がある場合、削除することがあります。
- これらのことにあなたはあらかじめ同意したものとみなされます。
Post comment
Post a comment to the following challenge:
マルバツゲーム:賢いプレイヤー
(Nested
Flatten)
As a reply to the following comment: yuin: 微妙な感じですがとりあえず・・・Clev...(#6235) [show]

yuin
#6235()
[
Scala
]
Rating0/0=0.00
微妙な感じですがとりあえず・・・CleverPlayerを追加しました。
1万回対戦させてみたところ
Cleverが先行
Randomが先行
Clever vs Clever
という感じでした。戦略は優先度順に
としてみました。
import java.util.Random class TicTacToe(val players:List[Player]) { val size = 3 protected val field = new Array[Array[char]](size,size) val lines = (_stline((v,v2) => (v,v2))++_stline((v,v2) => (v2,v))++ List(((size-1).until(-1,-1)).map(v=> (v,(size-1-v)))) ++ List((0 until size).map(v=>(v,v)))).map(_.toList) def _stline(f:(int,int) => Pair[int,int]) = (0 until size).map(v => (0 until size).map(v2 => f(v,v2))) def start:Option[Player] = { for(val i<-(0 until size); val j<-(0 until size)) { field(i)(j) = ' '} Stream.const(players).flatMap(v=>v).take(size*size).find {player => val p@Pair(y,x) = player.put(this) if(!available_?(p)) error("Oops!") field(y)(x) = player.mark judge } } def judge = lines.exists(l => l.forall(!available_?(_)) && l.forall(v => at(l(0)) == at(v))) def available_?(pos:Pair[int,int]) = at(pos) equals ' ' def at(pos:Pair[int,int]) = field(pos._1)(pos._2) def at_eq(pos:Pair[int,int], mark:char) = at(pos) equals mark def enemy_of(player:Player) = players.find{_.mark != player.mark}.get } abstract class Player{ val mark:char val name:String def put(ttt:TicTacToe):Pair[int,int] } class RandomPlayer(override val mark:char, override val name:String) extends Player{ val rnd = new Random override def put(ttt:TicTacToe) = { def _n = (rnd.nextInt(ttt.size), rnd.nextInt(ttt.size)) def next(v:Pair[int,int]):Stream[Pair[int,int]] = Stream.cons(v, next(_n)) next(_n).find(ttt.available_?).get } } class CleverPlayer(override val mark:char, override val name:String) extends Player { override def put(ttt:TicTacToe):Pair[int,int] = { val enemy = ttt.enemy_of(this) val return_if_available_find = (l:Seq[Pair[int,int]]) => l.find(ttt.available_?) match { case Some(pos) => return pos case _ => () } def line2(v:char) = ttt.lines.filter(_.count(ttt.at_eq(_,v)) == 2) return_if_available_find(List(mark, enemy.mark).flatMap(line2).flatMap(v=>v)) val all = (for(val i<-(0 until ttt.size); val j<-(0 until ttt.size)) yield (i,j)).toList val center = (ttt.size/2, ttt.size/2) val corners = List((0,0), (ttt.size-1,ttt.size-1), (0,ttt.size-1), (ttt.size-1, 0)) val others = all.diff(center::corners) if(all.count(ttt.at_eq(_, enemy.mark)) == 2 && ttt.at_eq(center, this.mark)) { if(!others.forall(ttt.available_?)) { val ps = all.filter(ttt.at_eq(_, enemy.mark)) def vecv(a:Pair[int,int]) = (0 /: ps){(r, p) => r+(a._1 - p._1).abs+(a._2 - p._2).abs} return_if_available_find(corners.sort(vecv(_) < vecv(_))) } return_if_available_find(others) } return_if_available_find(List(center)) return_if_available_find(corners) others.find(ttt.available_?).get } }Rating0/0=0.00-0+
[ reply ]