Compare commits

..

2 Commits

Author SHA1 Message Date
CT
a2b0c23b42 compiled 2026-04-23 15:58:28 -05:00
CT
4b222fabf7 idk 2026-04-23 15:57:18 -05:00
29 changed files with 32 additions and 410 deletions

1
.gitignore vendored
View File

@@ -1 +0,0 @@
*.class

View File

@@ -1,29 +0,0 @@
import java.util.*;
import javax.swing.ImageIcon;
public class Bishop extends Piece {
public Bishop(int x, int y, String color) {
super(x, y, color, new ImageIcon("sprites/" + color + "/bishop.png").getImage());
}
public Piece copy() {
Piece newP = new Bishop(this.pos.x, this.pos.y, this.color);
return newP;
}
public ArrayList<Position> getPseudoLegalMoves(Board board) {
ArrayList<Position> positions = new ArrayList<Position>();
positions.addAll(slide(board, -1, -1, 7));
positions.addAll(slide(board, 1, -1, 7));
positions.addAll(slide(board, -1, 1, 7));
positions.addAll(slide(board, 1, 1, 7));
return positions;
}
public ArrayList<Position> getLegalMoves(Board board) {
return getPseudoLegalMoves(board);
}
}

BIN
Board.class Normal file

Binary file not shown.

View File

@@ -6,56 +6,10 @@ public class Board {
public Board() { public Board() {
board = new Piece[8][8]; board = new Piece[8][8];
for (int i = 0; i <= 7; i++) { for (int i = 0; i <= 7; i++) {
board[i][1] = new Pawn(i, 1, "Black"); board[i][2] = new Pawn(i + 1, 2, "Black");
board[i][6] = new Pawn(i, 6, "White");
} }
for (int i = 0; i <= 7; i += 7) { for (int i = 0; i <= 7; i++) {
String color = i == 0 ? "Black" : "White"; board[i][7] = new Pawn(i + 1, 7, "White");
board[0][i] = new Rook(0, i, color);
board[7][i] = new Rook(7, i, color);
board[1][i] = new Knight(1, i, color);
board[6][i] = new Knight(6, i, color);
board[2][i] = new Bishop(2, i, color);
board[5][i] = new Bishop(5, i, color);
board[4][i] = new King(4, i, color);
board[3][i] = new Queen(3, i, color);
}
}
public Board(boolean isCopy) {
board = new Piece[8][8];
}
public void capture(Piece capturing, Piece captured) {
board[capturing.pos.x][capturing.pos.y] = null;
board[captured.pos.x][captured.pos.y] = capturing;
capturing.pos.x = captured.pos.x;
capturing.pos.y = captured.pos.y;
}
public void move(Piece p, Position posi) {
board[p.pos.x][p.pos.y] = null;
board[posi.x][posi.y] = p;
p.pos = posi;
if (p instanceof Pawn) {
((Pawn) p).hasMoved = true;
}
if (p instanceof King) {
((King) p).hasMoved = true;
}
if (p instanceof Rook) {
((Rook) p).hasMoved = true;
}
}
public void castle(King king, boolean kingSide) {
int row = king.pos.y;
if (kingSide) {
move(king, new Position(6, row));
move(board[7][row], new Position(5, row));
} else {
move(king, new Position(2, row));
move(board[0][row], new Position(3, row));
} }
} }
@@ -72,42 +26,6 @@ public class Board {
} }
public boolean isOpen(Position pos) { public boolean isOpen(Position pos) {
return this.getPiece(pos) == null; return this.board[pos.x][pos.y] == null;
}
public Piece getPiece(Position pos) {
if (inBounds(pos)) {
return this.board[pos.x][pos.y];
}
return null;
}
public Piece getPiece(int x, int y) {
if (inBounds(new Position(x, y))) {
return this.board[x][y];
}
return null;
}
public void setPiece(int x, int y, Piece p) {
this.board[x][y] = p;
}
public void setPiece(Position pos, Piece p) {
this.board[pos.x][pos.y] = p;
}
public static Board copy(Board b) {
Board newBoard = new Board();
for (int i = 0; i <= 7; i++) {
for (int j = 0; j <= 7; j++) {
Piece p = b.getPiece(i, j);
if (p == null) continue;
newBoard.board[i][j] = p.copy();
}
}
return newBoard;
} }
} }

BIN
Chess.class Normal file

Binary file not shown.

View File

