2023年3月

二维数组的定义 , canvas对象的使用

二维数组:以下用new,其实简化 [] 即可,

var tArray = new Array();  //先声明一维
for(var k=0;k<i;k++){ //一维长度为i,i为变量,可以根据实际情况改变
tArray[k]=new Array(); //声明二维,每一个一维数组里面的一个元素都是一个数组;
for(var j=0;j<p;j++){ //一维数组里面每个元素数组可以包含的数量p,p也是一个变量;
tArray[k][j]=""; //这里将变量初始化,我这边统一初始化为空,后面在用所需的值覆盖里面的值
}
}
--------
for(var a=0;a<i;a++){

tArray[a]=[ matArray[a],addArray[a] ];  两个 组成一个二维数组

};

 
var tArray = new Array();  //先声明一维
for(var k=0;k
<i;k++){ //一维长度为i,i为变量,可以根据实际情况改变

tArray[k]
=newArray(); //声明二维,每一个一维数组里面的一个元素都是一个数组;

for(var j
=0;j<p;j++){//一维数组里面每个元素数组可以包含的数量p,p也是一个变量;

tArray[k][j]
=""; //这里将变量初始化,我这边统一初始化为空,后面在用所需的值覆盖里面的值
}
}

五子棋代码如下:曾经把它看懂,现在再看感觉又有点忘了,尴尬  2018-11-26 16:57:07

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>人工智能五子棋</title>
    <metacharset="UTF-8" />
    <metaname="author"content="张" />
    <metaname="keywords"content="五子棋" />
    <metaname="description"content="五子棋" />
    <style>*{margin:0;}canvas{background:#fff;margin:120px auto;display:block;border-radius:4px;box-shadow:0px 0px 10px #000;
        }
    </style>
</head>
<body>
    <canvaswidth="450"height="450"id="canvas"></canvas>
    <script>

        varover= false;varchess=document.getElementById("canvas");//拿到权限 上下文 2d平面
        varcontext=chess.getContext("2d");

