秋声赋
简单易懂的现代魔法:C#编程教程(三)
展开Biu

本帖最后由 丨端木丶荒冬 于 2012-4-11 22:52 编辑


简单易懂的现代魔法:C#编程教程(三)

控件与事件

第二篇帖子很无聊吧?

看不懂也没什么关系,好好接受以后的知识就行,但是要记住只要不不懂的地方一定要弄懂,可以去查资料,也可以在下面发帖问我.

然后进入这次的学习.这篇帖子会接受控件的相关概念,如属性事件,然后介绍如何响应各种事件.

以后的帖子都会像这次的一样,介绍一到两个可视化编程的知识点,都不会很长,

但是实际动手操作的地方会比以前多很多,希望大家能亲自动手实验.


控件

首先新建一个工程.大家应该还记得一开始介绍的工具栏吧?里面就有我们需要的各种各样的控件.

控件有是什么呢?

广义上来说控件是对数据和方法的封装控件可以有自己的属性方法

这点是不是和非常像呢?差不多可以认为一种控件就是一个,单个的控件就是这个类的对象.

本帖以后所说的控件,具体指的是微软已经给我们写好的那些,也就是工具栏中的那些,我们只要拿来用就好了.

控件使得可视化编程变得非常的方便.

Winform程序的开发,很大一部分是通过设置各种各样的控件完成的.

在C#中,控件除了拥有属性行为(函数)外,还有事件.

什么是事件呢?

和现实生活中的事件一样,对于一个对象(例如一个人),他不只有打人这个行为(函数),也会有正在打人这个事件.

当一个人打人的时候,就会发生在打人这个事件.

我们可以为这个事件添加一个响应它的函数,以便在这个事件发生的时候做一些我们需要的操作.

这次的帖子只会用到一个控件,Button控件,也就是按钮控件.

添加按钮控件非常简单,直接从工具箱中选中拖出来就好了.得到下图.

然后选中按钮控件,在属性面板中可以看到它具有很多的属性,我们能修改这些属性已达到我们想要的效果.

例如我们修改这个按钮的Text属性,按钮上显示的文字就会被改变.

当然还有其他很多属性,例如位置啊,大小啊,文字的字体等等.

然后进入控件的事件面板(就是属性面板旁边的小闪电)

下面的已经描述的很清楚了,当按钮被点击(Click)的时候(就是按钮发生了点击这个事件)做出某种响应的操作.

我们可以点击一下Click后面的文字框,输入一个自己定的函数名(或者点2下,vs会自动填一个函数名),然后双击它,vs就会自动为我们这个点击事件生成一个响应它的函数.

可以看到系统生成的这个参数会自动带了2个参数进来,这个到后面讲.

在这个函数中输入以前经常用的代码.

MessageBox.Show(有种继续点);

然后点击运行(F5)

点击一下按钮

现在可以理解事件的概念了吧?

下面我们来点复杂的,响应键盘输入.

把刚刚新建的按钮删掉,选择整个窗口.

这时候我们会发现窗口其实和控件一样,也有属性和事件.

在窗口的事件中,我们在KeyDown事件后加入响应函数.

在这个函数中添加如下的代码

MessageBox.Show(e.KeyCode.ToString());

解释一下,可以看到e是KeyEventArgs的一个对象,这个类提供了键盘按下,这个事件的所有信息.

例如你在打人,你打的是谁呢?打了多久呢?都是系统通过这个参数传递给我们的.

其中e.KyeCode指的是这次按下的是哪个键,

ToString()就是把这个键转换成字符串方便我们输出啦.

运行下看看效果.

在运行中随便按下一个键试试.

如何?很有意思吧?



上面就是这次的全部内容.

这次,我介绍了控件和事件的概念

也通过响应发生的事件弹出了各种各样的对话框.

作业:

1.每次点击按钮都弹出不同的文字.

2.判断按键,只有按下的键是 5,4,2,B的时候才弹出窗口.

3.想想为什么要响应键盘就要删掉按钮呢?

[查看全文]
秋声赋
简单易懂的现代魔法:C#编程教程(二) 简单C#语法
展开Biu

本帖最后由 丨端木丶荒冬 于 2012-4-11 22:54 编辑

简单C#语法

上个帖子中为大家介绍了C#的基本知识,和VS2010的使用方法,并且我们就创建出了一个非常简单的小程序,

它只能弹出一个对话框.但是请不要小看它,它已经具备一个应用程序的基本框架了.

那么怎么样创建一个更复杂的程序呢?换句话说,我们怎么创建一个更绚丽的魔法世界呢?

很简单,如果看完这个系列的教程,我相信你就能创建一个实用的程序了,计算器,日历,文本处理器,甚至是一个简单的游戏.

先说一下整体的安排

在接下来的教程中,我们会以制作一个简单的Galgame程序为线索,讲解C#图形编程的相关知识.

下面我们列出我们将会接触到的内容:

1. 显示图片

2. 更换图片

3. 显示不同文字

4. 显示不同的界面

5. 接受鼠标和键盘的输入

6. 实现不同按钮相应的功能

7. 播放音频

8. 弹出不同的窗口(如读取存档,设置等等)

上面是我们要学习到的知识(相对于一个Galgame来说).相信你肯定会对其中的一项或几项感兴趣.

要学习以上的知识,首先你必须拥有最基本的编程知识,通俗的说就是编程的语法.

下面我就会简单的介绍下这些基本知识.也许会有点枯燥,但是却是很重要的一部分.

(如果你在看这篇帖子的时候,感觉到无聊并有导致你对编程失去兴趣的可能,就跳过这篇吧,只要记住在后面的帖子中有看不懂的地方,就来这篇帖子相应的地方看看)


变量与类型
变量,就是字面上的意思,在程序运行中可以变化的量.反之不能变化就是常量.

这里的变化指的是可不可以发生变化,不是会不会发生变化,这点要注意.

常量倒是用的不多.以后就不提常量了,因为除了可不可以变化外,它和变量基本没区别.

每一个变量都必须规定成一种类型的变量.类型有很多种,常用的例如,int,double,string,bool等等都是类型.