@@ -1,23 +1,19 @@
import java.awt.*; import java.awt.*;
import java.awt.Color; import java.awt.Color;
import java.awt.event.*; import java.awt.event.*;
import java.util.ArrayList;
import javax.swing.*; import javax.swing.*;
public class Chess extends JPanel implements ActionListener, MouseListener { public class Chess extends JPanel implements ActionListener {
// pieces stuff // pieces stuff
Board board; Board board;
// game vars // game vars
int boardWidth, boardHeight; int boardWidth, boardHeight;
boolean whiteTurn;
Timer gameTimer; Timer gameTimer;
Color creme = new Color(254, 245, 218); Color creme = new Color(254, 245, 218);
Color brown = new Color(121, 92, 50); Color brown = new Color(121, 92, 50);
Piece selected;
ArrayList<Position> legalMoves;
Image hover;
String turnColor;
public Chess(int boardWidth, int boardHeight) { public Chess(int boardWidth, int boardHeight) {
this.boardWidth = boardWidth; this.boardWidth = boardWidth;
@@ -25,15 +21,10 @@ public class Chess extends JPanel implements ActionListener, MouseListener {
setPreferredSize(new Dimension(this.boardWidth, this.boardHeight)); setPreferredSize(new Dimension(this.boardWidth, this.boardHeight));
setBackground(Color.WHITE); setBackground(Color.WHITE);
setFocusable(true); setFocusable(true);
addMouseListener(this);
board = new Board(); board = new Board();
selected = null;
legalMoves = null;
turnColor = "White";
gameTimer = new Timer(200, this);
hover = new ImageIcon("sprites/hover.png").getImage(); gameTimer = new Timer(200, this);
gameTimer.start(); gameTimer.start();
repaint(); repaint();
@@ -53,13 +44,6 @@ public class Chess extends JPanel implements ActionListener, MouseListener {
// draw pieces // draw pieces
board.draw(g); board.draw(g);
// draw legalMoves
if (legalMoves != null) {
for (Position p : legalMoves) {
g.drawImage(hover, (p.x + 1) * 40, (p.y + 1) * 40, null);
}
}
} }
public void paintComponent(Graphics g) { public void paintComponent(Graphics g) {
@@ -71,47 +55,4 @@ public class Chess extends JPanel implements ActionListener, MouseListener {
gameLoop(); gameLoop();
repaint(); repaint();
} }
public void mouseEntered(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {
int col = (e.getX() / 40) - 1;
int row = (e.getY() / 40) - 1;
Position pos = new Position(col, row);
Piece newSelected = board.getPiece(col, row);
// if selecting one of our own pieces
if (newSelected != null && newSelected.color.equals(turnColor)) {
legalMoves = newSelected.getLegalMoves(board);
selected = newSelected;
return;
}
// if selecting an enemy piece -- must have one of ours selected
else if (newSelected != null
&& selected != null
&& selected.color.equals(turnColor)
&& !newSelected.color.equals(turnColor)
&& legalMoves.contains(pos)) {
board.capture(selected, newSelected);
selected = null;
legalMoves = null;
turnColor = turnColor.equals("White") ? "Black" : "White";
}
// if selecting a blank square -- must have one of ours selected
else if (selected != null && selected.color.equals(turnColor) && legalMoves.contains(pos)) {
if (selected instanceof King && Math.abs(pos.x - selected.pos.x) == 2) {
board.castle((King) selected, pos.x > selected.pos.x);
} else {
board.move(selected, pos);
}
selected = null;
legalMoves = null;
turnColor = turnColor.equals("White") ? "Black" : "White";
}
}
public void mouseExited(MouseEvent e) {}
} }

BIN
Display.class Normal file

Binary file not shown.

View File

@@ -1,90 +0,0 @@
import java.util.*;
import javax.swing.ImageIcon;
public class King extends Piece {
boolean hasMoved;
static int[] xDir = {-1, 0, 1, -1, 1, -1, 0, 1};
static int[] yDir = {-1, -1, -1, 0, 0, 1, 1, 1};
public King(int x, int y, String color) {
super(x, y, color, new ImageIcon("sprites/" + color + "/king.png").getImage());
hasMoved = false;
}
public Piece copy() {
Piece newP = new King(this.pos.x, this.pos.y, this.color);
return newP;
}
public ArrayList<Position> getPseudoLegalMoves(Board board) {
ArrayList<Position> positions = new ArrayList<Position>();
for (int i = 0; i < xDir.length; i++) {
Position test = new Position(pos.x + xDir[i], pos.y + yDir[i]);
if (!Board.inBounds(test)) continue;
if (board.isOpen(test)) {
positions.add(test);
continue;
}
if (!board.getPiece(test).colorMatches(this)) {
positions.add(test);
}
}
int colorPos = this.color.equals("White") ? 7 : 0;
boolean leftOpen = true;
boolean rightOpen = true;
if (!this.hasMoved && !inCheck(board,pos)){
if(board.getPiece(7,colorPos) instanceof Rook && !Rook.class.cast(board.getPiece(7,colorPos)).hasMoved){
ArrayList<Position> right = this.slide(board,1,0,2);
for (Position p : new ArrayList<>(right)){
if (inCheck(board,p)){
rightOpen = false;
}
}
if (rightOpen) {positions.add(new Position(pos.x+2,pos.y));}
}
if (board.getPiece(0,colorPos) instanceof Rook && !Rook.class.cast(board.getPiece(0,colorPos)).hasMoved){
ArrayList<Position> left = this.slide(board,-1,0,2);
for (Position p : new ArrayList<>(left)){
if (inCheck(board,p)){
leftOpen = false;
}
}
if (leftOpen) positions.add(new Position(pos.x - 2, pos.y));
}}
return positions;
}
public ArrayList<Position> getLegalMoves(Board board) {
ArrayList<Position> positions = getPseudoLegalMoves(board);
for (Position p : new ArrayList<>(positions)) {
Piece tempPiece = board.getPiece(p);
board.setPiece(pos, null);
board.setPiece(p, this);
if (inCheck(board, p)) {
positions.remove(p);
}
board.setPiece(p, tempPiece);
board.setPiece(pos, this);
}
return positions;
}
public boolean inCheck(Board board, Position pos) {
for (Piece[] pieces : board.board) {
for (Piece p : pieces) {
if (p == null) continue;
if (!p.colorMatches(this) && !(p instanceof King)) {
ArrayList<Position> ar = p.getPseudoLegalMoves(board);
for (Position posi : ar) {
if (pos.equals(posi)) return true;
}
}
}
}
return false;
}
}

BIN
Knight.class Normal file

Binary file not shown.

View File

@@ -9,30 +9,16 @@ public class Knight extends Piece {
super(x, y, color, new ImageIcon("sprites/" + color + "/knight.png").getImage()); super(x, y, color, new ImageIcon("sprites/" + color + "/knight.png").getImage());
} }
public Piece copy() { public ArrayList<Position> getLegalMoves(Board board) {
Piece newP = new Knight(this.pos.x, this.pos.y, this.color);
return newP;
}
public ArrayList<Position> getPseudoLegalMoves(Board board) {
ArrayList<Position> positions = new ArrayList<Position>(); ArrayList<Position> positions = new ArrayList<Position>();
for (int i = 0; i < xDir.length; i++) { for (int i : xDir) {
Position test = new Position(pos.x + xDir[i], pos.y + yDir[i]); for (int j : yDir) {
Position test = new Position(pos.x + i, pos.y + j);
if (!Board.inBounds(test)) continue; if (!Board.inBounds(test)) continue;
if (board.isOpen(test)) {
positions.add(test);
continue;
}
if (!board.getPiece(test).colorMatches(this)) {
positions.add(test);
} }
} }
return positions; return positions;
} }
public ArrayList<Position> getLegalMoves(Board board) {
return getPseudoLegalMoves(board);
}
} }

BIN
Pawn.class Normal file

Binary file not shown.

View File

@@ -11,40 +11,30 @@ public class Pawn extends Piece {
colorDir = color.equals("White") ? -1 : 1; colorDir = color.equals("White") ? -1 : 1;
} }
public Piece copy() { public ArrayList<Position> getLegalMoves(Board board) {
Piece newP = new Pawn(this.pos.x, this.pos.y, this.color);
return newP;
}
public ArrayList<Position> getPseudoLegalMoves(Board board) {
ArrayList<Position> positions = new ArrayList<Position>(); ArrayList<Position> positions = new ArrayList<Position>();
// diagonal moves (captures) // diagonal moves (captures)
Position test = new Position(pos.x + 1, pos.y + colorDir); if (Board.inBounds(new Position(pos.x + 1, pos.y + colorDir))
if (Board.inBounds(test) && !board.isOpen(test) && !board.getPiece(test).colorMatches(this)) { && !board.isOpen(new Position(pos.x + 1, pos.y + colorDir))
positions.add(test); && !board.board[pos.x + 1][pos.y + colorDir].color.equals(this.color)) {
positions.add(new Position(pos.x + 1, pos.y + colorDir));
} }
if (Board.inBounds(new Position(pos.x - 1, pos.y + colorDir))
test = new Position(pos.x - 1, pos.y + colorDir); && !board.isOpen(new Position(pos.x - 1, pos.y + colorDir))
if (Board.inBounds(test) && !board.isOpen(test) && !board.getPiece(test).colorMatches(this)) { && !board.board[pos.x - 1][pos.y + colorDir].color.equals(this.color)) {
positions.add(test); positions.add(new Position(pos.x - 1, pos.y + colorDir));
} }
// one square in front: if blocked return early // one square in front: if blocked return early
test = new Position(pos.x, pos.y + colorDir); if (Board.inBounds(new Position(pos.x, pos.y + colorDir))
if (Board.inBounds(test) && board.isOpen(test)) { && board.isOpen(new Position(pos.x, pos.y + colorDir))) {
positions.add(test); positions.add(new Position(pos.x, pos.y + colorDir));
} else return positions; } else return positions;
// two squares in front // two squares in front
test = new Position(pos.x, pos.y + 2 * colorDir); if (!hasMoved && board.isOpen(new Position(pos.x, pos.y + 2 * colorDir))) {
if (!hasMoved && board.isOpen(test)) { positions.add(new Position(pos.x, pos.y + 2 * colorDir));
positions.add(test);
} }
return positions; return positions;
} }
public ArrayList<Position> getLegalMoves(Board board) {
return getPseudoLegalMoves(board);
}
} }

