我正在尝试创建一个“ShadowTictaToe”游戏,作为编程课程简介的最终项目。
这个游戏的工作方式是,用户点击第一块板上的一个单元格,就会画出一个X或O。该X也将绘制在同一单元格中,但在第二个游戏板上的不同位置。我所说的不同点是指,如果单元格(2,3)位于第一个游戏板的中间磁贴上,那么相同的单元格将位于第二个游戏板的右上角磁贴上(或其他磁贴上)。
我已经创建了第一个和第二个板,每个板都在JPanel中。我只是在创建一种方法时遇到了问题,即第一个游戏板上的一个单元格中的任何令牌都将位于第二个游戏板上的同一个单元格中。我创建了2个单元格,每个游戏板一个,如果这只是让事情复杂化,或者我真的需要2个单元格,请告诉我。我只是被困在这一部分的项目和任何帮助是感激的。
澄清最终项目说明:
代码(到目前为止,还有一些事情要做):
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.border.LineBorder;
import java.util.Random;
public class Almost extends JFrame{
private Cell[][] cell = new Cell[3][3];
private Cells[][] cells = new Cells[3][3];
private boolean t[][] = new boolean[3][3];
private JButton btnReset;
Random rand = new Random();
int f;
int g;
private JLabel jlblStatus = new JLabel(" ");
private JLabel jlblIndex1 = new JLabel("(" + 0 + "," + 0 + ")");
private JLabel jlblIndex2 = new JLabel("(" + 0 + "," + 1 + ")");
private JLabel jlblIndex3 = new JLabel("(" + 0 + "," + 2 + ")");
private JLabel jlblIndex4 = new JLabel("(" + 1 + "," + 0 + ")");
private JLabel jlblIndex5 = new JLabel("(" + 1 + "," + 1 + ")");
private JLabel jlblIndex6 = new JLabel("(" + 1 + "," + 2 + ")");
private JLabel jlblIndex7 = new JLabel("(" + 2 + "," + 0 + ")");
private JLabel jlblIndex8 = new JLabel("(" + 2 + "," + 1 + ")");
private JLabel jlblIndex9 = new JLabel("(" + 2 + "," + 2 + ")");
private JLabel jlblCells1 = new JLabel("(" + 0 + "," + 0 + ")");
private JLabel jlblCells2 = new JLabel("(" + 0 + "," + 1 + ")");
private JLabel jlblCells3 = new JLabel("(" + 0 + "," + 2 + ")");
private JLabel jlblCells4 = new JLabel("(" + 1 + "," + 0 + ")");
private JLabel jlblCells5 = new JLabel("(" + 1 + "," + 1 + ")");
private JLabel jlblCells6 = new JLabel("(" + 1 + "," + 2 + ")");
private JLabel jlblCells7 = new JLabel("(" + 2 + "," + 0 + ")");
private JLabel jlblCells8 = new JLabel("(" + 2 + "," + 1 + ")");
private JLabel jlblCells9 = new JLabel("(" + 2 + "," + 2 + ")");
private char currentPlayer = ' ';
public Almost(){
JFrame frame = new JFrame("Shadow Tic Tac Toe Game");
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
panel1.setLayout(new GridLayout(3,3,0,0));
for(int d = 0; d < 3; d++){
for(int c = 0; c < 3; c++){
panel1.add(cell[d][c] = new Cell());
cell[d][c].setPreferredSize(new Dimension(250,250));
}
}
cell[0][0].add(jlblIndex1);
cell[0][1].add(jlblIndex2);
cell[0][2].add(jlblIndex3);
cell[1][0].add(jlblIndex4);
cell[1][1].add(jlblIndex5);
cell[1][2].add(jlblIndex6);
cell[2][0].add(jlblIndex7);
cell[2][1].add(jlblIndex8);
cell[2][2].add(jlblIndex9);
panel2.setLayout(new GridLayout(3,3,0,0));
int n = 0;
while(n < 9){
f=rand.nextInt(3);
g=rand.nextInt(3);
while(t[f][g] == false){
t[f][g] = true;
panel2.add(cells[f][g] = new Cells());
cells[f][g].setPreferredSize(new Dimension(250,250));
n++;
}
}
cells[0][0].add(jlblCells1);
cells[0][1].add(jlblCells2);
cells[0][2].add(jlblCells3);
cells[1][0].add(jlblCells4);
cells[1][1].add(jlblCells5);
cells[1][2].add(jlblCells6);
cells[2][0].add(jlblCells7);
cells[2][1].add(jlblCells8);
cells[2][2].add(jlblCells9);
frame.add(panel1, BorderLayout.WEST);
frame.add(panel2, BorderLayout.EAST);
frame.add(jlblStatus, BorderLayout.SOUTH);
jlblStatus.setPreferredSize(new Dimension(100,100));
buildReset();
frame.add(btnReset, BorderLayout.NORTH);
Instructions();
Chose();
frame.pack();
frame.setVisible(true);
}
public void Instructions(){
JOptionPane.showMessageDialog(null,"INSTRUCTIONS" + "This game is called a 'Shadow Tic Tac Toe Game'. In this game there will be two Tic Tac Toe game boards, though only one is playable. \nBut you can win on either board. Lets say you place your token on the center tile at cell(2,3). \nAn X will be drawn on that spot on board 1 and on a randomized spot on the second game board at cell(2,3). \nYou will be able to see the cell indexes before you click on a cell so you can form a strategy");
}
public void Chose(){
int f = 2;
while(f == 2){
String input = JOptionPane.showInputDialog("CHOSE" + "\nPlease select your token. \nPress 1 for X and 2 for O.");
int pawn = Integer.parseInt(input);
if(input.equals("1")){
currentPlayer = 'X';
f = 3;
}else if(input.equals("2")){
currentPlayer = 'O';
f = 3;
}else{
JOptionPane.showMessageDialog(null,"ERROR INVALID RESPONSE");
f = 2;
}
}
}
public void buildReset(){
btnReset = new JButton("Reset");
btnReset.addActionListener(new BtnListener());
}
private class BtnListener implements ActionListener{
public void actionPerformed(ActionEvent e){
Almost b = new Almost();
}
}
public class Cells extends JPanel{
private char tok = ' ';
public Cells(){
setBorder(new LineBorder(Color.black,1));
}
public void setTok(char d){
tok = d;
repaint();
}
public char getTok(){
return tok;
}
protected void paintComponent(Graphics g){
super.paintComponent(g);
if(tok == 'X'){
g.drawLine(10,10,getWidth() - 10, getHeight()-10);
g.drawLine(getWidth()-10,10,10,getHeight()-10);
}else if (tok == 'O'){
g.drawOval(10,10,getWidth()-20, getHeight()-20);
}
}
}
public class Cell extends JPanel{
private char token = ' ';
String Id ="";
public void setToken(char c){
token = c;
repaint();
}
public char getToken(){
return token;
}
public Cell(){
setBorder(new LineBorder(Color.black, 1));
addMouseListener(new MyMouseListener());
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (token == 'X') {
g.drawLine(10,10, getWidth() - 10, getHeight() - 10);
g.drawLine(getWidth() - 10,10,10, getHeight() - 10);
}
else if (token == 'O') {
g.drawOval(10, 10, getWidth() - 20, getHeight() - 20);
}
}
private class MyMouseListener extends MouseAdapter{
public void mouseClicked(MouseEvent e){
if (token == ' ' && currentPlayer != ' ') {
setToken(currentPlayer);
PlaceGrid2();
if (Won1(currentPlayer)){
jlblStatus.setText(currentPlayer + " wins on board1!");
Change();
}else if (Won2(currentPlayer)){
jlblStatus.setText(" Player X wins on board 2!");
}else{
Change();
}
}
}
}
}
public void Change(){
if(currentPlayer == 'X'){
currentPlayer = 'O';
}else{
currentPlayer = 'X';
}
jlblStatus.setText("It is " + currentPlayer + " 's turn");
}
public void PlaceGrid2(){
for(int c = 0; c < 3; c++){
for(int d = 0; d < 3; d++){
if(cell[c][d].getToken() == 'X'){
cells[c][d].setTok('X');
}
if(cell[c][d].getToken() == 'O'){
cells[c][d].setTok('O');
}
}
}
}
public boolean Full1(){
for(int d = 0; d < 3; d++)
for(int c = 0; c < 3; c++)
if(cell[d][c].getToken() == ' ')
return false;
return true;
}
public boolean Full2(){
for(int d = 0; d < 3; d++)
for(int c = 0; c < 3; c++)
if(cells[d][c].getTok() == ' ')
return false;
return true;
}
public boolean Won1(char token){
for(int d = 0; d < 3; d++){
if(cell[d][0].getToken() == token && cell[d][1].getToken() == token && cell[d][2].getToken() == token){
return true;
}
}
for(int c = 0; c < 3; c++){
if(cell[0][c].getToken() == token && cell[1][c].getToken() == token && cell[2][c].getToken() == token){
return true;
}
}
if(cell[0][0].getToken() == token && cell[1][1].getToken() == token && cell[2][2].getToken() == token){
return true;
}
if(cell[0][2].getToken() == token && cell[1][1].getToken() == token && cell[2][0].getToken() == token){
return true;
}
return false;
}
public boolean Won2(char tok){
for(int d = 0; d < 3; d++){
if(cells[d][0].getTok() == tok && cells[d][1].getTok() == tok && cells[d][2].getTok() == tok){
return true;
}
}
for(int c = 0; c < 3; c++){
if(cells[0][c].getTok() == tok && cells[1][c].getTok() == tok && cells[2][c].getTok() == tok){
return true;
}
}
if(cells[0][0].getTok() == tok && cells[1][1].getTok() == tok && cells[2][2].getTok() == tok){
return true;
}
if(cells[0][2].getTok() == tok && cells[1][1].getTok() == tok && cells[2][0].getTok() == tok){
return true;
}
return false;
}
public static void main(String [] args){
new Almost();
}
}