context.strokeStyle
="#a8a8a8";//定义方法 vardrawChessboard= function(){//线条 起点终点坐标(x,y) /*context.moveTo(0,0);//起点坐标
context.lineTo(450,450);//终点坐标
context.stroke();//两点坐标相连
*/ for(vari=0; i<15; i++) {
context.moveTo((
15+30*i),15);
context.lineTo((
15+30*i),435);
context.stroke();
context.moveTo(
15,(15+30*i));
context.lineTo(
435,(15+30*i));
context.stroke();
}
}
drawChessboard();
//绘制棋子 varonStep= function(i,j,me) {//绘制棋子 圆形 圆心(x,y) 半径 //开始路径 区分大小写 context.beginPath();
context.arc(
15+i*30,15+j*30,13,0,Math.PI*2);//结束路径 context.closePath();//渐变色 看文档,两个圆心 半径, vargradient=context.createRadialGradient(15+i*30,15+j*30,0,15+i*30,15+j*30,13);if(me) {
gradient.addColorStop(
0,"#0a0a0a");
gradient.addColorStop(
1,"#636363");
}
else{
gradient.addColorStop(
0,"#d1d1d1");
gradient.addColorStop(
1,"#f9f9f9");
}
//填充颜色 context.fillStyle=gradient;
context.fill();
context.stroke();
}
//建立一个二维数组判断棋盘上的落子情况 varchessBoard=[];//把棋盘上面所有的点全部存进去 for(vari=0; i<15; i++) {
chessBoard[i]
=[];//一维中存入还是数组 for(varj=0; j<15; j++) {
chessBoard[i][j]
= 0;//等于0的地方没有下棋 }
}
//下棋 varme= true;
chess.onclick
= function(e) {if(over) {return false;
}
if(!me) {return false;
}
//获取鼠标坐标 varx=e.offsetX;vary=e.offsetY;//点击范围30都可以下棋 向下取整 vari=Math.floor(x/30); varj=Math.floor(y/30); //把落的子放到数组中存储 if(chessBoard[i][j]== 0) {

onStep(i,j,me);
chessBoard[i][j]
= 1;for(vark=0; k<count; k++) {if(wins[i][j][k]) {//* 这里应该加多一个判断myWin[k]等于或大于6了,直接不用往下操作了。 if(myWin[k]!=6){
myWin[k]
++;
computerWin[k]
= 6;if(myWin[k]== 5) {
alert(
"恭喜你赢了!");
over
= true;
}
}
}
}
if(!over) {
me
= !me;
computerAI();
}
}
}
//统计赢法的种类 varwins=[];//遍历棋盘 for(vari=0;i<15;i++) {
wins[i]
=[];for(varj=0; j<15; j++) {
wins[i][j]
=[];
}
}
//赢法的索引 varcount= 0;//横线赢 for(vari=0; i<15; i++) {for(varj=0; j<11; j++) {for(vark=0; k<5; k++) {
wins[i][j
+k][count]= true;
}
count
++;
}
}
//竖线赢 for(vari=0; i<15; i++) {for(varj=0; j<11; j++) {for(vark=0; k<5; k++) {
wins[j
+k][i][count]= true;
}
count
++;
}
}
//斜线赢 for(vari=0; i<11; i++) {for(varj=0; j<11; j++) {for(vark=0; k<5; k++) {
wins[i
+k][j+k][count]= true;
}
count
++;
}
}
//反斜线赢 for(vari=0; i<11; i++) {for(varj=14; j>3; j--) {for(vark=0; k<5; k++) {
wins[i
+k][j-k][count]= true;
}
count
++;
}
}
//本棋盘 有572中赢发, //统计赢法组 varmyWin=[];//全局,用于记录 每在此赢法上下子一个即加一,判断每一种赢法是否达到了5, varcomputerWin=[];for(vari=0; i<count; i++) {
myWin[i]
= 0;
computerWin[i]
= 0;
}
//计算机AI算法 varcomputerAI= function() {//统计分数 varmySource=[];//局部数组,我方分数,每次计算机下棋都计算一遍 varcomputerSource=[];//计算机分数 varmax= 0;//最高点分数 varu= 0,v= 0;//最高点分数坐标 //初始化我方和计算机分数 for(vari=0; i<15; i++) {
mySource[i]
=[];
computerSource[i]
=[];for(varj=0; j<15; j++) {
mySource[i][j]
= 0;
computerSource[i][j]
= 0;
}
}
for(vari=0; i<15; i++) {for(varj=0; j<15; j++) {//这里的两个for是遍历棋盘 if(chessBoard[i][j]== 0) {//这里对每一个没有下过子的 坐标分析,计算该落子的可能性多大 for(vark=0; k<count; k++) {//遍历所有赢法 572钟 if(wins[i][j][k]) {//遍历和该坐标有关的赢法,有关往下执行 if(myWin[k]== 1) {//若该赢法上 落子为1,加一定的分数;myWin[k]这个值是在我方下棋时累加的 mySource[i][j]+= 200;
}
else if(myWin[k]== 2) {//若该赢法上 落子为2,再加一定的分数 mySource[i][j]+= 400;
}
else if(myWin[k]== 3) {//若该赢法上 落子为3,再加一定的分数 mySource[i][j]+= 2000;
}
else if(myWin[k]== 4) {
mySource[i][j]
+= 10000;
}
if(computerWin[k]== 1) {//同理,对计算机下的期判断,累加分数 computerSource[i][j]+= 420;
}
else if(computerWin[k]== 2) {
computerSource[i][j]
+= 820;
}
else if(computerWin[k]== 3) {
computerSource[i][j]
+= 4100;
}
else if(computerWin[k]== 4) {
computerSource[i][j]
+= 20000;
}
}
}
if(mySource[i][j]>max) {//这个坐标对于我赢的概率和之前最大的比 max=mySource[i][j];
u
=i;
v
=j;
}
else if(mySource[i][j]==max) {//如果两个点对自己相同,那两个点对敌方哪个更有利? if(computerSource[i][j]>computerSource[u][v]) {
u
=i;
v
=j;
}
}
if(computerSource[i][j]>max) {//这个坐标对于计算机的概率和之前最大的比 max=computerSource[i][j];
u
=i;
v
=j;
}
else if(computerSource[i][j]==max) {if(mySource[i][j]>mySource[u][v]) {
u
=i;
v
=j;
}
}
}
}
}
onStep(u,v,
false);
chessBoard[u][v]
= 2;for(vark=0; k<count; k++) {if(wins[u][v][k]) {//* 这里应该加多一个判断computerWin[k]等于或大于6了,直接不用往下操作了。 if(computerWin[k]!=6){
computerWin[k]
++;
myWin[k]
= 6;if(computerWin[k]== 5) {
alert(
"计算机赢了!");
over
= true;
}
}

}
}
if(!over) {
me
= !me;
}
}
</script> </body> </html>

