电话号码分析与处理、开发小游戏贪食蛇
Java核心API--电话号码分析与处理
一、熟悉Math类
Math类包含执行基本数字运算的方法,它没有构造方法,当使用类中的成员时,要查看类中的成员是否是静态,如果是静态的,可以通过类名直接调用。
Math类的常用方法

二、熟悉String类
1.String类及常用方法使用
(1)String =new String();

2.String Builder类
b.StringBuilder类的常用方法
(2).Data类的常用方法
常用的模式字母

SimpleDateFormat类的构造方法

SimpleDateFormat类的常用方法
2.Calendar类的使用


1.Integer类的使用
package NumberHandle; import java. util. * ; //电话号码处理 public class NumberHandle{ public static void main ( String []sra){ Scanner sc = new Scanner( System. in); System. out. println("输入电话号码:"); String number = sc. nextLine(); int[] a=new int[10]; //未初始化的整型数组默认每个元素为0 char[] old = number. toCharArray(); for (int i= 0; i<old. length; i++){ //统计数字的出现频率 switch(old[i]){ //因为任何数都由10个基本数字组成,所以a的每一个下标对应一个基本数字 case 'O' : a[0] ++; break; case ' 1' : a[1] ++; break; case '2' : a[2] ++; break; case '3' : a[3] ++; break; case '4' : a[4] ++; break; case ' 5' : a[5] ++; break; case '6' : a[6] ++; break; case '7' : a[7] ++; break; case '8' : a[8] ++; break; case '9' : a[9] ++; break; //非法字符统一替换成特定字符,循环结束后通过replace方法过滤 default: old[i] ='#' ; break; } } //char数组转String,删除特定字符,替换出现率最高的数字为8 String newstr = new String (old). replace(" #" , ""). replace ("" +Max(a), "8"); System. out. println("新号:" +newstr); //通过下标确定出现次数最多的数字 public static int Max( int[] n) int max =n[0] , index=0; for( int i=0; i<n. length;i++) if(n[i]>max) |max=n[i]; index=i;{ } return index; } }
5.运行结果
集合——开发小游戏贪食蛇
一、Collection集合
二、Iterator
Iterator接口也是Java集合框架的成员,Iterator 主要用于遍历(即迭代访)Iterator集合中的元素,Iterator对象也被称为迭代器。
Iterator接口隐藏了各种 Collection 实现类的底层细节, 向应用程序提供了遍历Collection 集合元素的统一编程接口,Iterator接口里定义了如下 3 个方法:
所有的List实现类可以调用这些方法来操作集合元素,与set 集合相比,List 增加了根
3.增强for循环的使用
for(元素数据类型 变量名:数组或者 Collection 集合){ // 在此处使用变量即可ꎬ该变量就是元素 }
4.ArrayList类和Linked List类的使用
ArrayList的构造方法和常用方法
四、Set集合
set常用方法

五、泛型
ArrayList<参数化类型> list =new ArrayList<参数化类型>( );
六、设计贪食蛇游戏
1.任务描述package SnakeGame; import java. util. * ; class SnakeBody{ final static int WIDTH = 20; //蛇身的宽 final static int HEIGHT = 20; //蛇身的高 int x = 0; //此节蛇身x轴位置 int y = 0; //此节蛇身y轴位置 public SnakeBody ( int a, int b){ this. x=a; this. y=b; } public SnakeBody (){} }
(2)定义一个蛇类
package SnakeGame; import java. awt. Color; import java. awt. Graphics; import java. awt. Rectangle; import java. awt. event. KeyEvent; import java. util. LinkedList; import java. util. Random; class Snake{ //这里不能用父类List做引用,否则使用不了其子类的addFrist和addLast方法 static LinkedList<SnakeBody> It =new LinkedList<SnakeBody>();// SnakeBody sb; //蛇身节点 int eatEggs = 0; //蛇吃掉的蛋的数量 int number = 5; //蛇身初始化节数 boolean isLive; //蛇是否存活 enum Direction{ Left, Up, Right, Down ; //方向枚举 Random rd =new Random(); //随机数 Direction snakeDirection: SnakeClient se; //初始化 public Snake(SnakeClient sn){ //设蛇存活 this.isLive = true; //初始化蛇身节点,头元素到尾元素在坐标系上呈从左向右分布的一条直线 for( int i=0, bi = 300; i<= number; i++, bi+= 20){ It. add( new SnakeBody(bi, 300)); } //初始化蛇身的前进方向,因为蛇头是集合尾,最后打印,所以初始方向不能向左 //否则就咬到自己的身体,可以向右、上或下 this. snakeDirection = Direction. Right; this. se = sn; } //蛇移动 //最后更新头部坐标,若先更新头,身体的坐标会跟头相同,结果只有一个头在运动 public void movel () //如果蛇死了,就把尸体停留在那儿 if(this. isLive = =false) for( int i=0; iclt. size();i++) { It. get(i). x= It. get(i).x; It. get(i). y=It. get(i).y; } } //否则就判断移动方向并移动 else{ if( this. snakeDirection == Direction. Down){ for(int i=0;iclt. size() ;i++) { if(i==It. size()-1) //如果是尾元素,即头部 { It. get(i). y+=It. get(i). HEIGHT; //-个身位 固定20 else{ //非头元素 It. get(i). x= It. get(i+1). x; It. get(i). y=It. get(i+1).y; } } } else if(this, snakeDirection= = Direction. Up){ for(int i=0;iclt. size();i++){ if(i==It. size()-1) //如果是尾元素,即头部 { It. get(i). y-= It. get(i). HEIGHT; } else{ //非头元素 It. get (i). x=It. get(i+1).x; It. get(i). y=It. get(i+1).y; } } } else if ( this, snakeDirection == Direction. Right){ for(int i=0;iclt. size() ;i++) { if(i==It. size()-1) //如果是尾元素,即头部 { It. get(i). x+=It. get(i). HEIGHT; } else{ //非头元素 It. get (i). x=It. get(i+1).x; It. get (i), y=It. get(i+1). y; } } } else{ for(int i=0;iclt. size();i++) if(i==It. size()-1) //如果是尾元素,即头部 { It. get (i). x-= It. get(i). HEIGHT; } else{ //非头元素 It. get(i). x=It. get(i+1).x; It. get(i). y=It. get(i+1).y; } } } } int ti=0; //这个值指示是否掉头。0:否,1:是 //执行掉头的中间操作 public void huitou(){ if(ti ==1){ switch ( this. snakeDirection){ //掉头操作第二步 case Up: this. snakeDirection = Direction. Right; ti=0; break; case Down: this. snakeDirection=Direction. Left; ti =0; break; case Left; this. snakeDirection = Direction. Up; ti=0; break; case Right: this, snakeDirection = Direction. Down; ti=0; break; } } } int press=0; //蛇方向代表的整数 //方向键对蛇的控制 public void keyPress( Key Event e){ /*注意!这个程序在用户很快速地连续输入两个方向的时候, *比如正在向右前进,快速连续地输入个一或者+时, *会原地掉头,如果开启了咬自己的检测,蛇会直接死亡。 */ //输入的方向不是蛇运动方向的反方向时,正常接收行动 //是反方向时,第一步:向当前方向的右手转向;第二步:再执行回头,完成掉头 switch ( this, snakeDirection) { case Left: if(e. getKeyCode()! = KeyEvent. VK_RIGHT) press = e. getKeyCode(); else{ press= KeyEvent. VK_UP ; ti=1; break; case Right: if(e. getKeyCode()! = KeyEvent. VK_LEFT) press = e. getKeyCode(); else {press = KeyEvent. VK_DOWN ; ti =1; break; case Up: if(e. getKeyCode()! = KeyEvent. VK_DOWN) press = e. getKeyCode(); else{ press = KeyEvent. VK_RIGHT ;ti=1; break; case Down: if(e. getKeyCode()! = KeyEvent. VK_UP) press = e. getKeyCode(); else{ press = KeyEvent. VK_LEFT; ti=1;) break; } //等于T1+→四个按键所代表的整数值时,更新蛇的前进方向 //如果输入的非方向,无效 switch ( press){ case KeyEvent. VK_LEFT: this, snakeDirection = Direction. Left; break; case KeyEvent. VK_UP: this. snakeDirection = Direction. Up; break; case KeyEvent. VK_RIGHT: this, snakeDirection = Direction. Right; break; case KeyEvent. VK_DOWN: this. snakeDirection = Direction. Down; break; } } //与蛇相关的一切行为在这里发生 public void paint ( Graphics g)! for (SnakeBody sbt: lt) //如果是尾元素,渲染成黄色,集合尾是蛇头 if(It. peekLast(). equals (sbt))| g. setColor( Color. yellow); g. fillRect (sbt. x, sbt. y,20,20); } else{ g. setColor( Color. blue); g. fillRect(sbt. x, sbt. y, 20, 20); } } movel(); //蛇移动 huitou(); //检查是否在掉头 //eatBody(); //是否咬到身体 zhuangqiang(); //是否撞到墙 eatFood (this. sc. food); //是否吃到食物 } //咬身体 public void eatBody(){ //遍历蛇身除了头的每一个节点 //如果蛇头的区域和其他部位的区域重叠,蛇就死亡 for(int i=0; iclt. size()-1;i++){ if( getRecHead(). intersects( new Rectangle (It. get (i). x, It.get (i). y,20,20))) this, isLive = false; } } //撞墙检测 //蛇一个节点20*20 地图900 *800 边界大概宽度4 标题栏大概高度23 public void zhuangqiang() { //当头部节点碰到边界时蛇死亡 //要额外给一个身位的原因在于,这样才能让蛇贴着边界跑 //否则用户看见的效果就是蛇头在即将碰到边界之前还来不及操作就死掉了 if (It. peekLast (). x<4-201 I It. peekLast (). y<23 -20 + 40||It. peekLast ().x>877 + 20||It. peekLast(). y>777+20) } //蛇死亡,计分板提示并变色 this. isLive = false; sc. Ib1. setText("提示:游戏结束!! (你一共吃到了"+eatEggs+" 个蛋)"); sc. Ib1. setBackground (Color. red); } } //蛇吃食物 public void eatFood ( Food fd){ //头部和食物重叠后 if ( this. getRec(). intersects(fd. getRec())) eatEggs++;sc. Ibl. setText("你已经吃了" +eatEggs+" 个蛋了"); //获取旧的头元素 SnakeBody bodyold = It. peekFirst(); //集合头部插入新节点 It. addFirst (new SnakeBody()); //获取新的头元素 SnakeBody bodynew = It. peekFirst(); //判断当前方向 switch ( this, snakeDirection){ //头部节点坐标更新,尾巴长度增加 //往上走,x轴不变,y轴加长一格+20 case Up: bodynew. x= bodyold. x; bodynew. y= bodyold. y+20; break; //往下走,x轴不变,y轴加长一格-20 case Down: bodynew. x = bodyold. x; bodynew. y= bodyold. y-20; break; //往左走,y轴不变,x轴加长一格+20 case Left: bodynew. x = bodyold. x+20; bodynew. y= bodyold. y; break; //往右走,y轴不变,x轴加长一格-20 case Right: bodynew. x= bodyold. x-20; bodynew. y = bodyold. y; break; } //重置食物的坐标 sc. food. reFood(); } } //返回蛇头上一节的区域,用来检测是否吃到食物 public Rectangle getRec() //之所以不用蛇头的区域检测是否吃到食物,是因为那样看起来蛇头还没碰到食物,食物就消失了 return new Rectangle ( It. get( It. size() -2). x, It. get ( It. size()-2). y, It. peekFirst (). WIDTH.It. peekFirst (). HEIGHT); } //返回蛇头区域 public Rectangle getRecHead() return new Rectangle ( It. peekLast(). x, It. peekLast(). y, 20,20); } }
(3)定义一个食物类
package SnakeGame; import java. awt. Color; import java. awt. Graphics; import java. awt. Rectangle; import java. util. Random; class Food{ public static int WIDTH = 20; public static int HEIGHT = 20; int x,y; //食物出现的地点 SnakeClient ms; Random rd =new Random(); public Food(SnakeClient ms){ reFood(); this. ms = ms; } //重新设置食物坐标 public void reFood() //标题栏高度23,边界宽度4,计分板高度约为2倍的标题栏高度 //经测试,地图为900*800 时,x=877、y=777是食物在地图的右下角位置 //而x=4、y=67是在左上角的位置 int num2=rd. nextlnt( 877); //食物x坐标的最大值 877 if(num2<4) num2= num2+(4-num2); //避免食物有一部分处在边界里,x坐标要大于4 x=num2; int num=rd. nextlnt(777); //食物y坐标的最大值 777 if(num<67) num=num+(67-num); //避免刷新在标题栏或者计分板里,y坐标要大于67 y=num; } public int getX(){ return x; } public void setX(int x){ this. x = x; } public int getY(){ return y; } public void setY (int y) { this. y = y; } //绘制食物 public void paint( Graphics g){ g. setColor( Color. red); g. fillRect(x, y, WIDTH, HEIGHT); } public Rectangle getRee() //返回食物的区域 return new Rectangle(x, y, WIDTH, HEIGHT); } }
(4)定义一个游戏窗体类
package SnakeGame; import java. awt. * ; import java. awt. event. * ; class SnakeClient extends Frame { Snake mySnake = new Snake (this); Food food = new Food( this); //新建label控件作为计分板 Label lbl =new Label("E经吃了" +mySnake. eatEggs+"了"); //新建容器 Panel p=new Panel(); public SnakeClient(){ //绘制地图窗体 this. setBounds (0,0, 900, 800); //窗体坐标和大小 this. setTitle("贪食蛇"); //窗体标题 this. setBackground (Color. BLACK); //窗体背景颜色 //实现点击“x”图标关闭窗体的功能, this. addWindowListener(new WindowAdapter() { public void windowClosing( WindowEvent e){ System. exit(-1); } }); setResizable(false); //设置地图窗体大小不可调整 //加入得分信息 Ib1. setAlignment(1); //设置label控件的文本居中显示 p. add(lbl); //容器p加入一个label控件 p. setBackground (Color. GREEN); //容器p设为黄色背景色 this. setLayout ( new GridLayout (7,1,50,80)); //地图设置成7行1列,水平50,垂直80 p. setLayout ( new GridLayout(1,1)); //容器p设置成1行1列 this. add(p); //地图中加入容器p this. setVisible(true); //图窗体设为显示 } //开启线程和打开键盘监视 public void lanch(){ this. addKeyListener( new KeyMointer()); //调用键盘,不启用这个无法开启键盘控制 new Thread (new PaintThread() ). start(); //开启线程 } //线程执行的方法,repaint方法会执行该方法 public void paint( Graphics g) { mySnake. paint(g); food. paint (g); } //线程控制 class PaintThread implements Runnable { public void run(){ //保持蛇能一直运行 while(true){ repaint(); try{ //物体运行太快,减慢速度,使肉眼能跟上刷新速度 Tread. sleep(90) ; }catch (InterruptedException e){ e. printStackTrace(); } } } } //键盘监听 class KeyMointer extends KeyAdapter{ public void keyPressed ( KeyEvent e){ mySnake. keyPress(e); } } public static void main ( String[] args){ SnakeClient snakeClient = new SnakeClient(); snakeClient. lanch () ; } }
5.运行结果
浙公网安备 33010602011771号