结对作业
实验目的
这个项目在实践中充分体现出了Java面向对象给我们带来的方便。多用户聊天程序也让我体会到了Java多线程的强大功能。要求实现一个简单的多用户五子棋胡游戏程序,包括如下两个界面:选择对弈桌及角色(执黑、执白、观看)。
github网址
http://www.cnblogs.com/diaoxiankai/
实验过程
在游戏界面,有开始,退出(游戏未结束、点退出自动判负);发言及显示区用户列表区;棋盘绘制区。
工作原理图:
1.建立一个棋盘类,绘制棋盘的样式,在棋盘面板上添加各种按钮及相应胡触发事件。同时注意面板的设计,使面板设计的尽量胡的合理美观。
a.棋盘的绘制
public void draw_qipan(Graphics G) //画棋盘 15*15{
G.setColor(Color.lightGray);
G.fill3DRect(10,10,300,300,true);
G.setColor(Color.black);
for(int i=1;i<16;i++){
G.drawLine(20,20*i,300,20*i);
G.drawLine(20*i,20,20*i,300);
}
}
b.添加按钮与按钮胡规划
Button b1=new Button("开始");
Button b2=new Button("重置游戏");
Label lblWin=new Label(" ");
Checkbox ckbHB[]=new Checkbox[3];
Button exist = new Button("退出");
public void init(){
ckbHB[0]=new Checkbox("执白",ckgHB,false);
ckbHB[1]=new Checkbox("执黑",ckgHB,false);
ckbHB[2]=new Checkbox("观看",ckgHB, false);
}
C.鼠标棋子胡相应触发事件
public void mouseClicked(MouseEvent e) {
Graphics g=getGraphics();
int x1,y1;
x1=e.getX();
y1=e.getY();
if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300) {
return;
}
if (x1%20>10) {
x1+=10;
}
if(y1%20>10) {
y1+=10;
}
x1=x1/20*20;
y1=y1/20*20;
set_Qizi(x1,y1);
m*=(-1);
}
d.按钮的触发事件
public void actionPerformed(ActionEvent e) {
Graphics g=getGraphics();
if (e.getSource()==b1) {
Game_start();
}
else{
Game_re();
}
if(e.getSource()==exist){
Game_re();
lblWin.setText(Get_qizi_color(color_Qizi)+"输了!");
intGame_Start=0;
}
2.编写一个功能判断落子的位置及画出相应的黑白棋子
public void set_Qizi(int x,int y) //落子{
if (intGame_Start==0) //判断游戏未开始{
return;
}
if (intGame_Body[x/20][y/20]!=0) {
return;
}
Graphics g=getGraphics();
if (color_Qizi==1)//判断黑子还是白子{
g.setColor(Color.black);
color_Qizi=0;
}
else{
g.setColor(Color.white);
color_Qizi=1;
}
g.fillOval(x-10,y-10,20,20);
intGame_Body[x/20][y/20]=color_Qizi+1;
}
3.判断胜负
if (Game_win_1(x/20,y/20)) //判断输赢1{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_2(x/20,y/20)) //判断输赢2{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_3(x/20,y/20)) //判断输赢3{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_4(x/20,y/20)) //判断输赢4{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
} }
具体实现
1.创建棋盘类
Public class WcyChess extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener{
int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子
int intGame_Start=0;//游戏开始标志 0未开始 1游戏中
int intGame_Body[][]=new int[16][16]; //设置棋盘棋子状态
int m=-1;
Button b1=new Button("开始");
Button b2=new Button("重置游戏");
Label lblWin=new Label(" ");
Checkbox ckbHB[]=new Checkbox[3];
Button exist = new Button("退出");
CheckboxGroup ckgHB=new CheckboxGroup();
NetchatClient chat=new NetchatClient();
public void init(){
setLayout(null);
addMouseListener(this);
add(b1);
b1.setBounds(330,50,80,30);
b1.addActionListener(this);
add(b2);
b2.setBounds(330,90,80,30);
b2.addActionListener(this);
ckbHB[0]=new Checkbox("执白",ckgHB,false);
ckbHB[0].setBounds(320,20,60,30);
ckbHB[1]=new Checkbox("执黑",ckgHB,false);
ckbHB[1].setBounds(380,20,60,30);
ckbHB[2]=new Checkbox("观看",ckgHB, false);
add(ckbHB[0]);
add(ckbHB[1]);
add(ckbHB[2]);
ckbHB[0].addItemListener(this);
ckbHB[1].addItemListener(this);
add(lblWin);
lblWin.setBounds(330,180,80,30);
lblWin.setBackground(Color.red);
lblWin.setText("胜利者!");//没有显示?
ckbHB[2].setBounds(440, 20,60, 30);
add(exist);
exist.setBounds(330,130,80,30);
exist.addActionListener(this);
// add(chat);chat.setBounds(20, 500, 300, 300);
chat.frame();
chat.setVisible(true);
Game_start_csh();
setSize(500,600);
setVisible(true);
}
public void itemStateChanged(ItemEvent e) {
if (ckbHB[0].getState()) //选择黑子还是白子{
color_Qizi=0;
}
else{
color_Qizi=1;
}
}
public void mousePressed(MouseEvent e){}
public void mouseClicked(MouseEvent e) {
Graphics g=getGraphics();
int x1,y1;
x1=e.getX();
y1=e.getY();
if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300) {
return;
}
if (x1%20>10) {
x1+=10;
}
if(y1%20>10) {
y1+=10;
}
x1=x1/20*20;
y1=y1/20*20;
set_Qizi(x1,y1);
m*=(-1);
}
public void actionPerformed(ActionEvent e) {
Graphics g=getGraphics();
if (e.getSource()==b1) {
Game_start();
}
else {
Game_re();
}
if(e.getSource()==exist){
Game_re();
lblWin.setText(Get_qizi_color(color_Qizi)+"输了!");
intGame_Start=0;
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseDragged(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void paint(Graphics g) {
draw_qipan(g);
}
2判断输赢功能实现
if (Game_win_1(x/20,y/20)){ //判断输赢1
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_2(x/20,y/20)){ //判断输赢2
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_3(x/20,y/20)) //判断输赢3{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_4(x/20,y/20)) //判断输赢4{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
//判断输赢程序实现在详细过程
public boolean Game_win_1(int x,int y){ //横向判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ) {
if (x1>15) {
break;
}
if (intGame_Body[x1+i][y1]==intGame_Body[x][y]) {
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1)
break;
}
if(intGame_Body[x1-i][y1]==intGame_Body[x][y])
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}
}
public boolean Game_win_2(int x,int y) { //纵向判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ){
if (x1>15){
break;
}
if (intGame_Body[x1][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1){
break;
}
if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}
}
public boolean Game_win_3(int x,int y) //左斜判断输赢{
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ){
if (x1>15){
break;
}
if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1){
break;
}
if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}}
public boolean Game_win_4(int x,int y) { //左斜判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ) {
if (x1>15) {
break;
}
if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]) {
t+=1;
}
else
{
break;
}
}
for (int i=1;i<5 ;i++ ) {
if (x1<1) {
break;
}
if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]) {
t+=1;
}
else{
break; } }
if (t>4) {
return true;
}
else{
return false;
}
}
(3)类详细代码:
import java.net.*;
import java.io.*;
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;
import java.awt.Color;
public class WcyChess extends Applet implements ActionListener,MouseListener,MouseMotionListener,ItemListener{
int color_Qizi=0;//旗子的颜色标识 0:白子 1:黑子
int intGame_Start=0;//游戏开始标志 0未开始 1游戏中
int intGame_Body[][]=new int[16][16]; //设置棋盘棋子状态
int m=-1;
Button b1=new Button("开始");
Button b2=new Button("重置游戏");
Label lblWin=new Label(" ");
Checkbox ckbHB[]=new Checkbox[3];
Button exist = new Button("退出");
CheckboxGroup ckgHB=new CheckboxGroup();
public void init(){
setLayout(null);
addMouseListener(this);
add(b1);
b1.setBounds(330,50,80,30);
b1.addActionListener(this);
add(b2);
b2.setBounds(330,90,80,30);
b2.addActionListener(this);
ckbHB[0]=new Checkbox("执白",ckgHB,false);
ckbHB[0].setBounds(320,20,60,30);
ckbHB[1]=new Checkbox("执黑",ckgHB,false);
ckbHB[1].setBounds(380,20,60,30);
ckbHB[2]=new Checkbox("观看",ckgHB, false);
add(ckbHB[0]);
add(ckbHB[1]);
add(ckbHB[2]);
ckbHB[0].addItemListener(this);
ckbHB[1].addItemListener(this);
add(lblWin);
lblWin.setBounds(330,180,80,30);
lblWin.setBackground(Color.red);
lblWin.setText("胜利者!");//没有显示?
ckbHB[2].setBounds(440, 20,60, 30);
add(exist);
exist.setBounds(330,130,80,30);
exist.addActionListener(this);
// add(chat);chat.setBounds(20, 500, 300, 300);
Game_start_csh();
setSize(500,600);
setVisible(true);
}
public void itemStateChanged(ItemEvent e){
if (ckbHB[0].getState()) //选择黑子还是白子
{
color_Qizi=0;
}
else
{
color_Qizi=1;
}
}
public void mousePressed(MouseEvent e){}
public void mouseClicked(MouseEvent e){
Graphics g=getGraphics();
int x1,y1;
x1=e.getX();
y1=e.getY();
if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300){
return;
}
if (x1%20>10){
x1+=10;
}
if(y1%20>10){
y1+=10;
}
x1=x1/20*20;
y1=y1/20*20;
set_Qizi(x1,y1);
m*=(-1);
}
public void actionPerformed(ActionEvent e){
Graphics g=getGraphics();
if (e.getSource()==b1){
Game_start();
}
else{
Game_re();
}
if(e.getSource()==exist){
Game_re();
// color_Qizi=m;
lblWin.setText(Get_qizi_color(color_Qizi)+"输了!");
intGame_Start=0;
}
}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseDragged(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void paint(Graphics g){
draw_qipan(g);
}
public void set_Qizi(int x,int y){ //落子
if (intGame_Start==0) {//判断游戏未开始
return;
}
if (intGame_Body[x/20][y/20]!=0){
return;
}
Graphics g=getGraphics();
if (color_Qizi==1){//判断黑子还是白子
g.setColor(Color.black);
color_Qizi=0;
}
else{
g.setColor(Color.white);
color_Qizi=1;
}
g.fillOval(x-10,y-10,20,20);
intGame_Body[x/20][y/20]=color_Qizi+1;
if (Game_win_1(x/20,y/20)){ //判断输赢1
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_2(x/20,y/20)){ //判断输赢2{
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_3(x/20,y/20)){ //判断输赢3
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
if (Game_win_4(x/20,y/20)){ //判断输赢4
lblWin.setText(Get_qizi_color(color_Qizi)+"赢了!");
intGame_Start=0;
}
}
public String Get_qizi_color(int x)
{
if (x==0)
{
return "黑子";
}
else
{
return "白子";
}
}
public void draw_qipan(Graphics G){ //画棋盘 15*15
G.setColor(Color.lightGray);
G.fill3DRect(10,10,300,300,true);
G.setColor(Color.black);
for(int i=1;i<16;i++){
G.drawLine(20,20*i,300,20*i);
G.drawLine(20*i,20,20*i,300);
}
}
public void Game_start(){ //游戏开始
intGame_Start=1;
Game_btn_enable(false);
b2.setEnabled(true);
}
public void Game_start_csh() {//游戏开始初始化
intGame_Start=0;
Game_btn_enable(true);
b2.setEnabled(false);
ckbHB[0].setState(true);
for (int i=0;i<16 ;i++ ){
for (int j=0;j<16 ;j++ ){
intGame_Body[i][j]=0;
}
}
lblWin.setText("");
}
public void Game_re(){ //重新开始游戏
repaint();
Game_start_csh();
}
public void Game_btn_enable(boolean e){ //设置组件状态
b1.setEnabled(e);
b2.setEnabled(e);
ckbHB[0].setEnabled(e);
ckbHB[1].setEnabled(e);
}
public boolean Game_win_1(int x,int y){ //横向判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ){
if (x1>15){
break;
}
if (intGame_Body[x1+i][y1]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1){
break;
}
if(intGame_Body[x1-i][y1]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}
}
public boolean Game_win_2(int x,int y){ //纵向判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ){
if (x1>15){
break;
}
if (intGame_Body[x1][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1){
break;
}
if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}
}
public boolean Game_win_3(int x,int y){ //左斜判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ){
if (x1>15){
break;
}
if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1){
break;
}
if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}
}
public boolean Game_win_4(int x,int y){ //左斜判断输赢
int x1,y1,t=1;
x1=x;
y1=y;
for (int i=1;i<5 ;i++ ){
if (x1>15){
break;
}
if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
for (int i=1;i<5 ;i++ ){
if (x1<1){
break;
}
if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]){
t+=1;
}
else{
break;
}
}
if (t>4){
return true;
}
else{
return false;
}
}
}
4.软件操作说明及功能截图
(1).进入游戏的界面
(2).选择角色和开始游戏
(3).判断输赢的情况
实验心得 :
本次项目采取结对编程的方式进行。在项目初期,我们两人讨论了项目方向与内容确定做五子棋的2D到3D,然后根据自己的情况分配了各自的任务,每个人下去根据自己的任务找资料学习。在学习阶段,我们也互相交流进一步确定了程序要实现的细节,和整体框架。在感觉思考成熟之后,开始着手编程。编程的时候,大部分时间是两人一起编写,在责任人编写其负责的代码时,另一个人在旁边了解思路,帮助找出错误,并了解如何对接彼此的程序。在编程期间,我们也互相鼓励,战胜编程时的枯燥,最终完成了项目。通过此次项目的完成,我们增进了彼此的友谊,锻炼了编程合作能力,同时也从对方身上学习到了很多编程知识。
此外,此次项目给我最深的感受就是,计算机作为一门实用学科,特别是学习编程,动手实践才是学习最有效率的途径,而不是老是盯着书本。在这次项目中,我学会了团队合作。