首页 > 编程知识 正文

简单java五子棋代码下载,java小游戏编程源代码五子棋

时间:2023-12-27 22:27:52 阅读:326863 作者:LJYO

本文目录一览:

求一个简单的JAVA五子棋代码!! 网上复制的别来了!

以下是现写的 实现了两人对战 自己复制后运行把 没什么难度 类名 Games

import java.util.Scanner;

public class Games {

private String board[][];

private static int SIZE = 17;

private static String roles = "A玩家";

//初始化数组

public void initBoard() {

board = new String[SIZE][SIZE];

for (int i = 0; i SIZE; i++) {

for (int j = 0; j SIZE; j++) {

// if(i==0){

// String str = "";

// str += j+" ";

// board[i][j]= str;

// }else if(i!=0j==0){

// String str = "";

// str += i+" ";

// board[i][j]= str;

// }else{

board[i][j] = "╋";

// }

}

}

}

//输出棋盘

public void printBoard() {

for (int i = 0; i SIZE; i++) {

for (int j = 0; j SIZE; j++) {

System.out.print(board[i][j]);

}

System.out.println();

}

}

//判断所下棋子位置是否合理

public boolean isOk(int x, int y) {

boolean isRight = true;

if (x = 16 || x 1 || y = 16 | y 1) {

//System.out.println("输入错误,请从新输入");

isRight = false;

}

if (board[x][y].equals("●") || board[x][y].equals("○")) {

isRight = false;

}

return isRight;

}

//判断谁赢了

public void whoWin(Games wz) {

// 从数组挨个查找找到某个类型的棋子就从该棋子位置向右,向下,斜向右下 各查找5连续的位置看是否为5个相同的

int xlabel;// 记录第一次找到某个棋子的x坐标

int ylabel;// 记录第一次找到某个棋子的y坐标

// ●○╋

// 判断人是否赢了

for (int i = 0; i SIZE; i++) {

for (int j = 0; j SIZE; j++) {

if (board[i][j].equals("○")) {

xlabel = i;

ylabel = j;

// 横向找 x坐标不变 y坐标以此加1连成字符串

String heng = "";

if (i + 5 SIZE j + 5 SIZE) {

for (int k = j; k j + 5; k++) {

heng += board[i][k];

}

if (heng.equals("○○○○○")) {

System.out.println(roles+"赢了!您输了!");

System.exit(0);

}

// 向下判断y不变 x逐增5 连成字符串

String xia = "";

for (int l = j; l i + 5; l++) {

xia += board[l][j];

// System.out.println(xia);

}

if (xia.equals("○○○○○")) {

System.out.println(roles+"赢了!您输了!");

System.exit(0);

}

// 斜向右下判断

String youxia = "";

for (int a = 1; a = 5; a++) {

youxia += board[xlabel++][ylabel++];

}

if (youxia.equals("○○○○○")) {

System.out.println(roles+"赢了!您输了!");

System.exit(0);

}

}

}

}

}

// 判断电脑是否赢了

for (int i = 0; i SIZE; i++) {

for (int j = 0; j SIZE; j++) {

if (board[i][j].equals("●")) {

xlabel = i;

ylabel = j;

// 横向找 x坐标不变 y坐标以此加1连成字符串

String heng = "";

if (j + 5 SIZE i + 5 SIZE) {

for (int k = j; k j + 5; k++) {

heng += board[i][k];

}

if (heng.equals("●●●●●")) {

System.out.println(roles+"赢输了!您输了!");

System.exit(0);

}

// 向下判断y不变 x逐增5 连成字符串

String xia = "";

for (int l = i; l i + 5; l++) {

xia += board[l][ylabel];

// System.out.println(xia);

}

if (xia.equals("●●●●●")) {

System.out.println(roles+"赢了!您输了!");

System.exit(0);

}

// 斜向右下判断

String youxia = "";

for (int a = 1; a = 5; a++) {

youxia += board[xlabel++][ylabel++];

}

if (youxia.equals("●●●●●")) {

System.out.println(roles+"赢了!您输了!");

System.exit(0);

}

}

}

}

}

}

public static void main(String[] args) {

Games wz = new Games();

Scanner sc = new Scanner(System.in);

wz.initBoard();

wz.printBoard();

while (true) {

System.out.print("请"+roles+"输入X,Y坐标,必须在0-15范围内,xy以空格隔开,输入16 16结束程序");

int x = sc.nextInt();

int y = sc.nextInt();

if (x == SIZE y == SIZE) {

System.out.println("程序结束");

System.exit(0);

}

if (x SIZE || x 0 || y SIZE | y 0) {

System.out.println("输入错误,请从新输入");

continue;

}

//如果roles是A玩家 就让A玩家下棋,否则就让B玩家下棋。

if (wz.board[x][y].equals("╋")roles.equals("A玩家")) {

wz.board[x][y] = "○";

wz.printBoard();

//判断输赢

wz.whoWin(wz);

}else if(wz.board[x][y].equals("╋")roles.equals("B玩家")){

wz.board[x][y] = "●";

wz.printBoard();

//判断输赢

wz.whoWin(wz);

} else {

System.out.println("此处已经有棋子,从新输入");

continue;

}

if(roles.equals("A玩家")){

roles = "B玩家";

}else if(roles.equals("B玩家")){

roles = "A玩家";

}

}

}

}