背景:本人用这么久,因为大部分都是设定为UTF-8 就可以了,但是一些老项目居然是GBK格式,所以 工作空间、通常文件类型的编码都是UTF-8.

针对特殊项目设定特定格式,实际中本人对整个项目设定并不起作用,所以只能对单一文件 一个个修改编码格式,如果文件多的悲催。

实际发现 eclipse 不同版本,菜单是有点不一样的。

--先浏览一遍下方的文章,图文并茂:

eclipse编码格式设置教程、如何为eclipse设置编码格式? - Echo--Android - 博客园
https://www.cnblogs.com/jingmo0319/p/5626176.html

Eclipse如何设置编码格式?(3种方式) - CSDN博客--
有提到只对你设置编码之后产生的新文件有效
http://blog.csdn.net/Rainy_Black_Dog/article/details/52403735

eclipse 编码设置 - - ITeye博客---不错
http://kodak-zhou.iteye.com/blog/1004722

===

一般Java文件编码格式是UTF-8的。以下以默认GBK改为UTF-8为例。
1.改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式。
1、window -> Preferences -> general -> Workspac -> Text file encoding ->Other->UTF-8->OK
汉化版:eclipse->窗口->首选项->常规->工作空间->其它->UTF-8->确定

2.某类型文件的编码格式
eclipse->window -> Preferences -> general -> Content Types ->右边找到要修改的文件的类型(JAVA,JSP等等)->在下面的Default encoding,输入框中输入UTF-8->Update->OK
汉化版:eclipse->窗口->首选项->常规->内容类型->在右边选择要修改文件的类型->下面缺省编码输入->更新

3.项目范围的设置编码格式
(本人设定并未整个项目编码改变)
Project->Properties-->Resource->Other->UTF-8->OK

4、单个文件设置编码格式
在包资源管理器右键点击文件->属性,改变文本文件编码格式为UTF-8

或者:点击当前文件,按Alt+回车,弹窗

注:改变编码格式前做备份,另外可以用编码格式批量转换工具处理下,搜索下网上很多这样的小工具。

仅能在IntelliJ里面打开GUI Form文件来进行界面的拖拽设计--eclipse中也可以了

当eclipse 打开.form文件时,提示有、对应的编辑工具可以打开它,请到市场去安装

但是:本人安装这个插件后还是 打不开界面,应该是版本对应不上,造成:eclipse 打开的和IDEA打开的 From窗体代码少了一大部分:(窗体创建代码)

GUI initializer generated by IntelliJ IDEA GUI Designer 明确说明是有 工具生成的代码。


 private voidcreateUIComponents() {//TODO: place custom component creation code here
}

{
//GUI initializer generated by IntelliJ IDEA GUI Designer//>>> IMPORTANT!! <<<//DO NOT EDIT OR ADD ANY CODE HERE! $$$setupUI$$$();
}
/*** Method generated by IntelliJ IDEA GUI Designer
* >>> IMPORTANT!! <<<
* DO NOT edit this method OR call it in your code!
*
* @noinspection ALL
*/ private void$$$setupUI$$$() {
mainPanel
= newJPanel();
mainPanel.setLayout(
new GridLayoutManager(1, 1, new Insets(8, 0, 0, 0), -1, -1));
tabbedPane
= newJTabbedPane();
tabbedPane.setFont(
newFont(tabbedPane.getFont().getName(), tabbedPane.getFont().getStyle(), tabbedPane.getFont().getSize()));
mainPanel.add(tabbedPane,
new GridConstraints(0, 0, 1, 1, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_BOTH, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, GridConstraints.SIZEPOLICY_CAN_SHRINK | GridConstraints.SIZEPOLICY_CAN_GROW, null, new Dimension(200, 200), null, 0, false));
aboutPanel
= newJPanel();
aboutPanel.setLayout(
new GridLayoutManager(8, 6, new Insets(10, 10, 10, 10), -1, -1));
aboutPanel.setForeground(
new Color(-4486500));
tabbedPane.addTab(
"关于", aboutPanel);final JLabel label1 = newJLabel();
label1.setEnabled(
true);
label1.setFont(
new Font(label1.getFont().getName(), label1.getFont().getStyle(), 36));
label1.setText(
"WePush");
aboutPanel.add(label1,
new GridConstraints(1, 0, 1, 6, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));final JLabel label2 = newJLabel();
label2.setText(
"Proudly by 多多@放学了");
aboutPanel.add(label2,
new GridConstraints(2, 0, 2, 6, GridConstraints.ANCHOR_CENTER, GridConstraints.FILL_NONE, GridConstraints.SIZEPOLICY_FIXED, GridConstraints.SIZEPOLICY_FIXED, null, null, null, 0, false));

....省略

Test.setBorder(BorderFactory.createTitledBorder(BorderFactory.createRaisedBevelBorder(),
"测试"));
}
/*** @noinspection ALL*/ publicJComponent $$$getRootComponent$$$() {returnmainPanel;
}
}

