合作项目

•   题目简介

1.棋盘是10乘以10的方框。

2.棋盘处于鼠标监听状态,当鼠标在棋盘上有点击操作的时候,程序会获得鼠标点击的坐标然后换算成对应的棋盘的位置,在判断此处是否有棋子,假如没有,那么在此处画出对应颜色的实心棋子,假如已经有棋子了,则提示玩家此处已经有棋子请重新下棋。

3.无论黑白双方哪一方有五个棋子沿着横竖斜连在一起是,系统自动判断输赢,并显示黑方或者白方胜利。

本程序共有3个类,下载后将三个类复制到三个记事本里然后重名记事本(为了阅读方便分三个文件,其中main()方法在StartChessJFrame类中。

•   代码地址

https://github.com/xumin1994/cooperation

import java.awt.Color;

public class Point {

private int x;

//棋盘中X的索引

private int y;

//棋盘中Y的索引

private Color color;//颜色

public static final int DIAMETER = 30;

//直径

public Point(int x,int y,Color color){

this.x=x;

this.y=y;

this.color =color;

}

//拿到棋盘中的Y索引

public int getX(){

return x;

}

public int getY(){

return y;

}

//得到颜色

public Color getColor(){

return color;

}

}

import javax.swing.*;

import java.awt.*;

import java.awt.event.MouseListener;

import java.awt.event.MouseMotionListener;

import java.awt.event.MouseEvent;

/*

五子棋-棋盘类

*/

public class ChessBoard extends JPanel implements MouseListener {

public static final int MARGIN = 30;

//边距

protected static final int GRID_SPAN = 35;

//网格间距

public static final int ROWS = 10;

//棋盘行数

public static final int COLS = 10;

//棋盘列数

Point[] chessList = new Point[(ROWS+1)*(COLS+1)];

//初始化每个数组元素为null

boolean isBlack = true;

//默认开始是黑棋先下

boolean gameOver = false;

//游戏是否结束

int chessCount;

//当前棋盘棋子的个数

int xIndex,yIndex;

//当前刚下的棋子的索引

public ChessBoard(){

super.setBackground(Color.ORANGE);

//setBackground(Color.ORANGE);//设置背景颜色为橘黄色

addMouseListener(this);//添加监听器

addMouseMotionListener(new MouseMotionListener(){//匿名内部类

public void mouseDragged(MouseEvent e){

}

public void mouseMoved(MouseEvent e){

int x1 = (e.getX()- MARGIN +GRID_SPAN/2)/GRID_SPAN;

//将鼠标单击的坐标位置转换成网格索引

int y1 = (e.getY()- MARGIN +GRID_SPAN/2)/GRID_SPAN;

//游戏已经结束,落在棋盘外,x、y位置已经有棋子存在,不能下

if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver||findChess(x1,y1))

setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

//设置成默认形状

else

setCursor(new Cursor(Cursor.HAND_CURSOR));

//设置成手型

}

});

}

//绘制

public void paintComponent(Graphics g){

super.paintComponent(g);

//画棋类

for(int i=0;i<=ROWS;i++){//画横线

g.drawLine(MARGIN,MARGIN+i*GRID_SPAN,MARGIN+COLS*GRID_SPAN,MARGIN+i*GRID_SPAN);

}

for(int i=0;i<=COLS;i++){//画直线

g.drawLine(MARGIN+i*GRID_SPAN,MARGIN,MARGIN+i*GRID_SPAN,MARGIN+ROWS*GRID_SPAN);

}

//画棋子

for(int i=0;i<chessCount;i++) {

int xPos = chessList[i].getX()*GRID_SPAN+MARGIN;

//网络交叉点的x坐标

int yPos = chessList[i].getY()*GRID_SPAN+MARGIN;

//网络交叉点的y坐标

g.setColor(chessList[i].getColor());//设置颜色

g.fillOval(xPos-Point.DIAMETER/2, yPos-Point.DIAMETER/2, Point.DIAMETER, Point.DIAMETER);

//标记最后一个棋子的红矩形框

if(i == chessCount -1){

//最后一个棋子

g.setColor(Color.red);

g.drawRect(xPos - Point.DIAMETER/2,yPos-Point.DIAMETER/2,Point.DIAMETER,Point.DIAMETER);

}

}

}

//鼠标按键在组建上按下时调用

public void mousePressed(MouseEvent e){

//游戏已经结束,不能下

if(gameOver)

return;

String colorName = isBlack ?"黑棋":"白棋";

xIndex = (e.getX() - MARGIN + GRID_SPAN/2)/GRID_SPAN;

//将鼠标单击的坐标位置转换成网格索引

yIndex = (e.getY() - MARGIN + GRID_SPAN/2)/GRID_SPAN;

//落在棋盘外,不能下

if(xIndex <0 || xIndex > ROWS || yIndex < 0 || yIndex > COLS)

return;

//x、y位置都已经有棋子存在,不能下

if(findChess(xIndex , yIndex))

return;

Point ch = new Point(xIndex,yIndex,isBlack ? Color.black:Color.white);

chessList[chessCount++] = ch;

repaint();//通知系统重新绘制

if(isWin()){

//给出胜利信息,不能再继续下棋

String msg = String.format("恭喜,%s赢了!", colorName);

JOptionPane.showMessageDialog(this, msg);

gameOver = true;

}

isBlack = !isBlack;

}

//覆盖MouseListener的方法

public void mouseClicked(MouseEvent e){

}//鼠标按键在组件上单击(按下并释放)时调用

public void mouseEntered(MouseEvent e){

}//鼠标进入到组件上时调用

public void mouseExited(MouseEvent e){

}//鼠标离开组件时调用

public void mouseReleased(MouseEvent e){

}//鼠标离开组件时调用

//在棋子数组中查找是否有索引为x、y的棋子存在

private boolean findChess(int x, int y){

for(Point c : chessList){

if(c !=null && c.getX() == x && c.getY() == y)

return true;

}

return false;

}

//判定哪方赢

private boolean isWin(){

int continueCount =1;

//连续棋子的个数

//横向向西寻找

for(int x = xIndex-1; x>=0;x--){

Color c = isBlack ? Color.black : Color.white;

if(getChess(x,yIndex,c) !=null){

continueCount++;

}else

break;

}

//横向向东寻找

for(int x  =xIndex+1;x<=ROWS;x++){

Color c = isBlack ? Color.black : Color.white;

if(getChess(x,yIndex,c) !=null){

continueCount++;

}else

break;

}

//判定记录数大于等于五,即表示此方取胜

if(continueCount>=5){

return true;

}else

continueCount =1;

//继续另一种情况的搜索:纵向

//纵向向上寻找

for(int y = yIndex - 1; y >= 0; y--){

Color c =isBlack ? Color.black : Color.white;

if(getChess(xIndex,y,c) !=null){

continueCount++;

}else

break;

}

//纵向向下寻找

for(int y = yIndex + 1; y<=ROWS; y++){

Color c = isBlack ? Color.black : Color.white;

if(getChess(xIndex,y,c)!=null){

continueCount++;

}else

break;

}

if(continueCount>=5){

return true;

}else

continueCount =1;

//继续另一种情况的搜索:斜向

//东北寻找

for(int x = xIndex + 1,y=yIndex-1; y>=0 && x<=COLS; x++,y--){

Color c = isBlack ? Color.black : Color.white;

if(getChess(x,y,c)!=null){

continueCount++;

}else

break;

}

//西南寻找

for(int x = xIndex - 1,y=yIndex+1; y<=ROWS && x>=0; x--,y++){

Color c = isBlack ? Color.black : Color.white;

if(getChess(x,y,c)!=null){

continueCount++;

}else

break;

}

if(continueCount >=5){

return true;

}else

continueCount = 1;

//继续另一种情况的搜索:斜向

//西北寻找

for(int x = xIndex - 1,y = yIndex-1; y>=0 && x>=0; x--,y--){

Color c = isBlack ? Color.black : Color.white;

if(getChess(x,y,c)!=null){

continueCount++;

}else

break;

}

//西南寻找

for(int x = xIndex + 1,y=yIndex+1; y<=ROWS && x<=COLS; x++,y++){

Color c = isBlack ? Color.black : Color.white;

if(getChess(x,y,c)!=null){

continueCount++;

}else

break;

}

if(continueCount >=5){

return true;

}else

continueCount = 1;

return false;

}

private Point getChess(int xIndex, int yIndex, Color color){

for(Point c: chessList){

if(c !=null && c.getX() == xIndex && c.getY() == yIndex && c.getColor() == color)

return c;

}

return null;

}

public void restartGame(){

//清除棋子

for(int i=0; i< chessList.length; i++)

chessList[i]=null;

//恢复游戏相关的变量值

isBlack = true;

gameOver = false;//游戏是否结束

chessCount = 0;//当前棋盘的棋子个数

//System.out.println(this.toString());

//repaint();

}

//悔棋

public void goback(){

if (chessCount == 0)

return;

chessList[chessCount-1]=null;

chessCount--;

if(chessCount >0){

xIndex = chessList[chessCount -1].getX();

yIndex = chessList[chessCount -1].getY();

}

isBlack = !isBlack;

//repaint();

}

//Dimension:矩形

public Dimension getPreferredSize(){

return new Dimension (MARGIN*2 + GRID_SPAN*COLS,MARGIN*2 + GRID_SPAN*ROWS);

}

}

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

