日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

井字棋java代码_JAVA 井字棋

發布時間:2023/12/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 井字棋java代码_JAVA 井字棋 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候我們可以用java編寫一些小游戲,比如井字棋,這是一個很簡單的程序,如圖效果;

我們可以將它分為棋子,棋盤,框架啟動類表示;

首先我們來編寫棋子類,棋子類里有棋子的坐標和形狀的表示,

用1表示圓圈,2表示方框

public class Chess {

private int x;

private int y;//棋子的索引

private int form;//棋子的形狀,1是圓圈,2是方框

public Chess(int x,int y,int form) {//構造函數

this.x=x;

this.y=y;

this.form=form;

}

public int getX() {//get函數

return x;

}

public int getY() {

return y;

}

public int getForm() {

return form;

}

}

接下來進行框架類的編寫,創建一個類來繼承JFrame類,用來啟動游戲,放置面板對象,設置大小,設置標題,一個游戲少不了一些按鈕,井字棋中有三個按鈕,重新開始游戲按鈕,悔棋按鈕和退出游戲按鈕,有按鈕就有相應的事件處理,這時候我們需要一個類繼承事件處理類,并將三個按鈕和事件處理進行綁定;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

/*

* 井字棋的主框架類

*

*/

public class ChessJFrame extends JFrame {

private Chessbord chessbord;//聲明一個棋盤對象

private Buttonrestartgame;//聲明一個重新開始按鈕

private Buttonbackgame;//聲明一個悔棋按鈕

private Buttonexitgame;//聲明一個退出游戲按鈕

private JPanel jp;//面板對象,存放按鈕

public ChessJFrame() {//構造函數,對參數初始化

setTitle("井字棋");//設置表題名稱

MyActLister ma=new MyActLister();//事件處理對象

chessbord=new Chessbord();//棋盤對象

restartgame=new Button("重新開始");//

backgame=new Button("悔棋");

exitgame=new Button("退出");//對三個按鈕進行初始化

jp=new JPanel();//面板對象

jp.setLayout(new FlowLayout(FlowLayout.CENTER));//流式布局

jp.add(restartgame);//

jp.add(backgame);

jp.add(exitgame);//將三個按鈕添加到面板中

add(jp,BorderLayout.SOUTH);//面板的位置

restartgame.addActionListener(ma);

backgame.addActionListener(ma);

exitgame.addActionListener(ma);//將三個按鈕事件源進行監聽

add(chessbord);//添加棋盤

pack();//框架大小的自適應

}

public static void main(String[] args) {

ChessJFrame jf=new ChessJFrame();//聲明框架對象

jf.setVisible(true);//可見

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//設置關閉方式

jf.setLocationRelativeTo(null);//將面板置中

}

private class MyActLister implements ActionListener{//事件監聽內部類

@Override

public void actionPerformed(ActionEvent e) {

Object obj=e.getSource();//獲取事件源

if(obj==restartgame) {//重新開始事件

System.out.println("重新開始");

chessbord.restartgame();

}

else if(obj==backgame) {//悔棋事件

System.out.println("悔棋");

chessbord.backgame();

}else if(obj==exitgame) {//退出游戲事件

System.exit(0);

}

}

}

}

最后一個棋盤類是最復雜的,也是最重要的一個類,它繼承的JTable類和兩個鼠標事件接口,棋盤類里有畫圖函數,判單輸贏函數和鼠標處理事件,

先說畫圖函數,它對棋盤進行畫圖,對棋子進行畫圖,要想弄清楚其中的關系,畫一個九宮格自己比劃比劃,

畫圖函數調用的畫直線函數方法,畫圓圈方法,畫方框方法;

protected void paintComponent(Graphics g) {//畫棋盤和棋子

super.paintComponent(g);

for(int i=0;i<=ROWS;i ) {//畫棋盤的行數

g.drawLine(MARGIN, MARGIN i*GRID_SPAN, MARGIN COLS*GRID_SPAN, MARGIN i*GRID_SPAN);

}

for(int i=0;i<=COLS;i ) {//畫棋盤的列數

g.drawLine(MARGIN i*GRID_SPAN, MARGIN, MARGIN i*GRID_SPAN, MARGIN ROWS*GRID_SPAN);

}

for (int i = 0; i < chessCount; i ) {//畫棋子

int form=chessList[i].getForm();//判斷是什么形狀

int xpos=chessList[i].getX()*GRID_SPAN MARGIN 20;//棋子的X的坐標

int ypos=chessList[i].getY()*GRID_SPAN MARGIN 20;//棋子的y的坐標

if(form==1) {//畫圓圈

g.drawOval(xpos,ypos, GRID_SPAN/2, GRID_SPAN/2);

}else if(form==2) {//畫方框

g.drawRect(xpos, ypos, GRID_SPAN/2, GRID_SPAN/2);

}

}

}

