这是本人最近一段时间写的斗地主的java代码,大体框架都实现了,一些细节还需要后续优化。

package basegame;

import java.awt.Button;
import java.awt.Color;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.Point;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent; import javax.swing.JFrame;
import javax.swing.JOptionPane; import msg.RestartGameMsg;
import socket.GameServer;
import socket.NetClient; /***************************************************************************
* TODO
* <br>Created on 2013-6-28 下午7:45:13<br>
* @author daicy
***************************************************************************/
public class GameFrame extends JFrame { private Player[] players = new Player[2]; //private GameThread gameThread; private ChessBoard chessBoard; public int lordIndex = -1; public int turnIndex = -1; public int id; public GameFrame(String name){ initMain();// 初始化 //this.setlord(1);
reStart(); setVisible(true); //new Thread(new PaintThread()).start();
dialog.setVisible(true);
} // 初始化窗体
private void initMain() {
{
setBackground(new Color(0, 112, 26)); // 背景为绿色
setTitle("五子棋");
setSize(536,546);
setResizable(false);
setLocationRelativeTo(getOwner()); // 屏幕居中
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} } // 初始化窗体
public void reStart() { players[0] = new Player(0+"",0);
players[0].userState = 0;
players[0].setChessNum(1); players[1] = new Player(1+"",1);
players[1].userState = 0;
players[1].setChessNum(2); if(null!=chessBoard){
this.remove(chessBoard);
} chessBoard = new ChessBoard(this); add(chessBoard); chessBoard.repaint(); // gameThread = new GameThread(this);
//
// gameThread.start();
//
// gameThread.gameState = 2;
//
// turnIndex = 1; } public static void main(String args[]) {
GameFrame GamePanel = new GameFrame("daicy"); } public Player[] getPlayers() {
return players;
} public void setPlayers(Player[] players) {
this.players = players;
} public ChessBoard getChessBoard() {
return chessBoard;
} public void setChessBoard(ChessBoard chessBoard) {
this.chessBoard = chessBoard;
} public void sendXY(int id,Point point){
getPlayers()[id].setCurrentChesse(point);
getChessBoard().chesses[point.x][point.y] = getPlayers()[id].getChessNum();
getChessBoard().repaint(); if (new FiveChessAI(getChessBoard().chesses,2,1).
showWin(point.x, point.y, getPlayers()[id].getChessNum())) {
setWinById(getPlayers()[id].getChessNum());
} } public void setWinById(int id){
chessBoard.removeMouseListener(chessBoard);
chessBoard.removeMouseListener(chessBoard);
String s = "恭喜电脑" + id + ",赢了! 你的智商有待提高哦";
JOptionPane.showMessageDialog(this, s);
RestartGameMsg msg = new RestartGameMsg();
gameThread.send(msg); } public NetClient gameThread = new NetClient(this); ConnDialog dialog = new ConnDialog(); class ConnDialog extends Dialog {
Button b = new Button("确定"); TextField tfIP = new TextField("127.0.0.1", 12); TextField tfPort = new TextField("" + GameServer.TCP_PORT, 4); TextField tfMyUDPPort = new TextField("2223", 4); public ConnDialog() {
super(GameFrame.this, true); this.setLayout(new FlowLayout());
this.add(new Label("IP:"));
this.add(tfIP);
this.add(new Label("Port:"));
this.add(tfPort);
this.add(new Label("My UDP Port:"));
this.add(tfMyUDPPort);
this.add(b);
this.setLocation(300, 300);
this.pack();
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
setVisible(false);
}
});
b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
String IP = tfIP.getText().trim();
int port = Integer.parseInt(tfPort.getText().trim());
int myUDPPort = Integer.parseInt(tfMyUDPPort.getText()
.trim());
gameThread.setUdpPort(myUDPPort);
gameThread.connect(IP, port);
setVisible(false);
} });
} } }

package basegame;