import javax.swing.JPanel;

public class StartChessJFrame  extends JFrame {

private ChessBoard chessBoard;

//对战面板

private JPanel toolbar;

//工具条面板

private JButton startButton;

private JButton backButton;

private JButton exitButton;

//“重新开始”按钮,“悔棋”按钮,“退出”按钮

private JMenuBar menuBar;

//菜单栏

private JMenu sysMenu;

//系统菜单

private JMenuItem startMenuItem;

private JMenuItem exitMenuIatem;

private JMenuItem backMenuItem;

//“重新开始”,“退出”和“悔棋”菜单项

public StartChessJFrame(){

setTitle("单机版五子棋");

//设置标题

chessBoard =new ChessBoard();

//初始化面板对象

//创建和添加菜单

menuBar = new JMenuBar();

//初始化菜单栏

sysMenu = new JMenu("系统");

//初始化菜单

startMenuItem = new JMenuItem("重新开始");

exitMenuIatem = new JMenuItem("退出");

backMenuItem = new JMenuItem("悔棋");

//初始化菜单项

sysMenu.add(startMenuItem);

//将三个菜单项添加到菜单上

sysMenu.add(backMenuItem);

sysMenu.add(exitMenuIatem);

MyItemListener lis = new MyItemListener();

//初始化按钮事件监听器内部类

this.startMenuItem.addActionListener(lis);

//将三个菜单项注册到事件监听器上

backMenuItem.addActionListener(lis);

exitMenuIatem.addActionListener(lis);

menuBar.add(sysMenu);

//将“系统”菜单添加到菜单栏上

setJMenuBar(menuBar);

//将menuBar设置为菜单栏

toolbar =new JPanel();

//工具面板实例化

startButton = new JButton("重新开始");

//三个按钮初始化

backButton = new JButton("悔棋");

exitButton = new JButton("退出");

toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));

