1. 编程实现以下需求:
定义一个长度为[16][16]的整型二维数组并随机生成所有位置的元素值(1~100),分别实现二维数组每行元素的累加和及每列元素的累加和并打印。
再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印。
package com.lagou.task10;
import java.util.Arrays;
import java.util.Random;
public class TwoArray {
public static void main(String[] args) {
// 1.声明一个具有16行16列元素类型为int类型的二维数组
int[][] arr2 = new int[16][16];
// 2.使用Random进行随机数的生成
Random ra = new Random();
// 3.使用外层for循环控制打印的行数
int[] hang = new int[16];
int[] lie = new int[16];
for (int i = 0; i < arr2.length; i++){
//arr2[i][j] = ra.nextInt(100) + 1;
// 4.使用内层for循环控制打印的列数
int cnt = 0;
for (int j = 0; j < arr2.length; j++){
// 5.随机生成所有位置的元素值(1~100)
arr2[i][j] = ra.nextInt(100) + 1;
// 6.打印生成的随机数
cnt += arr2[i][j];
System.out.print(arr2[i][j] + " ");
}
System.out.println();
// 7.把每行的元素和存储到hang一维数组中去
hang[i] = cnt;
}
//System.out.println("第一个数组中的元素有:" + Arrays.toString(hang));
// 8.使用for循环打印存储在hang一维数组中每行元素累加的和
for (int i = 0; i < arr2.length; i++){
System.out.println("第" + (i+1) + "行的元素累加和是:" + hang[i]);
}
// 9.使用for循环把每列的元素和存储到lie一维数组中去
for (int j = 0; j < arr2.length; j++){
int cnt2 = 0;
for (int i = 0; i < arr2.length; i++){
cnt2 += arr2[i][j];
//System.out.print(arr2[i][j] + " ");
}
//System.out.println();
lie[j] = cnt2;
}
//System.out.println("第二个数组中的元素有:" + Arrays.toString(lie));
// 10.使用for循环打印存储在lie一维数组中的每列累加的和
for (int j = 0; j < arr2.length; j++){
System.out.println("第" + (j+1) + "列的元素累加和是:" + lie[j]);
}
// 11.打印左上角到右下角元素的累加和
int cnt3 = 0;
for (int i = 0; i < arr2.length; i ++){
cnt3 += arr2[i][i];
//System.out.println(arr2[i][i]);
}
System.out.println("左上角到右下角所有元素的累加和:" + cnt3);
// 12.右上角到左下角所有元素的累加和并打印
int cnt4 = 0;
for (int j = 0; j < arr2.length; j++){
cnt4 += arr2[j][15-j];
//System.out.println(arr2[j][15-j]);
}
System.out.println("右上角到左下角所有元素的累加和:" + cnt4);
}
}
/**
* 1、定义一个二维数组
* 2、随机生成所有位置的元素值(1~100)
* 3、二位数组每行元素的累计 每列元素的累计并打印
* 4、实现二维数组左上角到右下角,右上角到左下角的所有元素的累加和并打印
*
* */
2. 编程实现控制台版并支持两人对战的五子棋游戏。
(1)绘制棋盘 - 写一个成员方法实现
(2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
(3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
(4)提示: 采用二维数组来模拟并描述棋盘,棋盘如下:
Gobang.java
package com.lagou.task10;
import java.util.Scanner;
public class Gobang {
Scanner sc = new Scanner(System.in);
// 定义一个二维数组
public int[][] gobang = new int[16][16];
// 私有化成员变量
private int x; // 描述x坐标的成员变量
private int y; // 描述y坐标的成员变量
// 在构造方法中调用set方法进行合理值判断
public Gobang() {
}
public Gobang(int x, int y) {
this.x = x;
this.y = y;
}
// 提供公有的get和set方法,并在方法体中进行合理值判断
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;
}
// 1、绘制棋盘 - 写一个成员方法实现
public void draw() {
for (int i = 0; i < 17; i++) {
if (0 == i) {
System.out.print(" ");
} else {
System.out.printf("%x ", i - 1);
}
}
System.out.println();
for (int i = 0; i < gobang.length; i++) {
System.out.printf("%x ", i);
for (int j = 0; j < gobang.length; j++) {
if (gobang[i][j] == 0) {
// 碰到默认值为0的时候全部输出为+号
System.out.print("+ ");
} else if (1 == gobang[i][j]) {
System.out.print("● "); //测试
} else if (2 == gobang[i][j]) {
System.out.print("○ ");
}
//System.out.print(gobang[i][j] + " ");
}
System.out.println();
}
}
// 2、提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现
public void show2() {
int ia = 1; // 成员变量用于描述黑棋
int ib = 2; // 成员变量用于描述白棋
Scanner sc = new Scanner(System.in);
boolean flag = true;
for (; ; ) {
System.out.println("请" + (flag ? "黑棋" : "白棋") + "输入五子棋的x轴和y轴(如:1 1):");
int x = sc.nextInt();
int y = sc.nextInt();
System.out.println("xy = " + x + " " + y);
if (x >= gobang.length || y >= gobang.length) {
System.out.println("数组越界了哦!");
continue;
} else if (gobang[x][y] != 0) {
System.out.println("所在位置已下棋啦!");
continue;
}
if (flag) {
gobang[x][y] = ia;
} else {
gobang[x][y] = ib;
}
draw();
if (isWin(x,y)){
System.out.println(flag?"==========黑棋获胜游戏结束==========":"==========白棋获胜游戏结束==========");
// 打印获胜后的棋盘
draw();
break;
}
//if (boolean == false){}
// if (x == 15 && y == 15) {
// break;
// }
System.out.println((flag ? "黑棋:" : "白棋") + x + " " + y + "\n\n\n");
flag = !flag;
}
//draw();
}
// 3、每当一方下棋后判断是否获胜 - 写一个成员方法实现
public boolean isWin(int x, int y) {
// 判断落子的领近是否可以有形成的五个连续的子
int leftNumber = 1; //定义落子的左边连续相同的个数
int rightNumber = 1; //定义落子的右边连续相同的个数
int upperNumber = 1; //定义落子的上边连续相同的个数
int lowerNumber = 1; //定义落子的下边连续相同的个数
int leftUpperNumber = 1; //定义落子的左上连续相同的个数
int leftLowerNumber = 1; //定义落子的左下连续相同的个数
int rightUpperNumber = 1; //定义落子的右上连续相同的个数
int rightLowerNumber = 1; //定义落子的右下连续相同的个数
// 左边有多少个连续相同的,相同就往leftLowerNumber加1
int i=1;
if (y !=0 ){
while (gobang[x][y]==gobang[x][y-i]){
i++;
leftNumber++;
}
}
//右边连续相同的个数
if (y != 15){
i=1;
while (gobang[x][y]==gobang[x][y+i]){
i++;
rightNumber++;
}
}
// 上边连续相同的个数
if (x != 0){
i=1;
while (gobang[x][y]==gobang[x-i][y]){
i++;
upperNumber++;
}
}
// 下边连续相同的个数
if (x != 15){
i=1;
while (gobang[x][y]==gobang[x+i][y]){
i++;
lowerNumber++;
}
}
// 左上连续相同的个数
if (x !=15 && y != 0){
i=1;
while (gobang[x][y]==gobang[x-i][y-i]){
leftUpperNumber++;
}
}
// 左下连续相同的个数
if (x !=15 && y != 0){
i=1;
while (gobang[x][y]==gobang[x+i][y-i]){
i++;
rightLowerNumber++;
}
}
// 右上连续相同的个数
if (x !=15 && y != 0){
i=1;
while (gobang[x][y]==gobang[x-i][y+i]){
i++;
leftLowerNumber++;
}
}
// 右下连续相同的个数
if (x !=15 && y != 0){
i=1;
while (gobang[x][y]==gobang[x+i][y+i]){
i++;
rightUpperNumber++;
}
}
//判断
if (leftNumber >= 5){
return true;
}else if (rightNumber >= 5){
return true;
}else if (upperNumber >= 5){
return true;
}else if(lowerNumber >= 5){
return true;
}else if (leftUpperNumber >=5 ){
return true;
}else if (rightLowerNumber >= 5){
return true;
}else if (leftLowerNumber >= 5){
return true;
}else if (rightUpperNumber >= 5){
return true;
}else {
return false;
}
}
}
/**
* 1、首先输入xy的坐标,这里要多输入的坐标做循环,输入黑棋输入白棋
* 2、对输入的坐标在数组中进行判断,如果不为0赋值1代表黑棋
* 3、黑棋输入完毕后输入白棋,在输入中进行判断如果不为0赋值2代表白棋
* 4、打印修改后的棋盘,就是下棋后的棋盘
*
*/
GobangTest.java
package com.lagou.task10;
import java.util.Scanner;
public class GobangTest {
public static void main(String[] args) {
Gobang arr = new Gobang();
arr.draw();
arr.show2();
}
}