eclipse缺少的代码

最终造成 eclipse无法跑起来。

== 放到idea 中,

设定 Edit Configurations 为application 添加如何 main函数

因为在此之前本人已经 跑过一遍了,第二次很容易就跑起来了,

第一次大概经历:

lib里面的四个jar包我没有放到仓库,我IDEA 环境jar包的路径默认是用户路径,我就把那4个jar包手动放入Project Structure 的Libraries 里面,
把pom原来的<executions> 去掉
,我在edit configurations 中添加 application 和Main class;运行的时候提示错误:

对象空指针:是因为:Tab下的一个Jpanel我不小心勾上了下面的,意思是自定义创建。如果不勾就是由程序初始化自动创建。

发现后,去掉勾,可以跑起来。

第二次 重新导入项目后,因为上一次跑起来过一次了,所有lib下的4个jar包自动放到 了用户路径下的 jar库中了。所以本次不需要
把pom原来的<executions> 去掉

即可跑起来,下面动态图压缩了,所以有点模糊

---

GitHub - rememberber/WePush: 专注批量推送的小而美的工具,目前支持的消息类型:微信模板消息、微信客服消息、阿里大于模板短信 。
https://github.com/rememberber/WePush

build 说明 · rememberber/WePush Wiki
https://github.com/rememberber/WePush/wiki/build

代码如截图:

总结:

printf 多参数中有运算时 是从右到左执行的;

i++ 和 ++i 优先级是大于 赋值 =运算的; i++ 和++i 是平级的;

i++ 先用在算,++i 先算在用;

从右往左的过程:运算的先算,碰到只是赋值的 跳过执行下一个运算。

解说:

说明第一个printf:从右往左

第四个参数 i++ 先用(
输出i为2
),后加 i变成3=>

碰到第三参数 赋值 i 不管,跳到第二个运算参数 ++i,先算后用,i变成4,这个时候还没有用(即没有输出)=>

跳到第一个运算参数i++,先用(
输出i为4
),后加 i变成5  =>

然后到 第 2 3 个参数直接用i,这个时候 i都是5,
都输出5
,SO:输出的为 4,5,5,2。

说明第三个 printf :

第四个赋值 i 不执行,跳到第三个运算参数 i++,输出2 ,i变成了3=>

跳到了第二个运算参数i++,输出3,i变成了4 =>

跳到了第一个运算参数++i, 先运算i变成5 ,输出5 ,=> 剩余 第四个参数输出 i的值,输出5;

so: 5 3 2 5

vs2017添加引用时报错未能正确加载“ReferenceManagerPackage”包。 - AusonSir - 博客园
https://www.cnblogs.com/-bao/p/6749419.html

解决方法

  1. 启动
    Developer Command Prompt for VS 2017
  2. 执行命令
    CD
    C:\Program Files\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies

    • 备注:默认的安装地址就是这里,如果不一样请自行修改路径。
  3. 执行命令
    gacutil -i Microsoft.VisualStudio.Shell.Interop.11.0.dll
  4. 执行完成之后,你将会看到

    Microsoft (R) .NET Global Assembly Cache Utility.  Version 4.0.30319.0
    Copyright (c) Microsoft Corporation. All rights reserved.

    Assembly successfully added to the cache

    • 1
  5. 之后,重启Visual Studio就可以加载引用了。