java五子棋代码

package day17.gobang;

import java.util.Arrays;

public class GoBangGame {

public static final char BLANK='*';

public static final char BLACK='@';

public static final char WHITE='O';

public static final int MAX = 16;

private static final int COUNT = 5;

//棋盘

private char[][] board;

public GoBangGame() {

}

//开始游戏

public void start() {

board = new char[MAX][MAX];

//把二维数组都填充‘*’

for(char[] ary: board){

Arrays.fill(ary, BLANK);

}

}

public char[][] getChessBoard(){

return board;

}

public void addBlack(int x, int y) throws ChessExistException{

//@

//char blank = '*';

//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK);

if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子

board[y][x] = BLACK;

return;

}

throw new ChessExistException("已经有棋子了!");

}

public void addWhite(int x, int y)

throws ChessExistException{

if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子

board[y][x] = WHITE;

return;

}

throw new ChessExistException("已经有棋子了!");

}

//chess 棋子:'@'/'O'

public boolean winOnY(char chess, int x, int y){

//先找到y方向第一个不是 blank的棋子

int top = y;

while(true){

if(y==0 || board[y-1][x]!=chess){

//如果y已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

y--;

top = y;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

y = top;

while(true){

if(y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

y++;

}

return count==COUNT;

}

//chess 棋子:'@'/'O'

public boolean winOnX(char chess, int x, int y){

//先找到x方向第一个不是 blank的棋子

int top = x;

while(true){

if(x==0 || board[y][x-1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

x--;

top = x;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

x = top;

while(true){

if(x==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

x++;

}

return count==COUNT;

}

//chess 棋子:'@'/'O'

public boolean winOnXY(char chess, int x, int y){

//先找MAX向第一个不是 blank的棋子

int top = y;

int left = x;

while(true){

if(x==0 || y==0 || board[y-1][x-1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

x--;

y--;

top = y;

left=x;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

x = left;

y = top;

while(true){

if(x==MAX || y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

x++;

y++;

}

return count==COUNT;

}

//chess 棋子:'@'/'O'

public boolean winOnYX(char chess, int x, int y){

//先找到x方向第一个不是 blank的棋子

int top = y;

int left = x;

while(true){

if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){

//如果x已经是棋盘的边缘, 或者的前一个不是chess

//就不再继续查找了

break;

}

x++;

y--;

top = y;

left=x;

}

//向回统计所有chess的个数,如果是COUNT个就赢了

int count = 0;

x = left;

y = top;

while(true){

if(x==0 || y==MAX || board[y][x]!=chess){

//如果找到头 或者 下一个子不是chess 就不再继续统计了

break;

}

count++;

x--;

y++;

}

return count==COUNT;

}

public boolean whiteIsWin(int x, int y) {

//在任何一个方向上赢了,都算赢

return winOnY(WHITE, x, y) ||

winOnX(WHITE, x, y) ||

winOnXY(WHITE, x, y) ||

winOnYX(WHITE, x, y);

}

public boolean blackIsWin(int x, int y) {

return winOnY(BLACK, x, y) ||

winOnX(BLACK, x, y) ||

winOnXY(BLACK, x, y) ||

winOnYX(BLACK, x, y);

}

}

跪求JAVA五子棋源代码

很sb的电脑五子棋:

import java.io.*;

import java.util.*;

public class Gobang {

// 定义一个二维数组来充当棋盘

private String[][] board;

// 定义棋盘的大小

private static int BOARD_SIZE = 15;

public void initBoard() {

// 初始化棋盘数组

board = new String[BOARD_SIZE][BOARD_SIZE];

// 把每个元素赋为"╋",用于在控制台画出棋盘

for (int i = 0; i BOARD_SIZE; i++) {

for (int j = 0; j BOARD_SIZE; j++) {

// windows是一行一行来打印的。坐标值为(行值, 列值)

board[i][j] = "╋";

}

}

}

// 在控制台输出棋盘的方法

public void printBoard() {

// 打印每个数组元素

for (int i = 0; i BOARD_SIZE; i++) {

for (int j = 0; j BOARD_SIZE; j++) {

// 打印数组元素后不换行

System.out.print(board[i][j]);

}

// 每打印完一行数组元素后输出一个换行符

System.out.print("n");

}

}

// 该方法处理电脑下棋:随机生成2个整数,作为电脑下棋的坐标,赋给board数组。

private void compPlay() {

// 构造一个随机数生成器

Random rnd = new Random();

// Random类的nextInt(int n))方法:随机地生成并返回指定范围中的一个 int 值,

// 即:在此随机数生成器序列中 0(包括)和 n(不包括)之间均匀分布的一个int值。

int compXPos = rnd.nextInt(15);

int compYPos = rnd.nextInt(15);

// 保证电脑下的棋的坐标上不能已经有棋子(通过判断对应数组元素只能是"╋"来确定)

while (board[compXPos][compYPos].equals("╋") == false) {

compXPos = rnd.nextInt(15);

compYPos = rnd.nextInt(15);

}

System.out.println(compXPos);

System.out.println(compYPos);

// 把对应的数组元素赋为"○"。

board[compXPos][compYPos] = "○";

}

// 该方法用于判断胜负:进行四次循环扫描,判断横、竖、左斜、右斜是否有5个棋连在一起

private boolean judgeWin() {

// flag表示是否可以断定赢/输

boolean flag = false;

// joinEle:将每一个横/竖/左斜/右斜行中的元素连接起来得到的一个字符串

String joinEle;

// 进行横行扫描

for (int i = 0; i BOARD_SIZE; i++) {

// 每扫描一行前,将joinEle清空

joinEle = "";

for (int j = 0; j BOARD_SIZE; j++) {

joinEle += board[i][j];

}

// String类的contains方法:当且仅当该字符串包含指定的字符序列时,返回true。

if (joinEle.contains("●●●●●")) {

System.out.println("您赢啦!");

flag = true;

// 停止往下继续执行,提前返回flag。

// 如果执行了这个return,就直接返回该方法的调用处;

// 不会再执行后面的任何语句,包括最后那个return语句。

// (而break仅仅是完全跳出这个for循环,还会继续执行下面的for循环。)

return flag;

} else if (joinEle.contains("○○○○○")) {

System.out.println("您输啦!");

flag = true;

// 提前返回flag

return flag;

}

}

// 进行竖行扫描

for (int i = 0; i BOARD_SIZE; i++) {

joinEle = "";

for (int j = 0; j BOARD_SIZE; j++) {

// 竖行的元素是它们的列值相同

joinEle += board[j][i];

}

if (joinEle.contains("●●●●●")) {

System.out.println("您赢啦!");

flag = true;

return flag;

} else if (joinEle.contains("○○○○○")) {

System.out.println("您输啦!");

flag = true;

return flag;

}

}

// 进行左斜行扫描

for (int i = -(BOARD_SIZE - 2); i BOARD_SIZE - 1; i++) {

joinEle = "";

for (int j = 0; j BOARD_SIZE; j++) {

int line = i + j;

// 只截取坐标值没有越界的点

if (line = 0 line 15) {

joinEle += board[j][line];

}

}

if (joinEle.contains("●●●●●")) {

System.out.println("您赢啦!");

flag = true;

return flag;

} else if (joinEle.contains("○○○○○")) {

System.out.println("您输啦!");

flag = true;

return flag;

}

}

// 进行右斜行扫描

for (int i = 1; i 2 * (BOARD_SIZE - 1); i++) {

joinEle = "";

for (int j = 0; j BOARD_SIZE; j++) {

int line = i - j;

if (line = 0 line 15) {

joinEle += board[j][line];

}

}

if (joinEle.contains("●●●●●")) {

System.out.println("您赢啦!");

flag = true;

return flag;

} else if (joinEle.contains("○○○○○")) {

System.out.println("您输啦!");

flag = true;

// 最后这个return可省略

}

}

// 确保该方法有返回值(如果上面条件都不满足时)

return flag;

}

public static void main(String[] args) throws Exception, IOException {

Gobang gb = new Gobang();

gb.initBoard();

gb.printBoard();

// BufferedReader类:带缓存的读取器————从字符输入流中读取文本,并缓存字符。可用于高效读取字符、数组和行。

// 最好用它来包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。

// 下面构造一个读取器对象。

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

// 定义输入字符串

String inputStr = null;

// br.readLine():每当在键盘上输入一行内容按回车,刚输入的内容将被br(读取器对象)读取到。

// BufferedReader类的readLine方法:读取一个文本行。

// 初始状态由于无任何输入,br.readLine()会抛出异常。因而main方法要捕捉异常。

while ((inputStr = br.readLine()) != null) {

// 将用户输入的字符串以逗号(,)作为分隔符,分隔成2个字符串。

// String类的split方法,将会返回一个拆分后的字符串数组。

String[] posStrArr = inputStr.split(",");

// 将2个字符串转换成用户下棋的坐标

int xPos = Integer.parseInt(posStrArr[0]);

int yPos = Integer.parseInt(posStrArr[1]);

// 校验用户下棋坐标的有效性,只能是数字,不能超出棋盘范围

if (xPos 15 || xPos 1 || yPos 15 || yPos 1) {

System.out.println("您下棋的坐标值应在1到15之间,请重新输入!");

continue;

}

// 保证用户下的棋的坐标上不能已经有棋子(通过判断对应数组元素只能是"╋"来确定)

// String类的equals方法:比较字符串和指定对象是否相等。结果返回true或false。

if (gb.board[xPos - 1][yPos - 1].equals("╋")) {

// 把对应的数组元素赋为"●"。

gb.board[xPos - 1][yPos - 1] = "●";

} else {

System.out.println("您下棋的点已有棋子,请重新输入!");

continue;

}

// 电脑下棋

gb.compPlay();

gb.printBoard();

// 每次下棋后,看是否可以断定赢/输了

if (gb.judgeWin() == false) {

System.out.println("请输入您下棋的坐标,应以x,y的格式:");

} else {

// 完全跳出这个while循环,结束下棋

break;

}

}

}

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。