几个不算完整的小项目:
一 : 豆子吃妖精?
/**独立一个类,设置豆子的位置和图片...
* */
package lyh.projects.pacman;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
/*读入所有要用到的图片到内存中..
* 还有图片的位置...
* */
public class PacMan {
Rectangle rt; //控制图片的位置....
BufferedImage current;
BufferedImage c1;
BufferedImage c2;
BufferedImage c3;
BufferedImage c4;
//在实例化这个类的时候,就通过构造读入内存中...
public PacMan(){
rt = new Rectangle(220,350,35,35);
try{
//获得地址...读入内存...
current = ImageIO.read(this.getClass().getResourceAsStream("/images/stop.png"));
//多读几张图片,换方向
c1 = ImageIO.read(this.getClass().getResourceAsStream("/images/u.png"));
c2 = ImageIO.read(this.getClass().getResourceAsStream("/images/d.png"));
c3 = ImageIO.read(this.getClass().getResourceAsStream("/images/l.png"));
c4 = ImageIO.read(this.getClass().getResourceAsStream("/images/r.png"));
}catch(IOException e){
e.printStackTrace();
}
}
// public static void main(String[] args){
// PacMan man = new PacMan();
// }
}
/**独立一个类,设置保存妖精的位置和图片...
* */
package lyh.projects.pacman;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
/*读入所有要用到的图片到内存中..
* 还有图片的位置...
* */
public class PacMonter {
Rectangle rt;
BufferedImage current;
BufferedImage c1;
BufferedImage c2;
BufferedImage c3;
BufferedImage c4;
public PacMonter(){
rt = new Rectangle(0,0,35,35);
try{
//找到它的地址,将图片读入内存
current = ImageIO.read(this.getClass().getResourceAsStream("/images/m_001.png"));
//多读几张图片,换状态
c1 = ImageIO.read(this.getClass().getResourceAsStream("/images/m_002.png"));
c2 = ImageIO.read(this.getClass().getResourceAsStream("/images/m_003.png"));
c3 = ImageIO.read(this.getClass().getResourceAsStream("/images/m_004.png"));
c4 = ImageIO.read(this.getClass().getResourceAsStream("/images/m_001.png"));
}catch(IOException e){
e.printStackTrace();
}
}
// public static void main(String[] args){
// PacMonter monter = new PacMonter();
// }
}
程序入口:
/**豆子吃妖精:
* 1: 初始化界面:JFrame
* 2: 另建两个类,保存图片和位置...
* 3: 加载JPANEL,画出图形...
* 4: 建立一个键盘监听,让豆子动起来...
* 5: 建立一个线程类,让妖精动起来...主要是用开关实现判断越界!
* 6: 画出分数...
* <<测试,完善...
* 7: 后续: 子弹...妖精血量?...[飞机大战?呵呵]
* */
package lyh.projects.pacman;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
//public类,实现所有功能??
public class PacGame {
JFrame jframe;
PacPanel panel;
/*初始化窗体.... */
public PacGame(){
//实例化一个窗体并设置背景...
jframe = new JFrame("豆子吃妖精...");
jframe.setBackground(Color.BLACK);
//设置窗体不可改变大小...
jframe.setResizable(false);
//没置窗体显示在Windows的位置,和它自己的位置...
jframe.setBounds(100, 100, 640, 460);
//加载JPANEL画板.
panel = new PacPanel();
jframe.setContentPane(panel);
//加载一个键盘监听,实现控制豆子的移动...匿名内部类,实现接口所有方法....
jframe.addKeyListener(new KeyListener(){
//键盘按下去事件...
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP){
//设置换方向的图片..
panel.pacman.current = panel.pacman.c1;
if(panel.pacman.rt.y > 10){ //判断是否越界...
panel.pacman.rt.y = panel.pacman.rt.y - 10;
}
}
if(e.getKeyCode() == KeyEvent.VK_DOWN){
panel.pacman.current = panel.pacman.c2;
if(panel.pacman.rt.y < 390){
panel.pacman.rt.y = panel.pacman.rt.y + 10;
}
}
if(e.getKeyCode() == KeyEvent.VK_LEFT){
panel.pacman.current = panel.pacman.c3;
if(panel.pacman.rt.x > 10){
panel.pacman.rt.x = panel.pacman.rt.x - 10;
}
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
panel.pacman.current = panel.pacman.c4;
if(panel.pacman.rt.x < 600){
panel.pacman.rt.x = panel.pacman.rt.x + 10;
}
}
jframe.repaint();
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
});
//起动控制妖精移动线程...
Thread t1 = new MonterThread();
t1.start();
//窗体关闭退出程序...
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
//设置窗体可见..
jframe.setVisible(true);
}
/*
*新建一个内部线程类,控制妖精的(随机?)移动...
*并断判豆子与妖精是否相遇...
*实现相遇后被吃(换图片,换位置)...*/
boolean movex = true;
boolean movey = true;
class MonterThread extends Thread{
//起动线程时自动调用RUN方法..
public void run(){
boolean isStop = true;
while(isStop){
//判断豆子,妖精是否相遇(被吃)
if(panel.monter.rt.intersects(panel.pacman.rt)){
int random = getRandom();
//用随机四张图片来表示妖精被吃...
switch (random) {
case 1 : panel.monter.current = panel.monter.c1; break;
case 2 : panel.monter.current = panel.monter.c2; break;
case 3 : panel.monter.current = panel.monter.c3; break;
case 4 : panel.monter.current = panel.monter.c4; break;
default : panel.monter.current = panel.monter.current; break;
}
panel.monter.rt.x = new Random().nextInt(600);
panel.monter.rt.y = new Random().nextInt(390);
panel.scope += 10;
}
/* 移动思路...
*panel.monter.rt.x = panel.monter.rt.x +(int)(Math.random()*11);
*panel.monter.rt.y = panel.monter.rt.y +(int)(Math.random()*11);
* ----------
/*用movex,movey开(+)关(-)[判断是否越界],来控制妖精的移动...
* */
if(movex == true){
//给出随机移动象素大小,产生一个飘移效果...
panel.monter.rt.x += (int)(Math.random()*11);
if(panel.monter.rt.x >= 600){
movex = false;
}
}else{
panel.monter.rt.x -= (int)(Math.random()*11);
if(panel.monter.rt.x <= 0){
movex = true;
}
}
if(movey == true){
panel.monter.rt.y += (int)(Math.random()*11);
if(panel.monter.rt.y >= 390){
movey = false;
}
}else{
panel.monter.rt.y -= (int)(Math.random()*11);
if(panel.monter.rt.y <= 0){
movey = true;
}
}
try{
//移动一次就停0.06秒,不然看不见,移动太快...
Thread.sleep(60);
}catch(Exception e){
e.printStackTrace();
}
jframe.repaint(); //刷新
}
}
}
public int getRandom(){
return (new Random().nextInt(4)) + 1;
}
public static void main(String[] args){
PacGame game = new PacGame();
}
}
/*新建一个PANEL容器类,画出图片,并控制图片的位置...
* */
class PacPanel extends JPanel{
//实例化两个图片类...
PacMan pacman = new PacMan();
PacMonter monter = new PacMonter();
int scope = 0;
//继承基类的PAINT方法,画出图片...
public void paint(Graphics g) {
g.drawImage(pacman.current,pacman.rt.x,pacman.rt.y,
pacman.rt.width,pacman.rt.height,null);
g.drawImage(monter.current,monter.rt.x,monter.rt.y,
monter.rt.width,monter.rt.height,null);
g.setColor(Color.RED);
g.drawString("当前分数为: " + scope, 280, 420);
}
}
2 : 两人五子棋...
/** 1:建立客户端...
* 2:初始化棋盘...jframe,jpanel
* 3:加载图片,并在jpanel中画出(并且select.gif能随着鼠标移动)
* 4:初始化二维数组,并实现落子功能...
* 5:发送落子坐标给服务器...传送给另一方实现交互..('频道'属性文件设置..)
* 6:建立一个线程使终等待服务器信息...
* 7:画出对方落子...
* 8:判断输赢...
* 9:黑白竞手...
* <<<边代码边测试....
* */
package lyh.projects.gobangnet;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JOptionPane;
public class GobangClient {
private JPanel panel;
private int[][] border;
//关于table用到的些常量
private int BOARD_SIZE = 15; //多少个格子,常量
private final int TABLE_WIDTH = 535;
private final int TABLE_HEIGHT = 536;
private final int RATE = TABLE_WIDTH / BOARD_SIZE; //设置光标一次移动一个格子
private final int X_OFFSET = 5; //偏移量
private final int Y_OFFSET = 6;
//把几张要用到的图片加载到内存...
BufferedImage table;
BufferedImage selected;
BufferedImage black;
BufferedImage white;
//光标移动坐标...
private int movex = 0;
private int movey = 0;
//鼠标点击坐标
private int pointx = 0;
private int pointy = 0;
private final int EMPTY = 0;
private final int WHITE = 1;
private final int BLACK= 2;
boolean isGo = true;
private PrintWriter pw = null;
//构造函数..建立连接..
public GobangClient(){
try{
Socket client = new Socket("127.0.0.1",8899);
init();
pw = new PrintWriter(client.getOutputStream());
new ClientThread(client).start(); //起动线程
}catch(IOException e){
e.printStackTrace();
}
}
//初始化棋盘..
public void init(){
JFrame jframe = new JFrame("局域五子棋...");
try{
table = ImageIO.read(new File("image/board.jpg"));
selected = ImageIO.read(new File("image/selected.gif"));
black = ImageIO.read(new File("image/black.gif"));
white = ImageIO.read(new File("image/white.gif"));
}catch(IOException e){
e.printStackTrace();
}
//初始化数组..初始每一元素为0;
border = new int[BOARD_SIZE][BOARD_SIZE];
for(int i = 0; i < BOARD_SIZE; i++){
for(int j = 0; j < BOARD_SIZE; j++){
border[i][j] = EMPTY;
}
}
panel = new jpanel();
//加载jpanel,并设置它的大小...
panel.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
//在panel里面加载一个鼠标移动监听,实现光标随鼠标移动功能
panel.addMouseMotionListener(new MouseMotionListener(){
public void mouseDragged(MouseEvent e) {
}
public void mouseMoved(MouseEvent e) {
//优化鼠标移动..一次移动一个格...
movex = (int)((e.getX() - X_OFFSET) / RATE);
movey = (int)((e.getY() - Y_OFFSET) / RATE);
panel.repaint();
}
});
//鼠标点击监听,获得坐标,实现落子功能...
panel.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e) {
if(isGo){ //黑白竞手...
pointx = (int)((e.getX() - X_OFFSET) / RATE);
pointy = (int)((e.getY() - Y_OFFSET) / RATE);
border[pointx][pointy] = BLACK; //往数组里面放值..
panel.repaint();
//加载属性文件...
pw.println(Protocols.POINTXY+pointx + "," + pointy+Protocols.POINTXY);
pw.flush(); //加载属性文件...
}
isGo = false;
//调用方法,判断输赢...
if(isWin()){
pw.println(Protocols.WIN);
JOptionPane.showMessageDialog(panel, "恭喜你,赢了...");
}
}
});
jframe.add(panel);
jframe.pack(); //设置为填充显示...
jframe.setResizable(false); //不可改变大小...
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
jframe.setVisible(true); //窗体可见...
}
//一个内部类jpanel,继承JPanel,画出图形...
class jpanel extends JPanel{
public void paint(Graphics g) {
g.drawImage(table,0,0,null);
g.drawImage(selected,movex * RATE + X_OFFSET,movey * RATE + X_OFFSET,null);
for(int i = 0; i < BOARD_SIZE; i++){
for(int j = 0; j < BOARD_SIZE; j++){
//遍历数姐值,画出黑白子...
if(border[i][j] == BLACK){
g.drawImage(black,i * RATE + X_OFFSET,j * RATE + X_OFFSET,null);
}else if(border[i][j] == WHITE){
g.drawImage(white,i * RATE + X_OFFSET,j * RATE + X_OFFSET,null);
}
}
}
}
}
/*建立一个线程使终等待服务器信息...
* 处理信息并落子
* */
class ClientThread extends Thread{
Socket client;
public ClientThread(Socket client){
this.client = client;
}
public void run(){
try{
BufferedReader br = new BufferedReader(
new InputStreamReader(client.getInputStream()));
String temp = br.readLine();
System.out.println(temp);
boolean isStop = true;
while(isStop){
//处理信息
if(temp.startsWith(Protocols.POINTXY)){
SplitMessage(SubMessage(temp));
}else if(temp.equals("%$")){
JOptionPane.showMessageDialog(panel, "对方赢了...");
}
temp = br.readLine();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
//切割字符串生成坐标,并落子...
public void SplitMessage(String temp){
String[] temps = temp.split(",");
int x = Integer.parseInt(temps[0]);
int y = Integer.parseInt(temps[1]);
border[x][y] = WHITE;
isGo = true; //黑白竞手...
panel.repaint();
}
//截取字符串(处理信息)
public String SubMessage(String temp){
return temp.substring(2,temp.length() - 2);
}
//判断赢的方法...
public boolean isWin(){
//横向判断...
for(int i = 0; i < border.length; i++){
int sum = 0;
int count = 0;
for(int j = 0; j < border.length; j++){
if(border[j][i] == BLACK){
sum += border[j][i];
++count;
}
if(sum == 10 && count == 5){
return true;
}
}
}
//纵向判断...
for(int i = 0; i < border.length; i++){
int sum = 0;
int count = 0;
for(int j = 0; j < border.length; j++){
if(border[i][j] == BLACK){
sum += border[i][j];
count++;
}
if(sum == 10 && count == 5){
return true;
}
}
}
//右下对角线...
for(int i = -(border.length - 2); i < border.length - 1; i++){
int sum = 0;
int count = 0;
for(int j = 0; j < border.length; j++){
int line = i + j; //截取没有越界的点...
if(line >= 0 && line < border.length){
if(border[j][line] == BLACK){
sum += border[j][line];
count++;
}
if(sum == 10 && count == 5){
return true;
}
}
}
}
//右下对角线...
for(int i = 1; i < 2 * (border.length - 1); i++){
int sum = 0;
int count = 0;
for(int j = 0; j < border.length; j++){
int line = i - j;
if(line >= 0 && line < border.length){
if(border[j][line] == BLACK){
sum += border[j][line];
count++;
}
if(sum == 10 && count == 5){
return true;
}
}
}
}
return false;
}
public static void main(String[] args){
GobangClient client = new GobangClient();
}
}
/** 1:建立服务器端...
* 2:接收信息,转发...
* */
package lyh.projects.gobangnet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
//一个public类,实现所有的功能。
public class GobangServer {
//容器,保存两客户端的信息
private List<Socket> clients = new ArrayList<Socket>(2);
//构造函数,建立服务器端
public GobangServer(){
try{
ServerSocket ss = new ServerSocket(8899);
boolean isStop = true;
while(isStop){
Socket client = ss.accept();
System.out.println("连接成功...");
new ServerThread(client).start(); //起动线程...
clients.add(client); //保存信息...
}
}catch(IOException e){
e.printStackTrace();
}
}
//一个线程,使终等待守候信息...
class ServerThread extends Thread{
//ServerThread构造函数..听说线程只有这一种获得参数的方式..
Socket client;
public ServerThread(Socket client){
this.client = client;
}
//读入客户端信息反回给别一端...
public void run(){
try{
BufferedReader br = new BufferedReader(
new InputStreamReader(client.getInputStream()));
String temp = br.readLine();
boolean isStop = true;
while(isStop){
//获得另一端...
for(int i = 0; i < clients.size(); i++){
Socket s = clients.get(i);
if(client != s){
//把信息发送给另一端...
PrintWriter pw = new PrintWriter(s.getOutputStream());
pw.println(temp);
pw.flush();
temp = br.readLine();
}
}
}
}catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args){
new GobangServer();
}
}
package lyh.projects.gobangnet;
//它们通信的一个协议!
public class Protocols {
//坐标
public final static String POINTXY = "!@";
public final static String STOP = "#$";
public final static String WIN = "%$";
}
3:
**图书管理系统......
4:
**模拟QQ软件......
5:
**记事本......
6:
7:
8:
9:
简易游戏项目实战

被折叠的 条评论
为什么被折叠?