import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener; import javax.swing.JPanel; import msg.SendMoveMsg;
import msg.YourTurnMsg; /***************************************************************************
* TODO
* <br>Created on 2013-7-3 下午8:26:59<br>
* @author daicy
***************************************************************************/
public class ChessBoard extends JPanel implements MouseListener,MouseMotionListener{ private Image chessBoard ; private Image white ; private Image black ; public Image toClickFlag ; public Image clickedFlag ; public static int chessSize = 35; //棋子宽度 //棋盘 private static final int GRIDNUM = 15; public static final int GRID = 35; //棋盘格子的边长 public static int BORDER = 20; //棋盘边框宽度 private int width,height; private GameFrame mainFrame; public int[][] chesses = new int[15][15]; //用于记录棋盘上那些位置已落子 0 空,1黑子,2白子 int mousex ;
int mousey ; public ChessBoard(GameFrame mainFrame){ initImage(); this.mainFrame = mainFrame; initOther(); addMouseListener(this); addMouseMotionListener(this); setVisible(true); } // 初始化窗体
private void initOther() {
width = chessBoard.getWidth(this); height = chessBoard.getHeight(this); setSize(width,height); BORDER = (width - (GRIDNUM-1)* GRID)/2; } private void initImage(){
//Loading Images
MediaTracker tracker = new MediaTracker(this);//Used to track loading of image
Toolkit toolkit = Toolkit.getDefaultToolkit(); //loading images from jar file chessBoard = toolkit.getImage("Res//FiveChessBoard.jpg"); white = toolkit.getImage("Res//White.gif"); black = toolkit.getImage("Res//Black.gif"); toClickFlag = toolkit.getImage("Res//Selected.gif"); clickedFlag = toolkit.getImage("Res//Clicked.gif"); tracker.addImage(chessBoard, 1);
tracker.addImage(white, 1);
tracker.addImage(black, 1); tracker.addImage(toClickFlag, 1);
tracker.addImage(clickedFlag, 1); try {
//Waiting until image loaded.
tracker.waitForAll();
} catch (InterruptedException e) {
} chessSize = white.getHeight(this);
} @Override
/**
* 重写父类的重画方法
*/
public void paint(Graphics g) {
g.drawImage(chessBoard, 0, 0, this);
for (int i = 0; i < mainFrame.getPlayers().length; i++) {
drawMyChess(g);
} if(this.mainFrame.turnIndex==mainFrame.id){
g.drawImage(toClickFlag, mousex*GRID+BORDER-chessSize/2, mousey*GRID+BORDER-chessSize/2, null);
}else if(this.mainFrame.turnIndex>-1){
if(null!= mainFrame.getPlayers()[mainFrame.turnIndex].getCurrentChesse()){
int mousex = mainFrame.getPlayers()[mainFrame.turnIndex].getCurrentChesse().x;
int mousey = mainFrame.getPlayers()[mainFrame.turnIndex].getCurrentChesse().y;
g.drawImage(clickedFlag, mousex*GRID+BORDER-5, mousey*GRID+BORDER-5, null);
}
}
} public void drawMyChess(Graphics g) {
// GRID = 35; //棋盘格子的边长
//
// public static int BORDER = 20; //棋盘边框宽度
for (int i = 0; i < chesses.length; i++) {
for (int j = 0; j < chesses[i].length; j++) {
if(chesses[i][j]==1){
g.drawImage(black, i*GRID+BORDER-chessSize/2, j*GRID+BORDER-chessSize/2, null);
}else if(chesses[i][j]==2){
g.drawImage(white, i*GRID+BORDER-chessSize/2, j*GRID+BORDER-chessSize/2, null);
}
}
}
} @Override
public void mouseClicked(MouseEvent e) {
// TODO Auto-generated method stub
if(this.mainFrame.turnIndex==mainFrame.id){
int x = e.getX()/GRID;
int y = e.getY()/GRID;
if(chesses[x][y]==0){
Point point = new Point(x,y);
SendMoveMsg msg = new SendMoveMsg(this.mainFrame.turnIndex,point);
mainFrame.gameThread.send(msg); YourTurnMsg msgs = new YourTurnMsg((mainFrame.turnIndex+1)%2);
mainFrame.gameThread.send(msgs);
// mainFrame.getPlayers()[mainFrame.turnIndex].setCurrentChesse(new Point(x,y));
// chesses[x][y] = mainFrame.getPlayers()[mainFrame.turnIndex].getChessNum();
// mainFrame.turnIndex = (mainFrame.turnIndex+1)%2;
// mainFrame.repaint();
} }
} @Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub } @Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub } public void mouseDragged(MouseEvent e) {
} //移动
public void mouseMoved(MouseEvent e) {
if(this.mainFrame.id==mainFrame.turnIndex){
mousex = e.getX()/GRID;
mousey = e.getY()/GRID; repaint();//重画
}else{
setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
} } }

package basegame;

import java.awt.Point;

public class Player {

    public Point currentChesse ;        //用于记录自己刚走过的棋子 

	private String name ;

	private Integer id ;

	private Integer chessNum ;

	public int userState = -1; // 0 准备  1 抢地主  2 出牌;

	public Player(String name, Integer id) {
super();
this.name = name;
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Point getCurrentChesse() {
return currentChesse;
} public void setCurrentChesse(Point currentChesse) {
this.currentChesse = currentChesse;
} public Integer getChessNum() {
return chessNum;
} public void setChessNum(Integer chessNum) {
this.chessNum = chessNum;
} }

java——棋牌类游戏五子棋(webwzq1.0)之一(基础)的更多相关文章

  1. android开发之网络棋牌类在线游戏开发心得(服务器端、Java) 好文章值得收藏

    标签: android服务器 2013-10-09 17:28 3618人阅读 评论(0) 收藏 举报 分类: android(11) 转自:http://blog.csdn.net/bromon/a ...

  2. CCF201512-2 消除类游戏 java(100分)

    试题编号: 201512-2 试题名称: 消除类游戏 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进 ...

