二维数组
二维数组我们通过创建一个二维数组之后可以发现:二维数组跟C语言中的二级指针有种莫名其妙的相似之处:二级指针用来存储指针的地址,而二维数组则是存储一维数组的数组。这样一来我们其实也不难理解多维数组了,下来直接放代码,便于理解:
int[][] arr={{1,2},{3,4}};
for(int i=0;i<arr.length;i++){
//通过.length来获取存放一维数组的二维数组的长度
for(int j=0;j<arr[i].length;j++){
//通过.length来获取二维数组arr[i]所对应的一维数组的长度
System.out.println(arr[i][j]);
}
}
接下来我们来细说说创建二维数组的语法:
int[][] arr1=new int[][]{{1,2},{3,4}};
//这是第一种最基础的创建方法
int[][] arr2={{1,2,3},{3,2,1}};
//这是第二种,一般我们在已知数组长度和数据的时候会使用
我重点想强调的是接下来第三种:
/*
第三种:int[][] arr=new int[3][3];
但是当我们对后面两个[][]进行小手脚之后会出现一些意料之外的问题
*/
int[][] arr0=new int[2][];//不报错
// int[][] arr1=new int[][3];//会报错
System.out.println(Arrays.toString(arr0));
arr0[0]=new int[2];
arr0[1]=new int[6];
//这给我们说明这种方式可以对二维数组所包含的一维数组进行一些小操作
for(int i=0;i<arr0.length;i++){
for(int j=0;j<arr0[i].length;j++){
System.out.println(arr0[i][j]);
}
}
二维数组关于杨辉三角的应用
这一专题主要是对二维数组基础使用的练习。
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class YangHui {
public static void main(String[] args) {
Scanner con=new Scanner(System.in);
int num=con.nextInt();
int[][] arr=new int[num][2*num+1];
int len=(arr[0].length+1)/2-1;
arr[0][len]=1;
//让最中间的值为一,接下来只需要满足值等于左上方与右上方的和即可
for(int i=1;i< arr.length;i++){
for(int j=0;j<=i;j++){
//对一维数组的操作:找到要操作赋值的第一个数然后进行+2操作
int loc=len-i+j*2;
arr[i][loc]=(arr[i-1][loc-1]+arr[i-1][loc+1]);
}
}
//输出杨辉三角
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
if(arr[i][j]==0){
//将存入的0输出为空格
System.out.print(" ");
}else{
System.out.print(arr[i][j]);
}
}
System.out.println();
}
}
}
试做五子棋
import java.util.Scanner;
public class WuZiQi {
static String white = "☆";
static String black = "★";
static String[][] qp = new String[15][15];
static String[] num = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
static String line = "十";
static Scanner in = new Scanner(System.in);
static int turn = 1;//调控回合的变量
//以上为我们需要调用的图案和变量
public static void main(String[] args) {
//初始化棋盘(仅一次)
for(int i=0;i<qp.length;i++){
for(int j=0;j<qp.length;j++){
if(j==qp.length-1){
qp[i][j]=num[i];
}else{
qp[i][j]=line;
}
if(i==qp.length-1){
qp[i][j]=num[j];
}
}
}
//展示棋盘
menu();
}
/**
*棋盘,打印更新之后的棋盘
*/
public static void menu(){
//后面需要实时更新
for(int i=0;i<qp.length;i++){
for(int j=0;j<qp.length;j++){
System.out.print(qp[i][j]);
}
System.out.println();
}
ore();
}
/**
* 选择要下的地方,选择坐标轴
*/
public static void ore(){
if(turn==1){
System.out.println("黑棋落子:");
}else {
System.out.println("白棋落子:");
}
int x=in.nextInt()-1;
int y=in.nextInt()-1;
if(x>=0 && x<15 && y>=0 && y<15){
down(x,y);
}
else{
System.out.println("输入的位置不在棋盘内,请重新输入!");
ore();
}
}
/**
* 下棋并保存,同时更换棋子(通过turn实现)
* @param x
* @param y
*/
public static void down(int x,int y){
//判断这个地方能否落子,如果不是棋盘线则可以下
if(qp[x][y]!=line){
System.out.println("这个地方已经下过了,请重新输入!");
ore();
}
//下黑棋
if(turn == 1){
qp[x][y]=black;
//下棋之后判断是否能够赢棋,能赢棋则结束不能则继续
if(iswin(x,y)){
System.out.println("黑棋胜利");
return;
}
}
//下白棋,情况同上
if(turn == -1 && qp[x][y]==line){
qp[x][y]=white;
if(iswin(x,y)) {
System.out.println("白棋胜利");
return;
}
}
turn = -turn;//黑白棋切换
//展示桌面
menu();
}
/**
* 检索是否胜利
*/
public static boolean iswin(int x,int y){
int spsum=1,szsum=1,xxsum=1,fxsum=1;
//将本身所在的地方算入一次
for(int temp=1;y-temp>=0;temp++){
if(qp[x][y+temp].equals(black)){
spsum++;
}else {
break;
}
}
if(spsum==5){
return true;
}
for(int temp=1;y+temp<15;temp++){
if(qp[x][y+temp].equals(black)){
spsum++;
}else {
break;
}
}
if(spsum==5){
return true;
}
//横向检索,是否满足五子连珠
for(int temp=1;x-temp>=0;temp++){
if(qp[x-temp][y].equals(black)){
szsum++;
}else {
break;
}
}
if(szsum==5){
return true;
}
for(int temp=1;x+temp<15;temp++){
if(qp[x+temp][y].equals(black)){
szsum++;
}else {
break;
}
}
if(szsum==5){
return true;
}
//纵向检索,是否满足
for(int temp=1;y-temp>=0 && x-temp>=0;temp++){
if(qp[x-temp][y-temp].equals(black)){
xxsum++;
}else {
break;
}
}
if(xxsum==5){
return true;
}
for(int temp=1;y+temp<15 && x+temp<15;temp++){
if(qp[x+temp][y+temp].equals(black)){
xxsum++;
}else {
break;
}
}
if(xxsum==5){
return true;
}
//斜向检索
for(int temp=1;y-temp>=0 && x+temp<15;temp++){
if(qp[x+temp][y-temp].equals(black)){
fxsum++;
}else {
break;
}
}
if(fxsum==5){
return true;
}
for(int temp=1;y+temp<15 && x-temp>=0;temp++){
if(qp[x-temp][y+temp].equals(black)){
fxsum++;
}else {
break;
}
}
if(fxsum==5){
return true;
}
//反斜向检索
return false;
//若都不满足则棋局继续
}
}