BIN
Piece.class Normal file

Binary file not shown.

View File

@@ -1,8 +1,8 @@
import java.awt.*; import java.awt.*;
import java.util.*; import java.util.*;
public abstract class Piece { public class Piece {
public static int SIZE = 40; ArrayList<Integer> legalMoves;
Position pos; Position pos;
Image sprite; Image sprite;
String color; String color;
@@ -14,35 +14,11 @@ public abstract class Piece {
} }
public void draw(Graphics g) { public void draw(Graphics g) {
g.drawImage(sprite, (pos.x + 1) * 40, (pos.y + 1) * 40, null); g.drawImage(sprite, pos.x * 40, pos.y * 40, null);
} }
public abstract ArrayList<Position> getLegalMoves(Board board); public ArrayList<Position> getLegalMoves(Board board) {
System.out.println("parent method not overriden");
public abstract ArrayList<Position> getPseudoLegalMoves(Board board); return null;
public abstract Piece copy();
public boolean colorMatches(Piece p) {
return this.color.equals(p.color);
}
public ArrayList<Position> slide(Board board, int dx, int dy, int maxSteps) {
ArrayList<Position> positions = new ArrayList<>();
int step = 1;
while (step < maxSteps) {
Position test = new Position(pos.x + step * dx, pos.y + step * dy);
if (!Board.inBounds(test)) break;
if (board.isOpen(test)) {
positions.add(test);
} else if (board.getPiece(test).colorMatches(this)) {
break;
} else {
positions.add(test);
break;
}
step++;
}
return positions;
} }
} }

