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