天天看点

结对作业

  实验目的

  这个项目在实践中充分体现出了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) {

if (e.getSource()==b1) {

Game_start();

else{

Game_re();

if(e.getSource()==exist){

lblWin.setText(Get_qizi_color(color_Qizi)+"输了!");

intGame_Start=0;

}  

2.编写一个功能判断落子的位置及画出相应的黑白棋子

public void set_Qizi(int x,int y) //落子{

if (intGame_Start==0) //判断游戏未开始{

if (intGame_Body[x/20][y/20]!=0) {

if (color_Qizi==1)//判断黑子还是白子{

g.setColor(Color.black);

color_Qizi=0;

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)+"赢了!");

if (Game_win_2(x/20,y/20)) //判断输赢2{

if (Game_win_3(x/20,y/20)) //判断输赢3{

if (Game_win_4(x/20,y/20)) //判断输赢4{

}  }

具体实现

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;

CheckboxGroup ckgHB=new CheckboxGroup();

NetchatClient chat=new NetchatClient();

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].setBounds(320,20,60,30);

ckbHB[1].setBounds(380,20,60,30);

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()) //选择黑子还是白子{

public void mousePressed(MouseEvent e){}

public void actionPerformed(ActionEvent e) {

else {

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

if (Game_win_2(x/20,y/20)){ //判断输赢2

//判断输赢程序实现在详细过程

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;

for (int i=1;i<5 ;i++ ){

if (x1<1)

if(intGame_Body[x1-i][y1]==intGame_Body[x][y])

if (t>4){

return true;

return false;

public boolean Game_win_2(int x,int y) { //纵向判断输赢

if (x1>15){

if (intGame_Body[x1][y1+i]==intGame_Body[x][y]){

if (x1<1){

if(intGame_Body[x1][y1-i]==intGame_Body[x][y]){

public boolean Game_win_3(int x,int y) //左斜判断输赢{

if (intGame_Body[x1+i][y1-i]==intGame_Body[x][y]){

if(intGame_Body[x1-i][y1+i]==intGame_Body[x][y]){

}}

public boolean Game_win_4(int x,int y) { //左斜判断输赢 

if (x1>15) {

if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]) {

else

{

if (x1<1) {

if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]) {

break; } }

if (t>4) {

(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{

public void itemStateChanged(ItemEvent e){

if (ckbHB[0].getState()) //选择黑子还是白子

public void mouseClicked(MouseEvent e){

if (e.getX()<20 || e.getX()>300 || e.getY()<20 || e.getY()>300){

if (x1%20>10){

if(y1%20>10){

public void actionPerformed(ActionEvent e){

if (e.getSource()==b1){

// color_Qizi=m;

public void paint(Graphics g){

public void set_Qizi(int x,int y){ //落子

if (intGame_Start==0) {//判断游戏未开始

if (intGame_Body[x/20][y/20]!=0){

if (color_Qizi==1){//判断黑子还是白子

if (Game_win_2(x/20,y/20)){ //判断输赢2{

if (Game_win_3(x/20,y/20)){ //判断输赢3

if (Game_win_4(x/20,y/20)){ //判断输赢4

public String Get_qizi_color(int x)

if (x==0)

return "黑子";

return "白子";

public void draw_qipan(Graphics G){ //画棋盘 15*15

public void Game_start(){ //游戏开始

intGame_Start=1;

Game_btn_enable(false);

b2.setEnabled(true);

public void Game_start_csh() {//游戏开始初始化

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();

public void Game_btn_enable(boolean e){ //设置组件状态

b1.setEnabled(e);

b2.setEnabled(e);

ckbHB[0].setEnabled(e);

ckbHB[1].setEnabled(e);

if (intGame_Body[x1+i][y1]==intGame_Body[x][y]){

if(intGame_Body[x1-i][y1]==intGame_Body[x][y]){

public boolean Game_win_2(int x,int y){ //纵向判断输赢

public boolean Game_win_3(int x,int y){ //左斜判断输赢 

public boolean Game_win_4(int x,int y){ //左斜判断输赢 

if (intGame_Body[x1+i][y1+i]==intGame_Body[x][y]){

if(intGame_Body[x1-i][y1-i]==intGame_Body[x][y]){

4.软件操作说明及功能截图

(1).进入游戏的界面

结对作业

(2).选择角色和开始游戏

结对作业

(3).判断输赢的情况

结对作业

    实验心得 :

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

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