在使用一个变量,我们必须先定义,定义变量的语法如下:

int a;
double b;
string c;
bool d;
int[] e;

前面是变量的类型,后面是变量名.变量名就是变量的名字.为了区分不同的变量,他们就必须有不同的名字.

而且取变量名有一定的规则:只能由字母,数字,汉字,下划线_组成,且数字不能放在最前面,且不能用C#的关键字.

定义了变量后我们就能对他进行操作.例如:

a=2;
b=2.222222;
c=”简单易懂的现代魔法”;
d=true;
e={1,2,3,4,5}
a=a+b;
b=b/2*a+e[2];
c+=”C#编程;

这些都是通过运算符号来操作变量的值.

相信这些大家都能理解,这里我只做简单的讲解,到后面用到的时候我会仔细的说明.

其中可能对[]有些不了解,他是数组的意思,int[]表示一个里面元素是整数的数组,数组一系列相同类型变量的集合.

访问数组中变量的时候用数组名[来访问,其中下标从0开始,如e[0] 表示上面的整数数组e第一个元素.


语句

C#里面有以下5种语句:

控制语句,函数调用语句,表达式语句,空语句,复合语句。
先说控制语句,控制语句是用来控制程序流程的语句,分为条件,循环,分支3种.

条件语句: if语句,语法如下

if(表达式语句)
语句1;
else
语句2;

条件语句通过判断括号里面表达式语句的真假值来决定执行哪一个语句,如果为执行语句1,如果为执行语句2.

其中else 语句2 并不是必须有的,可以省略,表示如果表达式是假的就什么都不做.

表达式语句通常是由运算符和变量,数字,括号组成,

例如a+b,a*(b+c),(a>b) &&(a!=0),

能得出的结果(数值或者逻辑值(true/false)).

其中还要用到除了算术运算符以外的逻辑运算符:>(大于),<(小于),==(等于),!=(不等于),&(),|(),!().

循环语句: for语句,语法如下:

for(表达式1;表达式2;表达式3)
语句1;

循环语句是帮助我们重复做一件事情的语句.

对于for语句,首先执行一遍表达式1,通常我们在这里为我们的循环控制变量赋初值,

然后判断表达式2的真假,如果是真就继续执行,通常我们在这里放上我们的循环条件.

然后执行表达式3和语句1.在表达式3里面我们通常会改变我们的循环控制变量.

执行完后继续判断表达式2,如果是真就一直循环下去.

循环语句:while语句,语法如下:

while(表达式)
语句1;

顾名思义,就是当表达式成立的时候就一直执行语句1.

分支语句:switch语句

switch(表达式1)
{
case 常量表达式1: 语句1;
case 常量表达式2: 语句2;
case 常量表达式3: 语句3;
……..
default : 语句n;
}

执行的时候会根据表达式1的值来选择所执行的语句,如果case没有列出来表达式1所表达的结果,就会执行default所指定的语句n.

我们发现上面的语句中,通常只能执行一条语句.那怎么样在一个地方执行多条语句呢?

为了达到这一点,我就需要运用复合语句.符合语句是用一对大括号 { }所包裹起来的一条或多条语句的集合,

在执行的时候他们被看做是一条语句,以便插入在上面的控制语句当中.

顺便提一下注释语句,在任何语句前面打上//,计算机就认为//后面的文字是注释,在编译的时候不会去管他,同样的/*…..*/也有同样的效果.


函数

函数是由一条或者多条语句组成的语句块,

通常按照一定的逻辑组合起来,能够完成一定的任务.

计算机中的函数和数学中的函数一样,在同样的输入情况下,必定能获得相同的返回值或者效果.

函数和变量一样要先定义.下面是定义函数的语法:

[修饰符] 返回值类型 函数名(参数表)
{
/*函数所执行的语句*/
}

函数修饰符我们后面会讲.

每一个函数都有一个返回值类型,它可以是任意类型,例如int,bool,也可以是空,就是不返回任何值,我们用void表示.

函数名就是函数的名字啦,我们调用函数的时候,必须要靠函数名调用.

参数表是我们在调用函数的时候,传递给函数的一系列变量,函数按照这些变量的意义,进行各种各样的效果.

参数表可以有很多个参数,也可以没有参数.

例如我们编写一个求平方的函数:

public int 平方(int a)
{
return a*a;
}

当我们在我们自己的程序中调用平方这个函数时,就能求一个数的平方.例如

m=平方(n);

这时候m的值就是n的平方.这里就是函数调用语句.

在程序中,我们经常要调用各种各样的函数,调用的方法就是函数名(参数1,参数2…参数n).


类与对象

下面就是面向对象程序设计的关键部分了,很多人都觉得面向对象不好理解,

其实很简单的,就是把现实世界中的思想方式运用到程序设计中来.

首先,什么是对象?世界一切具体的东西(物体,能量,甚至是思想)都是对象.

在前面提到的一个变量和一个常量都是对象.一个,一个桌子也是对象.

一个对象一般都具有一定的属性(姓名,岁数),也具有一定的行为(走路,睡觉),

相对应的,程序中的对象也拥有属性(成员变量),和行为(成员函数).

那什么是呢?把具有相同属性和行为对象,抽象地描述出来,就是.

对象和类的关系就像是一个人和人类的关系.

对象抽象描述,我们可以通过这个描述去创造出一个对象,这个过程叫做实例化 .

火球来说,火球术本身是一个,是看不见,摸不着的,是一个并不存在实体的概念,

但是每天都会有很多的魔法师都会用火球术创造很多的火球,那么这单个的火球就是对象,火球术就一个.

像我们前面用到的int,double,string都是,前面我们说的是类型,其实他们就是一个,分别抽象了整数,浮点数和字符串对象,

方便了我们利用他们创建各种变量,变量也是对象.

到这里相信大家应该对类和对象就有一个大概的了解了.下面来说编程里面是如何定义类和对象的.

下面是定义类得语法

[类修饰符] class 类名
{
成员变量1;
成员变量2;
成员函数1;
成员函数;
…………………..
}

一个中一般包含多个变量和函数,我们把他们称为该类的成员变量成员函数.

关于修饰符,下面我会提及到.

为了理解,我们定义一个火球类.

首先我们要想想如何描述一个火球呢?

他应该有自身的大小,当前的速度,和爆炸的威力,以及目前的位置.然后他还应该有几种行为,

例如被施放出来,根据速度移动,以及碰到目标后爆炸等等.

有了这些想法,我们就要吧我们的火球类写出来了.

public class 火球
{
public int 大小;
public int 速度;
public double 威力;
public Point 位置;
public void 施放()
{
/******/
}
public void 爆炸()
{
/******/
}
public void 移动()
{
/******/
}
}

其中Point表示一个记录一个点位置,我们用一个Point的对象来记录当前的位置.

到这里我们已经完成了一个火球类的创建.但是我们是不能用它去攻击别人的,因为它只是一个抽象的概念,并不是实物.

所以我们需要下面的代码来创建一个真真正正的火球.

火球 火球1 = new 火球();

这和前面我们定义一个整数的时候有点不一样?因为int,double等类型有一个叫做字面量的东西,它使得我们可以直接用等于号给这些变量赋值,

而我们自己定义的和很多系统提供给我们的类是通常是没有字面量,这区别没必要知道,无所谓,只要知道引用类型创建变量需要new一下就好了.

new运算符的意义是创建一个类型的对象,我们定义了一个叫做火球1引用接受它所创造出来的这个对象,

所以火球1就是一个有实体的对象,我们就可以用它去攻击敌人了!

也许你会发现new后面那个火球带了一对括号(),这不是函数的调用吗?

没错,创建一个对象的时候必须要调用一个叫构造函数的函数.

但是我们并没有在类的定义中定义那个构造函数,因为系统会默认帮我们定义一个什么事都不做的构造函数.

当然我们也可以自己定义一个,做一些为变量赋初值等操作.注意哦,构造函数必须和类名相同

一个火球被制造出来的时候,一般会有一定的初速度,那么我们就把初速度赋值给对象的速度变量好了.

在类的定义中加入如下的函数.

public 火球()
{
速度 = 10;
}

这样当我们每一次new一个新火球的时候,他们的速度都会变成10.另外构造函数可以有参数,也可以重载.

创造出火球之后,我们就要发射它啦

如何调用火球这个对象中的发射这个函数呢?

很简单,

火球1.发射();

就行了.访问对象中的属性和函数都是通过 对象名.函数名(变量) 访问.

下面介绍面向对象程序设计的核心思想之一:继承.

继承是指一个另一个类复制所有的属性和行为.

我们把继承出来的类称为派生类(子类),被继承的类叫做基类(父类).

应该不难理解吧?我们还是拿上面火球类的例子继续说.

火焰专精的法师,不想和别的专精的法师一样用简单的火球术,他们在火球术的基础上,发明了另一种更强大的法术—炎爆术.

炎爆术是以火球术作为基础的,他具有所有火球术所具有的属性和行为,例如大小,移动等等.

但是他却具有火球术不具有的属性和行为,

首先,他的有一个持续时间的属性,并且他在命中目标后能持续性的造成伤害.

比火球术厉害多了不少,不是吗?

然我们来看看怎么写炎爆术:

public class 炎爆术 : 火球
{
public int 持续时间;
public void 造成持续伤害()
{
/******/
}
}

这个冒号:),就代表了炎爆术类是从火球术继承而来.

