本帖最后由 邵震 于 2013-5-9 20:52 编辑
今天用自习时间更新了一下 添加了悔棋的功能
优化了一下代码
还把代码分装成多个类了 正好把我对象调用这里好好的学习了一下
第一个小游戏
不是图形界面的 因为不会
不是用集合做的 因为不会
电脑可以用但是是无脑的随机数 因为不会
但是我用二维数组加上循环判断语句做出了一个简单的五子棋小游戏
可以两个好基友一起玩 能判断输赢
真心的感到很开心 哈哈
源码附上 一是炫耀 一是求错
这个真心的是源码 都没经过优化 我这几天会对代码进行优化和封装
如果大家有什么好的意见或者建议可以回帖给我 谢谢了 有BUG就更好了
玩法就是输入两个数 从1到15之间的
可以用15 15回车的方式 输入
或者 15回车 15回车的方式输入
假如有五颗同颜色的棋子连在一起就会停止游戏并提示谁获胜了
不知道为什么 我发的代码没有层次感 源文件附上了- /**
- * 五子棋小游戏
- * 作者:邵震
- * 完成日期:2013年5月8日19点50分,于北京传智播客101自习室。
- * 从4月29号开始断断续续打了4,5天。
- * 感谢李斌的不厌其烦的帮助。
- * 1.0版本:只能实现两人在同一台电脑上下棋。
- * 1.1版本:优化了代码,把白棋换成更易于观察的黑方块,增加了悔棋功能。
- */
- package TestDay26;
- import java.util.Scanner;
- public class DomePanDuan
- {
- public static void main(String[] args)
- {
- String [][] qiPan = new String [23][23];
- int [] Arr =new int[6];//这个数组的0和1索引用于记录玩家键盘录入的信息,2和3索引用于记录电脑随机的坐标
- DaYin d = new DaYin();
- XiaQi xq = new XiaQi();
- d.qiPan = qiPan;
- xq.qiPan= qiPan;
- xq.Arr = Arr;
- d.QiPan();
- d.DaYinQiPan();
- xq.RenXiaQi(d);
- }
- }
- class DaYin
- {
- String[][] qiPan;
- public void QiPan()
- {
- for(int x=0;x<qiPan.length;x++)
- {
- for(int y=0;y<qiPan[x].length;y++)
- qiPan[x][y]="╋";
- }
- }
- public void DaYinQiPan()//用于打印棋盘
- {
- //用于打印边框
- String[] Arr1 = {"⑴","⑵","⑶","⑷","⑸","⑹","⑺","⑻","⑼","⑽","⑾","⑿","⒀","⒁","⒂"};
- System.out.print("邵");
- for(int x=0;x<Arr1.length;x++)
- {
- if(x<Arr1.length-1)
- {
- System.out.print(Arr1[x]+"··");
- }
- else
- System.out.print(Arr1[x]);
- }
- System.out.println("震");
- for(int w=4;w<qiPan.length-4;w++)
- {
- System.out.print(Arr1[w-4]);
- for(int n=4;n<qiPan[w].length-4;n++)
- {
- if(n<qiPan.length-5)
- {
- System.out.print(qiPan[w][n]+"··");
- }
- else
- System.out.print(qiPan[w][n]);
- }
- System.out.println(Arr1[w-4]);
- }
- System.out.print("出");
- for(int x=0;x<Arr1.length;x++)
- {
- if(x<Arr1.length-1)
- {
- System.out.print(Arr1[x]+"··");
- }
- else
- System.out.print(Arr1[x]);
- }
- System.out.println("品");
- }
- }
- class XiaQi
- {
- String[][] qiPan;
- int[] Arr;
- public void RenXiaQi(DaYin d)//用于人下棋。
- {
- /*
- * 悔棋步骤:
- * 首先定义两个变量用于保存上局落子的坐标
- * 每次输入特定的数字的时候就调用上次的坐标对棋子进行覆盖。
- */
- Scanner site =new Scanner(System.in);
- boolean huanRen = true;//交换玩家出牌
- boolean xunHuan=true;
- while(xunHuan)//无限循环,直到游戏结束,或者手动结束。
- {
- try
- {
- if(huanRen==true)//判断出牌的玩家
- System.out.println("请第一个玩家输入横轴坐标,1到15之间的整数,然后回车。");
- else if(huanRen==false)
- System.out.println("请第二个玩家输入横轴坐标,1到15之间的整数,然后回车。");
- System.out.println("悔棋请输入11521,能返回上次有效输入,每次有效落子后才能悔棋一次。");
- Arr[4]=site.nextInt()+3;//因为数组是23*23的,但是四周有4个空位的隐藏格子,所以加三。
- if(Arr[4]==11524)
- {
- qiPan[Arr[2]][Arr[3]]="╋";
- d.DaYinQiPan();
- if(huanRen == false)
- {
- huanRen = true;
- }
- else
- {
- huanRen = false;
- }
- }
- else if(Arr[4]<19 && Arr[4]!=3)//判断坐标时候合法,不合法就报错。
- {
- Arr[0]=Arr[4];
-
- if(huanRen==true)//判断出牌的玩家
- System.out.println("请第一个玩家输入横轴坐标,1到15之间的整数,然后回车。");
- else if(huanRen==false)
- System.out.println("请第二个玩家输入横轴坐标,1到15之间的整数,然后回车。");
- Arr[5]=site.nextInt()+3;
- if(Arr[5]==11524)
- {
- qiPan[Arr[2]][Arr[3]]="╋";
- d.DaYinQiPan();
- if(huanRen == false)
- {
- huanRen = true;
- }
- else
- {
- huanRen = false;
- }
- }
- else if(Arr[5]<19 && Arr[5]!=3)
- {
- Arr[1]=Arr[5];
- //↓判断合法的坐标上有没有棋子,有则从新录入。
- if(qiPan[Arr[0]][Arr[1]]!="★" && qiPan[Arr[0]][Arr[1]]!="█")
- {
- if(huanRen==true)//判断出牌的玩家
- {
- qiPan[Arr[0]][Arr[1]]="★";
- d.DaYinQiPan();//调用打印棋盘的函数打印最新的棋盘。
- //判断输赢,如果赢了则返回true结束整个程序,如果没赢则返回false继续游戏。
- boolean jieGuo = WinRen();
- if(jieGuo == true)
- {
- xunHuan = false;
- }
- huanRen = false;
- }
- else if(huanRen == false)
- {
- qiPan[Arr[0]][Arr[1]]="█";
- d.DaYinQiPan();//☆,█
- //这里判断的是白旗玩家的输赢。
- boolean jieGuo = WinRen();
- if(jieGuo == true)
- {
- xunHuan = false;
- }
- huanRen = true;
- }
- Arr[2]=Arr[0];
- Arr[3]=Arr[1];
- }
- else
- {
- System.out.println("输入的坐标上有棋子,请重新输入。");
- }
- }
- else
- {
- System.out.println("输入坐标越界,请重新输入。");
- }
- }
- else
- {
- System.out.println("输入坐标越界,请重新输入。");
- }
- }
- catch(Exception e)
- {
- e.printStackTrace();
- System.out.println("坐标非法,请重新输入。");
- }
- }
- }
- //boolean flag=false;
- /*
- *要求:能够进行判断五子棋的输赢。
- *横向,竖向,斜向任意方向有五颗同颜色的棋子连成直线就判断该颜色棋子代表的玩家获胜。
- *思路:一个棋子有八个方向可以下棋,抛去对应的放下剩下4个方向。
- * 假设有x点和y点:
- * x-4 y-4到x+4 y+4代表捺方向
- * x-4 y+4到x+4 y-4代表撇方向
- * x y-4到x y+4代表横方向
- * x-4 y 到x+4 y 代表竖方向
- * 每次落子后,以当前坐标为原点进行判断
- * 定义一个变量a,用于保存连续的棋子数
- * 定义一个循环,循环次数是9次。
- * 判断每个坐标点上是否是棋子是棋子变量a就加一
- * 然后继续往下判断如果不等于棋子则变量a归零同时假如循环次数大于5则直接跳出循环,因为剩余长度不足5.
- * 结束程序的方法 1 返回值到主函数控制
- * 2 System.esit(0);
- */
- public boolean WinRen()
- {
- String qiZi;
- String qiZi2;
- if(qiPan[Arr[0]][Arr[1]]=="★")
- {
- qiZi="★";
- qiZi2="执星星棋子的玩家";
- }
- else
- {
- qiZi="█";
- qiZi2="执方块棋子的玩家";
- }
- try
- {
- int tally1=0;
- for(int a=0;a<9;a++)//判断左上到右下↖↖↖↖↖↖↖↖↖↖↖↖↖↖↖↖↖↖↖
- {
- int x=4-a;
- int y=4-a;
- if(qiPan[Arr[0]-x][Arr[1]-y]==qiZi )
- {
- tally1++;
- if(tally1==5)
- {
- System.out.println("游戏结束");
- System.out.println(qiZi2+"获胜");
- return true;
- }
- }
- }
- tally1=0;
- for(int a=0;a<9;a++)//从右上到左下↗↗↗↗↗↗↗↗↗↗↗↗↗↗↗↗↗↗↗↗
- {
- int x=4-a;
- int y=4-a;
- if(qiPan[Arr[0]-x][Arr[1]+y]==qiZi)
- {
- tally1++;
- if(tally1==5)
- {
- System.out.println("游戏结束");
- System.out.println(qiZi2+"获胜");
- return true;
- }
- }
- }
- tally1=0;
- for(int a=0;a<9;a++)//从上到下方向↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
- {
- int x=4-a;
- if(qiPan[Arr[0]-x][Arr[1]]==qiZi)
- {
- tally1++;
- if(tally1==5)
- {
- System.out.println("游戏结束");
- System.out.println(qiZi2+"获胜");
- return true;
- }
- }
- }
- tally1=0;
- for(int a=0;a<9;a++)//从左到右← ← ← ← ← ← ← ← ← ← ← ← ← ← ← ←
- {
- int y=4-a;
- if(qiPan[Arr[0]][Arr[1]+y]==qiZi )
- {
- tally1++;
- if(tally1==5)
- {
- System.out.println("游戏结束");
- System.out.println(qiZi2+"获胜");
- return true;
- }
- }
- }
- }
- catch(Exception e)
- {
- System.out.println("等您看到这些消息的时候代表我的小游戏出错了!");
- System.out.println("有错误,请联系QQ:350158598。");
- System.out.println("提供BUG有神秘大奖赠送,本人保留随时更改源码权利");
- }
- return false;
- }
- }
复制代码
wanwan1_1.zip
(2.74 KB, 下载次数: 49)
|