mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-12 15:50:20 -08:00
Spaces tend to cause annoyances in a Unix-style shell environment. This change fixes that.
207 lines
5.2 KiB
Java
207 lines
5.2 KiB
Java
import java.util.Scanner;
|
|
import java.util.Random;
|
|
|
|
public class Awari{
|
|
int []board;
|
|
private final int playerPits;
|
|
private final int computerPits;
|
|
private final int playerHome;
|
|
private final int computerHome;
|
|
Scanner input;
|
|
int sumPlayer;
|
|
int sumComputer;
|
|
Awari(){
|
|
input = new Scanner(System.in);
|
|
playerPits = 0;
|
|
computerPits = 7;
|
|
playerHome = 6;
|
|
computerHome = 13;
|
|
sumPlayer = 18;
|
|
sumComputer = 18;
|
|
board = new int [14];
|
|
for (int i=0;i<6;i++){
|
|
board[playerPits+i]=3;
|
|
board[computerPits+i]=3;
|
|
}
|
|
System.out.println(" AWARI");
|
|
System.out.println("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY");
|
|
printBoard();
|
|
playerMove(true);
|
|
}
|
|
|
|
private void printBoard(){
|
|
System.out.print("\n ");
|
|
for (int i=0;i<6;i++){
|
|
System.out.print(String.format("%2d",board[12-i]));
|
|
System.out.print(" ");
|
|
}
|
|
System.out.println("");
|
|
System.out.print(String.format("%2d",board[computerHome]));
|
|
System.out.print(" ");
|
|
System.out.println(String.format("%2d",board[playerHome]));
|
|
System.out.print(" ");
|
|
for(int i=0;i<6;i++){
|
|
System.out.print(String.format("%2d",board[playerPits+i]));
|
|
System.out.print(" ");
|
|
}
|
|
System.out.println("");
|
|
}
|
|
|
|
private void playerMove(boolean val){
|
|
System.out.println("\nComputerSum PlayerSum"+sumComputer+" "+sumPlayer);
|
|
if(val == true)
|
|
System.out.print("YOUR MOVE? ");
|
|
else
|
|
System.out.print("AGAIN? ");
|
|
int move = input.nextInt();
|
|
while(move<1||move>6||board[move-1]==0){
|
|
System.out.print("INVALID MOVE!!! TRY AGAIN ");
|
|
move = input.nextInt();
|
|
}
|
|
int seeds = board[move-1];
|
|
board[move-1] = 0;
|
|
sumPlayer -= seeds;
|
|
int last_pos = distribute(seeds,move);
|
|
if(last_pos == playerHome){
|
|
printBoard();
|
|
if(isGameOver(true)){
|
|
System.exit(0);
|
|
}
|
|
playerMove(false);
|
|
}
|
|
else if(board[last_pos] == 1&&last_pos != computerHome){
|
|
int opp = calculateOpposite(last_pos);
|
|
if(last_pos<6){
|
|
sumPlayer+=board[opp];
|
|
sumComputer-=board[opp];
|
|
}
|
|
else{
|
|
sumComputer+=board[opp];
|
|
sumPlayer-=board[opp];
|
|
}
|
|
board[last_pos]+=board[opp];
|
|
board[opp] = 0;
|
|
printBoard();
|
|
if(isGameOver(false)){
|
|
System.exit(0);
|
|
}
|
|
computerMove(true);
|
|
}
|
|
else{
|
|
printBoard();
|
|
if(isGameOver(false)){
|
|
System.exit(0);
|
|
}
|
|
computerMove(true);
|
|
}
|
|
}
|
|
|
|
private void computerMove(boolean value){
|
|
int val=-1;
|
|
System.out.println("\nComputerSum PlayerSum"+sumComputer+" "+sumPlayer);
|
|
for(int i=0;i<6;i++){
|
|
if(6-i == board[computerPits+i])
|
|
val = i;
|
|
}
|
|
int move ;
|
|
if(val == -1)
|
|
{
|
|
Random random = new Random();
|
|
move = random.nextInt(6)+computerPits;
|
|
while(board[move] == 0){
|
|
move = random.nextInt(6)+computerPits;
|
|
}
|
|
if(value == true)
|
|
System.out.println(String.format("MY MOVE IS %d ",move-computerPits+1));
|
|
else
|
|
System.out.println(String.format(",%d",move-computerPits+1));
|
|
int seeds = board[move];
|
|
board[move] = 0;
|
|
sumComputer-=seeds;
|
|
int last_pos = distribute(seeds,move+1);
|
|
if(board[last_pos] == 1&&last_pos != playerHome){
|
|
int opp = calculateOpposite(last_pos);
|
|
if(last_pos<6){
|
|
sumPlayer+=board[opp];
|
|
sumComputer-=board[opp];
|
|
}
|
|
else{
|
|
sumComputer+=board[opp];
|
|
sumPlayer-=board[opp];
|
|
}
|
|
board[last_pos]+=board[opp];
|
|
board[opp] = 0;
|
|
printBoard();
|
|
if(isGameOver(false)){
|
|
System.exit(0);
|
|
}
|
|
}
|
|
else{
|
|
printBoard();
|
|
if(isGameOver(false)){
|
|
System.exit(0);
|
|
}
|
|
}
|
|
playerMove(true);
|
|
}
|
|
else {
|
|
move = val+computerPits;
|
|
if(value == true)
|
|
System.out.print(String.format("MY MOVE IS %d",move-computerPits+1));
|
|
else
|
|
System.out.print(String.format(",%d",move-computerPits+1));
|
|
int seeds = board[move];
|
|
board[move] = 0;
|
|
sumComputer-=seeds;
|
|
int last_pos = distribute(seeds,move+1);
|
|
if(last_pos == computerHome){
|
|
if(isGameOver(true) ){
|
|
System.exit(0);
|
|
}
|
|
computerMove(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private int distribute(int seeds, int pos){
|
|
while(seeds!=0){
|
|
if(pos==14)
|
|
pos=0;
|
|
if(pos<6)
|
|
sumPlayer++;
|
|
else if(pos>6&&pos<13)
|
|
sumComputer++;
|
|
board[pos]++;
|
|
pos++;
|
|
seeds--;
|
|
}
|
|
return pos-1;
|
|
}
|
|
|
|
private int calculateOpposite(int pos){
|
|
return 12-pos;
|
|
}
|
|
|
|
private boolean isGameOver(boolean show){
|
|
if(sumPlayer == 0 || sumComputer == 0){
|
|
if(show)
|
|
printBoard();
|
|
System.out.println("GAME OVER");
|
|
if(board[playerHome]>board[computerHome]){
|
|
System.out.println(String.format("YOU WIN BY %d POINTS",board[playerHome]-board[computerHome]));
|
|
}
|
|
else if(board[playerHome]<board[computerHome]){
|
|
System.out.println(String.format("YOU LOSE BY %d POINTS",board[computerHome]-board[playerHome]));
|
|
}
|
|
else{
|
|
System.out.println("DRAW");
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
}
|