使用二维数组,实现五子棋功能.
-
使用二维数组存储五子棋棋盘
如下图
-
在控制台通过Scanner输入黑白棋坐标( 表示二维数组坐标),使用实心五角星和空心五角星表示黑白棋子.
如下图:
白棋输入后如下图
黑白棋依次重复输入下棋
思路
- 首先定义全局变量。
- 定义一个数组保存棋盘。
- 定义一个Boolean变量用于控制双方轮流下棋。
- 写一个方法用于输出双方下棋后的棋盘。
- 写一个方法用于判断输入值是否合法,并且判断输赢。
- 写一个方法用于判断输赢。
- 在一个main方法里面依次调用其他方法。
1. 首先定义全局变量。
static String white = "☆";
static String black = "★";
static String[][] qp = new String[15][15];
static String[] num = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
static String line = "十";
static String [][]a=new String[15][15];
2. 首先定义一个数组保存棋盘。
public static void init(){
for (int i = 0; i < a.length-1 ; i++) {
for (int j = 0; j <a[i].length -1; j++) {
a[i][j]=line;
}
a[i][14]=num[i];
}
for (int i=0;i<15;i++){
a[14][i]=num[i];
}
}
3. 定义一个Boolean变量用于控制双方轮流下棋。
public static void xiaqi(){
Scanner scanner=new Scanner(System.in);
boolean dc=true;
int x,y;
while (true){
if (dc==true) {
System.out.println("请黑子下棋");
x= scanner.nextInt()-1;//行数
y= scanner.nextInt()-1;//列数
boolean res = hefa(x, y);
if (res==true){
a[x][y]=black;
dayin();
boolean win = win(x,y);
if(win){
System.out.println("黑棋胜");
break;
}
dc=false;
}
}else if (dc==false){
System.out.println("请白子下棋");
x= scanner.nextInt()-1;//行数
y= scanner.nextInt()-1;//列数
boolean res = hefa(x, y);
if (res==true){
a[x][y]=white;
dayin();
dc=true;
}
}
}
}
4. 写一个方法用于输出双方下棋后的棋盘。
public static void xiaqi(){
Scanner scanner=new Scanner(System.in);
boolean dc=true;
int x,y;
while (true){
if (dc==true) {
System.out.println("请黑子下棋");
x= scanner.nextInt()-1;//行数
y= scanner.nextInt()-1;//列数
boolean res = hefa(x, y);
if (res==true){
a[x][y]=black;
dayin();
boolean win = win(x,y);
if(win){
System.out.println("黑棋胜");
break;
}
dc=false;
}
}else if (dc==false){
System.out.println("请白子下棋");
x= scanner.nextInt()-1;//行数
y= scanner.nextInt()-1;//列数
boolean res = hefa(x, y);
if (res==true){
a[x][y]=white;
dayin();
dc=true;
}
}
}
}
5. 写一个方法用于判断输入值是否合法,并且判断输赢。
public static boolean hefa(int x,int y){
if (x<15&&x>=0&&y<15&&y>=0&&a[x][y]!=white&&a[x][y]!=black){
return true;
}else {
System.out.println("您输入的位置不合法,请重新输入");
return false;
}
}
6. 写一个方法用于判断输赢。
public static boolean win(int x,int y){
//横向
int spsum=1,szsum=1,xssum=1,xxsum=1;
for (int i=y-1;i>0;i--){
if (a[x][y]==a[x][i]){
spsum++;
}else {
break;
}
}
for (int i=y+1;i<15;i++){
if (a[x][y]==a[x][i]){
spsum++;
}else {
break;
}
}
if (spsum>=5){
return true;
}
//纵向
for (int i=y-1;i>=0;i--){
if (a[x][y]==a[x][i]){
szsum++;
}
}
for (int i=y+1;i<15;i++){
if (a[x][y]==a[x][i]){
szsum++;
}
if (szsum>=5){
return true;
}
}
//斜向
for (int i = x-1,j=y-1; i >=0&&j>=0 ; i--,j--){
if (a[i][j]==a[x][y]){
xssum++;
}else {
break;
}
}
for (int i=x+1,j=y+1;i< a.length&&j<a[0].length;i++,j++) {
if (a[i][j]==a[x][y]){
xssum++;
}else {
break;
}
}
if (xssum>=5){
return true;
}
//斜上右
for (int i=x-1,j=y+1;i>=0&&j<a[0].length;i--,j++){
if (a[i][j]==a[x][y]){
xxsum++;
}else {
break;
}
}
for (int i=x+1,j=y-1;i< a.length&&j>=0;i++,j--){
if (a[i][j]==a[x][y]){
xssum++;
}else {
break;
}
}
if (xxsum>=5){
return true;
}
return false;
}
7. 在一个main方法里面依次调用其他方法。
static String [][]a=new String[15][15];
public static void main(String[] args) {
init();
dayin();
xiaqi();
}
总代码:
package work3;
import java.util.Scanner;
public class Demo6 {
static String white = "☆";
static String black = "★";
static String[][] qp = new String[15][15];
static String[] num = {"⒈","⒉","⒊","⒋","⒌","⒍","⒎","⒏","⒐","⒑","⒒","⒓","⒔","⒕","⒖"};
static String line = "十";
static String [][]a=new String[15][15];
public static void main(String[] args) {
init();
dayin();
xiaqi();
}
/*初始化棋盘 */
public static void init(){
for (int i = 0; i < a.length-1 ; i++) {
for (int j = 0; j <a[i].length -1; j++) {
a[i][j]=line;
}
a[i][14]=num[i];
}
for (int i=0;i<15;i++){
a[14][i]=num[i];
}
}
/*打印棋盘 */
public static void dayin(){
for (int i = 0; i < a.length ; i++) {
for (int j = 0; j < a[i].length ; j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
}
/*下棋*/
public static void xiaqi(){
Scanner scanner=new Scanner(System.in);
boolean dc=true;
int x,y;
while (true){
if (dc==true) {
System.out.println("请黑子下棋");
x= scanner.nextInt()-1;//行数
y= scanner.nextInt()-1;//列数
boolean res = hefa(x, y);
if (res==true){
a[x][y]=black;
dayin();
boolean win = win(x,y);
if(win){
System.out.println("黑棋胜");
break;
}
dc=false;
}
}else if (dc==false){
System.out.println("请白子下棋");
x= scanner.nextInt()-1;//行数
y= scanner.nextInt()-1;//列数
boolean res = hefa(x, y);
if (res==true){
a[x][y]=white;
dayin();
dc=true;
}
}
}
}
//判断玩家所选位置是否合法
public static boolean hefa(int x,int y){
if (x<15&&x>=0&&y<15&&y>=0&&a[x][y]!=white&&a[x][y]!=black){
return true;
}else {
System.out.println("您输入的位置不合法,请重新输入");
return false;
}
}
//判断输赢
public static boolean win(int x,int y){
//横向
int spsum=1,szsum=1,xssum=1,xxsum=1;
for (int i=y-1;i>0;i--){
if (a[x][y]==a[x][i]){
spsum++;
}else {
break;
}
}
for (int i=y+1;i<15;i++){
if (a[x][y]==a[x][i]){
spsum++;
}else {
break;
}
}
if (spsum>=5){
return true;
}
//纵向
for (int i=y-1;i>=0;i--){
if (a[x][y]==a[x][i]){
szsum++;
}
}
for (int i=y+1;i<15;i++){
if (a[x][y]==a[x][i]){
szsum++;
}
if (szsum>=5){
return true;
}
}
//斜向
for (int i = x-1,j=y-1; i >=0&&j>=0 ; i--,j--){
if (a[i][j]==a[x][y]){
xssum++;
}else {
break;
}
}
for (int i=x+1,j=y+1;i< a.length&&j<a[0].length;i++,j++) {
if (a[i][j]==a[x][y]){
xssum++;
}else {
break;
}
}
if (xssum>=5){
return true;
}
//斜上右
for (int i=x-1,j=y+1;i>=0&&j<a[0].length;i--,j++){
if (a[i][j]==a[x][y]){
xxsum++;
}else {
break;
}
}
for (int i=x+1,j=y-1;i< a.length&&j>=0;i++,j--){
if (a[i][j]==a[x][y]){
xssum++;
}else {
break;
}
}
if (xxsum>=5){
return true;
}
return false;
}
}