By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
432,508 Members | 1,915 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 432,508 IT Pros & Developers. It's quick & easy.

Urgent Help Required by Implementing a ConnectFour Game

P: 34
Hi all,

I am a student and I have a project due 20th of this month, I mean May 20, 2007 after 8 days. The project is about creating a Connect Four Game. I have found some code examples on the internet which helped me little bit. But there are lot of problems I am facing developing the whole game. I have drawn the Board and the two players can play. The players numbers can fill the board, but I have problem implementing the winner for the game. I need to implement the hasWon() method for Horizontal win, Vertical win and Diagonal win. I also found some code examples on the net but I was unable to make it working. I have 5 classes and one interface which I m implementing. The main problem is how to implement the hasWon() method in the PlayGame class below with Horizontal, vertical and diagonal moves.


Sorry there is so much code.

This the interface I must implement, but now I am only implementing the int move() of this interface. I will implement the rest later after solving the winner problem with your help.

Interface code..............
interface Player {
void init (Boolean color);
String name ();
int move ();
void inform (int i);

}

Player1 class......................

import java.util.*;
import java.io.*;
import javax.swing.*;





public class Player1 implements Player
{

public Player1()
{}
public int move()
{

Scanner scan = new Scanner(System.in);
// BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in));
int player1;
System.out.println ("What is your Number, player 1?");
player1 = scan.nextInt();
System.out.println ("Hey number"+player1+" are you prepared to CONNECT FOUR");
System.out.println();
return player1;

//Player.move();
//return player1;

}//end move method




public void init (Boolean color)
{}
public void inform (int i)
{}


public String name()
{
return "Koonda";
}

}//end player1 class




Player2 class...........................

import java.util.*;
import java.io.*;
import javax.swing.*;





public class Player2 implements Player
{

public int move()
{

//int cup0,cup1,cup2,cup3,cup4,cup5,cup6;
// cup0=5;cup1=5;cup2=5;cup3=5;cup4=5;cup5=5;cup6=5;

//int num1, num2;
Scanner scan = new Scanner(System.in);
// BufferedReader stdin = new BufferedReader (new InputStreamReader(System.in));
int player2;
System.out.println ("What is your Number, player 2?");
player2 = scan.nextInt();
System.out.println ("Hey "+player2+" are you prepared to CONNECT FOUR");
System.out.println();
//return player1;




return player2;

}//end move method




public void init (Boolean color)
{}
public void inform (int i)
{}


public String name()
{
return "malook";
}

}//end player1 class


PlayGame class which contains all the functionality..................................... ....................


import java.util.*;
import java.io.*;
import javax.swing.*;