//将工具面板按钮用FlowLayout布局

toolbar.add(startButton);

//将三个按钮添加到工具面板上

toolbar.add(backButton);

toolbar.add(exitButton);

startButton.addActionListener(lis);

//将三个按钮注册监听事件

backButton.addActionListener(lis);

exitButton.addActionListener(lis);

add(toolbar,BorderLayout.SOUTH);

//将工具面板布局到界面“南”方也就是下面

add(chessBoard);//将面板对象添加到窗体上

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//设置界面关闭事件

//setSize(600,650);

pack();

//自适应大小

}

//事件监听器内部类

private class MyItemListener implements ActionListener{

public void actionPerformed(ActionEvent e){

Object obj = e.getSource();

//取得事件源

if(obj == StartChessJFrame.this.startMenuItem || obj ==startButton){

//重新开始

//JFiveFrame.this //内部类引用外部类

System.out.println("重新开始...");

chessBoard.restartGame();

repaint();

}else if (obj == exitMenuIatem || obj == exitButton){

System.exit(0);

//结束应用程序

}else if (obj == backMenuItem || obj == backButton){

//悔棋

System.out.println("悔棋...");

chessBoard.goback();

repaint();

}

}

}

public static void main(String[] args){

StartChessJFrame f = new StartChessJFrame();

//创建主框架

f.setVisible(true);

//显示主框架

}

}

•    结对分工情况

韩爽负责JUnit4的测试部分,徐敏负责代码编写。

•    结对实践过程

(1)对局双方各执一色棋子。

(2)空棋盘开局。

(3)黑先、白后,交替下子,每次只能下一子。

(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。

(5)黑方的第一枚棋子可下在棋盘任意交叉点上。

(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)。

•   测试情况

•   问题及心得

通过这次综合实验,我们将Java程序设计语言所要掌握的基本知识加以贯穿,把分散的知识点提高到对java编程的整体认识,全面体验java面向对象编程的特点,提高综合应用能力。由对语言的基本理解向程序设计层面上转变。

时间: 2024-10-18 23:01:38

合作项目的相关文章

合作项目5

结组成员:信1201-1柴珏辉 信1201-2邓锐 一.要求 1.题目: 返回一个二维数组中最大子数组的和. 2.要求: 输入一个二维整形数组,数组里有正数也有负数. 二维数组首尾相接,象个一条首尾相接带子一样. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n). 3.结对开发要求: 两人结对完成编程任务. 一人主要负责程序分析,代码编程. 一人负责代码复审和代码测试计划. 发表一篇博客文章讲述两人合作中的过程.体会以及如何解决

通用电气、哈电合作项目入选中美绿色合作伙伴计划

中国北京,2014年7月10日 —— 今天,在北京人民大会堂,通用电气公司(GE)与哈尔滨电气集团在2014年度“中美绿色合作伙伴计划” 签字仪式上签署“高效.灵活.低排放重型燃气轮机联合循环发电机组设计和制造示范项目”合作意向书,标志着这一项目正式入选“中美绿色合作伙伴计划”.根据项目意向书,GE将携手哈电在中国推广9HA燃机联合循环发电技术的广泛使用,助力中国提高能源的高效.清洁利用.中国国务委员杨洁篪和美国国务卿约翰•克里参加了2014年度“中美绿色合作伙伴计划” 签字仪式. 当前,中国的

