结对作业

  实验目的

  这个项目在实践中充分体现出了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,然后根据自己的情况分配了各自的任务,每个人下去根据自己的任务找资料学习。在学习阶段,我们也互相交流进一步确定了程序要实现的细节,和整体框架。在感觉思考成熟之后,开始着手编程。编程的时候,大部分时间是两人一起编写,在责任人编写其负责的代码时,另一个人在旁边了解思路,帮助找出错误,并了解如何对接彼此的程序。在编程期间,我们也互相鼓励,战胜编程时的枯燥,最终完成了项目。通过此次项目的完成,我们增进了彼此的友谊,锻炼了编程合作能力,同时也从对方身上学习到了很多编程知识。

此外,此次项目给我最深的感受就是,计算机作为一门实用学科,特别是学习编程,动手实践才是学习最有效率的途径,而不是老是盯着书本。在这次项目中,我学会了团队合作。

posted @ 2015-05-17 22:50  diaoxiankai  阅读(230)  评论(5编辑  收藏  举报