TankII 1.2 - "Big Map"

我承认版本号没什么用,仅仅用来标识一个新的版本而已。这次的更新是自#十天游戏设计#以来的一些小更新了。尽管对于我来说是大更新……

简介:

基于 Java2D 写的坦克小游戏。1.0 的源码可以在 http://www.box.net/shared/r6rusgtymqqn3aaja8tc 处下载。需要 JRE 6.0 以上运行(因为仅仅测试过 JRE 6.0 上的运行情况)。

Enjoy playing~ :-)

更新内容:

  • 增加大地图模式。呃,看不了全部地图,增加了一些未知的成分;
  • 机器人探测的一些修改,只有在当前可视情况下才会攻击玩家;
  • 玩家坦克的射击角度更精确。

嗯,更新内容基本上就是上面这些了。但这次更新似乎不够优化,游戏速度反而有点慢了……

下载:
http://www.boxcn.net/shared/1v7lhfdfumj08sxoktsl

最近的一些事情

这篇日志其实和程序不很相关……

假期终于过去了一半。

前几天回到了以前的高中,和一群高一新生交流高中的生活。事实上,一年的大学生活过去后,我发现对高中的生活又陌生了。或许现在渐渐地对很多东西的看法也发生了一些变化。不再执着于对和错,而是关注所谓的对错会带来什么。于是,高中和大学就很难说谁更好。大学更自由,是一个表现自我的平台。而高中则是扎实基础的地方,有的是硬化的指标。大学的累在于要对自己的选择负责,而高中的累则主要体现在学业的繁重。

又回想起莫老师说的:“Therer's no standard answer.” 人生或许真的没有标准答案吧。我不知道,你知道吗?

记得当初说过八月初会回校,但到现在,我也没有回校。可能推到八月二十日吧。而现在,我也不知道回去要去做什么了。邓老师的项目也不需要我去参与了。 ACM/ICPC 的成绩并不好,有很多东西还有待学习,现在,计划也只是参加一下校赛吧……

慢慢来吧。妈说过。嗯,慢慢来吧。即使速度很小,但只要有速度,那么也一定可以到达目的地。这个暑假,虽然一开始我自己都觉得不很可能,但我还是把一个游戏的大致框架做出来了。当然,那个框架还是存在很多不足。 Sprite 类的定义显然还不够细致,而且对 Java2D 的理解不是很透彻,导致 Sprite 结构里面有些简陋的代码。

在朋友的影响下也听起 Eason 的歌,大家听的似乎大都是 Eason 的国语歌。记得小时候就听着 Eason 的儿歌(粤语),不过,以前都没怎么注意到 Eason 的歌。到了东北以后,当我终于很少能听到粤语的时候,终于听到 Eason 的歌,虽然是国语歌,总是引起了一些怀念……

回到广东,在东北的生活又仿佛一场梦,周围都是粤语,没有东北的气氛……不过,大概还有 10 天左右又回去了。好好在这里感受一下吧……

新的一篇以及改进的主题

终于决定把博客迁到这里了。小玖似乎也不在百度空间了,而人人上压力巨大,大多数博客系统基本上不适合写代码……

昨天晚上把自定义 CSS 玩了一把。发现这里的自定义 CSS 挺好的,主题的 HTML 结构也很好(比百度空间的标准一点吧),附有多种主题作为基础选择。相对于以前的百度空间也算是一个进步。不过有些特效还是依赖 jQuery 等库才可以玩, CSS 3 的动画目前似乎只有gecko和webkit支持,opera也不支持(但我没有测试过,据W3schools.com的测试了解到的)。

主题主要修改部分:

  • 把 header 部分改为导航栏在上,然后用 position: fixed; 固定。考虑到 IE 可能不支持,我尝试删掉 position 属性定义,效果还可以,起码不会太乱。
    这样做的好处是看文章的时候总是可以见到导航栏,真正发挥导航的作用(呵呵,一家之言罢了)
  • header 上部分 float 的内容改用 position: absolute; 来替换。
  •  header 部分圆角边框和其他一些地方的圆角微调。
  • 改进了原来 #wrapper 控制的主内容区的排版方式。采用 margin-right 属性固定留空 #sidebar 区域,然后把 #sidebar 的 position 属性设置为 absolute ,当然,这样一来,为了排版,一些父元素的 position 也改成了 relative 。取消了原来的 float 和 width 固定页宽的排版方式。
    这个改进的好处是页面会随着屏幕的宽度而改变。尽可能不浪费横向空间的同时,也保留了版式的完整。但在小屏幕上,我承认这样的设计会有问题。但小屏幕的时候,浏览器应该不会过多地考虑 position 等定义吧(尽可能利用纵向空间)
  • 一些动画的改进。仅仅对Webkit和Gecko较新的内核上测试过。IE 肯定不支持的。看看 IE 10 吧。模拟了部分以往需要 jQuery 才能达到的动画效果。
  • 底部 footer 配合样式把宽度设为 100% 了。

