天天看點

結對作業

  實驗目的

  這個項目在實踐中充分展現出了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,然後根據自己的情況配置設定了各自的任務,每個人下去根據自己的任務找資料學習。在學習階段,我們也互相交流進一步确定了程式要實作的細節,和整體架構。在感覺思考成熟之後,開始着手程式設計。程式設計的時候,大部分時間是兩人一起編寫,在責任人編寫其負責的代碼時,另一個人在旁邊了解思路,幫助找出錯誤,并了解如何對接彼此的程式。在程式設計期間,我們也互相鼓勵,戰勝程式設計時的枯燥,最終完成了項目。通過此次項目的完成,我們增進了彼此的友誼,鍛煉了程式設計合作能力,同時也從對方身上學習到了很多程式設計知識。

此外,此次項目給我最深的感受就是,計算機作為一門實用學科,特别是學習程式設計,動手實踐才是學習最有效率的途徑,而不是老是盯着書本。在這次項目中,我學會了團隊合作。