900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > JAVA 实现《五子棋单机版》游戏

JAVA 实现《五子棋单机版》游戏

时间:2023-06-21 19:00:20

相关推荐

JAVA 实现《五子棋单机版》游戏

前言

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

棋具与围棋通用,起源于中国上古时代的传统黑白棋种之一。主要流行于华人和汉字文化圈的国家以及欧美一些地区,是世界上最古老的棋。

容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想。

主要需求

1、对局双方各执一色棋子。

2、空棋盘开局。

3、玩家(黑棋)先、AI(红棋)后,交替下子,每次只能下一子。

4、棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。

5、黑方的第一枚棋子可下在棋盘任意交叉点上。

6、轮流下子是双方的权利,但允许任何一方放弃下子权,先形成5子连线者获胜。

主要设计

1、由于是单机的游戏,启动游戏后,可直接开始游戏。

2、游戏规则:

对局双方各执一色棋子。空棋盘开局。黑先、红后,交替下子,每次只能下一子。棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。黑方的第一枚棋子可下在棋盘任意交叉点上。轮流下子是双方的权利,但允许任何一方放弃下子权,先形成5子连线者获胜。

3、设计排行榜功能

统计局数,步数和结果

4、更换棋盘

可以切换不同的棋盘,下棋更加赏心悦目。

5、更换棋子

可以芀不同的棋子颜色。

功能截图

启动游戏:

对战效果

切换棋盘:

代码实现

主界面:

package wuziqi;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import javax.swing.JFrame;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;public class Wumain extends JFrame{Pan p = null;JMenuBar menuber = new JMenuBar();JMenu jm1 = new JMenu("选项");JMenu jm2 = new JMenu("设置");JMenu jm3 = new JMenu("帮助");JMenuItem jm1_1 = new JMenuItem("重新开始");JMenuItem jm1_2 = new JMenuItem(" 排行榜");JMenuItem jm1_3 = new JMenuItem("退出游戏");JMenuItem jm2_1 = new JMenuItem("更换棋盘");JMenuItem jm2_2 = new JMenuItem("更换棋子");JMenuItem jm3_1 = new JMenuItem("关于我们");public Wumain(){p =new Pan();this.setSize(585,600);this.setLocation(200,100);this.add(p);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jm1.add(jm1_1);jm1.add(jm1_2);jm1.add(jm1_3);jm2.add(jm2_1);jm2.add(jm2_2);jm3.add(jm3_1);menuber.add(jm1);menuber.add(jm2);menuber.add(jm3); this.setJMenuBar(menuber);this.addMouseListener(p);jm1_3.addActionListener(new ActionListener() {//匿名虚构类@Overridepublic void actionPerformed(ActionEvent e) {System.exit(0);}});jm1_1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {for(int i=0;i<p.row;i++){for(int j=0;j<p.col;j++){p.num[i][j] = 0;}}p.canSetqizi = true;p.qizi_num = 0;repaint();}});jm2_1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Random r = new Random();int n = r.nextInt(8);String qipan_name = "qipan"+n+".jpg";p.qipan_name = qipan_name;repaint();}});jm2_2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {Random r = new Random();int n = r.nextInt(8);String qizi1_name = "c"+n+".png";String qizi2_name = "c"+(n+1)+".png";p.qizi1_name = qizi1_name;p.qizi2_name = qizi2_name;repaint();}});jm3_1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {String msg ="关于我们\n" +"1、玩家先落子;\n" +"2、形成5颗同色连子即为赢;\n\n\n" +" ";JOptionPane.showMessageDialog(null, msg);}});jm1_2.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {String msg ="排行榜\n" +"局数步数结果\n";for(int i=0;i<p.paihanglist.size();i++){PaiHangBang ph = p.paihanglist.get(i);msg = msg+" "+ph.getJushu()+""+ph.getBushu()+""+ph.getJieguo()+"\n";}JOptionPane.showMessageDialog(null, msg);}});this.setVisible(true);}public static void main(String[] args){Wumain w = new Wumain();}}

排行榜

package wuziqi;public class PaiHangBang {private int jushu;private int bushu;private String jieguo;public int getJushu() {return jushu;}public void setJushu(int jushu) {if(jushu<1){this.jushu = 1;}this.jushu = jushu;}public int getBushu() {return bushu;}public void setBushu(int bushu) {this.bushu = bushu;}public String getJieguo() {return jieguo;}public void setJieguo(String jieguo) {this.jieguo = jieguo;}}

棋盘:

package wuziqi;import java.awt.Graphics;import java.awt.Image;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.util.ArrayList;import java.util.List;import java.util.Random;import javax.swing.ImageIcon;import javax.swing.JOptionPane;import javax.swing.JPanel;public class Pan extends JPanel implements MouseListener{int i=0,j=0;int row = 15;//数组下标int col = 15;//数组上标String qipan_name = "qipan1.jpg";String qizi1_name = "c1.png";String qizi2_name = "c2.png";int num[][] = new int[row][col];//0:标示该位置为空,1:标示红棋子,2:标示黑棋子boolean canSetqizi = true;//定义boolean值,用来判断该位置是否有子int qizi_num = 0;//定义记录落子数List<PaiHangBang> paihanglist = new ArrayList();//定义集合,用来存储排行榜public void paint(Graphics g){super.paint(g);Image img= new ImageIcon("img/"+qipan_name).getImage();//调入棋盘图片g.drawImage(img, 0, 0, 567, 567, this);//绘制棋盘Image c1= new ImageIcon("img/"+qizi1_name).getImage();Image c2= new ImageIcon("img/"+qizi2_name).getImage();for(int i = 0;i<num.length;i++){for(int j = 0;j<num[i].length;j++){if(num[i][j] == 1){g.drawImage(c1, i*35+20, j*35+20, 35, 35, this);}else if(num[i][j] == 2){g.drawImage(c2, i*35+20, j*35+20, 35, 35, this);}}//重绘棋子}//重载整个界面(防止最小化后原内容丢失)}public int[] getLoc(int x,int y) {int count = 1;//定义计数器,用于计算棋子数int[] wz1 = null;int[] wz2 = null;//定义数组,用来存储危险位置for(int i =x-1;i>=0;i--){if(num[i][y] == num[x][y]){count++;}else{if(num[i][y] == 0){wz1 = new int[]{i,y};//获取左边的危险位置坐标}break;}}//左for(int i =x+1;i<row;i++){if(num[i][y] == num[x][y]){count++;}else{if(num[i][y] == 0){wz2 = new int[]{i,y};//获取有变位置危险坐标}break;}}//右if(count>=3){if(wz1 != null){return wz1;//判断返回左边危险位置}else if(wz2 != null){return wz2;//判断返回右边危险位置}else{return null;}}//左右count = 1;wz1 = null;wz2 = null;//初始化所有参数for(int j =y-1;j>=0;j--){if(num[x][j] == num[x][y]){count++;}else{if(num[x][j] == 0){wz1 = new int[]{x,j};}break;}}//上for(int j =y+1;j<col;j++){if(num[x][j] == num[x][y]){count++;}else{if(num[x][j] == 0){wz2 = new int[]{x,j};}break;}}//下if(count>=3){if(wz1 != null){return wz1;}else if(wz2 != null){return wz2;}else{return null;}}//上下count = 1;wz1 = null;wz2 = null;for(int i =x-1,j =y-1;i>=0&&j>=0;i--,j--){if(num[i][j] == num[x][y]){count++;}else{if(num[i][j] == 0){wz1 = new int[]{i,j};}break;}}//左上for(int i =x+1,j =y+1;i<row&&j<col;i++,j++){if(num[i][j] == num[x][y]){count++;}else{if(num[i][j] == 0){wz2 = new int[]{i,j};}break;}}//右下if(count>=3){if(wz1 != null){return wz1;}else if(wz2 != null){return wz2;}else{return null;}}//左上右下count = 1;wz1 = null;wz2 = null;for(int i =x-1,j =y+1;i>=0&&j<col;i--,j++){if(num[i][j] == num[x][y]){count++;}else{if(num[i][j] == 0){wz1 = new int[]{i,j};}break;}}//左下for(int i =x+1,j =y-1;i<row&&j>=0;i++,j--){if(num[i][j] == num[x][y]){count++;}else{if(num[i][j] == 0){wz2 = new int[]{i,j};}break;}}//右上if(count>=3){if(wz1 != null){return wz1;}else if(wz2 != null){return wz2;}else{return null;}}//左下右上return null;}public boolean iswin(int x,int y){int count = 1;for(int i =x-1;i>=0;i--){if(num[i][y] == num[x][y]){count++;}else{break;}}//左for(int i =x+1;i<row;i++){if(num[i][y] == num[x][y]){count++;}else{break;}}//右if(count>=5){return true;}//左右count = 1;for(int j =y-1;j>=0;j--){if(num[x][j] == num[x][y]){count++;}else{break;}}//上for(int j =y+1;j<col;j++){if(num[x][j] == num[x][y]){count++;}else{break;}}//下if(count>=5){return true;}//上下count = 1;for(int i =x-1,j =y-1;i>=0&&j>=0;i--,j--){if(num[i][j] == num[x][y]){count++;}else{break;}}//左上for(int i =x+1,j =y+1;i<row&&j<col;i++,j++){if(num[i][j] == num[x][y]){count++;}else{break;}}//右下if(count>=5){return true;}//左上右下count = 1;for(int i =x-1,j =y+1;i>=0&&j<col;i--,j++){if(num[i][j] == num[x][y]){count++;}else{break;}}//左下for(int i =x+1,j =y-1;i<row&&j>=0;i++,j--){if(num[i][j] == num[x][y]){count++;}else{break;}}//右上if(count>=5){return true;}//左下右上return false;}//判断输赢@Overridepublic void mouseClicked(MouseEvent e) {if(canSetqizi){Graphics g = this.getGraphics();int checkusersuccess = 0;//标示是否落子成功int x = e.getX();int y = e.getY();//获取鼠标点击的位置Image c1= new ImageIcon("img/"+qizi1_name).getImage();int i = (x-25)/35;int j = (y-75)/35;if(num[i][j] != 0){JOptionPane.showMessageDialog(null, "该位置有旗子,请重新落子");return;// 判断有子,终止本次事件,进行下次事件触发}else{g.drawImage(c1, i*35+20, j*35+20, 35, 35, this);//画出玩家落子num[i][j] = 1;//给数组付一个只值,表示该位置有旗子checkusersuccess = 1;//标示量标示qizi_num++;//记录玩家落子步数}boolean b=iswin(i,j);if(b){JOptionPane.showMessageDialog(null, "你赢了!");canSetqizi = false;PaiHangBang ph = new PaiHangBang();ph.setJushu(paihanglist.size()+1);ph.setBushu(qizi_num);ph.setJieguo("win");paihanglist.add(ph);return;}//调用boolean判断方法try {Thread.sleep(1000);} catch (InterruptedException e1) {e1.printStackTrace();}//时间间隔:玩家落子后的等待Random r = new Random();Image c2 = new ImageIcon("img/"+qizi2_name).getImage();//调入黑棋子图片do{int[] wz =getLoc(i, j);if(wz == null){i = r.nextInt(15);j = r.nextInt(15);}else{i=wz[0];j=wz[1];}//设置随机的坐标}while(num[i][j] != 0);g.drawImage(c2, i*35+20, j*35+20, 35, 35, this);num[i][j] = 2;boolean d=iswin(i,j);if(d){JOptionPane.showMessageDialog(null, "你输了!");canSetqizi = false;PaiHangBang ph = new PaiHangBang();ph.setJushu(paihanglist.size()+1);ph.setBushu(qizi_num);ph.setJieguo("fail");paihanglist.add(ph);return;}//随机电脑落子位置;}}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}}

总结

通过此次的《五子棋单机版》游戏实现,让我对swing的相关知识有了进一步的了解,对java这门语言也有了比以前更深刻的认识。

java的一些基本语法,比如数据类型、运算符、程序流程控制和数组等,理解更加透彻。java最核心的核心就是面向对象思想,对于这一个概念,终于悟到了一些。

源码获取

源码下载地址:传送门------->

可关注博主后,私聊博主免费获取

需要技术指导,写项目程序,等更多服务请联系博主

今天是持续写作的第 32 / 100 天。

可以关注我,点赞我、评论我、收藏我啦。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。