基本上也就是这样了。有些细节可能没写出来,毕竟也很难完全写出来。参看我的 CSS 代码吧。:-)

#coldblue .inner {
  position: relative;
  margin: auto 20ex;
  width: auto;
}

#coldblue #search {
  position: fixed;
  top: 0;
  z-index: 100;
}

#coldblue #header {
  width: auto;
  margin: 50px 20ex 0;
  border-top-left-radius: 5px;
  border-top-right-radius: 5px;
}

#coldblue #header .inner {
  margin: 0 1ex;
}

#coldblue #header #navigation {
  float: none;
  top: auto;
  width: auto;
  position: absolute;
  right: 1ex;
  bottom: 1em;
}

#coldblue img[alt='Avatar'] {
  box-shadow: 0px 0px 10px #333;
}

#coldblue #head ~ h2, #coldblue #head ~ #chito_search {
  display: none;
}

#coldblue #chito_search ~ h2 {
  display: block;
}

#coldblue #chito_search + h2 {
  display: none;
}

@-moz-keyframes colorFadeAnimation {
  0% { color: white; }
  40% { color: yellow; }
  60% { color: yellow; }
  100% { color: white; }
}

@-webkit-keyframes colorFadeAnimation {
  0% { color: white; }
  40% { color: yellow; }
  60% { color: yellow; }
  100% { color: white; }
}

@keyframes colorFadeAnimation {
  0% { color: white; }
  40% { color: yellow; }
  60% { color: yellow; }
  100% { color: white; }
}

#coldblue #search a {
  color: white;
}

#coldblue #search .current_page_item a {
  text-shadow: 0px 0px 10px white;
  color: green;
}

#coldblue #search a:hover {
  -moz-animation:colorFadeAnimation 5s infinite;
  -moz-animation-play-state: running;
  -webkit-animation: colorFadeAnimation 5s infinite;
  -webkit-animation-play-state: running;
  animation: colorFadeAnimation 5s infinite;
  animation-play-state: running;
  color: yellow;
  text-shadow: 0px 0px 10px white;
}

#coldblue #wrapper {
  background-image: none;
  width: auto;
  margin: auto 20ex;
  position: relative;
  border-width: 0px;
}

#coldblue #wrapper #content {
  width: auto;
  margin-right: 270px;
  float: none;
}

#coldblue .post-title h3 {
  text-align: right;
}

#coldblue .post-p {
  padding: 0.3em;
  background-color: #aaa;
  border-radius: 0.2em;
}

@-moz-keyframes backgroundFade1 {
  0% { background-color: black; }
  50% { background-color: #888; }
  100% { background-color: black; }
}

@-webkit-keyframes backgroundFade1 {
  0% { background-color: black; }
  50% { background-color: #888; }
  100% { background-color: black; }
}

@keyframes backgroundFade1 {
  0% { background-color: black; }
  50% { background-color: #888; }
  100% { background-color: black; }
}

#coldblue .post-p a {
  padding: 0.1em;
  border-radius: 0.3em;
}

#coldblue .post-p a:hover {
  -moz-animation: backgroundFade1 4s infinite;
  -moz-animation-play-state: running;
  -webkit-animation: backgroundFade1 4s infinite;
  -webkit-animation-play-state: running;
  animation: backgroundFade1 4s infinite;
  animation-play-state: running;
  background-color: #888;
}

#coldblue #wrapper #sidebar {
  position: absolute;
  top: 0;
  right: 0;
  background-color: #ccc;
  border-bottom-left-radius: 15px;
}

#coldblue #footer {
  text-align: center;
  width: auto;
  margin: 0;
}

 

[C语言]字符串与其他类型间的转换

字符串->其他类型:sscanf(const char *src, const char *format, ... )

这个函数和scanf(const char *format, ...)类似,但不同的是,sscanf()是把字符串src当作输入,然后从中提取需要的信息的。所以,事实上format参数的运用和我们从标准输入(键盘)那里获取参数是相似的。

例如:

由字符串提取整数(十进制):

char *src="2"; int i;
sscanf(src, "%d", &i); /* i = 2 */

从字符串提取浮点数:

char *src="2.2"; float f;
sscanf(src, "%f", &f); /* f = 2.2 */

从字符串提取字符串:

char *src="abc def"; char a[4], b[4];
sscanf(src, "%s %s", a, b); /* a="abc". b="def" */

这个是比较有意思的应用。这样,我们就可以很方便地分割字符了。

而使用这个函数时,不需注意后面的参数是指针而不是整数或者其他数值类型。


其他类型->字符串:sprintf(const char *dest, const char *format, ...)

这个函数和sscanf是相对应的。因此,可以类比printf()的用法来得出这个函数的用法,就是从把后文format的内容复制到src中而不是标准输出而已。

例如:

十进制整数到字符串:

char dest[3]; int i=3;
sprintf(dest, "%d", i); /* dest = "3"; */

浮点数到字符串:

char dest[5]; float f=3.3f;
sprintf(dest, "%f", f); /* dest = "3.3" */

字符串到字符串:

char dest[10]; char *a="abc", *b="def";
sprintf(dest, "%s %s", a, b); /* dest = "abc def" */

这样也可以当作字符串合并函数用~

而使用sprintf()时必须注意目标字符串的长度。

以上的仅仅列举了常用的一些类型转换,至于其他类型,只要修改格式中的%x就好了(x替换为其他类型的代表字符,叫做类型转换符吧,另外注意‘x’本身其实也代表一种类型)。作为一个参考的文档,把Linux Programmer's Manual上关于sscanf()和sprintf()的文档也翻译一下吧~

类型转换符:(就是修饰在‘%’后面的字符,作为后面传入参数的类型提示。)

  • d - 十进制整数,对应int类型指针
  • i - 整数,对应int类型;与d不同的是,如果字符串中的整数以‘0x’等暗示进位制的前缀时,它会自动识别为该进制下的整数。
  • o - 八进制整数,对应int类型指针
  • u - 无符号十进制整数,对应unsigned int类型指针
  • x - 十六进制整数,对应int类型指针
  • f - 浮点数,对应float类型指针
  • s - 连续字符串(没有空格分开),对应char的指针
  • c - 指定长度的字符串,例如:10c读取10个字符到字符串中。对应char指针
  • [] - 匹配正则表达式……
  • ……

 

类型修饰符:(就是在前面类型转换符前面加的修饰符)

  • h - 修饰短整数
  • l - 长整数
  • L - 更精确的double类型(也就是long double)
  • ……

另外,这两个函数就存在于stdio.h中,属于标准函数。更详细的内容,例如正则表达式的使用,参见Linux Programmer's Manual……

 

L.UI设计稿

本来应该写为文档的,不过,在下经验不多,还是用“稿”吧。

Life...

It's a long time since the last update...

I must admit that I was unhappy today; even can be described as 'sad'... I took an English tests prepared for people who want to take the CET-4 but I did completely bad on the test: hardly having enough time to finish it. To be frank, I didn't prepare for the coming tests in this term, as last term past so smoothly that I didn't expect any changes. But it proved that I was wrong...

Arranging time was not easy, I did finally find. I didn't have time to improve the L.UI project but I know maybe there's no people ever cherished it except me... I hope it was a wrong conclusion. 

In the coming week, I have to prepare for a speech which is actually a program that is being played on a regular basis and do nothing really good to audience. It was about my study of last term but I didn't think I did good...

Since the last update, KDE has released the second updates and GNOME has released a major version 3.0 . Now the Linux desktop may become more interesting. It is a good news.

 

New laptop...

I bought a new laptop today, Acer 455G. It features AMD Phenom II N970 with AMD Radeon HD 6470M. I admitted that it wasn't a really good setup but it cost little. I had been working on the new machine since 7 o'clock, a little longer than I expected but still can't find the driver for AMD Radeon HD 6xxxM and suffered a terrible 1024x768 display on a 16:9 monitor. Then I would try OpenSuse 11.4 KDE edition.

However, I had chosen it, whether good or not. 

L.UI 开发

断断续续地,又很久没更新过了……

L.UI这个东西是我学习SDL写的一套界面,名字是为了纪念一件事,或许是我做错了的一件事。不过,从寒假结束到现在,在这其中,我还是学到了不少东西。学习了M-V-C的设计模式,终于明白绘制和控制分离的好处了——这样就不用传递太多的东西;还有,就是坚持…… The code will be released in the near future...

A little busy these days, I had been working on a project that cost a lot of time and energy. I thought I had done a lot of wrong things the past seven days. Finally, with the help of the rest five colleagues, I had worked out a version that could be submitted but it was still a demo. 

It was the first time for me to be a 'leader' in a team. People all trusted me but I thought I was not a good leader then. However, I will try to be a good leader in the following days. 

I was still studying English... (But I didn't know how to set up the input method in Kubuntu.  )

2011 and the past

It has been 2011, meaning that I had been existed in this world for almost twenty years. Yesterday, the eve of 2011 and the end of 2010, I received several messages that evoke memories of my past life. In the past three years, 2008, 2009 and 2010, I think it would be my second important years in my life.

#define的继续讨论

正如上次所说的,#define可以定义语言结构,例如:

#include <stdio.h>

#define Dear(x)  void main(x) {
#define she      int argc, int *argv[]
#define I        int i;
#define love     for(i=0;i<99;i++)
#define you      printf("I love you!\n");
#define by       ;
#define name      }

Dear(she) 
	I love you
by name

可以把一段原来很普通的代码变得“优雅”。当然,C语言在宏命令处理方面肯定没有其它宏命令处理强,而且也容易出错。

正如代码所说的,可以定义没有“main()”的代码。