接下來就是鼠標事件,鼠標事件又分為鼠標移動事件和鼠標按下事件,

鼠標移動事件用來設置鼠標光標的,當光標在棋盤外,所在位置有棋子時或游戲結束時設置為默認形狀;

代碼如下;

?

public void mouseMoved(MouseEvent e) {//鼠標移動事件

int x1=(e.getX()-MARGIN)/GRID_SPAN;//棋子x的坐標

int y1=(e.getY()-MARGIN)/GRID_SPAN;//棋子y的坐標

if(x1<0||x1>ROWS-1||y1<0||y1>COLS-1||findchess(x1,y1)||gameover) {//判斷鼠標光標是否在棋盤外,是否所在位置有棋子,是否游戲結束

setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//如果是,設置為默認形狀

}else {//如果不是,則設置為手形

setCursor(new Cursor(Cursor.HAND_CURSOR));

}

}

?

鼠標按下事件,是用來下棋子的,并判斷棋子是否勝利,是否平局;

代碼如下;

public void mousePressed(MouseEvent e) {//鼠標按下事件

if(gameover)//游戲結束不能下

return ;

int form=start?1:2;

int xindex=(e.getX()-MARGIN)/GRID_SPAN;

int yindex=(e.getY()-MARGIN)/GRID_SPAN;

if(xindex<0||xindex>ROWS-1||yindex<0||yindex>COLS-1||findchess(xindex, yindex)) {

return ;//在棋盤外,所在位置有棋子,不能下

}

Chess ch=new Chess(xindex,yindex,form);//棋子對象

chessList[chessCount ]=ch;//存放在棋子對象數組里

repaint();//重畫

if(win(xindex,yindex)) {//如果游戲勝利,輸出以下信息

String msg=String.format("恭喜 %s贏了",start?"圓圈":"方框");

JOptionPane.showMessageDialog(this, msg);

gameover=true;

}else if(chessCount==ROWS*COLS&&gameover==false) {//如果棋子下滿,并且沒有勝利,輸出以下信息

String msg=String.format("旗鼓相當,加油");

JOptionPane.showMessageDialog(this, msg);

gameover=true;

}

start=!start;//改變形狀

}

最后是判斷棋子是否勝利的代碼,個人覺得這是最難的地方;

判斷井字棋是否勝利時,當棋子個數小于5時不用判斷棋子是否勝利,棋子數不夠;

判斷主對角線上的棋子時,根據棋子的坐標我們可以知道主對角線上的x坐標與y坐標是相等的;

接下來就是遍歷棋子數組中的棋子是否有x坐標與Y坐標相等的;

有的話就判斷是否和當前所下棋子是否相同,是的話,數目加一,當數目為三時,說明游戲中有棋子勝利;

根據這個關系寫出可以下代碼;

