数组案例:五子棋
import java.util.Random;
import java.util.Scanner;
public class WuZiQi {
static String[][] datas = new String[10][10];//设置一个10*10的棋盘,用到二维数组
public static void main(String[] args) {
init();//调用方法
paint();
XiaQi();
}
//初始化数据,把二维数组里的每个一维数组的每个索引的值设定为“+”
public static void init() {
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
System.out.println(datas[i][j]);
datas[i][j] = "+";
}
}
}
//绘制棋盘的,效果图为图1
public static void paint() {
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
System.out.print(datas[i][j] + "\t");
}
System.out.println();
}
}
// 下子
public static void XiaQi() {
/*
1、两个人 或者有个电脑人,我们用到随机数Random
2、如果下的位置有棋子了,就得重新下
3、两个人交替!!!
4、你下的坐标不能超出棋牌最大的坐标
5、x.y坐标减一是因为我们从0,0开始
用户从1,1开始
*/
boolean flag = true;
Scanner s = new Scanner(System.in);
Random r = new Random();
int x = 0;//x坐标
int y = 0;//y坐标
while (true) {
if (flag) {
System.out.println("A下");//○
System.out.println("请输入x坐标");
x = s.nextInt();
System.out.println("请输入y坐标");
y = s.nextInt();
if (x > 10 || y > 10 || x < 1 || y < 1) {
System.out.println("请输入正确的xy坐标");
continue;// 继续下一次循环
}
if (isRepeat(x, y)) {
datas[y - 1][x - 1] = "○";
} else {
continue;
}
} else {//电脑
System.out.println("B下");
x = r.nextInt(10)+1 ;// 1-10
y = r.nextInt(10)+1;//0-9
if (isRepeat(x, y)) {
datas[y - 1][x - 1] ="●";
} else {
continue;
}
}
flag = !flag;//来回交换
paint();//重新打印棋盘
boolean res = upDown(x - 1, y - 1,datas[y - 1][x - 1]);
if(res){
break;
}
boolean re=leftRight(x-1, y-1, datas[y-1][x-1]);
if (re){
break;
}
boolean lr=leftUpRightDown(x-1, y-1, datas[y-1][x-1]);
if (lr){
break;
}
boolean lurd=leftDownRightUp(x-1, y-1, datas[y-1][x-1]);
if (lurd){
break;
}
}
}
//判断x,y坐标是否有棋子
public static boolean isRepeat(int x, int y) {
if (!datas[y - 1][x - 1].equals("○") && !datas[y - 1][x - 1].equals("●")) {
return true;
}
return false;
}
// 判断输赢的
//上下,图2
public static boolean upDown(int x, int y, String s) {
/*
x ,y 就是当前棋子的坐标
*/
int count = 1;
int i = x;
int k = y - 1;
for (; k >= 0; k--) {
if (datas[k][i].equals(s)) {
count++;
}else {
break;
}
}
int j = y + 1;
for (; j <= 9; j++) {
if (datas[j][i].equals(s)) {
count++;
}else {
break;
}
}
if (count >= 5) {
System.out.println(s + "Win!!!");
return true;
}
return false;
}
//左右,图3
public static boolean leftRight(int x, int y,String s){
int count = 1;
int i = x-1;
int k = y;
for (; i >= 0; i--) {
if (datas[k][i].equals(s)){
count++;
}else {
break;//必须连续,才能获胜
}
}
int j = x+1;
for (; j <=9 ; j++) {
if (datas[k][j].equals(s)){
count++;
}else {
break;
}
}
if (count>=5){//连续到五次,获胜
System.out.println(s+"Win!!!");
return true;
}
return false;
}
//左上右下,图4
public static boolean leftUpRightDown(int x, int y,String s){
int count = 1;
int i = x-1;
int k = y-1;
for (; i >= 0&&k>=0; i--,k--) {
if (datas[k][i].equals(s)){
count++;
}else {
break;
}
}
int j = x+1;
int l = y+1;
for (; j <=9&&l<=9 ; j++,l++) {
if (datas[l][j].equals(s)){
count++;
}else {
break;
}
}
if (count>=5){
System.out.println(s+"Win!!!");
return true;
}
return false;
}
//左下右上,图5
public static boolean leftDownRightUp(int x,int y,String s){
int count = 1;
int i = x-1;
int k = y+1;
for (; i >= 0&&k<=9; i--,k++) {
if (datas[k][i].equals(s)){
count++;
}else {
break;
}
}
int j = x+1;
int l = y-1;
for (; j <=9&&l>=0 ; j++,l--) {
if (datas[l][j].equals(s)){
count++;
}else {
break;
}
}
if (count>=5){
System.out.println(s+"Win!!!");
return true;
}
return false;
}
}
效果图
图1:
图2:
下在上一次下的子上边
x坐标不变,y坐标-1
下在第一次下的子下边
x坐标不变,y坐标+1
图3:
下在上一次下的子左边
y坐标不变,x坐标-1
下在上一次下的子右边
y坐标不变,x坐标+1
图4:
下在上一次下的子左下边
y坐标+1,x坐标-1
下在上一次下的子右上边
y坐标-1,x坐标+1
图5:
下在上一次下的子左上边
y坐标-1,x坐标-1
下在上一次下的子右下边
y坐标+1,x坐标+1