这是本人最近一段时间写的斗地主的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. IDEA maven 项目 如何获取项目离线运行所需的全部依赖( .m2格式)

    背景:maven项目要将整个项目的依赖移植到某无法联网服务器进行测试,需要项目离线运行所需的全部依赖 步骤: 1. 首先需要有项目源码,解压后,使用IDEA Open Project 2. 在Sett ...

  2. 【YashanDB知识库】手动停止统计信息自动收集任务导致的性能变差

    [问题分类]功能使用 [关键字]统计信息收集 [问题描述]UAT对外演示环境因统计信息收集任务引起数据库整理性能变慢无应急处理手段 [问题原因分析] ● DROP_JOB程序用于删除一个非执行状态下的 ...

  3. 【YashanDB知识库】kettle从DM8的number类型同步到YashanDB的varchar类型,存入是科学计数法形式的数据

    [标题]kettle从DM8的number类型同步到YashanDB的varchar类型,存入是科学计数法形式的数据 [问题分类]数据导入导出 [关键字]数据同步,number类型,科学计数法 [问题 ...

  4. ChatGPT介绍与使用场景

    ChatGPT是OpenAI开发的一款基于GPT-3和GPT-4的人工智能聊天机器人."GPT"代表的是"Generative Pre-trained Transform ...

  5. Java实现英语作文单词扫盲程序

    来自背英语四级单词的突发奇想: 是否可以通过Java语言实现一个随机抽取作文中单词进行复习的程序. 首先,展示下成果: 点击查看代码 package Demo; import java.util.Ar ...

  6. 数据库MySQL-安装、卸载、配置、登录、退出

    一.下载 下载链接:MySQL :: Download MySQL Community Server (Archived Versions) 二.安装(解压)  三.配置 1.添加环境变量 我的电脑- ...

  7. 向量法求 T3 这个若智 r^2

    int sqr_vector_dis(node a){ return a.x*a.x+a.y*a.y; } frac vector_multi(node a,node b){ return frac( ...

  8. 八字测算引流seo程序php网页版黄历/排盘/抽签/星座/生肖/解梦整站程序分享

    2演示站: https://s31.yczfcn.com/ 2源码说明: 1.手机端和PC端共两套模板,手机端访问时候自动跳转至手机端模板和域名. 2.本程序包含文章系统,结合自身的免费测算功能,适合 ...

  9. “技术沙龙”来袭,邀您一同探讨 Serverless 数据库技术最佳实践

    如今,随着数据库的上云趋势,企业用户对业务连续性的要求越来越高,基于Serverless架构下的数据库也应运而生. Serverless数据库技术可以满足客户在公有云计算环境下根据业务发展弹性扩展集群 ...

  10. Android复习(三)清单文件中的元素——> activity

    转自:  https://developer.android.google.cn/guide/topics/manifest/activity-element <activity> 语法: ...