嗯,距离上次写完也过了一天了,其实每天能用来学java的时间也不是很多,然后能挑出来写的东西好像觉得少之又少,刚才还觉得这样写得太多反而都是废话,还不如隔几天写一次,好好总结一番这样更有意义。但是又一想,觉得作为一个初学者,在学习java的过程中每天接触的都是新东西。就算是在生活中,有很多时候突然发现了或者领悟了某个东西,但是过一会可能就又忘了或者懒得写出来了,所以说我还是决定,想到什么就赶紧写出来,不要等攒了一堆再来总结,还是容易忘掉很多东西。其实上篇我也说了,能把自己所想的东西都写出来时间很舒服的事情,生活中有时候我们要考虑得很多,和人交谈畏首畏尾,其实并不能把自己的想法和积压在心里的感触倾倒出来,反而是一个无法看到彼此的平台才给了人们更多诉说真实想法的地方。嗯,先这样吧,祝我天天都有所收获吧!
今天先直接进入正题吧。。。
昨天说道学了个入门,只是用了些简单得不能再简单的东西写了个棋盘,后来又把这个五子棋完善了一下,当然说到底这还只是一个控制台的小程序。。。走一步就要打印一遍棋盘。
有了棋盘以后,首先要考虑一下如何落子,落子又分为玩家和电脑,先说玩家吧,只是控制台的小程序肯定只需要输入坐标然后在相应位置做改动就好了,当然不用去想做什么图形界面之类的。。。涉及到GUI的东西以后会慢慢学到的。。。(应该吧)那么首先要考虑的是怎么获取所输入的内容,之前学c的时候还真没想过这个问题,都是直接scanf,去网上补了下java的课才知道原来java没有这类函数,我之前学习c语言首先就要接触的scanf居然被划分成功能强大的函数。。。好吧,那么java中能接受键盘信息的方法昨天也是学到了两种,一种是BufferedReader,一种是Scanner。
先说BufferedReader(就简称BR吧),其实之前学习c语言从来没有像这样去具体的了解一个函数本身,一般来说只是知道它有个什么功能,参数都是啥基本就完事了,现在觉得可能了解一下函数的具体运作机制也不是件坏事。。。今天也是专门地去了解了一下缓冲区的工作原理,虽然很多都没怎么理解,但是也大概读懂了缓冲区存在的意义,对于这个BR来说,主要就是提高了阅读的效率,可以先将输入的内容存放到一个缓冲内,等到想要读取或者使用了flush函数以后才会将其内容写入内存,就是说在自己想要使用这些输入的内容之前,这些字符是不占用内存的。。。好吧其实我也不怎么理解。。。类似的还有BufferedWriter吧,都是可以控制字符流的,之前学习c的时候也学过流的概念,但是感觉太抽象,用的也很少,现在java中又没有像scanf之类的函数,所以感觉学习控制运行时候的各种流也就成了家常便饭。当然说到底顾名思义BR只是一个reader,只有在它里面有东西时它才可以“read”,所以说使用BR还需要一个能把字符放进其缓冲内的方法,就是这个InputStreamReader(就简称ISR吧。。。)。其实之前在学的时候看到stream就很头疼,就是刚才说的对于流的掌握很差。。。先说下这个函数用法,想要在程序运行时给玩家一个敲字的机会,自然就是用System.in让程序能在运行时候停下来等玩家输入内容所以说想要声明一个实现这个功能的BR连起来的话应该是这样的:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
从里到外说的话,就是System.in让程序停下来等用户输入内容,然后ISR把这个内容捕获到,最后BR将这个内容放到其缓冲当中并随时可以拿出来读。不知道我理解的对不对。。。这一步就实现了将键盘信息转移到缓冲中,那怎么将其拿出来用呢,就是BR这个类中的方法read或者readLine。之前学c呢,感觉xx.xxxx()这种方式没怎么用到过,也可能是我好久没敲代码早就忘了。。。那么把BR中刚才输入的东西拿出来就是这样:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputstr=br.readLine();
然后scanner的用法是这样:
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
好像差不多就不费话了。。。只不过这个直接就可以将输入的内容拿出来用,当然刚才说缓冲区有其更大的优势嘛。
好吧输入棋子的坐标就到这儿,接下来是怎么使用这串字符。我的字符是输入两个数字并用逗号隔开,所以说还要考虑怎么将这串字符从逗号分开并存到两个变量中,那么就需要用到split这个函数,其本身是这样的
stringObj.split([separator,[limit]]),这个函数既将字符分开同时也不包含那个分割条件本身(就是输入的坐标中间那个逗号)又不会被算进去,所以说模拟玩家落子过程的整个部分我是这么写的:
//获取输入信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputstr = null;
System.out.println("请输入您要落子的坐标并用“,”隔开");
while((inputstr=br.readLine())!=null)
{
//将输入信息拆分成x和y两部分,并赋值
String[] sep = inputstr.split(",");
int x = Integer.parseInt(sep[1]);
int y = Integer.parseInt(sep[0]);
//将对应位置变为“●”
mgrid.grid[x-1][y-1]="●";
//打印新的棋盘
mgrid.printGrid();
System.out.println("请输入您要落子的坐标并用“,”隔开");
}
好吧到这儿玩家落子的目的也就实现了,输入坐标后对应位置就从加号变成圆圈啦(重复落子的问题后面会解决),然后电脑的落子我就是直接用的随机数。。。当然也可以改成两个人下棋一人走一步。。。不过我估计应该不会有人和我用这玩意真的去下棋。。。
说到这儿突然想起来,我写这个用的因为是记事本,所以说出现了好多以前不会出现的问题,也是学到了好多。首先就是包的调用,之前写代码在eclipse上直接可以点那个感叹号自动补全的嘛,然后这回写完各种错误根本不知道是啥。。。查了一些资料发现只是因为我没添加对应的包。。。上面的BR那些都需要添加java.io.*,星号的意思当然就是全部了,io这个包其实就是in和out,基本所有有关输入输出流有关的方法都会用到这个包,然后就是关于接下里的电脑落子的随机数生成,我用的函数是Math.random,这个Math类包含在java.lang.*中。另一个问题是写代码时候的改动,这回我写一小段一个小功能实现了就保存下来然后复制一个新的文档再写下一个,主要是后来在写胜负判定时候改了半天然后发现方法直接错了,我也忘了原来我都改了啥,所以说之前写的代码可能都比较简单,也没有养成这种习惯,现在还是多改进吧,当然很多工具会有根据工程版本号恢复之类的,比如svn什么的,但是现在还是先意识到记录版本的重要性,免得以后再用工具而不知道这一点。
好吧,又插了这么多。接下来关于电脑落子只需要在玩家下完棋然后打印新棋盘前操作就可以了,然后电脑的棋子我用方块来表示了,主要是实心圆很大,然后我用空心圆代表电脑的话在控制台上显示出来只有句号那么大,所以勉强改了别的图案。这回我加了避免重复下棋:
public static void main(String[] args) throws Exception
{
WuziqiGrid3 mgrid = new WuziqiGrid3();
mgrid.initGrid();
mgrid.printGrid();
int x1=0,x2=0,y1=0,y2=0;
//获取输入信息
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String inputstr = null;
System.out.println("请输入您要落子的坐标并用“,”隔开");
while((inputstr=br.readLine())!=null)
{
//将输入信息拆分成x和y两部分,并赋值
String[] sep = inputstr.split(",");
x1 = Integer.parseInt(sep[1]);
y1 = Integer.parseInt(sep[0]);
//将对应位置变为“●”
if(mgrid.grid[x1-1][y1-1]=="+")
{
mgrid.grid[x1-1][y1-1]="●";
}else {System.out.println("该处已有棋子,请重新输入");continue;}
//获取两个随机数为电脑的落子点的坐标,电脑棋子为“■”
do{
x2 = (int)(Math.random()*15);
y2 = (int)(Math.random()*15);
}while(mgrid.grid[x2][y2]!="+");
mgrid.grid[x2][y2]="■";
//将新的棋盘打印出来
mgrid.printGrid();
System.out.println("请输入您要落子的坐标并用“,”隔开");
}
}
可能有些点写得特别繁琐,希望以后写得多了我能发现更加简便的方法吧。
最后就是胜负的判定了,这个我一开始想了很久,很多方法都觉得太麻烦,最后也还是用了在网上学到的方法,只需要判定四个方向(横、纵和两个斜向),总的判定是这样:
//判定有无胜负条件,x和y是落子的坐标,chess表示是玩家的棋还是电脑的棋
public static boolean isWin(int x,int y,String chess)
{
boolean isWin=false;
//需要判定4种方向上是否满足,01横向,02纵向,03左上至右下,04坐下至右上
if(is01Win(x,y,chess)
||is02Win(x,y,chess)
||is03Win(x,y,chess)
||is04Win(x,y,chess)==true)
isWin=true;
return isWin;
}
然后里面涉及了四个函数分别代表四个方向的判定,就放一个吧,别的也都一样:
//判断左上至右下
public static boolean is03Win(int x,int y,String chess)
{
boolean isWin=false;
//设置一个计数器,每连续一次递增,到了5时候即为胜
int count=0;
//判断左上和右下两次
//判断左上连续的个数
for(int i=x-1,j=y+1;i>=0&&j<=15;i--,j++)
{
if(grid[i][j]==chess) count++;
else break;
}
//判断右下
for(int i=x+1,j=y-1;i<=15&&j>=0;i++,j--)
{
if(grid[i][j]==chess) count++;
else break;
}
//检查计数器的值,不小于4即为5颗棋子连续
if(count>=4) isWin=true;
return isWin;
}
最后只需要在main函数中每次有人落子之后调用一遍就好了。
好吧,毕竟也刚过了一天嘛,学的时间是真的不多,关于这个程序的异常处理暂时我就不打算加了,准备按照书上的顺序一步一步来,异常处理好像也比较靠后,就先不跳过去专门看了,免得有许多看不懂的要来回翻很麻烦反而影响效率。随便放张图吧。。。
PS:刚才想去截图时候发现神tm方块也变小了,于是改成了五角星。。。
好吧,似乎又到了日常闲扯淡的环节。其实昨天想说的话还有很多,先来说说为什么学java吧,其实首先是因为我们学校居然没有java的相关课程。。。我去翻了整个大三的应修课程和学校公选课,只有几门选修课看起来是和java有关的,但是还是全校都可以选的那种,必修课里面还真的没有java。。。但是有学长和我说有的课程会用得到java。。。。而且的话,学个java好像并不需要啥理由吧,这几天我去查了很多资料,以后很多发展方向我都仔细的看过了,比如说大数据开发,前端和后台或者移动端之类的,java也算是个基础中的基础吧,在这之前我居然完全不会。。。好吧其实关于这个本来感觉挺多想说的,写到这儿又不知道该说啥了。
然后还想说一下毕业以后吧,我其实并不准备考研,主要我也相当于多上了一年大学,本来就比较晚,也听了不少前辈的建议,觉得考研可能也不太适合我,但是如果这样我就需要在大学时期多干尽量多的事,所以我也是希望我能从现在开始改变原来那种在学校里虚度光阴(这么说好像有点过了。。。)的态度,希望我能在半年后重返校园时做好为今后打算的准备。
既然不准备考研,要说毕业后想去的地方,其实有一个地方我一直想去,想了也有两三年了吧,这个地方就是b站。可能我属于那种想到什么就做什么的人,然后就演变成了走一步看一步,但是就这个想法让我好好考虑过很久,我也是真心希望自己为了这个想法而努力。在以前吧,其实包括现在,我还没有一个明确的发展方向,但是我只是非常希望我能在这个地方工作,能够为b站做(生)点(个)贡(猴)献(子)吧。我自己是属于那种走到哪里不管自己开不开心,肯定想让也能让别人开心的人,我觉得之前想了那么多,真正让我重新拿出这个想法更加坚定的事应该是我最近看了b站的招聘网站,和所有普通的网站没啥区别只是写了需要的职位和要求,但是让我有所触动的其实网站的标题:生产欢乐的地方~,其实真的就是这个几个字让我重新。。。可以说燃起斗志吧。之前我说了我其实这半年来其实都是浑浑噩噩感觉在混日子,关键也是从前几天看了这里才让我想有所改变吧。我不知道我今后会往什么方向去深入,但是不管我学什么,只要我以后还是准IT界的一份子,我都希望能够在这里找到真正的自己吧。
进入b站应该是三四年以前,b站也是陪我度过了高中的大半时光和一半的大学时光了,现在我看待这个地方其实和原来的想法发生了很大改变,现在我也进入了计算机这个领域,我希望的是从更深的层次把b站变成我生活中的一部分。关于这个我肯定也是问了许许多多已经毕业从事IT的前辈校友们,包括我也从网上翻了翻很多在b站工作或者工作过的人他们的经历。我最初看这个应该还是在大学刚入学没多久,当时我其实觉得挺失望的,很多在BAT的学长说从事这个领域,很多人真的就只是为了赚钱多才进来的,然后作为一个码农对于自己身体的损害肯定也是不言而喻的。也看过一些在b站工作过的前辈他们的看法,有很多说的是其实b站工作环境并不是特别好,相对于BAT薪资在很多部门比不上之类的,也有很多人说如果你只对b站感兴趣,只有情怀,那这个地方不适合你。这些话说实话我当时看过以后心情确实不怎么好,我的那个想了一两年的想法可能也就随之淡化,但是现在又过了两年,我最近想出来一句话觉得挺有道理:
空有一腔热血,只带着情怀,可能确实不适合在b站工作,但是有什么事情是只需要有情怀就能做成功的呢?热情不能当饭吃,但是热情能让你的饭吃的更香,当然前提是你有饭吃。
不过我也看过很多b站的探访神马的,里面形容的二次元的氛围,工作的性质,以及b站这类公司特有的工作内容,这些确实挺吸引一个热爱二次元的人,但是现在可能我关注的就不只是这些了吧。
嗯。。。剩下的留到下次再说好了,这些事情对于我来说真的是一开口就会滔滔不绝,希望我能够在把这些想法说出来之后对自己有一个新的认识,为梦想努力!