if(xindex==yindex) {//主對角線上的棋子

for(int i=0;i

if(chessList[i].getX()==chessList[i].getY()) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子個數是否為三

return true;

}else {

Count=0;

}

判斷反對角線上的棋子,放對角線的棋子x坐標和y坐標相加等于同一個數;

判斷反對角線上的棋子原理和主對角線上的原理差不多,這里就不多說了;

if(xindex yindex==2) {//反對角線上的棋子

for(int i=0;i

if(chessList[i].getX() chessList[i].getY()==2) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子數是否為三

return true;

}else {

Count=0;

}

}

接下來就是判斷棋子所在行和列是否有相同連續的三個棋子;

根據坐標關系我們可知;同一列的坐標,它們的x坐標值相等,同一行的坐標,它們的y坐標相等;

以列為例,我們可以根據所下棋子的索引來對棋子所在的列進行遍歷;

拿出當前所下棋子的x索引值,然后遍歷棋子對象中有沒有和當前棋子x索引相同的值,有的話說明該棋子是和所下棋子在同一列

然后進行判斷,同一列有沒有連續相同的三個棋子;有的話則當前棋子勝利;

行和列的判斷代碼如下;

for(int i=0;i

if(xindex==chessList[i].getX()) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子數是否為三

return true;

}else {

Count=0;

}

for(int i=0;i

if(yindex==chessList[i].getY()) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子數是否為三

return true;

}else {

Count=0;

}

棋盤類三個比較重要的部分已經說完了,接下來我會貼出完整的棋盤類代碼,大家再接再厲;

?

import java.awt.*;

import java.awt.event.*;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import javax.swing.*;

/*

* 井字棋的棋盤類

* 棋盤類繼承了面板類和鼠標事件接口

*/

public class Chessbord extends JPanel implements MouseListener,MouseMotionListener{

private static int MARGIN=30;//面板與框架之間的間距

private static int ROWS=3;//行數

private static int COLS=3;//列數

private static int GRID_SPAN=80;//網格間距

Chess[] chessList=new Chess[ROWS*COLS];//棋子數組,存放棋子對象

int chessCount=0;//棋子個數

boolean start=true;//默認圓圈先下

boolean gameover=false;//游戲結束

public Chessbord() {//構造函數

setBackground(Color.GRAY);//設置背景顏色

addMouseListener(this);

addMouseMotionListener(this);//添加鼠標事件

}

@Override

protected void paintComponent(Graphics g) {//畫棋盤和棋子

super.paintComponent(g);

for(int i=0;i<=ROWS;i ) {//畫棋盤的行數

g.drawLine(MARGIN, MARGIN i*GRID_SPAN, MARGIN COLS*GRID_SPAN, MARGIN i*GRID_SPAN);

}

for(int i=0;i<=COLS;i ) {//畫棋盤的列數

g.drawLine(MARGIN i*GRID_SPAN, MARGIN, MARGIN i*GRID_SPAN, MARGIN ROWS*GRID_SPAN);

}

for (int i = 0; i < chessCount; i ) {//畫棋子

int form=chessList[i].getForm();//判斷是什么形狀

int xpos=chessList[i].getX()*GRID_SPAN MARGIN 20;//棋子的X的坐標

int ypos=chessList[i].getY()*GRID_SPAN MARGIN 20;//棋子的y的坐標

if(form==1) {//畫圓圈

g.drawOval(xpos,ypos, GRID_SPAN/2, GRID_SPAN/2);

}else if(form==2) {//畫方框

g.drawRect(xpos, ypos, GRID_SPAN/2, GRID_SPAN/2);

}

}

}

@Override

public void mouseDragged(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mouseMoved(MouseEvent e) {//鼠標移動事件

int x1=(e.getX()-MARGIN)/GRID_SPAN;//棋子x的坐標

int y1=(e.getY()-MARGIN)/GRID_SPAN;//棋子y的坐標

if(x1<0||x1>ROWS-1||y1<0||y1>COLS-1||findchess(x1,y1)||gameover) {//判斷鼠標光標是否在棋盤外,是否所在位置有棋子,是否游戲結束

setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//如果是,設置為默認形狀

}else {//如果不是,則設置為手形

setCursor(new Cursor(Cursor.HAND_CURSOR));

}

}

private boolean findchess(int x1, int y1) {//判斷所在位置是否有棋子

for (Chess chess : chessList) {

if(chess!=null&&chess.getX()==x1&&chess.getY()==y1) {

return true;

}

}

return false;

}

@Override

public void mouseClicked(MouseEvent e) {

// TODO Auto-generated method stub

}

@Override

public void mousePressed(MouseEvent e) {//鼠標按下事件

if(gameover)//游戲結束不能下

return ;

int form=start?1:2;

int xindex=(e.getX()-MARGIN)/GRID_SPAN;

int yindex=(e.getY()-MARGIN)/GRID_SPAN;

if(xindex<0||xindex>ROWS-1||yindex<0||yindex>COLS-1||findchess(xindex, yindex)) {

return ;//在棋盤外,所在位置有棋子,不能下

}

Chess ch=new Chess(xindex,yindex,form);//棋子對象

chessList[chessCount ]=ch;//存放在棋子對象數組里

repaint();//重畫

if(win(xindex,yindex)) {//如果游戲勝利,輸出以下信息

String msg=String.format("恭喜 %s贏了",start?"圓圈":"方框");

JOptionPane.showMessageDialog(this, msg);

gameover=true;

}else if(chessCount==ROWS*COLS&&gameover==false) {//如果棋子下滿,并且沒有勝利,輸出以下信息

String msg=String.format("旗鼓相當,加油");

JOptionPane.showMessageDialog(this, msg);

gameover=true;

}

start=!start;//改變形狀

}

private boolean win(int xindex,int yindex) {//判斷游戲是否勝利

if(chessCount<5) {//當棋子小于5時不用判斷

return false;

}

int x=start?1:2;//判斷棋子形狀

int Count=0;//統計連續棋子數

if(xindex==yindex) {//主對角線上的棋子

for(int i=0;i

if(chessList[i].getX()==chessList[i].getY()) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子個數是否為三

return true;

}else {

Count=0;

}

}

if(xindex yindex==2) {//反對角線上的棋子

for(int i=0;i

if(chessList[i].getX() chessList[i].getY()==2) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子數是否為三

return true;

}else {

Count=0;

}

}

for(int i=0;i

if(xindex==chessList[i].getX()) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子數是否為三

return true;

}else {

Count=0;

}

for(int i=0;i

if(yindex==chessList[i].getY()) {

if(chessList[i].getForm()==x) {

Count ;

}else

break;

}

}

if(Count==3) {//判斷連續棋子數是否為三

return true;

}else {

Count=0;

}

return false;//否則返回false

}

@Override

public void mouseReleased(MouseEvent e) {

}

@Override

public void mouseEntered(MouseEvent e) {

}

@Override

public void mouseExited(MouseEvent e) {

// TODO Auto-generated method stub

}

public void restartgame() {//重新開始函數

for (int i = 0; i < chessList.length; i ) {

chessList[i]=null;

}

chessCount=0;

gameover=false;

start=true;//一切恢復為初始狀態

repaint();//重畫

}

public void backgame() {//悔棋函數

if(gameover) {//如果游戲結束,不能悔棋

return ;

}

if(chessCount==0) {//如果棋子個數為0,不能悔棋

return ;

}

chessList[chessCount-1]=null;

chessCount--;

start=!start;//改變形狀

repaint();//重畫

}

public Dimension getPreferredSize() {//畫矩形面板

return new Dimension(MARGIN*2 ROWS*GRID_SPAN,MARGIN*2 COLS*GRID_SPAN);

}

}

?

井字棋代碼到此結束;

來源:http://www.icode9.com/content-1-135351.html

總結

以上是生活随笔為你收集整理的井字棋java代码_JAVA 井字棋的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性欧美丰满熟妇xxxx性久久久 | 男女啪啪网站 | 国产精品粉嫩 | 欧美大波大乳巨大乳 | 九草网 | 国产高清一区二区三区 | 看黄网站在线 | 在线观看国产一级片 | 网友自拍视频 | 欧美日韩久久久久 | 女性爱爱视频 | 成年人免费高清视频 | 伊人久久大香线蕉综合网站 | 日批网址 | 张津瑜国内精品www在线 | 日韩色视频在线观看 | 日本伦理中文字幕 | 亚洲欧洲在线看 | 色综合五月天 | 欧美xxxx非洲 | 72种无遮挡啪啪的姿势 | 国产女人18水真多18精品一级做 | 亚洲av永久无码精品 | 青娱乐极品在线 | 日韩一区二区三区免费视频 | 亚洲精品在线视频免费观看 | 日韩精品tv | 中文字幕精品视频在线观看 | 91国产在线免费观看 | 色窝窝无码一区二区三区 | 美女久久久久久久久 | 久啪视频 | 亚洲天堂午夜 | 国产精品欧美激情在线播放 | 国产影视一区二区三区 | 成人精品一区二区三区四区 | 国产精品精品视频 | 肉感丰满的av演员 | 欧美日韩在线国产 | 黄色一极片| 中文字幕永久在线观看 | 日本xxxwww | 91大神小宝寻花在线观看 | 国产精品一区二区亚洲 | 亚洲成a人在线观看 | 一级黄片毛片 | а√天堂8资源在线官网 | 欧洲一区二区三区 | 亚洲激情文学 | 各种含道具高h调教1v1男男 | 免费精品视频在线观看 | 国产综合网站 | 申鹤乳液狂飙 | www日韩av | 爱爱网视频 | 人人干网站 | 爱爱亚洲| 一区二区三区中文字幕在线观看 | 国产综合在线视频 | 国产一级片一区二区 | 婷婷av在线| 国产综合第一页 | 亚洲三级网| 一道本在线 | 人人爽人人澡 | 老太脱裤让老头玩ⅹxxxx | 七仙女欲春2一级裸体片 | 国产精品亚洲专区无码牛牛 | 欧美一级高清片 | 男女做的视频 | 亚洲国产第一区 | www.黄色一片 | 一区=区三区乱码 | 黑人巨大av| 婷婷激情六月 | 极品少妇一区二区三区 | 亚洲黄色中文字幕 | xxxx性视频| 欧美视频直播网站 | 在线播放一区二区三区 | 老司机午夜精品视频 | 拔萝卜91 | 成人免费在线观看 | 亚洲一区精品在线观看 | 香蕉毛片 | 中文在线观看av | 99久久精 | 精品人妻一区二区三区日产乱码卜 | 久久综合久久综合久久 | 麻豆成人入口 | 午夜蜜桃视频 | 嫩草在线播放 | 日韩中文字幕视频在线 | 开心激情av| 亚洲乱码国产乱码精品精的特点 | 不卡av片| 日韩欧美成人一区二区 | 精品久久久视频 | 亚洲午夜视频在线观看 |