BIN
Position.class Normal file

Binary file not shown.

View File

@@ -5,9 +5,4 @@ public class Position {
this.x = x; this.x = x;
this.y = y; this.y = y;
} }
public boolean equals(Object o) {
Position pos = (Position) o;
return pos.x == this.x && pos.y == this.y;
}
} }

View File

@@ -1,33 +0,0 @@
import java.util.*;
import javax.swing.ImageIcon;
public class Queen extends Piece {
public Queen(int x, int y, String color) {
super(x, y, color, new ImageIcon("sprites/" + color + "/queen.png").getImage());
}
public Piece copy() {
Piece newP = new Queen(this.pos.x, this.pos.y, this.color);
return newP;
}
public ArrayList<Position> getPseudoLegalMoves(Board board) {
ArrayList<Position> positions = new ArrayList<Position>();
positions.addAll(slide(board, -1, -1, 7));
positions.addAll(slide(board, 1, -1, 7));
positions.addAll(slide(board, -1, 1, 7));
positions.addAll(slide(board, 1, 1, 7));
positions.addAll(slide(board, 1, 0, 7));
positions.addAll(slide(board, -1, 0, 7));
positions.addAll(slide(board, 0, 1, 7));
positions.addAll(slide(board, 0, -1, 7));
return positions;
}
public ArrayList<Position> getLegalMoves(Board board) {
return getPseudoLegalMoves(board);
}
}

View File

@@ -1,31 +0,0 @@
import java.util.*;
import javax.swing.ImageIcon;
public class Rook extends Piece {
boolean hasMoved;
public Rook(int x, int y, String color) {
super(x, y, color, new ImageIcon("sprites/" + color + "/rook.png").getImage());
hasMoved = false;
}
public Piece copy() {
Piece newP = new Rook(this.pos.x, this.pos.y, this.color);
return newP;
}
public ArrayList<Position> getPseudoLegalMoves(Board board) {
ArrayList<Position> positions = new ArrayList<Position>();
positions.addAll(slide(board, 1, 0, 7));
positions.addAll(slide(board, -1, 0, 7));
positions.addAll(slide(board, 0, 1, 7));
positions.addAll(slide(board, 0, -1, 7));
return positions;
}
public ArrayList<Position> getLegalMoves(Board board) {
return getPseudoLegalMoves(board);
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 724 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 795 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 724 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 B