public class PlayGame
{
//Player player1;
//Player player2;
int [][]ConnectFourArray;
boolean status;
int winner;
int player1;
int player2;
public PlayGame()
{
//this.player1 = player1;
//this.player2 = player2;
}

public void StartGame()
{

try{
// int X = 0, Y = 0;
//int value;
int cup0,cup1,cup2,cup3,cup4,cup5,cup6;
cup0=5;cup1=5;cup2=5;cup3=5;cup4=5;cup5=5;cup6=5;
int[][] ConnectFourArray = new int[6][7];
int num1, num2;
for(int limit=21;limit!=0;limit--)
{
BufferedReader selecter = new BufferedReader (new InputStreamReader(System.in));
String column1;
System.out.println();
for ( int row=0; row < ConnectFourArray.length; row++ ){
System.out.print("Row " + row + ": ");
for ( int col=0; col < ConnectFourArray[row].length; col++ )
System.out.print( ConnectFourArray[row][col] + " ");
System.out.println();
}
System.out.println();
System.out.println ("Please Select a column of 0 through 6 ");
column1 = selecter.readLine();
num1= Integer.parseInt(column1);
System.out.println();

if (num1==0){
ConnectFourArray[cup0][0]=1;
cup0=cup0-1;
}
else if (num1==1){
ConnectFourArray[cup1][1]=1;
cup1=cup1-1;
}
else if (num1==2){
ConnectFourArray[cup2][2]=1;
cup2=cup2-1;
}
else if (num1==3){
ConnectFourArray[cup3][3]=1;
cup3=cup3-1;
}
else if (num1==4){
ConnectFourArray[cup4][4]=1;
cup4=cup4-1;
}
else if (num1==5){
ConnectFourArray[cup5][5]=1;
cup5=cup5-1;
}
else if (num1==6){
ConnectFourArray[cup6][6]=1;
cup6=cup6-1;
}
System.out.println();


BufferedReader selecter2 = new BufferedReader (new InputStreamReader(System.in));
String column2;
System.out.println();
for ( int row=0; row < ConnectFourArray.length; row++ ){
System.out.print("Row " + row + ": ");
for ( int col=0; col < ConnectFourArray[row].length; col++ )
System.out.print( ConnectFourArray[row][col] + " ");
System.out.println();
}
System.out.println();

System.out.println ("Please Select a column of 0 through 6 ");
column1 = selecter.readLine();
num1= Integer.parseInt(column1);
System.out.println();

if (num1==0){
ConnectFourArray[cup0][0]=2;
cup0=cup0-1;
}
else if (num1==1){
ConnectFourArray[cup1][1]=2;
cup1=cup1-1;
}
else if (num1==2){
ConnectFourArray[cup2][2]=2;
cup2=cup2-1;
}
else if (num1==3){
ConnectFourArray[cup3][3]=2;
cup3=cup3-1;
}
else if (num1==4){
ConnectFourArray[cup4][4]=2;
cup4=cup4-1;
}
else if (num1==5){
ConnectFourArray[cup5][5]=2;
cup5=cup5-1;
}
else if (num1==6){
ConnectFourArray[cup6][6]=2;
cup6=cup6-1;
}
System.out.println();







}
System.out.println();
}
catch (Exception E){
System.out.println("Error with input");
}





System.out.println("Would you like to play again");
try{
{

String value;
BufferedReader reader = new BufferedReader (new InputStreamReader(System.in));
// Scanner scan = new Scanner(System.in);
System.out.println("Enter yes to play or no to quit");
// value = scan.nextLine();
// String value2;
value = reader.readLine();
//value2 = reader.readLine();
if (value.equals("yes"))
{

System.out.println("Start again");
StartGame(); // calling the StartGame method to play a game once more
}
else if (value.equals("no"))
{

System.out.println("No more games to play");
// System.exit(0);
}
else
{

System.exit(0);
}

}
System.out.println();
}
catch (Exception e){
System.out.println("Error with input");
}

finally
{

System.out.println(" playing done");
//StartGame();


}


}








//check for horizontal win
public int hasWon()
{
int status = 0;


for (int row=0; row<6; row++)
{
for (int col=0; col<4; col++)
{
if (ConnectFourArray[col][row] != 0 &&
ConnectFourArray[col][row] == ConnectFourArray[col+1][row] &&
ConnectFourArray[col][row] == ConnectFourArray[col+2][row] &&
ConnectFourArray[col][row] == ConnectFourArray[col+3][row])
{
//status = true;//int winner;

if(status == player1)
{


System.out.println("Player 1 is the winner");
}

else if(status == player2)
{


System.out.println("Player 2 is the winner" );
}

}//end inner for loop
}// end outer for loop
} // end method Winner

return status;
}








}//end class



ClassConnectFour which designs the board........................

import java.util.*;
import java.io.*;
import javax.swing.*;


public class ClassConnectFour
{
//Player player1;
//Player player2;
public ClassConnectFour()
{
//this.player1 = player1;
}

public void DrawBoard()
{
int[][] ConnectFourArray = new int[6][7] ;
for ( int row=0; row < ConnectFourArray.length; row++ ){
System.out.print("Row " + row + ": ");
for ( int col=0; col < ConnectFourArray[row].length; col++ )
System.out.print( ConnectFourArray[row][col] + " ");
System.out.println();
}
System.out.println();

}


}//end class


TestConnetFour class which uses most of the above class..................

import java.util.*;
import java.io.*;
import javax.swing.*;


public class TestConnectFour
{

public static void main(String[] args)
{

ClassConnectFour cf = new ClassConnectFour();
cf.DrawBoard();


Player1 player1 = new Player1();
Player2 player2 = new Player2();




player1.move();
player2.move();
System.out.println("Number 1 belongs to player " + player1.name());
System.out.println("Number 2 belongs to player " + player2.name());
PlayGame pg = new PlayGame();
pg.StartGame();
pg.hasWon();



//pg.Play();
//System.out.println(player.name());
//System.out.println(player2.name());
}// end main


}//end class


I am sorry for all this junk code but I only understand it this way. Your urgent help is required. Looking forward to your reply.

Thanks in advance.

Koonda






//
May 12 '07 #1
Share this Question
Share on Google+
5 Replies


dmjpro
100+
P: 2,476
good approach.

do one thing.
try to represent the board as a matrix with the help of two-dimesional array.
i think u can do it.
then do mimmum decision making equations by which u can reach at a decision who won.
that means .... when a mark in done by a player check three conditions on the basis of current marked square.
if sequential vertical or horizontal or diagonal mark is done by that player then that player won.

