五子棋是我学习Java后写的第二个小游戏,初步实现了五子棋的人人对战。
下面简单介绍一下我的五子棋及其我在编写过程中遇到的一些问题,但愿大家可以避免我走的一些弯路
我的五子棋经历了如下四个步骤:
一、将五子棋的界面做出来( 棋盘 棋子)
二、对棋子进行一些设置 ( 如黑白分明 棋子下在棋盘的交点上 已下棋子的位置不能再下等)
三、判断输赢
四、悔棋和重新开局
五子棋的界面
主要是重写父类中的paint方法,及其重绘 由于之前做过画板的重绘,这步没花费太多时间
对棋子进行基本的设置
就开始接触最最基本的算法了,也是我第一次写算法,在磕磕碰碰中实现了,主要是根据获取鼠标点击的坐标,判断距离最近的棋盘交点,把棋子放在最近的交点上
判断输赢
从这步开始就有点纠结了,总是自己很清楚算法是怎样的,就是无法用Java语言准确的表达出来
横向纵向判断还好,因为坐标的i j值只有一个变化,用一个for循环就可以解决了
到斜着的两个方向,i j值则变成了同增同减 或者 此消彼长的关系,我以前写的for循环里面只有一个变量,由于对for语句了解的局限性,
耗费了很多功夫,最后只能一个for循环设置两个变量,这么一试,问题解决了,松了一口气
判断输赢时还要注意数组越界的问题
四个方向计算连在一起的最大棋子数时最好分别计数,避免互相干扰
//横向判断
public int XWin(int i,int j){
ch = cl.getChess();
value = ch[i][j];
s1=1;
for (int b=j+1; b<ch[0].length; b++) {
int temp = ch[i][b];
if (temp == value) {
s1++;
}else{
break;
}
}
for (int b=j-1; b>=0; b--) {
int temp = ch[i][b];
if (temp == value) {
s1++;
}else{
break;
}
}
return s1;
}
//纵向判断
public int YWin(int i,int j){
ch = cl.getChess();
value = ch[i][j];
s2 = 1;
for (int b=i+1; b<ch[0].length; b++) {
int temp = ch[b][j];
if (temp == value) {
s2++;
}else{
break;
}
}
for (int b=i-1; b>=0; b--) {
int temp = ch[b][j];
if (temp == value) {
s2++;
}else{
break;
}
}
return s2;
}
//斜向判断1
public int XYWin(int i,int j){
ch = cl.getChess();
value = ch[i][j];
s3 = 1;
for (int b=j+1, a=i+1; b<ch[0].length&&a<ch[0].length; b++,a++){
int temp = ch[a][b];
if (temp == value) {
s3++;
}else{
break;
}
}
for (int b=j-1, a=i-1; b>=0&&a>=0; b--,a--){
int temp = ch[a][b];
if (temp == value) {
s3++;
}else{
break;
}
}
return s3;
}
//斜向判断2
public int YXWin(int i,int j){
ch = cl.getChess();
value = ch[i][j];
s4 = 1;
for (int a=i+1,b=j-1; a<ch[0].length&&b>=0;a++,b--) {
int temp = ch[a][b];
if (temp == value) {
s4++;
}else{
break;
}
}
for (int a=i-1, b=j+1; a>=0&&b<ch[0].length; a--,b++) {
int temp = ch[a][b];
if (temp == value) {
s4++;
}else{
break;
}
}
return s4;
}
悔棋
悔棋的算法有很多,我用的是数组,也可以用堆栈的方法
用一个n行2列的数组保存已下棋子的ij值,n值取决于棋盘能容纳的最大棋子数
前面在区别黑白棋时,用一个二维数组 ch[][]白棋保存1 黑子保存2,悔棋就是把保存的数值赋为0,然后重绘
由于我只悔棋一步,悔棋后下白子还是黑子要判断一下
//实现悔棋
public void stepBack(){
//得到保存棋子种类的数组
ch=cl.getChess();
//得到保存棋子坐标的数组
chi = cl.getChi();
chj = cl.getChj();
for(int m=0;m<1;m++){
//获取已下的棋子数
n=cl.getN();
i=chi[n][1];
j=chj[n][1];
//悔棋后将棋子的坐标等参数重置为0
ch[i][j]=0;
chi[n][1]=0;
chj[n][1]=0;
n--;
}
//悔棋后仍下该颜色的棋子
count = cl.getCount();
if(count==0){
cl.setCount(1);
}else{
cl.setCount(0);
}
wzq.paint(g);
}
//重新开局
public void restart(){
ch=cl.getChess();
for(int i=0;i<ch.length;i++){
for(int j=0;j<ch[i].length;j++){
ch[i][j]=0;
}
}
for(int i=0;i<200;i++){
for(int j=0;j<2;j++){
//重新开局后将数组清空
chi[i][j]=0;
chj[i][j]=0;
}
}
//所下棋子数设为0
cl.setN(0);
cl.setCount(0);
wzq.paint(g);
choose = cl.isChoose();
if(choose == true){
//只有输赢结果出来后才加上监听器
wzq.addMouseListener(cl);
cl.setChoose(false);
}
}
由于之前一直对参数传递不太熟,只要不在一个类里面就手足无措,通过这个小项目,我更好的理解了如何传递参数,
还有利用source中的Generate Getters and Setters 现成的方法 可以省好多力气的
总是在不断地发现问题和解决问题中进步,不要害怕遇到问题,写程序中总会遇到问题的
下一步,该好好想想如何实现人机对战了。
分享到:
相关推荐
本项目旨在设计并实现一个高效、稳定、用户友好的五子棋对战系统,让玩家可以在网络环境下随时随地进行对局,同时支持人机对战和人人对战模式,满足不同用户的需求。 1.2.2 研究意义 此系统的实现不仅丰富了网络...
Kotti 是一个基于 Pyramid 框架的 Python 内容管理系统(CMS),适合用来搭建中小型网站、文档库、企业展示平台、知识库等需要灵活内容结构和权限模型的项目。它本身更像一个可以二次开发的 CMS 框架,比 WordPress、Drupal 这类“一装就用”的系统更倾向于开发者定制和扩展。 这是支持pyramid2.x版本的kotti! tar -xzvf kotti1.0.tar.gz 解压缩 进入目录执行 pip install -e . 来安装, 然后执行pserve app.ini 启动。 用浏览器浏览127.0.0.1:5000 即可浏览。 用户名admin ,口令qwerty
cmd-bat-批处理-脚本-hello world.zip
知识付费系统自动采集V3.0 跳转不卡顿+搭建教程,不和外面的一样跳转卡顿,这个跳转不卡顿,支持三级分销。
在Matlab环境下,对图像进行特征提取时,主要涵盖形状、纹理以及颜色这三大关键特征。其中,对于纹理特征的提取,采用灰度梯度共生矩阵这一方法来实现。通过灰度梯度共生矩阵,可以有效地捕捉图像中像素灰度值之间在不同方向和距离上的相互关系,进而量化地反映出图像的纹理特性,为后续的图像分析、分类等任务提供重要的纹理信息依据。
该数据集为2010-2023年中国A股上市公司管理层情感语调的年度面板数据,覆盖45,320条样本,数据源自年报及半年报的"管理层讨论与分析"部分。通过构建中文金融情感词典(融合《知网情感分析用词典》与L&M金融词汇表),采用文本分析方法计算情感语调指标,包括:正面/负面词汇数量、文本相似度、情感语调1((积极词-消极词)/总词数)和情感语调2((积极词-消极词)/(积极词+消极词))。同时包含盈利预测偏差、审计意见类型等衍生指标,可用于研究信息披露质量、市场反应及代理问题。该数据复刻了《管理世界》《财经研究》等期刊的变量构建方法,被应用于分析语调操纵对债券市场的影响,学术常用度与稀缺度较高。
cmd-bat-批处理-脚本-FTIME.zip
1747829038637.png
2025年自动化X光检查机项目大数据研究报告.docx
在计算机组成原理课程设计中,我全程跟随老师的指导,独立完成了以下两项任务:一是利用Logisim软件进行原码一位乘法器的仿真设计,通过逐步搭建电路、配置逻辑单元,实现了原码乘法运算的完整流程,深入理解了原码乘法的原理和实现机制;二是完成了补码一位乘法器的Logisim仿真,同样按照老师讲解的步骤,精心设计电路,确保补码乘法运算的正确性,进一步掌握了补码乘法的运算规则和电路实现方法。通过这两个项目,我不仅巩固了理论知识,还提升了动手实践能力和逻辑思维能力。
cmd-bat-批处理-脚本-msvc2017.zip
cmd-bat-批处理-脚本-virtualcam-install.zip
二十四节气之立秋介绍.pptx
cmd-bat-批处理-脚本-shift.zip
二十四节气之小雪介绍.pptx
java、SpringBoot面试专题,6页面试题
cmd-bat-批处理-脚本-GenerateUnionWinMD.zip
二十四节气之大暑节气.pptx
python实现五子棋游戏源码
cmd-bat-批处理-脚本-TransparentConsole.zip