设计思路:
- 对象Ball中主要定义两个方法:碰到墙和小球方向改变,并且初始化小球的初始位置及小球的初始化方向;
2.在Main方法中规定小球向左运动时位置-1,向右时+1,在碰撞和遇到墙的时候会发生改变,当时间消耗结束,就是小球的最终位置。
基本思路如下:
碰撞的小球java思路.png
代码如下:
import java.util.Scanner;
public class CrashBall {
//设置为true表示方向向右
boolean side = true;
//定义小球的坐标
int point = 0;
//方向的改变
public void changeSide() {
//如果方向向右,则变为向左
if(this.side) {
this.side = false;
}else {
//否则方向变为向右
this.side = true;
}
}
//碰到墙的情况,L表示整个坐标轴长度
public void pWall(int L) {
//如果到达坐标两端,则调用changeSide方法改变方向
if(this.point == L || this.point == 0)
changeSide();
}
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
//读入第一行信息,包括小球个数,线段长度,时间
int n = scanner.nextInt();//小球个数
int L = scanner.nextInt();//坐标长度
int t = scanner.nextInt();//时间
//创建数组对象ball
CrashBall[] balls = new CrashBall[n];
//获取初始坐标
for(int i = 0; i < n; i++) {
//创建ball个体对象
balls[i] = new CrashBall();
//每个ball的point属性通过键盘输入读取
balls[i].point = scanner.nextInt();
}
//一开始就要运动了1s,所以用--t
while(--t > -1) {
//小球向右运动+1,向左运动-1
for(int i = 0; i < n; i++) {
//如果小球向右(即true),则point+1
if(balls[i].side)
balls[i].point++;
else
balls[i].point--;
//运动一秒后判断是否碰到墙了
balls[i].pWall(L);
}
//两球相碰时方向都改变
for(int i = 0; i < n-1; i++) {
for(int j = i + 1; j < n; j++) {
if(balls[i].point == balls[j].point) {
balls[i].changeSide();
balls[j].changeSide();
}
}
}
}
//输出最后的坐标
for(int i = 0; i < n; i++) {
if(i == n-1)
System.out.print(balls[i].point);
else
System.out.print(balls[i].point + " ");
}
}
}