五子棋小游戏
需求
游戏设置优先出棋子、游戏说明、重新开始、悔棋、认输、退出、关于。
图像界面如下
源码
package keshe;
import java.util.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FiveChess extends JFrame implements MouseListener{
String message = "轮到黑方";
int x; //鼠标横坐标
int y; //鼠标纵坐标
int [][]chess = new int[19][19];
int jilu =0;
boolean isBlack =true; //轮到哪一方落子,默认黑色落子
boolean canPlay= true;
int X[] = new int [181];
int Y[] = new int [181];
public FiveChess(){
this.setTitle("欢乐五子棋");
this.setSize(690,660);//宽 高
this.setVisible(true); //可显示
int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽
int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;//获取屏幕高
this.setLocation((screen_width -690)/2,(screen_height-695)/2); //使屏幕正中间显示
this.addMouseListener(this); //监听鼠标
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭
}
@Override
public void paint(Graphics g){ //加载图片
//添加背景图片
// if(Pattern.equals("One")) {
try{
BufferedImage img = ImageIO.read(new File("C:\\Users\\Administrator\\Desktop\\eclipse-jee-oxygen-R-win32-x86_64\\ke\\bg1.jpg"));// bg1.jpg是图片名 将图片加载到程序当中来
g.drawImage(img,0,35,this);//参数(画哪张图片, 开始画位置 ,开始画位置 ,)
} catch(IOException e){
e.printStackTrace(); //在命令行输出异常的原因
}
//生成19*19的棋盘
for(int i=0 ; i<19; i++){
//画19条横线
g.drawLine(35, 125+25*i, 485,125+i*25); //画横线的方法 参数(起点横坐标,起点纵坐标,结束横坐标,结束纵坐标)
}
for(int j=0;j<19;j++){
//画19条竖线
g.drawLine(35+25*j,125,35+j*25,575);//画竖线的方法 参数(起点横坐标,起点纵坐标,结束横坐标,结束纵坐标)
}
//生成顶部提示信息
g.setFont(new Font("黑体",Font.BOLD,20)); //Font.BOLD为字体加粗
g.drawString("提示信息: "+this.message,200,100); //数字为坐标
g.drawRect(520,125,120,40);//画矩形 参数(开始横坐标,开始纵坐标,长,宽)
g.drawString("游戏设置",530,160);
g.drawRect(520,185,120,40);
g.drawString("游戏说明",530,210);
g.drawRect(520,235,120,40);
g.drawString("重新开始",530,260);
g.drawRect(520, 285, 120, 40);
g.drawString("悔棋",530,310);
g.drawRect(520,335,120,40);
g.drawString("认输",530,360);
g.drawRect(520,385,120,40);
g.drawString("退出",530,410);
g.drawRect(520,435,120,40);
g.drawString("关于",530,460);
//遍历数组,输出棋子
for(int i=0 ; i<19; i++){
for(int j=0; j<19;j++){
if(chess[i][j]==1){ //1落黑子
g.setColor(Color.BLACK);
g.fillOval(j*25+35-8,i*25+125-8,16,16); //参数(坐标x,坐标y,长,宽)
}
else if(chess[i][j]==2){
g.setColor(Color.RED);
g.fillOval(j*25+35-8,i*25+125-8,16,16);
}
}
}
}
@Override
public void mouseReleased(MouseEvent e){
if(canPlay) {
this.x = e.getX();
this.y = e.getY();
if(x>=35 &&x<485&&y>=125&&y<=575){ //单击是否在棋盘
int j =(x-35+25/2)/25;//纵坐标
int i =(y-125+25/2)/25; //横坐标
if(chess[i][j]!= 0) {
JOptionPane.showMessageDialog(this,"不能重复落子");
}else{
if(isBlack){
chess[i][j] = 1;
++jilu;
X[jilu]=i;
Y[jilu]=j;
isBlack = false;
// chesshui.add(chess);
message ="轮到红方";
}
else{
++jilu;
X[jilu]=i;
Y[jilu]=j;
chess[i][j] = 2;
isBlack = true;
// chesshui.add(chess);
message = "轮到黑方";
}
}
this.repaint();
int count=0;
int index_j = j;
while(chess[i][j]==chess[i][index_j++]){
count++;
}
index_j = j;
while(chess[i][j]==chess[i][--index_j]){
count++;
}
if(count>=5){
JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
canPlay= false;
isBlack =true;
}
//判断竖线是否五个连珠
count =0;
int index_i =i;
while(chess[i][j]==chess[index_i++][j]){
count++;
}
index_i =i;
while(chess[i][j] == chess[--index_i][j]){
count++;
}
if(count>=5){
JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
canPlay = false;
isBlack =true;
}
//判断斜线是否五个连珠
count =0;
index_i = i;
index_j = j;
while(chess[i][j]==chess[index_i++][index_j++]) {
count++;
}
index_i =i;
index_j =j;
while(chess[i][j]==chess[--index_i][--index_j]) {
count++;
}
if(count>=5){
JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
canPlay = false;
isBlack =true;
}
//判断斜线是否五个连珠
count =0;
index_i = i;
index_j = j;
while(chess[i][j]==chess[index_i++][index_j--]) {
count++;
}
index_i = i;
index_j = j;
while(chess[i][j]==chess[--index_i][++index_j]) {
count++;
}
if(count>=5) {
JOptionPane.showMessageDialog(this,"恭喜"+(isBlack ?"红方":"黑方")+"获胜!");
canPlay = false;
isBlack =true;
count =0;//
}
}//
}
this.x = e.getX();
this.y = e.getY();
if(x>=520&&x<=640&&y>=185&&y<=225) {//游戏说明
JOptionPane.showMessageDialog(this,"一方抢先横、竖、斜五颗连珠即可获胜");
}
if(x>=520&&x<=640&&y>=125&&y<=165) { //游戏设置
JOptionPane.showMessageDialog(this,"已调换哪一方先出");
canPlay =true;
for(int i=0; i<19;i++) {
for(int j=0; j<19;j++) {
chess[i][j]=0;
}
}
this.repaint();
if(isBlack) {
isBlack = false;
message = "轮到红方";
}
else {
isBlack = true;
message = "轮到红方";
}
}
if(x>=520&&x<=640&&y>=235&&y<=275) { //重新开始游戏
canPlay =true;
for(int i=0; i<19;i++) {
for(int j=0; j<19;j++) {
chess[i][j]=0;
}
}
this.repaint();
}
if(x>=520&&x<=640&&y>=285&&y<=325) { //悔棋
if(isBlack) {
chess[X[jilu]][Y[jilu]] = 0;
isBlack=false;
}
else {
chess[X[jilu]][Y[jilu]] = 0;
isBlack=true;
}
this.repaint();
}
if(x>=520&&x<=640&&y>=335&&y<=375) {//认输
if(isBlack) {
JOptionPane.showMessageDialog(this,"恭喜!" +(isBlack ? "红方" : "黑方") +"获胜");
//重新开始游戏
for(int i=0; i<19;i++) {
for(int j=0; j<19;j++) {
chess[i][j]=0;
}
}
this.repaint();
}
else {
JOptionPane.showMessageDialog(this,"恭喜!黑方获胜");
//重新开始游戏
for(int i=0; i<19;i++) {
for(int j=0; j<19;j++) {
chess[i][j]=0;
}
}
this.repaint();
}
}
if(x>=520&&x<=640&&y>=385&&y<=425) { //退出
this.dispose();
}
if(x>=520&&x<=640&&y>=435&&y<=475) { //关于
JOptionPane.showMessageDialog(this,"本软件由南航188207140吴华制作");
}
}
public void mouseClidked(MouseEvent e){
}
@Override
public void mouseEntered(MouseEvent e){
}
@Override
public void mouseExited(MouseEvent e){
}
public void mousePressed(MouseEvent e){
}
@Override
public void mouseClicked(MouseEvent e) {
}
}
public class Test {
public static void main(String[] args) {
// TODO 自动生成的方法存根
FiveChess f = new FiveChess();
}
}
效果如下所示
感觉一步一步来就不难