你还在画棋盘吗? 20分钟教你如何用Java编写井字棋游戏!
文章目录
前言
上课无聊的时候,很多人肯定会拿出一张白纸,老师饶有兴趣地讲起来。 我和我的同桌已经开始玩井字游戏了。 一张空白的纸。 如果你无聊想玩井字棋,不仅浪费纸张,还得自己画棋子。 ,今天小编就带大家用Java编写一个井字棋小游戏。
设计流程 1.创建窗体类MyGameWindow
创建MyGameWindow类继承JFrame类成为表单类并实现ActionListener套接字,并在ActionListener套接字中实现actionPerformed(ActionEvent e)方法。
public class MyGameWindow extends JFrame implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
}
}
2.创建表单的构造函数
创建表单的构造函数,进行一些基本设置,并在 main 方法中实例化它。
public class MyGameWindow extends JFrame implements ActionListener {
public MyGameWindow(){
//设置窗口的标题
setTitle("井字棋");
//设置窗体的位置和大小
setBounds(100,100,600,600);
//设置窗体的布局方式
setLayout(new GridLayout(3,3));
//设置窗体的关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体可见
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
public static void main(String[] args) {
new MyGameWindow();
}
}
此时,我们已经创建了一个空窗口。
3. 创建棋盘
创建一个三行三列的键链表来表示棋盘,将键字段实例化添加到表单中,并为每个键设置一个风暴监听器。
public class MyGameWindow extends JFrame implements ActionListener {
//以3行3列数组的形式创建表盘
private JButton[][] boards = new JButton[3][3];
public MyGameWindow(){
//设置窗口的标题
setTitle("井字棋");
//设置窗体的位置和大小
setBounds(100,100,600,600);
//设置窗体的布局方式
setLayout(new GridLayout(3,3));
//将按钮数组添加到窗体中去并为按钮添加事件监听方法
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//实例化按钮
boards[i][j] = new JButton();
//将按钮添加到窗体中去
add(boards[i][j]);
//为按钮添加时间监听方法
boards[i][j].addActionListener(this);
}
}
//设置窗体的关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体可见
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
public static void main(String[] args) {
new MyGameWindow();
}
}
此时,我们已经可以看到我们制作的棋盘了。
4. 编写游戏方法
现在我们有了棋盘,我们该怎么下棋呢? 接下来,您需要编译一个游戏方法。
首先我们需要添加一个标志,它会指示此时谁在下棋。
当flag=0时,表示此时下棋的棋手是下棋X的棋手。当flag=1时,表示此时下棋的棋手是下棋的O。我们将flag变量初始化为0 ,表示持有 X 的玩家将开始每一轮。
然后我们就可以编译演奏技巧了。 当flag=0时,按X,将flag参数设置为1,表示执行O的棋手该下棋了。 同理,当flag=1时井字游戏 源码,按O键,将flag参数设置为0,表示执行X的棋手该下棋了。
//如何下棋
私人无效播放(JButton clickBtn,int i,int j){
如果(标志== 0){
clickBtn.setText(“X”);
标志= 1;
}否则如果(标志== 1){
clickBtn.setText(“O”);
标志= 0;
public class MyGameWindow extends JFrame implements ActionListener {
//以3行3列数组的形式创建表盘
private JButton[][] boards = new JButton[3][3];
//X先手
private int flag = 0;//flag = 0 表示落子X flag = 1表示落子O
public MyGameWindow(){
//设置窗口的标题
setTitle("井字棋");
//设置窗体的位置和大小
setBounds(100,100,600,600);
//设置窗体的布局方式
setLayout(new GridLayout(3,3));
//将按钮数组添加到窗体中去并为按钮添加事件监听方法
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//实例化按钮
boards[i][j] = new JButton();
//将按钮添加到窗体中去
add(boards[i][j]);
//为按钮添加时间监听方法
boards[i][j].addActionListener(this);
}
}
//设置窗体的关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体可见
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
//下棋方法
private void play(JButton clickBtn,int i,int j){
if(flag == 0){
clickBtn.setText("X");
flag = 1;
}else if(flag == 1){
clickBtn.setText("O");
flag = 0;
}
}
public static void main(String[] args) {
new MyGameWindow();
}
}
5. 编写一个查找游戏位置的方法
编写完游戏方法后,我们需要确切地知道玩家在棋盘上下的哪个位置。 因此,有必要编写一个寻找游戏位置的方法。
该方法返回一个厚度为2的location字段,location[0]记录了玩家的播放位置的行数,location[1]记录了玩家的播放位置的列数。
这样我们就可以准确的找到棋手在棋盘上的位置。
//找到关键位置
私有 int[] 位置(JButton clickBtn){
int[] location = new int[2];//location[0]代表第i行,location[1]代表第j列
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(boards[i][j] == clickBtn){
位置[0] = i;
位置[1] = j;
返回地点;
public class MyGameWindow extends JFrame implements ActionListener {
//以3行3列数组的形式创建表盘
private JButton[][] boards = new JButton[3][3];
//X先手
private int flag = 0;//flag = 0 表示落子X flag = 1表示落子O
public MyGameWindow(){
//设置窗口的标题
setTitle("井字棋");
//设置窗体的位置和大小
setBounds(100,100,600,600);
//设置窗体的布局方式
setLayout(new GridLayout(3,3));
//将按钮数组添加到窗体中去并为按钮添加事件监听方法
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//实例化按钮
boards[i][j] = new JButton();
//将按钮添加到窗体中去
add(boards[i][j]);
//为按钮添加时间监听方法
boards[i][j].addActionListener(this);
}
}
//设置窗体的关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体可见
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
}
//下棋方法
private void play(JButton clickBtn,int i,int j){
if(flag == 0){
clickBtn.setText("X");
flag = 1;
}else if(flag == 1){
clickBtn.setText("O");
flag = 0;
}
}
//寻找按钮位置
private int[] location(JButton clickBtn){
int[] location = new int[2];//location[0]表示第i行,location[1]表示第j列
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(boards[i][j] == clickBtn){
location[0] = i;
location[1] = j;
}
}
}
return location;
}
public static void main(String[] args) {
new MyGameWindow();
}
}
改进风暴监视器
前期规划工作已基本完成。 如果我们要将棋子移动到棋盘上,我们还需要为按钮创建一个风暴监听器。
首先我们需要获取玩家点击的是哪个按钮,然后记录这个按钮的行数和列数。 然后我们就可以把棋子放在棋盘上了。
@覆盖
公共无效actionPerformed(ActionEvent e){
//获取被点击的按钮
JButton clickBtn = (JButton) e.getSource();
//找到水滴的位置
int[] 地点 = 位置(clickBtn);
int i = 地点[0];
int j = 位置[1];
//下棋
播放(clickBtn,i,j);
public class MyGameWindow extends JFrame implements ActionListener {
//以3行3列数组的形式创建表盘
private JButton[][] boards = new JButton[3][3];
//X先手
private int flag = 0;//flag = 0 表示落子X flag = 1表示落子O
public MyGameWindow(){
//设置窗口的标题
setTitle("井字棋");
//设置窗体的位置和大小
setBounds(100,100,600,600);
//设置窗体的布局方式
setLayout(new GridLayout(3,3));
//将按钮数组添加到窗体中去并为按钮添加事件监听方法
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//实例化按钮
boards[i][j] = new JButton();
//将按钮添加到窗体中去
add(boards[i][j]);
//为按钮添加时间监听方法
boards[i][j].addActionListener(this);
}
}
//设置窗体的关闭方式
setDefaultCloseOperation(EXIT_ON_CLOSE);
//设置窗体可见
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//获取点击的按钮
JButton clickBtn = (JButton) e.getSource();
//找到落子的位置
int[] places = location(clickBtn);
int i = places[0];
int j = places[1];
//下棋
play(clickBtn, i, j);
}
//下棋方法
private void play(JButton clickBtn,int i,int j){
if(flag == 0){
clickBtn.setText("X");
flag = 1;
}else if(flag == 1){
clickBtn.setText("O");
flag = 0;
}
}
//寻找按钮位置
private int[] location(JButton clickBtn){
int[] location = new int[2];//location[0]表示第i行,location[1]表示第j列
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if(boards[i][j] == clickBtn){
location[0] = i;
location[1] = j;
}
}
}
return location;
}
public static void main(String[] args) {
new MyGameWindow();
}
}
6.添加限制,一个位置只能放置一颗棋子
看看里面的两张图,看看有没有发现什么问题。
第一张图是正常的。 此时棋盘已经满了,但是我们仍然可以在棋盘上的任意位置下棋,这就导致了第二张图的情况。 屏幕上全是O,而做X的玩家表示这不公平!
这是不合理的。 那么如何解决呢?
我们定义一个二维数组来存储棋盘上棋子的状态。
当place[i][j]=1时,表示该位置有棋子X
当place[i][j]=-1时井字游戏 源码,表示该位置有棋子O
当place[i][j]=0时,表示该位置没有棋子
当棋手想要在已经有棋子的位置下棋时,我们应该给予提示,提醒他不能在这里下棋。
由于已经规定了玩家下棋时需要记录棋盘的情况,所以我们稍微修改了下棋的方法,让它能够实时记录棋盘的情况。
//如何下棋
私人无效播放(JButton clickBtn,int i,int j){
如果(标志== 0){
clickBtn.setText(“X”);
标志= 1;
地点[i][j] = 1;
}否则如果(标志== 1){
clickBtn.setText(“O”);
标志= 0;
地点[i][j] = -1;