画棋盘
要下棋首先要有一个方格棋盘,一个普通的棋盘是由横线和竖线组成的,我们控制好间距就行,这里有很多常量,我们可以定义它,后期想修改的话就简单了。我这里定义了行row、列colulmn、行间距size,x、y 为窗口上的坐标
for (int i = 0; i < row; i++){
g.drawLine(x, y + size * i, x + size * (column - 1), y + size * i);//横线
g.drawLine(x + size * i, y, x + size * i, y + size * (row - 1));//竖线
}
画棋子
在有棋盘的基础上,我们就可以在上面添加棋子了,我们关键将画好的棋子放在两条线的交叉处。关键的地方我们画好的棋子存入一个数字,方便后面判断输赢。我这里定义画出的黑棋为1,白棋为2
Chess chess= new Chess(vy,vx);//调用chess方法
chessarr[chessCount]=chess;//将累加的下标存入棋子数组
chessCount++;
if(index==1&&x<=575&&y<=625){ //防止棋子落到棋盘之外
Image ima = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\heiqi.png").getImage();
g.drawImage(ima,vx*size+25,vy*size+75, 50, 50,null);
arr[vy][vx] = 1; //将画好的棋子定好数字
index++;
if(isWin(vy, vx)){//如果isWin方法为真,就输出下面的对话框
JOptionPane.showMessageDialog(null, "黑方赢了!!!");
}
}
else if(index==2&&x<=575&&y<=625){
Image ima = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\baiqi.png").getImage();
g.drawImage(ima,vx*size+25,vy*size+75, 50, 50,null);
arr[vy][vx] = 2;
index--;
if(isWin(vy, vx)){
JOptionPane.showMessageDialog(null, "白方赢了!!!");
}
}
判输赢
五子棋的游戏规则,在横竖、斜对角有连起来相同颜色的五个旗子,该颜色方就获胜.在画棋子的时候我们已经定义了一个二维数组,将画好的棋子按颜色存起来了,下面只需要遍历数组就行。我分为横向的向左向右判断,竖向的向上向下判断,两个斜向的方向也两边判断,只要相同颜色的棋子达到五个就弹出获胜方。
public boolean chessL_R(int r, int c) {//r,c是随机点击的棋子的列,行
int count=0;
//确定好一个点,看横向的相同数字个数,i是行,j是列
//以最后下的棋子为中心,往右遍历
for(int j=c;j<arr.length;j++){
System.out.println(arr[r][c]);
if(arr[r][c]==arr[r][j]){
count++;
}
}
//以最后下的棋子为中心,往左遍历
for(int j=c-1;j>=0;j--){
System.out.println(arr[r][c]);
if(arr[r][c]==arr[r][j]){
count++;
}
}
System.out.println("count1= "+count);
return count >= 5 ? true : false;
}
//判断纵向
//先往上遍历,再往下
public boolean chessU_D(int r,int c){
int count=0;
for(int i=r;i>=0;i--){
if(arr[r][c]==arr[i][c]){
count++;
}
}
for(int i=r+1;i<arr.length;i++){
if(c+i<600&&arr[r][c]==arr[i][c]){
count++;
}
}
System.out.println("count2= "+count);
return count >= 5 ? true : false;
}
//斜向右下
public boolean chessR_R(int r, int c) {
int count=0;
//以最后一个球为中心,左上角
for(int i=r,j=c;i>=0&&j>=0;i--,j--){
if(arr[r][c]==arr[i][j]){
count++;
}
}
//以最后一个球为中心,右上角
for(int i=r+1,j=c+1;i<arr.length&&j<arr.length;i++,j++){
if(i+c<600&&j+r<700&&arr[r][c]==arr[i][j]){
count++;
}
}
System.out.println("count3= "+count);
return count >= 5 ? true : false;
}
//判断斜左下
public boolean chessL_L(int r, int c) {
int count=0;
//以最后一个球为中心,右上角
for(int i=r,j=c;i<arr.length&&j>=0;i++,j--){
if(i+c<600&&arr[r][c]==arr[i][j]){
count++;
}
}
//以最后一个球为中心,左上角
for(int i=r-1,j=c+1;i>=0&&j<arr.length;i--,j++){
if(j+r<550&&arr[r][c]==arr[i][j]){
count++;
}
}
System.out.println("count4= "+count);
return count >= 5 ? true : false;
}
输赢的方法
public boolean isWin(int r, int c) {
if(chessL_R(vy, vx) ||chessU_D(vy, vx) ||chessL_L(vy, vx)||chessR_R(vy, vx)){
return true;
}else {
return false;
}
}
悔棋的功能
我们需要将下好的棋子个数计下来,每点一下悔棋按钮就消失一个棋子
public class Chess {
int x,y;
int size=50;
public Chess(int x,int y){
this.x=x;
this.y=y;
}
}
public void regret(){
if(chessCount>0){
chessCount--;
Chess chess = chessarr[chessCount];
System.out.println("x="+chess.x);
System.out.println("y="+chess.y);
arr[chess.x][chess.y]=0;
}
}
再来一局
再来一局,只需要将棋盘上画好的棋子清空就行,将之前黑白棋存下的数字全部清零即可
public void tryAgain(){
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr.length;j++){
arr[j][i] =0;
}
}
}
更换皮肤
我们只需要在菜单条上添加菜单,然后在菜单上添加菜单项,菜单项上就是我们所需要更换皮肤的名字
JMenuBar jmb=new JMenuBar();//菜单条
JMenu skimMenu=new JMenu("skim");//菜单
jmb.add(skimMenu);
skimMenu.addActionListener(bl);
setJMenuBar(jmb);
String[] picStr = {"大自然","小动物","动漫","护眼"};
for (int i = 0; i <picStr.length; i++) {
JMenuItem picItem=new JMenuItem(picStr[i]);
skimMenu.add(picItem);
picItem.addActionListener(bl);
}
之后在监听器界面
if(picStr.equals("动漫")){
image = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java1.jpg").getImage();
}else if(picStr.equals("小动物")){
image =new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java2.jpg").getImage();
}else if(picStr.equals("大自然")){
image =new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java3.jpg").getImage();
}else if(picStr.equals("护眼")){
image = new ImageIcon("C:\\Users\\Lenovo\\Desktop\\com\\pic\\java4.jpg").getImage();
}
记得整完上面的要重绘哦,要不然滑动窗口棋盘就消失啦啦啦!
送一句话给大家:
“好的艺术家只是照抄,而伟大的艺术家窃取灵感,在窃取伟大的灵感这方面,我们一直都是厚颜无耻的”