五子棋
package demo01;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Gobang003 extends JFrame implements KeyListener, ActionListener, MouseListener {
//设置宽为800,高为1000
int width=800;
int height=950;
// 格子的大小
int size=50;
// 棋盘
int qipan[]=new int[256];
// 设置游戏状态 1表示等待黑方落子 2表示等待白方落子 3表示黑子胜 4表示白字胜
int zhuangtai =1;
// 认输按钮的坐标
int x_renshu = 550;
int y_renshu = 60;
int width_renshu = 150;
int height_renshu = 70;
// 悔棋按钮的坐标
int x_huiqi = 100;
int y_huiqi = 60;
int width_huiqi = 150;
int height_huiqi = 70;
// 开始按钮的坐标
int x_kaishi = 100;
int y_kaishi = 60;
int width_kaishi = 150;
int height_kaishi = 70;
//记录下棋的步骤
int []buzhou=new int[256];
int buzhoulength=0;
public void Tian(){
for(int e:qipan) {
System.out.println(e+",");
}
//设置宽为800,高为1000
this.setSize(width,height);
//设置窗口能看见
this.setVisible(true);
//设置键盘监听事件(也就是当键盘有什么反应都会调用此函数)
this.addKeyListener(this);
//设置鼠标监听事件(也就是当鼠标有什么反应都会调用此函数)
this.addMouseListener(this);
}
public void paint(Graphics g){
// 绘制棋盘网格
g.setColor(Color.orange);
g.fill3DRect(0,0,width,height,true);
// 网格颜色
g.setColor(Color.darkGray);
// 画竖线
for (int j = 0; j <=width ; j+=size) {
g.drawLine(j,0,j,height);
}
// 画横线
for (int i = 0; i <=height ; i+=size) {
g.drawLine(0,i,width,i);
}
g.setColor(Color.GRAY);
g.fill3DRect(0,0, width,height-800,true);
// g.setColor(Color.black);
// g.fillOval(1*size,(height-800)+1*size,size,size);
// g.setColor(Color.white);
// g.fillOval(3*size,(height-800)+1*size,size,size);
// 绘制棋子
for (int y = 0; y < 16; y++) {
for (int x = 0; x < 16; x++) {
if(qipan[y*16+x]==1){// 绘制黑子
g.setColor(Color.black);
g.fillOval(x*size,(height-800)+y*size,size,size);
}else if(qipan[y*16+x]==2){//绘制白字
g.setColor(Color.white);
g.fillOval(x*size,(height-800)+y*size,size,size);
}
}
}
// 绘制提示信息
g.setFont(new Font("华文新魏", 10, 35)); //设置字体
if(zhuangtai==1){
g.setColor(Color.black);
// 提示黑方落子
g.drawString("黑方请落子",315,100);
}else if(zhuangtai==2){
g.setColor(Color.white);
// 提示白方落子
g.drawString("白方请落子",315,100);
}else if(zhuangtai==3){
g.setColor(Color.black);
// 黑方获胜
g.drawString("黑方棋子赢",315,100);
}else if(zhuangtai==4){
g.setColor(Color.white);
// 白方获胜
g.drawString("白方棋子赢",315,100);
}
if(zhuangtai==1||zhuangtai==2){
g.setColor(Color.darkGray);
g.fill3DRect(x_huiqi,y_huiqi,width_huiqi,height_huiqi,true);
g.setFont(new Font("华文新魏", 10, 55)); //设置字体
g.setColor(Color.white);
g.drawString("悔棋",x_huiqi+20,y_huiqi+50);
g.setColor(Color.darkGray);
g.fill3DRect(x_renshu,y_renshu,width_renshu,height_renshu,true);
g.setFont(new Font("华文新魏", 10, 55)); //设置字体
g.setColor(Color.white);
g.drawString("认输",x_renshu+20,y_renshu+50);
}else if (zhuangtai==3||zhuangtai==4){
g.setColor(Color.darkGray);
g.fill3DRect(x_kaishi,y_kaishi,width_kaishi,height_kaishi,true);
g.setFont(new Font("华文新魏", 10, 55)); //设置字体
g.setColor(Color.white);
g.drawString("开始",x_kaishi+20,y_kaishi+50);
}
}
public void actionPerformed(ActionEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
// 响应鼠标点击事件(鼠标监听事件)
public void mouseClicked(MouseEvent e) {
}
//鼠标按压事件
public void mousePressed(MouseEvent e) {
// 处理鼠标左键
if(e.getButton()==e.BUTTON1){
// 鼠标点击的像素坐标
// 鼠标点击的x坐标位置
int x=e.getX();
// 鼠标点击的y坐标位置
int y=e.getY();
// 鼠标点击格子数坐标
// System.out.println(fanggex+","+fanggey);
// System.out.println(x+","+y);
// 判断鼠标是否点击在棋盘内
// if(fanggex>=0&&fanggex<16&&fanggey>=0&&fanggey<16){
if(x>=0&&x<=width&&y>=150&&yx&&y_renshuy){
// 如果状态是黑子请落子,此时点击了认输,那么状态改为白方胜
if(zhuangtai==1){
zhuangtai=4;
}else if(zhuangtai==2){
zhuangtai=3;
}
repaint();
}
// 处理点击开始
if(x_kaishix&&y_kaishiy){
// 如果状态是黑子请落子,此时点击了认输,那么状态改为白方胜
if(zhuangtai==3||zhuangtai==4){
zhuangtai=1;
buzhoulength = 0;
for (int i = 0; i < qipan.length; i++) {
qipan[i]=0;
}
}
repaint();
}
// 处理点击悔棋
if(x_huiqix&&y_huiqiy){
// 如果状态是黑子请落子,此时点击了认输,那么状态改为白方胜
if(buzhoulength>0){
qipan[buzhou[buzhoulength-1]]=0;
buzhoulength--;
if(zhuangtai==1){
zhuangtai=2;
}else if(zhuangtai==2){
zhuangtai=1;
}
}
repaint();
}
}
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
// 0表示平手 1表示黑子胜 2表示白字胜
public int panduanshuying(){
int black=0;
int white=0;
//水平方向检测是否有连续的5个棋子
for (int y = 0; y < 16; y++) {
// 每一行开头,棋子连子数目设置为0
black=0;
white=0;
for (int x = 0; x < 16; x++) {
if(qipan[y*16+x]==1){// 绘制黑子
black++;
white=0;
if (black>=5){
return 1;
}
}else if(qipan[y*16+x]==2){//绘制白字
white++;
black=0;
if (white>=5){
return 2;
}
}else{
black=0;
white=0;
}
}
}
//竖直方向检测是否有连续的5个棋子
black=0;
white=0;
for (int x = 0; x < 16; x++) {
// 每一行开头,棋子连子数目设置为0
black=0;
white=0;
for (int y = 0; y < 16; y++) {
if(qipan[y*16+x]==1){// 绘制黑子
black++;
white=0;
if (black>=5){
return 1;
}
}else if(qipan[y*16+x]==2){//绘制白字
white++;
black=0;
if (white>=5){
return 2;
}
}else{
black=0;
white=0;
}
}
}
// 左下到右上的判断
for (int i = 0; i <= 15; i++) {
black=0;
white=0;
for(int x=0,y=i;x<=i;x++,y--)
{
if(qipan[y*16+x]==1){// 绘制黑子
black++;
white=0;
if (black>=5){
return 1;
}
}else if(qipan[y*16+x]==2){//绘制白字
white++;
black=0;
if (white>=5){
return 2;
}
}else{
black=0;
white=0;
}
}
black=0;
white=0;
for (int y = 15,x=i; y >= i; y--,x++) {
if(qipan[y*16+x]==1){// 绘制黑子
black++;
white=0;
if (black>=5){
return 1;
}
}else if(qipan[y*16+x]==2){//绘制白字
white++;
black=0;
if (white>=5){
return 2;
}
}else{
black=0;
white=0;
}
}
}
// 左上到右下的判断
for (int i = 0; i <=15; i++) {
black=0;
white=0;
for(int y=0,x=15-i;y<=i;y++,x++) {
if(qipan[y*16+x]==1){// 绘制黑子
black++;
white=0;
if (black>=5){
return 1;
}
}else if(qipan[y*16+x]==2){//绘制白字
white++;
black=0;
if (white>=5){
return 2;
}
}else{
black=0;
white=0;
}
}
black=0;
white=0;
for (int x=0,y=15-i;x<=i;y++,x++){
if(qipan[y*16+x]==1){// 绘制黑子
black++;
white=0;
if (black>=5){
return 1;
}
}else if(qipan[y*16+x]==2){//绘制白字
white++;
black=0;
if (white>=5){
return 2;
}
}else{
black=0;
white=0;
}
}
}
return 0;
}
public static void main(String[] args) {
Gobang003 gobang=new Gobang003();
gobang.Tian();
}
}