五子棋 JAVA
首先我们应该思考五子棋是由哪些东西组成的
1、棋盘,假设我们要创建一个10*10的棋盘,应该使用数组且为二维数组
public class QP {
static String[][]a=new String[10][10];
public static void main(String[] args) {
Qi();
Pan();
Zi();
}
由于下面要创建方法,为了方便,将数组定义为成员变量
public static void Qi(){
for (int i = 0; i <a.length; i++) {
for (int j = 0; j <a[i].length ; j++) {
a[j][i]="+";
}System.out.println();
}
}
创建一个方法使其循环
第一个循环代表的是打印的行数比数组长度少一行
第二个循环代表每一行打印多少个
定义a [j] [i]="+";然后让他们换行
出来的效果就是在数组中将"+"存进去
public static void Pan(){
for (int i = 0; i <a.length; i++) {
for (int j = 0; j <a[i].length ; j++) {
System.out.print(a[j][i]+"\t");
}System.out.println();
}
}
接着在创建一个方法,让他能够调用数组里存的"+",并将他显示出来,至此棋盘创建成功
2、接下来就是要开始下子了
单独创建一个方法
我们来分析一下下子的逻辑
首先下子要分为两方对弈,所以会有前后两次的输入来在棋盘上确认一点然后完成下子
其次下的子肯定不能重复下在同一个坐标上
比如下了一个黑子坐标(1,,1),接着又下了一个白子坐标也是(1,1)
那么要判定(1,1)这个坐标到底是哪种颜色的子呢?所以不能下在同一个坐标,也不能下出棋盘
public static void Zi(){
Scanner s = new Scanner(System.in);
boolean flag = true;
int x = 0;
int y = 0;
while (true){
if (flag){
System.out.println("空心先下");
x = s.nextInt();
y = s.nextInt();
if (x>10||x<1||y>10||y<1){
System.out.println("重新输入");
continue;
}
if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
a[y-1][x-1] = "○";
}else {
System.out.println("重新输入");
continue;
}
}else {
System.out.println("实心后下");
x = s.nextInt();
y = s.nextInt();
if (x>10||x<1||y>10||y<1){
System.out.println("重新输入");
continue;
}
if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
a[y-1][x-1] = "●";
}else {
System.out.println("重新输入");
continue;
}
}
Pan();
flag = !flag;
先创建一个布尔类型boolean flag = true;
再创建一个while死循环,一直为true
[y-1] [x-1]是因为我们按照习惯输入的数肯定是从1开始的,但是[y-1]是数组的下标,数字中的0,可以看作平常的1,所以要把输入的x,y坐标都减一,这样才能正确找到相应数组的下标
循环内有两种情况,一种是flag = true时,白子下
要先判断他能下坐标的范围,也就是横坐标大于1,小于10,纵坐标大于1,小于10的时候输出“重新输入”并且下边的代码都不执行,判断输入的坐标里不是黑子,也不是白子,也就是"+";那么下白子,如果棋盘上不是"+";要重新输入,并且下面的代码不执行
flag = false,黑子下
原理与判断白子相同
每次下子都重新打印棋盘
每次循环 flag = !flag,也就是每次进入循环的值都不一样,一次为true,下一次就是false,就会形成白子下一次,黑子下一次
接着就是判断输赢
要判断输赢,我们要明白赢的方式有哪些
一、五个相同的棋子连成一条线
二、横着连五个
三、竖着连五个
四、斜着连五个——1、左边在上右边在下的连五子 2、左边在下右边在上的连五子
也就是会有四种情况来判断赢
我们每一种情况都创建一个方法
横着连五个
public static boolean Ying(int x,int y,String s){
int count = 1;
int i = x;
int j = y-1;
for (; j >=0 ; j--) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = y+1;
for (; k <=9 ; k++) {
if (a[k][i].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
横着连五个又有两种判断
1、判断以一个子为原点向左找是否连成5个,但是不能小于0,判断成功,那么这个坐标的左边是和他相同的棋子,棋子连成的长度加一
2、判断以一个子为原点向右找是否连成5个,但是不能大于9,判断成功,那么这个坐标的左边是和他相同的棋子,棋子连成的长度加一
如果棋子连成的长度大于等于5,那么就是这种棋子赢,如果是,就停止这个程序
竖着连五个
public static boolean Ying1(int x,int y,String s){
int count = 1;
int i = x-1;
int j = y;
for (; i >=0 ; i--) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = x+1;
for (; k <=9 ; k++) {
if (a[j][k].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
竖着连五个又有两种判断
1、判断以一个子为原点向上找是否连成5个,但是不能小于0,判断成功,那么这个坐标的上边是和他相同的棋子,棋子连成的长度加一
2、判断以一个子为原点向下找是否连成5个,但是不能大于9,判断成功,那么这个坐标的下边是和他相同的棋子,棋子连成的长度加一
如果棋子连成的长度大于等于5,那么就是这种棋子赢,如果是,就停止这个程序
左边在上右边在下的连五子
public static boolean Ying2(int x,int y,String s){
int count = 1;
int i = x-1;
int j = y-1;
for (; i >=0&& j>=0; i--,j--) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = x+1;
int z = y+1;
for (; k <=9 &&z<=9; k++,z++) {
if (a[z][k].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
我们来看一下这种判断方式
也是以一个子为原点来判断他相邻的那个棋子是不和他一样
左上
就是x坐标,y坐标同时减一来判断相邻
右下
就是x坐标,y坐标同时加一来判断相邻
如果判断五个相同的连在一起,就判赢
左边在下右边在上的连五子
public static boolean Ying3(int x,int y,String s){
int count = 1;
int i = x-1;
int j = y+1;
for (; i >=0&&j<=9 ; i--,j++) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = x+1;
int z = y-1;
for (; k <=9 && z>=0; k++, z--) {
if (a[z][k].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
}
左下
x坐标减一,y坐标加一
右上
x坐标加一,y坐标减一
至此有了四种判断方式,任意一种判断出为赢就可以结束程序了
完整程序如下
import jdk.nashorn.internal.ir.ContinueNode;
import java.util.Scanner;
public class QP {
static String[][]a=new String[10][10];
public static void main(String[] args) {
Qi();
Pan();
Zi();
}
public static void Qi(){
for (int i = 0; i <a.length; i++) {
for (int j = 0; j <a[i].length ; j++) {
a[j][i]="+";
}System.out.println();
}
}
public static void Pan(){
for (int i = 0; i <a.length; i++) {
for (int j = 0; j <a[i].length ; j++) {
System.out.print(a[j][i]+"\t");
}System.out.println();
}
}
public static void Zi(){
Scanner s = new Scanner(System.in);
boolean flag = true;
int x = 0;
int y = 0;
while (true){
if (flag){
System.out.println("空心先下");
x = s.nextInt();
y = s.nextInt();
if (x>10||x<1||y>10||y<1){
System.out.println("重新输入");
continue;
}
if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
a[y-1][x-1] = "○";
}else {
System.out.println("重新输入");
continue;
}
}else {
System.out.println("实心后下");
x = s.nextInt();
y = s.nextInt();
if (x>10||x<1||y>10||y<1){
System.out.println("重新输入");
continue;
}
if (!a[y-1][x-1].equals("○")&&!a[y-1][x-1].equals("●")){
a[y-1][x-1] = "●";
}else {
System.out.println("重新输入");
continue;
}
}
Pan();
flag = !flag;
boolean res = Ying(x-1,y-1,a[y-1][x-1]);
if (res){
break;
}
boolean res1 = Ying1(x-1,y-1,a[y-1][x-1]);
if (res1){
break;
}
boolean res2 = Ying2(x-1,y-1,a[y-1][x-1]);
if (res2){
break;
}
boolean res3 = Ying3(x-1,y-1,a[y-1][x-1]);
if (res3){
break;
}
}
}
public static boolean Ying(int x,int y,String s){
int count = 1;
int i = x;
int j = y-1;
for (; j >=0 ; j--) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = y+1;
for (; k <=9 ; k++) {
if (a[k][i].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
public static boolean Ying1(int x,int y,String s){
int count = 1;
int i = x-1;
int j = y;
for (; i >=0 ; i--) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = x+1;
for (; k <=9 ; k++) {
if (a[j][k].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
public static boolean Ying2(int x,int y,String s){
int count = 1;
int i = x-1;
int j = y-1;
for (; i >=0&& j>=0; i--,j--) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = x+1;
int z = y+1;
for (; k <=9 &&z<=9; k++,z++) {
if (a[z][k].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
public static boolean Ying3(int x,int y,String s){
int count = 1;
int i = x-1;
int j = y+1;
for (; i >=0&&j<=9 ; i--,j++) {
if (a[j][i].equals(s)){
count++;
}else{
break;
}
}
int k = x+1;
int z = y-1;
for (; k <=9 && z>=0; k++, z--) {
if (a[z][k].equals(s)){
count++;
}else{
break;
}
}
if (count>=5){
System.out.println("win");
return true;
}
return false;
}
}