Difference between revisions of "Connect Four"

From CSE231 Wiki
Jump to navigation Jump to search
Line 33: Line 33:
 
===connectfour.core===
 
===connectfour.core===
 
[https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html interface Board]
 
[https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html interface Board]
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#isDone-- isDone()]
+
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#isDone()-- isDone()]
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#getWinner-- getWinner()]
+
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#getWinner()-- getWinner()]
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#getCurrentPlayer-- getCurrentPlayer()]
+
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#getCurrentPlayer()-- getCurrentPlayer()]
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#getTurnsPlayed-- getTurnsPlayed()]
+
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#getTurnsPlayed()-- getTurnsPlayed()]
 
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#createNextBoard-int- createNextBoard(int column)]
 
: [https://www.cse.wustl.edu/~cosgroved/courses/cse231/current/apidocs/connectfour/core/Board.html#createNextBoard-int- createNextBoard(int column)]
 
<!--
 
===java.util.concurrent===
 
[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveTask.html class RecursiveTask] extends ForkJoinTask
 
:[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RecursiveTask.html#compute-- compute()]
 
 
[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html class ForkJoinTask]
 
:[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html#fork-- fork()]
 
:[https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinTask.html#join-- join()]
 
-->
 
 
class EvaluationColumnPair
 
: double getEvaluation()
 
: Optional<Integer> getColumn()
 
  
 
===java.util===
 
===java.util===

Revision as of 07:10, 13 February 2020

credit for this assignment: Finn Voichick and Dennis Cosgrove

Motivation

Minimax is an important concept in game theory and search.

Negamax is a variant which relies on

While this technique is applicable to Chess (as Deep Blue employed to defeat Kasparov), we choose Connect Four as our context since it has a simpler game mechanic.

While the core part of searches like Minimax may be easy to parallelize, critical aspects such as alpha-beta pruning are more challenging.

Background

Video

Tutorial

Solving Connect Four

Wikipedia

Minimax

Negamax

The Core Questions

  • What are the tasks?
  • What is the data?
  • Is the data mutable?
  • If so, how is it shared?

Code To Use

connectfour.core

interface Board

isDone()
getWinner()
getCurrentPlayer()
getTurnsPlayed()
createNextBoard(int column)

java.util

class Optional<T>

Code To Implement

Negamax

class: ConnectFour.java Java.png
methods: select
negamaxKernel
selectNextColumn
package: connectfour.studio
source folder: student/src/main/java

method: private static ColumnEvaluationPair select(ColumnEvaluationPair[] array) Sequential.svg (sequential implementation only)

method: static ColumnEvaluationPair negamaxKernel(Board board, Heuristic heuristic, IntPredicate parallelPredicate, IntPredicate evaluatePredicate, int currentDepth) Parallel.svg (parallel implementation required)

method: public static int selectNextColumn(Board board, Heuristic heuristic, IntPredicate parallelPredicate, IntPredicate evaluatePredicate) Sequential.svg (sequential implementation only)

Win or Lose Heuristic

class: WinOrLoseHeuristic.java Java.png
methods: evaluate
package: connectfour.studio
source folder: student/src/main/java

method: public double evaluate(Board board) Sequential.svg (sequential implementation only)

Evaluate the current state of the Board. You should return a negative number if you have lost. You should return less negative numbers for losses that occur later.

OpenEndedHeuristic (Optional)

class: OpenEndedHeuristic.java Java.png
methods: evaluate
package: connectfour.challenge
source folder: student/src/main/java

method: public double evaluate(Board board) Sequential.svg (sequential implementation only)

Testing Your Solution

Correctness

class: ConnectFourTestSuite.java Junit.png
package: connnectfour.studio
source folder: testing/src/test/java

Visualization

class: ConnectFourViz.java VIZ
package: connnectfour.viz.game
source folder: student/src//java

ConnectFourViz.png