  3. 网狐6603 cocos2dx 棋牌、捕鱼、休闲类游戏《李逵捕鱼》手机端完整源码分析及分享

    该资源说明: cocos2d 棋牌.捕鱼.休闲类游戏<李逵捕鱼>手机端完整源码,网狐6603配套手机版源码,可以选桌子,适合新手学习参考,小编已亲测试,绝对完整可编译手机端,下载后将文件考 ...

  4. java导出数据EXCEL的工具类(以spring-webmvc-4.0.4jar为基础)

    1.本工具类继承于  spring-webmvc-4.0.4jar文件心中的一个类   AbstractExcelView 2.代码如下 package com.skjd.util; import j ...

  5. C++ MFC棋牌类小游戏day1

    好用没用过C++做一个完整一点的东西了,今天开始希望靠我这点微薄的技术来完成这个小游戏. 我现在的水平应该算是菜鸟中的战斗鸡了,所以又很多东西在设计和技术方面肯定会有很大的缺陷,我做这个小游戏的目的单 ...

  6. JAVA小项目之五子棋

    五子棋V1.0 功能: 人人对战,人机对战(初级) 记录双方分数: 主要知识点: 二维坐标系中,各方向坐标的关系及规律. 效果图: 主框架类: package com.gxlee.wzq; /** * ...

  7. 《Unity3D/2D游戏开发从0到1》正式出版发行

    <Unity3D/2D游戏开发从0到1>正式出版发行 去年个人编写的Unity书籍正式在2015年7月正式发行,现在补充介绍一下个人著作.书籍信息:      书籍的名称: <Uni ...

  8. Java太阳系小游戏分析和源代码

    Java太阳系小游戏分析和源代码 -20150809 近期看了面向对象的一些知识.然后跟着老师的解说做了一个太阳系各行星绕太阳转的小游戏,来练习巩固一下近期学的知识: 用到知识点:类的继承.方法的重载 ...

  9. 消除类游戏(js版)

    最近一直在玩一款消灭星星的消除类游戏,周末无聊就用js也写了一遍,感觉玩比写还困难一直玩不到10000分.废话不多说直接上源码. 效果图(ps 页面有点难看木有美工) 代码总共456行,未经过严格测试 ...

  10. Java:类与继承

    Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础.抽象.封装.继承.多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知 ...

随机推荐

  1. Java并发编程之验证volatile的可见性

    Java并发编程之验证volatile的可见性 通过系列文章的学习,凯哥已经介绍了volatile的三大特性.1:保证可见性 2:不保证原子性 3:保证顺序.那么怎么来验证可见性呢?本文凯哥将通过代码 ...

  2. jstack排查cpu占用高的步骤

    通过jstack排查cpu占用高的问题 1.通过top命令找到cpu占用高的应用程序进程 2.通过top -H -p pid查看该应用中占用CPU高的线程. 3.通过printf "%x\n ...

  3. FFmpeg开发笔记(五十一)适合学习研究的几个音视频开源框架

    ​很多程序员想学习音视频的编程开发,却不知从何学习,因为音视频技术的体系庞大.知识杂糅,一眼望去就令人生怯.那么学习音视频建议站在前人的肩膀上,从优秀的音视频开源框架开始钻研,先熟悉这些开源工具的具体 ...

  4. 【合合TextIn】深度解析智能文档处理技术与应用

    一.智能文档处理介绍 智能文档处理(Intelligent Document Processing, IDP)是利用人工智能(AI).机器学习(ML).计算机视觉(CV).自然语言处理(NLP)等技术 ...

  5. Figma 学习笔记 – Constraints 约束

    用途 Constraints 用于 responsive design, 子元素和父元素建立约束关系后, 当父元素 dimension 变换的时候, 子元素会做出相应的变化 (移动位置或 resize ...

  6. select框多选(利用Bootstrap-select)

    前端HTML: <select id="usertype" multiple class="selectpicker" style="width ...

  7. excel江湖异闻录--修迪斯.嗦狸

    因为技术出类拔萃,同学都尊称他为"修神",修神的python.vba.Javascript.java.数据库.批处理等众多编程语言都是极强的,以笔者的见识来判断,大佬的vba已经是 ...

  8. meminfo一些容易混淆的点

    MemTotal: 688576 kB 总内存 MemFree: 153736 kB 空闲内存 MemAvailable: 339884 kB 可用内存 Buffers: 16 kB 给文件的缓冲大小 ...

  9. iOS开发Block使用详解

    项目开发中经常会用到页面之间传值的问题,常用的方法是通知.单例.代理.block等.最近项目忙完,有空细细研究了一下block的用法,收货多多. block又称闭包,它的实现原理是c语言的函数指针.函 ...

  10. base64 是什么,有什么作用?

    base64 是图片编码的一种形式,可以替代图片的url进行网络访问和请求等操作: 使用图片的url形式操作图片,每次都要请求一次网络,因为每次请求都是一个http:都是一个网络开销,都是对服务器的负 ...