虽然我们没有定义其他的那些属性,但是它却火球术所有的属性和函数.

并且它比火球术多了一个持续时间属性造成持续伤害的函数.

然后我们就可以创造一个比火球厉害得多的炎爆去攻击敌人了!

补充一点,前面我们所说的修饰符,就是你们看到的public之类的,他描述了类或者是函数的访问权限,

例如public,private, protected和是不是静态变量(静态函数)(static).

所谓静态static),指的是它属于这个类变量(函数),而不是属于该类的对象的.

打个比方说,人类的总数,这个属性是描述人类这个的,单个的人并没有总数这个概念.

这些修饰符是可有可无的,视情况需要加在类(函数)的定义前面,默认是private和非静态函数.



上面就是这次的全部知识,这次我介绍了C#的基本语法,

虽然你可能觉得无聊,也可能没有看懂,但是没关系!因为这些都是理论知识,

在后面的实例中我们会要经常用到他们,用的时候你就能很轻松地理解他们了!

其实我也觉得这次的内容很枯燥无聊,都不想写了…

但是他们毕竟是基础,在后面的学习过程中,如果有这方面的问题,就可以到这里面来找.当然我更推荐去上次说的那3个地方找.


另外说明一点,为了提高大家的兴趣,也是为了节省时间,

上面的介绍并不是C#的全部语法,很多重要的语法我都没有说明,例如重载,泛型,委托等等.

用到的时候我会讲,毕竟本帖的目的是带你们快速的开发出一个小程序以提高你们的兴趣,一开始讲那么多理论只会吓退一些读者.

C#入门的经典书籍<C#入门经典>就有将近1000页,你可以想象得出我省略了多少.

如果你非常有兴趣学习C#,我推荐你去读那本书,或者<C#高级编程>.相信你能收获很多知识.

我希望大家记住:类就是类型,对象就是变量(常量).

下次,我告诉大家我列出的galgame功能的其中2项,如何响应键盘和鼠标操作,与按钮的响应.

作业:复习下今天的所讲述的知识就行,毕竟没什么需要动手的地方.如果你愿意就自己定义几个类,和函数试试看.

作业记得贴上代码和成功运行的图!!

另外如果你觉得galgame除了我列出的那些功能外,还应该具有什么功能,你可以在下面回帖,我会回去研究下.


后面是一点广告

首先,欢迎对编程有兴趣或者已经从事IT工作以及相关专业的同学加入论坛的ooxx研究院的群 纯技术研究所(118213378)

本群有各种NB人士,有相关的问题都可以在其中交流。

