关于毕业设计这个没有总目录,请自行在去毕业设计的这个版块查看
基于jsp的企业员工信息管理系统的设计与实现–【毕业论文】 这里列了一些,其它的请自行查找
JAVA的有代码可能叫【课程设计】
SSM或JAVAWEB(JSP)的【唐诗300首】
springBoot 的叫【JSB项目实战】
PHP的项目叫【白嫖项目】
其它的有可能叫【课程设计】或【毕业设计】
本系列校训
互相伤害互相卷,玩命学习要你管,天生我才必有用,我命由我不由天!
毕设的技术铺垫
语言选择 | 收录专辑链接 | 卷的程度 |
---|---|---|
C | 张雪峰推荐选择了计算机专业之后-在大学期间卷起来-【大学生活篇】 | ★★★✫✰ |
JAVA | 黑马B站视频JAVA部分的知识范围、学习步骤详解 | ★★★★★ |
JAVAWEB | 黑马B站视频JAVAWEB部分的知识范围、学习步骤详解 | ★★★★★ |
SpringBoot | SpringBoot知识范围-学习步骤【JSB系列之000】 | ★★★★★ |
微信小程序 | 详细解析黑马微信小程序视频–【思维导图知识范围】 | ★★★✰✰ |
python | 详细解析python视频选择–【思维导图知识范围】 | ★★✫✰✰ |
php | PHP要怎么学–【思维导图知识范围】 | ★★★✫✰ |
环境及工具:
本系列环境
环境 | win11 |
---|---|
工具 | idea 2017/idea 2018 |
jdk | 1.8 |
数据库 | 无 |
maven | 无 |
项目导入方式 | 打开目录 |
数据库前端工具 | 无 |
项目说明
这个游戏工作量比较小,也比较粗糙。当做学习还是相当的不错的。当毕业设计就有点拿不出手了。但是还是相当的值得学习
总体功能
其实这是棋牌类的最大的特点,就是规则 至上。
中间部分称为 河界 。两端的中间,以斜交叉线构成中文米字形方格的地方,叫作九宫 。这些规则都是和中国古战场的一些场景类似,并且逐渐演变而来成为中国象棋的行棋基本规则。这两位棋子的最高统帅,只能在九宫内行走,不得走出九宫外。将和帅不准在同一直线上直接对面,如一方已先占据位置,则另一方必须回避,否则就算输了。
1、棋盘:中国象棋的棋盘有九条平行的竖线和十条平行的横线相交而组成,其中共有九十个交叉点,棋子就摆在这些交叉点上。中间部分(棋盘的第五,第六两横线之间末画竖线的空白地带)称为 河界 。两端的中间(两端第四条到第六条竖线之间的正方形部位),以斜交叉线构成中文米字形方格的地方,叫作九宫 (它恰好有九个交叉点)。
2、界河:这是一个和国际象棋不同的地方,及对垒双方的中间有一条河界,通常称其为楚河,也就是说棋子过河才能攻打对方的首领。这些规则都是和中国古战场的一些场景类似,并且逐渐演变而来成为中国象棋的行棋基本规则。
3、九宫:双方的底线中心处,也就是纵向中心线分别向两边外移一条线(第四条到第六条竖线)之间的正方形部位,以斜交叉线构成 米 字方格的地方,叫作 九宫 (它恰好有九个交叉点),知道这个区域,对理解一些走棋规则很有帮助。
4、棋子:所有的棋子共有三十二个,其中又分为红、黑两组(分别代表对垒的一方),每组共有十六个棋子(为了区别双方的棋子,不仅在颜色中有所区别,而且还会使用同音不同字的棋子),其中又各分为七种棋子,其名称和数目如下:红棋子:帅一个,车、马、炮、相、士各两个,兵五个。黑棋子:将一个,车、马、炮、象、士各两个,卒五个。
5、将(帅):虽然名称不同,但它们这都是对垒双方的最高统帅,对垒的目的就是通过运用各自的棋子,想方设法将对方的首领将死,方为己方胜利。这两位棋子的最高统帅,只能在九宫内行走,不得走出九宫外。行走的步法为:左、右横走,上、下竖走都行,但每次只能行走一格。将和帅不准在同一直线上直接对面(中间无棋子),如一方已先占据位置,则另一方必须回避,否则就算输了。
6、士(仕):每行一步棋,只许沿着 九宫 中的斜线行走一步(方格的对角线),行走方位可进、可退,其最终目的也是为了护卫各自的最高将领(帅、将)。
7、象(相):此棋不能越过 河界走入对方的领地,其走法为:只能斜走(两步),可以使用汉字中的田字形象地表述:田字格的对角线,即俗称象(相)走田字。行走方位可进、可退,但是,当象(相)行走的路线中,及田字中心有棋子时(无论己方或者是对方的棋子),则不允许走过去,俗称:塞象(相)眼。
8、车(車):此棋是中国象棋中棋力最强的棋子,每行一步棋可以上、下直线行走(进、退);左、右横走(中间不隔棋子),且行棋步数不限。
9、炮(砲):此棋的行棋规则和车(車)类似,横平、竖直,只要前方没有棋子的地方都能行走。但是,它的吃棋规则很特别,必须跳过一个棋子(无论是己方的还是对方的)去吃掉对方的一个棋子。俗称:隔山打炮。
10、马(馬):走棋规则:使用中国的日字来形容马的行走方式比较贴切,俗称:马走日字(斜对角线)。但是,这里有一个行走规则,可以将马走日分解为:先一步直走(或一横)再一步斜走,如果在要去的方向,第一步直行处(或者横行)有别的棋子挡住,则不许走过去(俗称:蹩马腿)。行走范围不限,可以进、也可以退。
11、卒(兵):在没有过河界前,此棋每走一步棋只许向前直走一步(不能后退);过了河界之后,每行一步棋可以向前直走,或者横走(左、右)一步,但也是不能后退的。根据此规则,卒(兵)走到对方的底线只能左右横走,俗称:兵走老了!
可以说,中国象棋在纯规则这一块真的是太复杂了。
代码部分
文件编码问题。不太熟悉JAVA的同学请不要随意怀疑本程序运行出错,或不能运行,盲目修改文件
项目文件目录如下:
关键核心代码:
应用软件的核心代码是指这个程序最关键部分的代码。例如WinRAR,它的核心代码就是压缩算法部分,而诸如用户界面、操作系统移植等部分就无足轻重了。
商城类的核心代码是指业务层的代码,比如你商城的核心代码就是:商品、购物车、创建订单、支付这些代码就是核心代码。
作为程序员,我们经常需要看懂别人的代码。特别是在开源社区中,我们需要理解许多优秀的开源项目的代码。而在Gitee这样的代码托管平台上,我们如何快速有效地看懂别人的代码呢?本文将为大家介绍一些方法。
1.阅读README和项目介绍
在Gitee上,许多开源项目都会有自己的README文件或项目介绍。这些文件一般会介绍项目的背景、功能、使用方法等内容,可以帮助我们快速了解这个开源项目的基本情况。如果我们能够从这些文件中找到与自己相关的内容,就可以快速入手这个开源项目的代码。
2.了解项目结构和代码组织
在阅读代码之前,我们需要先了解这个开源项目的代码结构和代码组织方式。通常,开源项目会将不同的功能模块封装到不同的代码文件中,并按照一定的目录结构组织起来。如果我们能够了解这个开源项目的代码组织方式,就能更加快速地找到所需的代码。
3.利用IDE和工具
IDE和一些代码阅读工具可以帮助我们更快速、更高效地阅读代码。例如,Java开发者可以使用Eclipse或IntelliJ IDEA这样的IDE,可以快速打开代码文件、查看类、方法和变量等信息。另外,一些代码阅读工具,如Source Insight、CodeCompare等,可以帮助我们更方便地查看代码的结构和关系,以及快速跳转到相关代码。
4.关注代码注释和文档
良好的代码注释和文档可以帮助我们更快速地理解代码。因此,在阅读别人的代码时,我们可以将注意力放在代码注释和文档上。有些开源项目会提供详细的文档,有些则注重代码注释。如果我们能够针对代码注释和文档有一个系统的阅读和理解,就能更快速地掌握别人的代码。
5.跑通测试和运行项目
如果我们想更深入地了解别人的代码,可以试着跑通相关的测试,或者直接运行这个开源项目。通过跑测试和运行项目,我们可以更加直观地了解代码的实现细节和具体的业务逻辑。
总结:
以上就是在Gitee上快速理解他人代码的一些方法,希望对大家有所帮助。当然,阅读代码是一件需要耐心和细心的事情,需要我们多花一点时间和心思。只有沉下心来,慢慢阅读每一行代码,才能真正理解它们的含义和作用。
对于一个棋牌游戏而言,规则 就是重中之重的核心代码了。
在所有的规则 之前,
先说一句,象棋是红方先行,黑方后行,
红黑交替行棋。(只有一方走的,那是开车)
5、将(帅):虽然名称不同,但它们这都是对垒双方的最高统帅,对垒的目的就是通过运用各自的棋子,想方设法将对方的首领将死,方为己方胜利。这两位棋子的最高统帅,只能在九宫内行走,不得走出九宫外。行走的步法为:左、右横走,上、下竖走都行,但每次只能行走一格。将和帅不准在同一直线上直接对面(中间无棋子),如一方已先占据位置,则另一方必须回避,否则就算输了。
6、士(仕):每行一步棋,只许沿着 九宫 中的斜线行走一步(方格的对角线),行走方位可进、可退,其最终目的也是为了护卫各自的最高将领(帅、将)。
7、象(相):此棋不能越过 河界走入对方的领地,其走法为:只能斜走(两步),可以使用汉字中的田字形象地表述:田字格的对角线,即俗称象(相)走田字。行走方位可进、可退,但是,当象(相)行走的路线中,及田字中心有棋子时(无论己方或者是对方的棋子),则不允许走过去,俗称:塞象(相)眼。
8、车(車):此棋是中国象棋中棋力最强的棋子,每行一步棋可以上、下直线行走(进、退);左、右横走(中间不隔棋子),且行棋步数不限。
10、马(馬):走棋规则:使用中国的日字来形容马的行走方式比较贴切,俗称:马走日字(斜对角线)。但是,这里有一个行走规则,可以将马走日分解为:先一步直走(或一横)再一步斜走,如果在要去的方向,第一步直行处(或者横行)有别的棋子挡住,则不许走过去(俗称:蹩马腿)。行走范围不限,可以进、也可以退。
9、炮(砲):此棋的行棋规则和车(車)类似,横平、竖直,只要前方没有棋子的地方都能行走。但是,它的吃棋规则很特别,必须跳过一个棋子(无论是己方的还是对方的)去吃掉对方的一个棋子。俗称:隔山打炮。
炮的规则 代码较长。
if (qi_name.equals("炮") || qi_name.equals("炮")) {
boolean swapflagx = false;
boolean swapflagy = false;
if ((x - oldx) * (y - oldy) != 0) {
return false;
}
c = 0;
if (x != oldx) {
if (oldx > x) {
int t = x;
x = oldx;
oldx = t;
swapflagx = true;
}
for (i = oldx; i <= x; i += 1) {
if (i != x && i != oldx) {
if (Map[i][y] != -1) {
c = c + 1;
}
}
}
}
if (y != oldy) {
if (oldy > y) {
int t = y;
y = oldy;
oldy = t;
swapflagy = true;
}
for (j = oldy; j <= y; j += 1) {
if (j != y && j != oldy) {
if (Map[x][j] != -1) {
c = c + 1;
}
}
}
}
if (c > 1) // 与目标处间隔1个以上棋子
{
return false;
}
if (c == 0) // 与目标处无间隔棋子
{
if (swapflagx == true) {
int t = x;
x = oldx;
oldx = t;
}
if (swapflagy == true) {
int t = y;
y = oldy;
oldy = t;
}
if (Map[x][y] != -1) {
return false;
}
}
if (c == 1) // 与目标处间隔1个棋子
{
if (swapflagx == true) {
int t = x;
x = oldx;
oldx = t;
}
if (swapflagy == true) {
int t = y;
y = oldy;
oldy = t;
}
if (Map[x][y] == -1) // 如果目标处无棋子,则不能走此步
{
return false;
}
}
return true;
}
主面板
//Java RPG 游戏开发中地图的初步构建
//文件:Example1.Java
import java.awt.Container;
import javax.swing.JFrame;
public class MainFrame extends JFrame {
public MainFrame() {
// 默认的窗体名称
setTitle("飞行射击类游戏");
// 获得我们自定义面板[地图面板]的实例
GamePanel panel = new GamePanel();
Container contentPane = getContentPane();
contentPane.add(panel);
// 执行并构建窗体设定
pack();
}
public static void main(String[] args) {
MainFrame e1 = new MainFrame();
// 设定允许窗体关闭操作
e1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 显示窗体
e1.setVisible(true);
}
}
11、卒(兵):在没有过河界前,此棋每走一步棋只许向前直走一步(不能后退);过了河界之后,每行一步棋可以向前直走,或者横走(左、右)一步,但也是不能后退的。根据此规则,卒(兵)走到对方的底线只能左右横走,俗称:兵走老了!
上面的是可以走子的规则 ,
如果是吃子,
吃掉的是老将(帅)那就还有胜负的规则
游戏面板
public class ChessBoard extends JPanel implements Runnable {// 棋盘类
public static final short REDPLAYER = 1;
public static final short BLACKPLAYER = 0;
public Chess[] chess = new Chess[32]; // 所有棋子
public int[][] Map = new int[9 + 1][10 + 1]; //棋盘的棋子布局
public Image bufferImage; // 双缓存
private Chess firstChess2 = null; // 鼠标单击时选定的棋子
private Chess secondChess2 = null;
private boolean first = true; // 区分第一次跟第二次选中的棋子
private int x1, y1, x2, y2;
private int tempx, tempy;
private int r; // 棋子半径
private boolean IsMyTurn = true; // IsMyTurn判断是否该自己走了
public short LocalPlayer = REDPLAYER; // LocalPlayer记录自己是红方还是黑方
private String message = ""; // 提示信息
// 线程消亡的标识位
private boolean flag = false;
private int otherport; // 对方端口
private int receiveport; // 本机接收端口
...
网络部分
启动主程序
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
public class Frmchess extends JFrame {
ChessBoard panel2 = new ChessBoard();
JButton button1 = new JButton("认输");
JButton button2 = new JButton("开始");
JTextField jTextField1 = new JTextField();// 输入IP
JTextField jTextField2 = new JTextField();// 输入对方端口
public static final short REDPLAYER = 1;
public static final short BLACKPLAYER = 0;
/**
* @param args
*/
public Frmchess() {
JPanel panel = new JPanel(new BorderLayout());
JPanel panel3 = new JPanel(new BorderLayout());
String urlString = "C://帅.png";
JLabel label = new JLabel(new ImageIcon(urlString));
panel.add(label, BorderLayout.CENTER);
panel2.setLayout(new BorderLayout());
panel3.setLayout(new FlowLayout());
JLabel jLabel1 = new JLabel("输入IP");
JLabel jLabel2 = new JLabel("输入对方端口");
panel3.add(jLabel1);
panel3.add(jLabel2);
jTextField1.setText("127.0.0.1");
jTextField2.setText("3004");
panel3.add(jLabel1);
panel3.add(jTextField1);
panel3.add(jLabel2);
panel3.add(jTextField2);
panel3.add(button1);
panel3.add(button2);
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(panel, BorderLayout.NORTH);
this.getContentPane().add(panel2, BorderLayout.CENTER);
this.getContentPane().add(panel3, BorderLayout.SOUTH);
this.setSize(380, 600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("网络中国象棋游戏");
this.setVisible(true);
button1.setEnabled(false);
button2.setEnabled(true);
setVisible(true);
// 窗口关闭事件
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
try {
panel2.send("quit|");// 向对方发送离开信息
System.exit(0);
} catch (Exception ex) {
}
}
});
/**
* 鼠标事件监听
*/
button1.addMouseListener(new MouseAdapter() {// 认输按钮
@Override
public void mouseClicked(MouseEvent e) {
try {
panel2.send("lose|");// 向对方发送认输信息
} catch (Exception ex) {
}
}
});
button2.addMouseListener(new MouseAdapter() {// 重新开始按钮
@Override
public void mouseClicked(MouseEvent e) {
// panel2.NewGame(REDPLAYER);
String ip = jTextField1.getText();
int remoteport = Integer
.parseInt(jTextField2.getText());
// int
// receiveport=Integer.parseInt(jTextField2.getText());
int receiveport;
if (remoteport == 3003)
receiveport = 3004;
else
receiveport = 3003;
panel2.startJoin(ip, remoteport, receiveport); // 开始联机
button1.setEnabled(true);
button2.setEnabled(true);
}
});
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Frmchess f = new Frmchess();
}
}
画棋子(逻辑倒是简单)
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.image.ImageObserver;
import javax.swing.JPanel;
class Chess // 棋子类
{
public static final short REDPLAYER = 1;
public static final short BLACKPLAYER = 0;
public short player; // 红子为REDPLAYER,黑子为BLACKPLAYER
public String typeName; // 帅、士...
public Point pos; // 位置
private Image chessImage; // 棋子图案
public Chess(short player, String typeName, Point chesspos) {
this.player = player;
this.typeName = typeName;
this.pos = chesspos;
// 初始化棋子图案
// 不能使用switch (typeName)因为switch不支持String枚举
if (player == REDPLAYER) {
if (typeName.equals("帅"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\帅.png");
else if (typeName.equals("仕"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\士.png");
else if (typeName.equals("相"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\相.png");
else if (typeName.equals("马"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\马.png");
else if (typeName.equals("车"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\车.png");
else if (typeName.equals("炮"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\炮.png");
else if (typeName.equals("兵"))
chessImage = Toolkit.getDefaultToolkit().getImage("pic\\兵.png");
} else// 黑方棋子
{
if (typeName.equals("将"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\将1.png");
else if (typeName.equals("士"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\仕1.png");
else if (typeName.equals("象"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\象1.png");
else if (typeName.equals("马"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\马1.png");
else if (typeName.equals("车"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\车1.png");
else if (typeName.equals("炮"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\炮1.png");
else if (typeName.equals("卒"))
chessImage = Toolkit.getDefaultToolkit()
.getImage("pic\\卒1.png");
}
}
public void SetPos(int x, int y) // 设置棋子位置
{
pos.x = x;
pos.y = y;
}
public void ReversePos() // 棋子位置对调
{
pos.x = 10 - pos.x;
pos.y = 11 - pos.y;
}
// public void Draw(Graphics g) // 绘制自己到棋盘上
// {
// g.drawImage(chessImage, pos.x * 40 - 40, pos.y * 40 - 40, 40, 40, null);
// }
// 指定的JPanel上画棋子
protected void paint(Graphics g, JPanel i) {
g.drawImage(chessImage, pos.x * 40 - 40, pos.y * 40 - 20, 40, 40,
(ImageObserver) i);
}
public void DrawSelectedChess(Graphics g) {
// 画选中棋子的示意边框线
g.drawRect(pos.x * 40 - 40, pos.y * 40 - 20, 40, 40);
}
}
运行的端口及界面
运行一次,启动的端口 3004
那么第二个就要用3003
是不是酷毕了?
当一方行棋时,消息要发给另一方的程序上。
总结
就一句,太强了,真的太强了。
以前的学习的人,没有那么正规,但是潜下心写代码。现在的人呢?除了各种网络的BBLL,真心写代码的还能找不到工作?每个人都是springBoot ,甚至springcloud 起步,但是实际的分析能力真的是…也正如2023年的IT现状一样,会springBoot全套,会VUE,工资只有2000左右。
有的时候,真的要思考一下,现在的人取巧 到底是不是巧。
论文参考
《基于java的坦克大战游戏的设计与实现–毕业论文–【毕业论文】》
https://blog.csdn.net/dearmite/article/details/131962993
配套资源
java的网络象棋游戏-自带走子规则-太牛了–【课程设计】