mark the sqaures with unique character for each player.
check every time when a player marks a square and update the square with player's indentification character.

i think u got my point ..... so immediate implement this ... if any problem is there plz post ur hasWon method ..

i think i ll able to correct ur bug if have any.
best of luck.

kind regards.
dmjpro.
May 13 '07 #2

Expert 10K+
P: 11,448
There's a little very practical trick: the board measures 7x6 cells (if I'm not
mistaken). Make the real board 9x8 where the border cells contain sentinel
values (i.e. unequal to the three possible values). That way you never have to
explicitly check your indexes for crossing a border.

Another observation is: suppose there's no winner. If, after the current move
there does happen to be a winner, the position of the last move is part of the
winning configuration. All you have to do is track in horizontal, vertical and
diagonal directions starting at that last move's position and count for the
number of coins in that direction.

kind regards,

Jos
May 13 '07 #3

P: 34
good approach.

do one thing.
try to represent the board as a matrix with the help of two-dimesional array.
i think u can do it.
then do mimmum decision making equations by which u can reach at a decision who won.
that means .... when a mark in done by a player check three conditions on the basis of current marked square.
if sequential vertical or horizontal or diagonal mark is done by that player then that player won.

mark the sqaures with unique character for each player.
check every time when a player marks a square and update the square with player's indentification character.

i think u got my point ..... so immediate implement this ... if any problem is there plz post ur hasWon method ..

i think i ll able to correct ur bug if have any.
best of luck.

kind regards.
dmjpro.





Hi dmjpro,

Thanks for your great help. But I really don't know how to implement it your way. Could you please send me some code so I can try that.

Looking forward to your reply.

Best regards,

Koonda
May 13 '07 #4

P: 34
There's a little very practical trick: the board measures 7x6 cells (if I'm not
mistaken). Make the real board 9x8 where the border cells contain sentinel
values (i.e. unequal to the three possible values). That way you never have to
explicitly check your indexes for crossing a border.

Another observation is: suppose there's no winner. If, after the current move
there does happen to be a winner, the position of the last move is part of the
winning configuration. All you have to do is track in horizontal, vertical and
diagonal directions starting at that last move's position and count for the
number of coins in that direction.

kind regards,

Jos
Hi Jos,

I think I did not understand your way of implementing it. If possible could you please send me some code examples to implement that.

Looking forward to your reply.

Thanks a lot

Best regards,

Koonda
May 13 '07 #5

Expert 10K+
P: 11,448
Hi Jos,

I think I did not understand your way of implementing it. If possible could you please send me some code examples to implement that.

Looking forward to your reply.

Thanks a lot

Best regards,

Koonda
Nope, no code; code is for computers and similar silly machines. What I was
saying is that if your 'logical' board measures 7x6 you should use a 'physical'
board of 9x8:
Expand|Select|Wrap|Line Numbers
  1. +---+---+---+---+---+---+---+---+---+
  2. | X | X | X | X | X | X | X | X | X |
  3. +---+---+---+---+---+---+---+---+---+
  4. | X |   |   |   |   |   |   |   | X |
  5. +---+---+---+---+---+---+---+---+---+
  6. | X |   |   |   |   |   |   |   | X |
  7. +---+---+---+---+---+---+---+---+---+
  8. | X |   |   |   |   |   |   |   | X |
  9. +---+---+---+---+---+---+---+---+---+
  10. | X |   |   |   |   |   |   |   | X |
  11. +---+---+---+---+---+---+---+---+---+
  12. | X |   |   |   |   |   |   |   | X |
  13. +---+---+---+---+---+---+---+---+---+
  14. | X |   |   |   |   |   |   |   | X |
  15. +---+---+---+---+---+---+---+---+---+
  16. | X | X | X | X | X | X | X | X | X |
  17. +---+---+---+---+---+---+---+---+---+
the 'X' values represent a non-empty square not taken by any of the two players.
That way you don't need to do any explicit boundary checks in any of your
methods. The logical playing board ranges from [1 ... 7] and [1 ... 6] and any
cell outside that range is invalid (although it physically exists).

w.r.t. my second remark: if none of the players has won and a current move
causes one of the players to win then the position of that last current move
is part of the winning configuration. If it weren't, a previous configuration would
have been a winning situation for one of the players therefore contradicting the
previous assumption that none of the players did win already.

So checking in any possible directions starting from that last move is sufficient
to find a possible winning configuration.

kind regards,

Jos
May 13 '07 #6

Post your reply

Sign in to post your reply or Sign up for a free account.