然后是Runa游戏引擎征集中文名,不局限于音译.同时欢迎有兴趣的同学参与到引擎的开发中来.

Runa是基于Ruby和XNA的游戏引擎,目前处于制作阶段,将在4月份出第一个演示用的DEMO.

对于演示程序有好的建议的同学请联系我,以及招募各种画师,程序员等等.

Runa引擎交流群(2715634)

秋声赋(104228916@qq.com

因为对外推送的缘故.编辑了一下帖子.请谅解.BY:落幕 @秋声赋

https://www.gn00.com/t-37919-1-1.html

[查看全文]
GRzhan
通过简单的Python代码来做ascii字符画
展开Biu

写这个东西的原因是问社团前辈买的云主机到了,用putty连上去后想在/etc/motd里加点东西。

考虑了下就网上参考了些Python的代码弄个字符画。

另外大概PIL还是挺有用的,基友在学校写的选课机其中的验证码识别就是用PIL处理的。大概以后自己也要挖模式识别的坑所以就先看一点。

因为以前libjpeg没装好配置不对所以下下来的PIL有点问题,花了半个下午的时间。

---

大家如果经常逛B站或者网站的话可以看到一些用ASCII码制作的动画。(一般都是 Bad Apple的 PV,因为比较好处理)

比如 http://www.bilibili.tv/video/av419052/

在视频中采用的技术应该是 Python + PIL + OpenCV , PIL是一个Python的数字图像处理库(Python Image Library),OpenCV功能更加强大,负责处理视频帧,而这

一切库的调用以都是在Python语言编程基础上实现的。

Python跟C一样是一门高级语言,跟PHP一样是一门脚本语言,现在因其简单的语法强大的功能以及优秀的设计在各个领域都十分流行。

强烈建议没有接触过Python以及希望学习编程的同学学习Python这门语言,比C/C++要简单多了=,=。

这个贴子呢主要讲的是通过Python + PIL 库来制作一些字符画,效果如图(选用我们社团logo的jpg图片)

在写代码之前要确定自己装了Python(我用的是Python2.7,在Linux多数发行版本中自带)以及PIL库(PIL库在使用之前libjpeg等库作为扩展,代码运行时如果碰到问题可以去网上搜索解决或者找我)

Python下载地址:http://www.python.org/getit/

PIL下载地址(不知道Windows要不要装别的库~_~,Linux安装会遇到点问题):http://www.pythonware.com/products/pil/

使用的代码大概也是参考来的(http://zhan.renren.com/linuxfunc ... 717986&checked=true),去掉装饰器后加上注释:

[mw_shl_code=python,true]

#-*- coding: utf-8 -*-

# Image 库即PIL,是用来进行数字图像处理的Python库

import Image

# color = 'MNHQ$OC?7>!:-;.'

# 字符映射,将对应的像素根据其灰度映射成不同的字符,比如 `M` 代表黑色, ' '空格代表白色等

color = 'MNHQ$OC?7>!:- '

def make_char_img(img):

""" 将已经预处理好的图片根据color生成字符字符串,存放到 pic_str 变量中 """

pix = img.load()

pic_str = ''

width, height = img.size

for h in xrange(height):

for w in xrange(width):

pic_str += color[int(pix[w,h]) * 14 /255]

pic_str += '\n'

return pic_str

def preprocess(img_name):

""" 预处理: 通过使用PIL库里的函数将图片打开并重新缩放大小"""

img = Image.open(img_name)

w, h = img.size

m = max(img.size)

# 修改 delta 可以更改图片的大小,分母越大图片越大。

delta = m / 50.0

w, h = int(w/delta), int(h/delta)

img = img.resize((w,h))

img = img.convert('L')

return img

def save_to_file(filename, pic_str):

""" 将生成的图片载入到 filename 中"""

outfile = open(filename,'w')

outfile.write(pic_str)

outfile.close()

def main():

""" 这是主函数,相当于 C 里的 int main() """

# 预处理 'ncg.jpg' 图片,把处理好的图片放入 img 变量中

img = preprocess('ncg.jpg')

# 生成图片字符串

pic_str = make_char_img(img)

# 保存字符串到 foo.txt 中

save_to_file('foo.txt', pic_str)

if __name__ == '__main__':

main()

[/mw_shl_code]

之后只要在当前文件夹里放好对应图片,用python解释器跑一下即可。

关于在Linux使用的时候会碰到错误,应该是没有安装libjpeg库(或者在编译PIL的时候没有指定路径无法安装扩展)

这里有解决方案:

http://www.360doc.com/content/13/0314/15/7972_271475405.shtml

http://mariz.org/blog/2007/01/26 ... jpeg-not-available/ 在使用这个解决方案的时候请在对libjpeg源码进行编译并要 "./configure" 时加上 --enable-static选项(大概是这个如果不是查查下载下来的文档,README啊 install.doc什么的)

opencv的话,最近学校里有数字图像处理课还是蛮不错的,基友玩机器人搞Kinect也挖了不少坑,这学期可以多研究研究,搞个PHP的扩展出来。

[查看全文]
睦猫长望
用AutoHotKey编写月姬格斗连续技
展开Biu

最近写完东方百鬼夜行的挂机程序并通关后,突然想把以前想做的事补一下

之前在测试月姬格斗人物招式的时候,琥珀的某个技能完全放不出来

基于对那个技能的好奇,写段代码集成它

y::

{

send {down down} ;按下方向下键

send {left down}

sleep 5 ;延迟0.005秒

send {right down}

sleep 2

send {down up} ;放开方向下键

send {left up}

sleep 5

send {down down}

sleep 5

send {right up}

sleep 5

send {left down}

sleep 5

send {down up}

sleep 5

send {left up}

send {down down}

send {right down}

sleep 2

send {, down}

sleep 2

send {down up}

send {right up}

sleep 3

send {, up}

}

return ;改键结束

程序非常简单,之后按y键就能放那串连续技

效果如下

当技能超过100%可以使用

强制进入BLOOD HEAT状态,BLOOD HEAT状态下可以放超必杀,并回复一定量的血

但由于发招需要一会儿时间,放前必须放倒对手

而且BLOOD HEAT结束后技能条清零

看情况使用吧

加上这串超必杀能狠踢对手一脚(打中的话)

u::

{

send {left down}

sleep 5

send {down down}

sleep 5

send {left up}

sleep 5

send {right down}

sleep 5

send {down up}

sleep 5

send {right up}

send {, down}

sleep 1

send {, up}

}

return

接着是月姬的19连连续技

v::

{

send {n down}

sleep 1

send {n up}

sleep 100

send {m down}

sleep 1

send {m up}

sleep 100

send {down down}

sleep 50

send {m down}

sleep 1

send {m up}

sleep 200

send {, down}

sleep 1

send {, up}

sleep 100

send {down up}

sleep 100

;提起(上面去掉的话会实用点)

send {left down}

send {m down}

sleep 1

send {left up}

send {m up}

sleep 500

send {m down}

sleep 1

send {m up}

sleep 400

send {up down}

sleep 1

send {up up}

sleep 100

send {m down}

sleep 1

send {m up}

sleep 200

send {down down}

sleep 1

send {down up}

sleep 50

send {down down}

sleep 1

send {down up}

sleep 50

send {m down}

sleep 1

send {m up}

sleep 350

send {right down}

sleep 1

send {right up}

sleep 100

send {right down}

sleep 1

send {right up}

sleep 100

send {m down}

sleep 1

send {m up}

sleep 250

send {down down}

sleep 1

send {down up}

sleep 50

send {down down}

sleep 1

send {down up}

sleep 50

send {, down}

sleep 10

send {, up}

}

return

以上必须在对手左侧使用,可自行修改右侧的版本

谁去试试集成拳皇的绝招和连招

或者使用ahk的图像匹配功能做个能和电脑pk的程序

(匹配对手的位置和对手的发招编写各情况的应对措施让电脑控制自己的人物和对手pk,理论上是可以实现的XD)

[查看全文]
fair_jm
[原创]简单下载网站特定后缀的文件~~加密的网站不行
展开Biu

本帖最后由 fair_jm 于 2012-9-20 19:52 编辑

去学校的网站下点东西 发现没有批量吐血 顿时热血澎湃啊.....不说废话了

这是咱学校网站的一个下载页:http://kczy.zjut.edu.cn/jsjwl/downloadcenter.asp?Page=2

如果chrome说有恶意程序你自己判断 因为...我们学校的神马精品课程管理系统等等都会跳

废话不多说 源码贴上 bug是一定有的 我测试了两次发现可以用之后就不去管了(下午还得上课 晚上也是...额)

所以注释什么的也没写.......以后再补上 如果有人要注释的话

原理超简单 下载速度很慢 没用NIO的关系吧?...

[mw_shl_code=java,true]package org.cc.network;

/**

* 用于简单下载一个网页(未加密)的特定后缀的文件

* @author Fair_jm

* @version 1.0

*/

import java.io.File;

import java.io.FileOutputStream;

import java.io.FileWriter;

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.Reader;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.Date;

import java.util.concurrent.Executor;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Semaphore;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class FileDownloader {

private int limit=5;

private Semaphore licence=null;

private ExecutorService exec=null;

private String suffix="ppt";

private String base_page="http://kczy.zjut.edu.cn/jsjwl/";

private String task_page;

private StringBuffer page_buffer;

public int getLimit() {

return limit;

}

public void setLimit(int limit) throws Exception {

if (this.limit!=licence.availablePermits())

throw new Exception("程序正在运行,无法修改");

this.limit = limit;

this.licence=new Semaphore(limit);

}

public FileDownloader(String task_page){

this.page_buffer=new StringBuffer();

this.task_page=task_page;

this.licence=new Semaphore(limit);

this.exec=Executors.newCachedThreadPool();

}

public FileDownloader(String task_page,String base_page){

this(task_page);

this.base_page=base_page;

}

public FileDownloader(String task_page,String base_page,ExecutorService exec){

this(task_page,base_page);

this.exec=exec;

}

public FileDownloader(String task_page,String base_page,ExecutorService exec,int limit){

this(task_page,base_page,exec);

licence=new Semaphore(limit);

this.base_page=base_page;

}

private void init() throws IOException{

URL url=new URL(task_page);

Reader reader=new InputStreamReader(url.openStream());

char[] buf = new char[1024];

int len=0;

while(!((len=reader.read(buf))<0)){

page_buffer.append(buf,0,len);

}

reader.close();

}

public void download() throws IOException{

this.init();

Pattern pattern = Pattern.compile("<a href=\"(.*)"+"\\."+suffix+"\"");

Matcher matcher = pattern.matcher(page_buffer);

while(matcher.find()){

String file_page = base_page + matcher.group(1)+"."+suffix;

//System.out.println(file_page);

exec.submit(new DownloadHelp(file_page));

}

}

private class DownloadHelp implements Runnable{

private String task;

private URL url;

public DownloadHelp(String url) throws IOException{

this.task=url;

this.url=new URL(url);

}

@Override

public void run() {

FileOutputStream fw=null;

InputStream reader=null;

try {

FileDownloader.this.licence.acquire();

} catch (InterruptedException e) {

Thread.currentThread().interrupt();

e.printStackTrace();

}

try{

String[] names=task.split("/");

String fileName=names[names.length-1];

//System.out.println(fileName);

File file=new File(FileDownloader.class.getResource(".").getPath()+fileName);

reader=url.openStream();

byte[] buf = new byte[1024];

Date date_begin=new Date();

int len=0;

int temp=0;

while(file.exists()){

String temps=Integer.toString(temp);

String name=FileDownloader.class.getResource(".").getPath()+temps+fileName;

file=new File(name);

temp++;

//System.out.println(file.getAbsolutePath());

}

//System.out.println(file.getAbsolutePath());

System.out.println(file.getName()+"启动");

file.createNewFile();

fw=new FileOutputStream(file);

while(!((len=reader.read(buf))<0)){

fw.write(buf, 0, len);

}

Date date_end=new Date();

System.out.println(file.getName()+"完成"+"\n用时:"+(date_end.getTime()-date_begin.getTime()));

FileDownloader.this.licence.release();

}catch(IOException e){

e.printStackTrace();

}finally{

try {

fw.close();

reader.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

}

[/mw_shl_code]

一下测试用的main方法

[mw_shl_code=java,true]package org.cc.network;

import java.io.IOException;

public class Test {

public static void main(String[] args) {

FileDownloader fd=new FileDownloader("http://kczy.zjut.edu.cn/jsjwl/downloadcenter.asp?Page=2");

try {

fd.download();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

[/mw_shl_code]

以下结果:

[mw_shl_code=text,true]020101025111274266.ppt启动

02010102511822860.ppt启动

0201010251110374374.ppt启动

0201010251110374374.ppt完成

用时:11982ms

020101025111274266.ppt完成

用时:13411ms

02010102511822860.ppt完成

用时:15095ms

[/mw_shl_code]

[查看全文]
轻舟过
C++教程(一):快速入门
展开Biu

本帖最后由 轻舟过 于 2012-7-21 21:17 编辑

到博客看的话,排版可能会好看一些

http://bimania.org/2012/07/20/c-plus-plus-tutorial-1/

编程的第一课基本上是对程序有个初步的认识,下面的内容涵盖了程序的基本的知识,开发环境的选择,IO库的基本知识以及程序注释。其实基本是照搬《C++ Primer 第四版》的第一章的,而且后面几节被我省略了。有错的话请指正。

编写简单的C++程序

每个C++程序都包含一个或多个函数,其中必须有一个函数为 main ,并且 main 函数是唯一被系统显式调用的,系统通过调用 main 函数来执行程序, main 函数执行组成自己的语句并返回一个值给操作系统。操作系统则根据 main 函数的返回值来确定程序是否成功执行完毕,返回0表示程序成功执行完毕,其他值则通常说明出现了错误。
下面就是一个简单的main函数,它不执行任何功能,只是返回一个值:
[mw_shl_code=cpp,true]int main()

{

return 0;

}[/mw_shl_code]

定义函数必须指定函数的返回类型、函数名、圆括号内的参数表(可能为空)和函数体,main函数也不例外,这里它的返回类型是int型,main函数的返回类型也只能是这种int型,该类型是C++的内置类型,是由C++定义的,这种类型表示整数。函数名为main,这里main函数的参数表为空。函数体是函数定义的最后部分,以花括号开始并以花括号结束的语句块:
[mw_shl_code=cpp,true]{

return 0;

}[/mw_shl_code]

语句块中只有一个return语句,该语句终止函数并将返回值返回给函数的调用者,return后面所跟的值就是函数的返回值,这个值的类型必须和函数的返回类型相同,或者可以转换成函数的返回类型。对于上面的例子中,返回值必须是int类型,而0是int类型的,所以这里没有问题。C++中的语句都是以分号结束的,这点需要注意。
编译与执行程序

编写、编译、执行程序大体有两种选择,使用或者不使用集成开发环境(IDE)。
IDE是集成了文本编辑器、编译器、、调试器等多种工具,具有点击式的图形界面,在开发复杂程序的时候非常有用,编译运行?点击一下按钮就可以了,之后下面会有一个框列出程序中存在的错误(如果有的话),点击错误信息可以跳到错误发生的代码位置。微软的Visual Studio就是一款功能非常强大的IDE,不过一般时候写点小程序倒是用不着这把牛刀,我个人推荐CFree这个编译器,体积比较小,基本上常用的功能也都有了。
当然也可以不使用集成开发环境,用文本编辑器写程序,在命令行下编译、运行、调试,为了代码能写起来爽,通常要求文本编辑器有智能缩进以及语法高亮的功能,这样的文本编辑器有非常非常多的选择,比如有UltraEdit、EditPlus、Notepad++、sublimetext,当然还有两大神器Emacs和Vim,除了两大神器比较难以上手之外,其他的应该都还好。
编译器的话首选g++,Windows环境下的话推荐装一个mingw,包含了g++等各种有用的工具,可能需要配置一下环境变量。用g++编译的话只要在命令行输入g++后面跟你的文件名就好了,默认会编译成a.exe,运行的话只要输一个a回车就行了。如果想要改变输出的可执行文件名,可以用加上-o参数后面跟输出的文件名就可以了。当然g++其他的参数有很多,有空可以去研究研究。
初窥输入输出

C++的输入输出是由标准库提供的。程序通常要用到处理格式化输入和输出的iostream库。iostream库的基础是两种命名为istream和ostream的类型,分别表示输入流和输出流。流是指要从某种IO设备上读入或写出的字符序列。
标准输入与输出对象

标准库定义了4个IO对象。处理输入时使用cin的istream类型对象,这个对象也被称为标准输入。处理输出时使用命名为cout的的ostream类型对象,这个对象也被称为标准输出。另外两个对象是cerr和clog。
一个使用IO库的程序

下面来看一个使用了IO库的程序,程序要求用户给出两个数,然后输出它们的和:

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢*

int main()

{

std::cout << "Enter two numbers:" << std::endl;

int v1, v2;

std::cin >> v1 >> v2;

std::cout << "The sum of " << v1 << " and " << v2

<< " is " << v1 + v2 << std::endl;

return 0;

}[/mw_shl_code]

运行程序之后会在屏幕上显示:
Enter two numbers:

这时候输入
3 7

跟着一个换行符,程序会产生下面的输出:
The sum of 3 and 7 is 10

第一行是一个预处理指令

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢* [/mw_shl_code]

这个指令告诉编译器程序要使用iostream库。尖括号里的名字是一个头文件,程序使用库工具时必须包含相关的头文件。#include指示必须单独写成一行,#include指令应出现在任何函数的外部。而且习惯上,程序的所有#include指令都在文件开头部分出现。
写出到流
main函数体中的第一条语句执行了一个表达式。C++中一个表达式由一个或几个操作数和通常是一个操作符组成。语句的表达式使用输出操作符'<<',在标准输出上输出提示:
[mw_shl_code=cpp,true]std::cout << "Enter two numbers:" << std::endl;[/mw_shl_code]

这个语句中使用了两次输出操作符,输出操作符接受两个操作数,左操作数必须是ostream对象,右操作数是要输出的值,操作符的作用是将右操作数写到左操作数的ostream对象中。C++中每个表达式都会产生一个结果,这里也不例外,当输出操作符连接两个操作数时,结果是左操作数的值,也就是说输出操作返回的值是输出流本身。因此我们也可以在上面的表达式加上括号
[mw_shl_code=cpp,true](std::cout << "Enter two numbers:") << std::endl;[/mw_shl_code]

endl是一个特殊的值,它被称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新与设备相关联的缓冲区。
另外注意到上面的程序中使用的是std::cout和std::endl,前缀std::表明cout和endl是定义在命名空间std中的。使用命名空间程序员可以避免与库中定义的名字相同而无意间引起命名的冲突,不过代价就是当我们使用标准库中的名字时,必须显示表达出使用的是命名空间std下的名字。当然也可以在函数前加入using namespace std;来引入整个命名空间中的名字。
读入流
在输出提示语之后,将读入用户输入的数据。先定义两个名为v1和v2的变量来保存输入。
[mw_shl_code=cpp,true]int v1, v2;[/mw_shl_code]

上面将两个变量定义为int类型。需要注意的是这两个变量没有初始化,就是没有赋给它们初始值,但是因为会在下面的语句中读入一个值,所以现在可以不必初始化。
输入操作符的行为与输出操作符相似,不同的是它接受一个istream对象作为其左操作数,接受一个变量或对象为右操作数,它从istream操作数读取数据并保存到右操作数。像输出操作符一样,输入操作符返回左操作数作为结果。
这里整个表达式的效果是从标准输入读取两个值,第一个存放在v1中,第二个存放在v2中。
完成程序
最后是输出结果:
[mw_shl_code=cpp,true]std::cout << "The sum of " << v1 << " and " << v2 << " is " << v1 + v2 << std::endl;[/mw_shl_code]

这条语句与之前的输出语句并没有什么本质区别,它将每个遇到的右操作数输出到标准输出。这里的操作数有多种类型,有些操作数是字符串字面值。例如:
"The sum of "
其他的是各种int值,如v1、v2以及对算术表达式v1 + v2求值的结果。iostream库定义了接受全部内置类型的输入输出操作符版本。
关于注释

注释会被编译器所忽略,但是它可以帮助其他人阅读程序,通常用于概括算法、确认变量的用途或者阐明难以理解的代码段。
C++中注释有两种类型,一种是从C语言集成过来的/* */,/*与*/之间的为注释内容,会被编译器所忽略,这种注释可以跨越程序的多行。另一种则是单行注释//, 本行中//后面的内容均为注释内容,会被编译器所忽略,这种注释不能跨越多行。
下面是一个例子程序:

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢*

/* Simple main function: Read two numbers and write their sum */

int main()

{

// prompt user to enter two numbers

std::cout << "Enter two numbers:" << std::endl;

int v1, v2; // uninitialized

std::cin >> v1 >> v2; // read input

return 0;

}[/mw_shl_code]

原创文章,转载请注明: 转载自二进制狂热

本文链接地址: C++教程(一):快速入门

[查看全文]
terry182
【绝对新手向】整数型五则运算方法和解说
展开Biu

先说一下,什么是五则运算,就是在 加减乘除 的基础上面 ,再加上 %,也就是余 【就是求余数啊喂!】

输入的是一条标准的运算式,比如:2*(3+4)*5

注意一下是包含括号的,还有先乘除後加減以及() 優先運算的計算規則

【P.S. %是和乘除一个等级的

整数型 也就是说里面的任何运算都不可以出现非整数的数字,不然会是错误的哟亲 (好吧我是懒得改成浮点数的)】

以下就是程式的代码

[mw_shl_code=cpp,true]#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

#include *本站禁止HTML标签噢*

using namespace std;

int sti(string a)

{stringstream b;

int k;

b << a;

b >> k;

return k;

}

int isopr(char c)

{if (c=='+' || c=='/' || c=='%' || c=='-' || c=='*' )

{return 1;}

else

return 0;

}

int check(char c)

{if (c=='*' || c=='/' || c=='%')

{return 3;}

if (c=='+' || c=='-')

{return 2;}

else

return 0;

}

void caculate (string a)

{int i,m,n;

stack *本站禁止HTML标签噢* Numstack;

for (i=0;i<a.length();i++)

{if (isdigit(a *本站禁止HTML标签噢* ))

{string c;

while (isdigit(a *本站禁止HTML标签噢* ))

{c+=a *本站禁止HTML标签噢* ;

i++;}

Numstack.push(sti(c));

}

if (isopr(a *本站禁止HTML标签噢* ))

{if (a *本站禁止HTML标签噢* =='+')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(m+n);

}

if (a *本站禁止HTML标签噢* =='-')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(n-m);

}

if (a *本站禁止HTML标签噢* =='*')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(m*n);

}

if (a *本站禁止HTML标签噢* =='/')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(n/m);

}

if (a *本站禁止HTML标签噢* =='%')

{m=Numstack.top();

Numstack.pop();

n=Numstack.top();

Numstack.pop();

Numstack.push(n%m);

}

}

}

cout << Numstack.top() << endl;

}

int main(){

stack *本站禁止HTML标签噢* Oprstack;

string a,b;

int i;

while (getline(cin,a))

{

Oprstack.push('!');

for (i=0;i<a.length();i++)

{if(isdigit(a *本站禁止HTML标签噢* ))

{ while (isdigit(a *本站禁止HTML标签噢* ))

{ b+=a *本站禁止HTML标签噢* ;

i++;}

b+=' ';

}

if(a *本站禁止HTML标签噢* =='(')

{Oprstack.push(a *本站禁止HTML标签噢* );}

if (a *本站禁止HTML标签噢* ==')')

{while (Oprstack.top()!='(')

{b+=Oprstack.top();

b+=' ';

Oprstack.pop();

}

Oprstack.pop();

}

if(isopr(a *本站禁止HTML标签噢* ))

{if (check(a *本站禁止HTML标签噢* )>check(Oprstack.top()))

{Oprstack.push(a *本站禁止HTML标签噢* );

}

else if (check(a *本站禁止HTML标签噢* )<=check(Oprstack.top()))

{while (check(a *本站禁止HTML标签噢* )<=check(Oprstack.top()))

{b+=Oprstack.top();

b+=' ';

Oprstack.pop();

}

Oprstack.push(a *本站禁止HTML标签噢* );

}

}

}

while(Oprstack.top()!='!')

{b+=Oprstack.top();

b+=' ';

Oprstack.pop();}

caculate(b);

}

return 0;

}[/mw_shl_code]

[查看全文]
蓝宇轩
asp.net的简单教程(一) 安装
展开Biu

本帖最后由 蓝宇轩 于 2012-8-10 11:52 编辑

asp.net的简单教程(一)

学习asp.net也需要学习C#!一个是解释语言;一个是编写逻辑层的语言

先来了解cs于BS的区别吧!

C/S又称Client/Server或客户/服务器模式。服务器通常采用高性能的PC、工作站或小型机,并采用大型数据库系统,如Oracle、Sybase、Informix或 SQLServer。客户端需要安装专用的客户端软件。
最常见的有:网络游戏;如魔兽世界什么的就是CS模式;

C/S的优点是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快
缺点:
l 只适用于局域网

l 客户端需要安装专用的客户端软件

l 对客户端的操作系统有一定的限制

B/S是Browser/Server的缩写,客户机上只要安装一个浏览器(Browser),如NetscapeNavigator或InternetExplorer,服务器安装Oracle、Sybase、Informix或 SQLServer等数据库。浏览器通过WebServer 同数据库进行数据交互。
就是web应用程序;比如我们的这个网站是用PHP写的

B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。只要有一台能上网的电脑就能使用,客户端零维护。系统的扩展非常容易,只要能上网,再由系统管理员分配一个用户名和密码,就可以使用了。甚至可以在线申请,通过公司内部的安全认证(如CA证书)后,不需要人的参与,系统可以自动分配给用户一个账号进入系统
我们的asp,net及时BS模式的

客户端→<http响应>→iis服务器→ADO数据对象→数据库

web应用程序的运行结构

ASP.NETASP的比较

l新的运行环境:新的运行环境引入受控代码

(managedcode),它贯穿整个视窗开发平台。
l 效率:ASP.NET应用程序是在服务器上运行的编译

好的通用语言运行环境(CLR)代码。
l VisualStudio.net开发工具的支持:ASP.NET应用程

序可利用微软公司的VisualStudio.net进行产品开
发,VisualStudio.net比以前的Visual Studio集成开
发环境增加了大量工具箱和设计器,来支持
ASP.NET应用程序的可视化开发。

l多语言支持:ASP.NET支持多种语言,无论使用哪

种语言编写程序,都将被编译为中间语言
(Intermediate Language,IL),目前,ASP.NET支持的 语言有VisualBasic.NET,C#.NET,J#.NET和 C++.NET,设计者可以选择最适合自己的语言来编写 程序。
l 高效的管理能力:ASP.NET使用基于文本的、分级的配置系统,使服务器环境和应用程序的设置更加简单。

l 清晰的程序结构:ASP.NET使用事件驱动和数据绑定的方式开发程序,将程序代码和用户界面彻底分离,具有清晰的结构。

.NET Framework介绍

其实就是一个体系;以实现多种语言编写的程序之间的相互调用,这种跨平台性为程序设计提供了一个十分方便快捷的设计环境,为了跨平台(目前只支持win系统).

asp,net可以用:C#,J#C++,VB.NET,F#等语言来写逻辑层代码

ASP.NET应用程序的执行由IIS服务器完成,IIS的安装操作如下:点击桌面上的“开始”菜单,选择“设置”,进而选择“控制面板”菜单项,双击“添加/删除程序”选择添加/删除Windows组件,如图2.3所示,在对话框中选择Internet信息服务(注意,前面小方框里勾上小对号),单击下一步按钮,即开始安装IIS服务器。

需要安装一下软件

Visual Studio 2010 http://www.xiazaiba.com/html/4614.html 安装的话很简单那的!

可以去看下https://www.gn00.com/t-36106-1-1.html 安装

使用Visual Studio.NET开发ASP.NET应用程序共有三种工作模式
l设计模式。此模式可进行用户界面的设计和代码的

编制,来完成应用程序的开发
l 运行模式。此模式表示应用程序处于运行状态,在

这个时候可以观看应用程序运行结果
l 中断模式。此模式表示应用程序运行暂时中断,这

时单击“继续”按钮程序继续进行运行,单击“结束”按
钮停止程序的运行
菜单栏功能:l创建、打开、保存、关闭、页面设置以及打印`调试加
Web窗体、添加控件、添加HTML页、复制项目和从
项目排除等功能。
工具箱服务器资源管理器
工具箱、服务器资源管理器通常位于设计调试窗口的左侧,它们是隐藏式的窗口,当鼠标移到此位置时,该窗口出现;当鼠标移开时,该窗口将隐藏。
工具箱的主要作用是用来设计界面,它主要包括两
类服务器控件:HTML控件和Web控件。
服务器资源管理器主要用于服务器和数据库服务器
的管理
解决方案资源管理器(常用)
解决方案资源管理器主要用于代码查看、视图与代码窗口的切换、项目复制、新项添加等操作。
属性窗口(经常用)
主要作用是对控件的属性进行设置。
对Visual Studio.NET及其集成开发环境有了这些了解
之后,下面就开始介绍如何创建、调试运行ASP.NET
应用程序。
SQL server 2008 http://www.xiazaiba.com/html/4610.html

SQL server 是数据库管理系统,sql是数据库语言;需要去学sql和微软扩展的T-SQL

基本介绍到这里吧

[查看全文]