以色列驻华大使馆:中以诸多合作项目正常开展r7

而这,正是曾宪章在创业之外更想做的事.在他看来,与其用十多年的时间成立一家又一家公司,成就自己,不如把已有的知识.经验.人脉等资源整合,帮助更多的人创新创业. 中医药正在成为中国的国际形象标识中新网1月4日电 据外媒4日报道,孟加拉首都达卡一处市场发生火灾,大火从3日凌晨烧起,一直到3日晚间火势才被控制住. 警方当地时间2日到内塔尼亚胡位于耶路撒冷的官邸,向他问话3小时.内塔尼亚胡否认指控,又批评政敌兴风作浪,警告对方"别太早庆祝". 以上印象派诸家,说他们截然和传统对立是片面的.印象

第一次c++团队合作项目第三篇随笔

这次终于想出来了上次问题的解决方法,就是用多态的方法,让小兵,建筑和英雄继承于Object类,通过指针能实现信息的传递. 同时我也完善了地图中每个Pane类的信息,包括每个格子的位置信息,state(包括default, walkable, unwalkable),还有inclusion(包括hero, soldier, building),现在就要看最后的UI生成了. 这是一起合作的图片 原文地址:https://www.cnblogs.com/yisongmx/p/9240863.html

团队合作项目---TeamMakerChat

团队介绍: 队员: 孔梵冰 软工系大二学生 比较喜欢学习 队员: 闫彦霖 软工系大二学生 英俊潇洒,玉树临风,有着基本的编程功底,喜欢与伙伴一起钻研探讨 队员: 张琛 软工系大二学生 一位默默耕种的码农.... 团队项目: 名称:TM聊聊(TeamMakerChat) 介绍:TM聊聊是一款专向当代大学生的交友组队软件,不同于市面上的其他交友软件,TM聊聊额外提供了一个学术性的交友氛围,它为希望在大学学习生涯中 遇到其他专业的学生一起组队比赛,创作,交流提供了一个平台.在当今时代下,伴随着经济社会

团队合作项目----冲刺目标确定

一.团队会议计划 短期内通过进一步的市场调研和需求分析,更加准确的把握用户的需求,确定软件总体功能的方向.根据团队的成员各自擅长的知识和技能,进行初步的任务分配,实现软件的基本框架. 二.团队会议过程 我们团队四人于本周三下午三点在基教开展了一个小组会议,首先对软件将要实现的各项功能进行了具体的分析,然后又对整个项目的backlog进行了梳理,最后通过自愿的原则进行了工作认领. 三.团队的backlog 1.用户界面的设计,包括登录注册界面,商品信息界面,用户信息反馈界面等等. 2.后台管理,包

EmbarrassedBird网站 招募队友中! 团队合作项目

试想现在有如下 尴尬的情景 (情景1) 你写了一封情书准备给心中暗恋很久很久的小Z同学, 我们假设, 你提起来超级无敌巨大的勇气把情书直接交给了小Z, 现在有两种情况 a. 小Z也喜欢你, 欢乐大结局! b. 小Z并不喜欢你, 而且一般情况下, 她可能不知道怎么去拒绝你, 她如果直接拒绝你会令双方陷入尴尬的境地. 因为一旦让小Z看到你写的2000字情书, 是不可回撤的, 那么如果想达到完美结局可以归结到如下两点: a. 不能让"不喜欢你的小Z"看到你辛辛苦苦写的2000字情书. b.

辽台经济合作签约28个项目 共计47亿美元

由国务院台湾事务办公室和辽宁省人民政府共同举办的“第十三届辽宁台湾周”在锦州市举行.在“台湾周”主体活动期间举办辽台经济合作项目洽谈及签约仪式上,辽宁省与台湾共签约28个经济合作项目,总计47.14亿美元. 近五年来,辽台经济合作达到前所未有的热度.截至目前,辽宁省已累计批准台资项目3000多家,台湾许多知名企业在辽宁投资,单体项目投资额不断加大.辽宁全面推动辽宁沿海经济带.沈阳经济区和辽西北的进一步开放.开发和建设,深入拓展辽台产业合作,针对自身的能源.港口等优势,开展对台网络pos机精细化工

优秀的 Android 开源项目

摘要  转载http://www.trinea.cn/android/android-open-source-projects-view/,方便大家找到自己合适的资料 目录[-] 一.ListView 二.ActionBar 三.Menu 四.ViewPager .Gallery 五.GridView 六.ImageView 七.ProgressBar 八.其他 GitHub上优秀Android开源项目 3. Android开发神器 1.Xabber客户端 2.oschina客户端 3.手机安全