&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&
&&&&&&&&&&&
位置:&&&&&&&&&&&&&&&&&正文
看不到动态棋盘怎么办?
作者:佚名
文章来源:OneGreen.Net
浏览次数:
更新时间:
如果你看不到动态棋盘,只看到下图的话,就说明你的JAVA虚拟机没有安装好,或者安装了没有配置好:
(动态棋盘不能正常显示)
1、JAVA类动态棋盘都需要JAVA虚拟机的支持,所以,首要条件是先安装好JAVA虚拟机,目前的最新版本为8.0:
官方下载地址为:
本站下载地址为:
下载后,按提示安装到你的电脑中。
2、因为从7.0开始,JAVA虚拟机在安全方面做了升级,安装好JAVA虚拟机后还要做必要的设置才能正常使用:
(1)、从开始菜单调出JAVA控制面板:
(2)、启用浏览器中的JAVA内容:
(3)、添加例外站点:
(4)、OK!重启一下你的浏览器,必要时候重启一下你的电脑,再次回到棋谱的页面。如果出现如下画面,点击“运行”按钮后,棋盘就出来了:
(5)、正常的棋盘是这样滴:
(这是国际象棋棋盘)
(这是五子棋棋盘)
如果这样做了,还不行啊,怎么办:那就凉拌咯
浏览器:工具------Internet选项------安全------自定义级别
上篇文章: 下篇文章: 没有了
&相关文章:
&相关下载:
没有相关文章
没有相关下载
【】【】【】【】【】Posts - 39,
Articles - 0,
Comments - 0
关注Web技术,Web学习笔记,记录点滴
23:08 by lefan, ... 阅读,
&&&&& 断断续续看了马士兵的JavaSE基础教程,现在还有容器、IO和多线程没有看完。学习给我感触最深的是内存分析,知识点可以是先有个了解,需要用时再去翻书,看看具体怎么样,当然如果特别熟是更好的。
&&&&&& 通过对程序进行内存分析,理解了程序运行过程,在JAVA中,有六个不同的地方可以存储数据[1]:
1. 寄存器(register)。这是最快的存储区,因为它位于不同于其他存储区的地方&&处理器内部。但是寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。你不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象。
2. 堆栈(stack)。位于通用RAM中,但通过它的&堆栈指针&可以从处理器哪里获得支持。堆栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。这是一种快速有效的分配存储方法,仅次于寄存器。创建程序时候,JAVA编译器必须知道存储在堆栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动堆栈指针。这一约束限制了程序的灵活性,所以虽然某些JAVA数据存储在堆栈中&&特别是对象引用,但是JAVA对象不存储其中。
3. 堆(heap)。一种通用性的内存池(也存在于RAM中),用于存放所以的JAVA对象。堆不同于堆栈的好处是:编译器不需要知道要从堆里分配多少存储区域,也不必知道存储的数据在堆里存活多长时间。因此,在堆里分配存储有很大的灵活性。当你需要创建一个对象的时候,只需要new写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。当然,为这种灵活性必须要付出相应的代码。用堆进行存储分配比用堆栈进行存储存储需要更多的时间。
4. 静态存储(static storage)。这里的&静态&是指&在固定的位置&。静态存储里存放程序运行时一直存在的数据。你可用关键字static来标识一个对象的特定元素是静态的,但JAVA对象本身从来不会存放在静态存储空间里。
5. 常量存储(constant storage)。常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中.
6. 非RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。
程序的执行过程[2]:
&&&&& 在学了一部分常用类后,想看看程序运行结果,根据网上的五子棋源代码,阅读了两个java五子棋的程序,并且生成了游戏,成功对弈一盘。我看到的两种算法:1.利用分数代表每个位置的重要程度,越重要的位置的分数值会越高,当电脑下棋时会先将电脑和玩家棋型的分数分别计算一遍,然后选择二者中分数最高的点下子。如果玩家的分数高,那么代表电脑应该防守,如果电脑的分数高,那么代表电脑应该进攻。2.计算棋盘上某一方格上左、右、上、下、左上、左下、右上、右下八个方向棋子的最大值,判断该坐标位置是否可下棋子。计算机走棋时,用穷举法判断每一个坐标点的四个方向的的最大棋子数,最后得出棋子数最大值的坐标,然后下子。
& &&使用第二个方案的源代码生成的游戏,完了两局都,设计的还是不好,程序只是给了简单的判断准则,相对智能点还是实现不了,以后会留心着更智能的设计。
[1] 《Thinking in Java》中文第四版。
[2] &马士兵《J2SE课件》。该问题被发起重新开启投票
投票剩余时间:
之前被关闭原因:
该问题被发起删除投票
投票剩余时间:
距离悬赏到期还有:
参与关闭投票者:
关闭原因:
该问题已经被锁定
锁定原因:()
保护原因:避免来自新用户不合宜或无意义的致谢、跟帖答案。
该问题已成功删除,仅对您可见,其他人不能够查看。
准备两个变量 一个 黑赢变量
一个白赢变量为棋盘上每个点准备一个变量
叫点变量该变量空为0 下白棋加1 下黑棋加2看看拥有超过4个点的线(包括斜线)有多少个
作为外循环次数
外循环的工作要6次重置起始点的位置,和内循环次数,和内循环里面的起始点内存地址以及距离一下个点的内存地址的距离,每循环一次是加还是减也要知道规律会变化6次内循环的工作1.测试点
如果为0则把黑赢和白赢变量清0
如果为1把白赢变量加1黑赢变量清0
如果为2把黑赢变量加1白赢变量清02.测试黑赢和白赢变量是否为5
哪个为5就是哪个赢了 结束循环
3.根据外循环提供的规律调整指向点变量的指针,和距离一下个点变量在内存里的距离
判断当前点周围也可以,不过涉及到边界问题,我觉得那样更复杂
玩家每下一个点,程序在该点的上下左右、斜下左右、斜上左右这几个方向上,都判断是否已满5个棋子。这个问题貌似和java无甚关系。
import java.applet.*; import java.awt.*; import java.awt.event.*; import java.applet.A import java.awt.C
public class Wuziqi extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener { int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子 int intGame_Start=0;//游戏开始标志 0未开始 1游戏中 int intGame_Body[][]=new int[16][16]; //设置棋盘棋子状态 0 无子 1 白子 2 黑子 Button b1=new Button("游戏开始"); Button b2=new Button("重置游戏"); Label lblWin=new Label(" "); Checkbox ckbHB[]=new Checkbox[2]; CheckboxGroup ckgHB=new CheckboxGroup(); public void init() { setLayout(null); addMouseListener(this); add(b1); b1.setBounds(330,50,80,30); b1.addActionListener(this); add(b2); b2.setBounds(330,90,80,30); b2.addActionListener(this); ckbHB[0]=new Checkbox("白子先",ckgHB,false); ckbHB[0].setBounds(320,20,60,30); ckbHB[1]=new Checkbox("黑子先",ckgHB,false); ckbHB[1].setBounds(380,20,60,30); add(ckbHB[0]); add(ckbHB[1]); ckbHB[0].addItemListener(this); ckbHB[1].addItemListener(this); add(lblWin); lblWin.setBounds(330,130,80,30); Game_start_csh(); } public void itemStateChanged(ItemEvent e) { if (ckbHB[0].getState()) //选择黑子先还是白子先 { color_Qizi=0; } else { color_Qizi=1; } } public void actionPerformed(ActionEvent e) { Graphics g=getGraphics(); if (e.getSource()==b1) { Game_start(); } else { Game_re(); } } public void mousePressed(MouseEvent e){} public void mouseClicked(MouseEvent e) { Graphics g=getGraphics(); int x1,y1; x1=e.getX(); y1=e.getY(); if (e.getX()&20 || e.getX()&300 || e.getY()&20 || e.getY()&300) { } if (x1%20&10) { x1+=20; } if(y1%20&10) { y1+=20; } x1=x1/2020;
y1=y1/2020; set_Qizi(x1,y1); } public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseDragged(MouseEvent e){} public void mouseMoved(MouseEvent e){} public void paint(Graphics g) { draw_qipan(g); } public void set_Qizi(int x,int y) //落子 { if (intGame_Start==0) //判断游戏未开始 { } if (intGame_Body[x/20][y/20]!=0) { } Graphics g=getGraphics(); if (color_Qizi==1)//判断黑子还是白子 { g.setColor(Color.black); color_Qizi=0; } else { g.setColor(Color.white); color_Qizi=1; } g.fillOval(x-10,y-10,20,20); intGame_Body[x/20][y/20]=color_Qizi+1; if (Game_win_1(x/20,y/20)) //判断输赢 { lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if (Game_win_2(x/20,y/20)) //判断输赢 { lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if (Game_win_3(x/20,y/20)) //判断输赢 { lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } if (Game_win_4(x/20,y/20)) //判断输赢 { lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!"); intGame_Start=0; } } public String Get_qizi_color(int x) { if (x==0) { return "黑子"; } else { return "白子"; } } public void draw_qipan(Graphics G) //画棋盘 1515
G.setColor(Color.lightGray);
G.fill3DRect(10,10,300,300,true);
G.setColor(Color.black);
for(int i=1;i&16;i++)
G.drawLine(20,20i,300,20i);
G.drawLine(20i,20,20*i,300); } } public void Game_start() //游戏开始 { intGame_Start=1; Game_btn_enable(false); b2.setEnabled(true); } public void Game_start_csh() //游戏开始初始化 {& br /& intGame_Start=0; Game_btn_enable(true); b2.setEnabled(false); ckbHB[0].setState(true); for (int i=0;i&16 ;i++ ) { for (int j=0;j&16 ;j++ ) { intGame_Body[i][j]=0; } } lblWin.setText(""); } public void Game_re() //游戏重新开始 { repaint(); Game_start_csh(); } public void Game_btn_enable(boolean e) //设置组件状态 { b1.setEnabled(e); b2.setEnabled(e); ckbHB[0].setEnabled(e); ckbHB[1].setEnabled(e); } public boolean Game_win_1(int x,int y) //判断输赢 横 { int x1,y1,t=1; x1=x; y1=y; for (int i=1;i&5 ;i++ ) { if (x1&15) { } if (intGame_Body[x1+i][y1]==intGame_Body[x][y]) { t+=1; } else { } } for (int i=1;i&5 ;i++ ) { if (x1&1) { } if(intGame_Body[x1-i][y1]==intGame_Body[x][y]) { t+=1; } else { } } if (t&4) { } else { } } public boolean Game_win_2(int x,int y) //判断输赢 竖 { int x1,y1,t=1; x1=x; y1=y; for (int i=1;i&5 ;i++ ) { if (x1&15) { } if (intGame_Body[x1][y1+i]==intGame_Body[x][y]) { t+=1; } else { } } for (int i=1;i&5 ;i++ ) { if (x1&1) { } if(intGame_Body[x1][y1-i]==intGame_Body[x][y]) { t+=1; } else { } } if (t&4) { } else { } } public boolean Game_win_3(int x,int y) //判断输赢 左斜 { int x1,y1,t=1; x1=x; y1=y; for (int i=1;i&5 ;i++ ) { if (x1&15) { } if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]) { t+=1; } else { } } for (int i=1;i&5 ;i++ ) { if (x1&1) { } if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]) { t+=1; } else { } } if (t&4) { } else { } } public boolean Game_win_4(int x,int y) //判断输赢 左斜 { int x1,y1,t=1; x1=x; y1=y; for (int i=1;i&5 ;i++ ) { if (x1&15) { } if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]) { t+=1; } else { } } for (int i=1;i&5 ;i++ ) { if (x1&1) { } if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]) { t+=1; } else { } } if (t&4) { } else { } } }
用扫雷的递归判定也是一种好方法吧
1:每放置一颗母棋子,便判定该棋子周围八宫是否有同色子棋子2:如果有,则依母子棋子的坐标差计算出子棋子所在方位(共八个)3:判定与母棋子相距两格的同向坐标点是否有同色子棋子4:如果有,则计算同向是否有第四、五颗同色子
这样每下一颗母棋子则会立即显示结果,且只需要判定有关的极少的棋子数,较为高效
不是您所需,查看更多相关问题与答案
德问是一个专业的编程问答社区,请
后再提交答案
关注该问题的人
共被浏览 (8127) 次Java五子棋(人人对战)学习经验 - 推酷
Java五子棋(人人对战)学习经验
五子棋算是我学习java一个月以来第一次做的一个项目,也算是小游戏。开始觉得五子棋遥不可及,后来在老师的指导下也一步步攻克难关,做了出来。
首先是最初的界面实现。用一个再寻常不过的JFrame窗体,并常规的设置属性。
不过在勾画棋盘时,我们第一次用到了对界面的重绘。代码是public void paint (Graphics g){}这个方法是重写原来默认的JFrame自带paint方法,在此方法中用循环的方式,画出一条条线,并需要精确计算,以保证能画出15*15的棋盘。当然重绘的不仅只有棋盘而已,在后来每下一个棋子,在最小化JFrame窗体界面后又会这些下的棋子会自动消失,这时就需要我们用重绘的方法将它们一一画出来。这个代码实现就相对难一些,后面再讨论。
接下来是画棋子,这里自然免不了添加MouseListener监听器。在Released操作中,在每次释放鼠标后便要在释放的位置最近的那个点画出一个棋子。我起初觉得这是一件很困难的事,并尝试用取余的方法分了四种情况一一讨论,也实现了目标。不过,在老师的指导下,我引入了行和列的关系,巧妙的给坐标加上20以后不用取余,得到我需要的行数和列数,进而画出想要的位置的棋子。而引入行数和列数,自然需要构建对接下来的事件很有必要的数组。因为棋盘和行列之分。所以只要构建两个变量相组合便能方便地记录棋盘上的每一个位置,而再没有比二维数组更有效的方式。
有了数组,除了实现画棋子,在前面提到了重绘方法上,也变得容易了,只要把画的棋子所对应的数组的位置传到前面,那么就能简单地画出每一个画过的棋子,并保存。除此以外,给画过黑棋和白棋的位置所对应的数组分别赋上一个值,这样也方便能在画过的地方不再重画。然后,采用计数器或者时间真假的方法,用循环的方式,来规定一次下黑棋一次下白棋。
最后,也是最难的地方,便是五子棋判断输赢的部分。起初觉得好像这部分的实现遥不可及。可仔细想想,五子棋判断输赢的方式也很简单啊。无非是有没有五个相同颜色的棋子横向或竖向或斜向连在一起。于是,在定义数组后这显得很简单了,我单独定义一个类用以判断输赢,每下一个棋子,就判断这个棋子在横向、竖向和两个斜向上是否有五子连在一起,然后调用这四个方向的判断方法,最终完成了判断输赢方法的编写。然后,在继承MouseListener的类中,下完棋子后,调用这个方法,以此判断输赢。最后,人人版的五子棋便大功告成了。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致}