设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 13026|回复: 46

[讨论] 几个有意思的问题_第二弹

[复制链接]

Lv1.梦旅人

梦石
0
星屑
54
在线时间
323 小时
注册时间
2010-8-21
帖子
666
发表于 2011-4-3 09:39:59 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
呵呵,我胡汉三又回来了....这次又有几个问题!

经过上次事件后,我写的代码变得诡异起来了....
这次的难度较上次,较难,好吧,这次是三级考试...


1.大家都知道,按下F12是重置游戏,有没有办法让它不"重置",而直接退出呢...?

2.请尝试重新定义Array类的max方法

3.我们经常会这样:
  actor = $game_actors[n]
  actor.hp -= damage
  其中:
  p $game_actors[n] == actor => true

  但是,数类对象就不行了:
  a = 5
  b = a
  b -= 1
  p b == a  => false
  (因为是共不共内存地址的问题...)现想在让两个个数类变量(类型不限)的值一直一样

4.defined?(Foo)和defined?(Foo())分别代表什么...?

5.现让一个雪碧对象(Sprite)向27度方向一直移动5像素点...但是实际上不会这样做,
  这是因为5太小了,加上雪碧(好吧,我承认我没有打广告)对象不支持浮点坐标,误差很大,请设计个方案,让误差尽量小....

6.来个简单了(终于....)如图...怎么回事...?
捕获.PNG

7.现在有一个数组array中有一堆(?)位图(Bitmap),现在请释放掉其中面积最大的一个

8.这是我们的一道数学题(我悲剧地错了,本来数学就不太好...):

0,1,2,3,4,5这6个数字组成的所有4位数中,要求:
  ①.没有重复数字
  ②.包含2,3,但是2,3不相邻
  问:有多少个

  在这要求用数组array包含所有符合要求的数字

9.最后一个,压轴题..!
  求1000以质数(貌似改叫素数了?)算法...!要求从下面2个要求任选一个
  ①.最(尽量)精简的代码
  ②.最(尽量)少的循环、迭代次数


什么?你要两个一起选...?不可能吧...?毕竟熊掌和鱼的兼容性不好....

答案照例,下次发布



>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
98 小时
注册时间
2011-2-17
帖子
219
发表于 2011-4-3 09:48:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

发表于 2011-4-3 10:38:35 | 显示全部楼层
本帖最后由 熊猫 于 2011-4-3 10:41 编辑

1.F12的问题可以在DLL中封掉,PM我你的邮箱地址,到时候我发给你。
2.这个忘了,翻翻某个动物出版社介绍Ruby的书好像就有。
3.就像你举的例子,将变量a类化(也就是放到类中)就可以了。
4.不懂
5.5像素可不小啊,差不少呢只要是循环的话效果很明显。我在XNA中完全可以用Sprite实现右上27度移5像素
  1. Update段
  2. {
  3. tex_x += (int)(5 * 0.89);
  4. tex_y -= (int)(5 * 0.45);
  5. }
  6. Draw段
  7. {
  8. spriteBatch.Begin();
  9. spriteBatch.Draw(Texture2D, new Vector2(tex_x, tex_y), Color.White);
  10. spriteBatch.End();
  11. }
复制代码
6.未定义的对象,在外部调用了私用对象造成的错误吧。
7.不熟悉
8.最傻瓜的方式是循环生成....然后输出结果,这个代码不难,就不写了。
9.我选择后者最高效的
Prime的算法,我认为最高效的是:
定义一个Prime的可伸缩数组(.NET中我用ArrayList)
  1. Public Function Check_Prime(ByVal Num As Integer) As Boolean
  2.         Try
  3.             If Num = 1 Or Num = 2 Then Return True : Exit Function
  4.             Dim DefinedPrime As Integer = 0
  5.             Dim StartNum As Integer = 2
  6.             Dim NumSqr As Integer = Math.Sqrt(Num)
  7.             If PrimeSet.Count <> 0 Then
  8.                 If PrimeSet.Item(UBound(PrimeSet.ToArray)) > NumSqr Then
  9.                     For S As Integer = 0 To PrimeSet.Count - 1
  10.                         If PrimeSet(S) > NumSqr Then
  11.                             Exit For
  12.                         Else
  13.                             DefinedPrime += 1
  14.                             'StartNum = PrimeSet(S) + 1
  15.                         End If
  16.                     Next

  17.                     For S As Integer = 1 To DefinedPrime
  18.                         If Num Mod PrimeSet(DefinedPrime - 1) = 0 Then
  19.                             Return False
  20.                             Exit Function
  21.                         End If
  22.                     Next
  23.                 End If
  24.             End If
  25.             For S As Long = StartNum To Math.Sqrt(Num)
  26.                 If Num Mod S = 0 Then Return False : Exit Function
  27.             Next
  28.             Call Add_Prime(Num)
  29.             Return True
  30.         Catch ex As Exception
  31.             MessageBox.Show(ex.Message)

  32.         End Try

  33.     End Function
复制代码
这是我写的质数计算代码,感觉是最高效且精简的。
核心判断就在于,如果一个数从1除到这个数的平方根都没有被整除的话这个数就是Prime。
还有一个数除以比这个数平方根小的所有Prime都没有被整除的话,这个数就是Prime。
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
54
在线时间
323 小时
注册时间
2010-8-21
帖子
666
 楼主| 发表于 2011-4-3 10:46:41 | 显示全部楼层
回复 熊猫 的帖子

1.麻烦 不超过10字节的代码就可以搞定
2.这是叫你自己写,不是翻源代码
3.还可以更简单
4......
5.Sprite默认不支持浮点坐标...
6.  未定义  66   ? 66 是一个数
a = eval('66') => a = 66
7.....
8....
9.你要相信Ruby!太长了!

点评

看报错的内容来讲,解释器把66当成了一个过程或者函数。因为你用的是eval  发表于 2011-4-3 10:59
其实XNA里面支持。不过不重要,请你认真读这行代码(int)(5 * 0.89);  发表于 2011-4-3 10:58
F12我记得那个纯代码有漏洞的。  发表于 2011-4-3 10:57
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (管理员)

老黄鸡

梦石
0
星屑
39352
在线时间
7470 小时
注册时间
2009-7-6
帖子
13482

开拓者贵宾

发表于 2011-4-3 11:13:56 | 显示全部楼层
本帖最后由 fux2 于 2011-4-3 15:47 编辑

手机打字累,熊猫君这个素数算法不优秀哦
  1. def getprime(max=3)
  2.   return "error" if max<3
  3.   prime=[]
  4.   for i in 3..max
  5.     fux=0
  6.     j=2
  7.     while j<sqr(i)&&fux==0
  8.       if i%j==0
  9.         fux=1
  10.         j+=1
  11.       end
  12.     end
  13.     prime<<i if fux==0
  14.   end
  15.   prime
  16. end
复制代码

点评

啊,手机,漏打了  发表于 2011-4-3 15:47
prime<<i if fux=0 bug哦~ 话说我也经常犯  发表于 2011-4-3 11:59
还可以更简单哦!  发表于 2011-4-3 11:17
RGDirect - DirectX驱动的RGSS,点我了解.
RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

发表于 2011-4-3 11:31:43 | 显示全部楼层
回复 fux2 的帖子

我感觉简单的话就势必要牺牲效率....
“一个数除以比这个数平方根小的所有Prime都没有被整除的话,这个数就是Prime”
按照这个可以大大减少迭代量。

另外,沙漠啊,第一个问题我只需要改DLL的一个字节就可以。比起10字节的代码哪个好?

点评

啊,既要精简又要效率真难啊  发表于 2011-4-3 15:49
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
54
在线时间
323 小时
注册时间
2010-8-21
帖子
666
 楼主| 发表于 2011-4-3 11:42:39 | 显示全部楼层
回复 熊猫 的帖子

1个字节...?
dll也有3个字节吧....?
牺牲效率。。。?我都说了 鱼和熊掌的兼容性不好!
我考虑一下提前发答案...?
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
72
在线时间
673 小时
注册时间
2006-10-3
帖子
1795

开拓者

发表于 2011-4-3 11:47:25 | 显示全部楼层
回复 沙漠点灰 的帖子

只需修改一个字节,我忘记那个16进制是要改成74还是75了。反正jnz改成jz或者什么的。
是啊,我注重的是效率不是精简啊。。

点评

我也來求一下封掉F12的位置,找了幾次沒找到- -b  发表于 2011-4-3 12:25
( ส็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็็ ω ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้【看猫君玩,我也搞一只】)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
54
在线时间
323 小时
注册时间
2010-8-21
帖子
666
 楼主| 发表于 2011-4-3 11:51:40 | 显示全部楼层
回复 熊猫 的帖子

好吧!公布第1问的答案:
下面代码置顶:
$g ? exit: $g=0

点评

强悍到家了!!!!!! PS:Ruby程序员?!!!!  发表于 2011-4-11 20:37

评分

参与人数 1星屑 +20 收起 理由
熊猫 + 20 Ruby程序员和程序员的差别。

查看全部评分

>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1015
在线时间
1564 小时
注册时间
2008-7-30
帖子
4418

贵宾

发表于 2011-4-3 12:44:55 | 显示全部楼层
本帖最后由 DeathKing 于 2011-4-3 12:45 编辑


1、从RGSS来说,Input模块应该可以检测到F12的敲击,就是不知道是Input的优先级高,还是重置的优先级高。当然,可以利用F12重置游戏时,对于某些特殊情况可以引起StackTooDeepError的特点,来捕获错误,并退出。

2、考虑到Array的可以容纳的对象可以是不同的,所以还是作弊为上策。
class Array
  def max
    return self.sort.last
  end
end

3、a != b 是因为 a 和 b 的 hash 不一样,而 Fixnum 类的 == 是根据 hash 来判断的。下面的方法或许有点暴力,直接重定义 == 方法。
class Fixnum
  def ==(obj)
    return self.class == obj.class
  end
end

4、Foo 被认为是常量标识符,defined?(Foo) 会检查是否定义了Foo常量,而 Foo() 即使是大写字母开头,也被认为是一个方法。

5、利用三角函数,这样,x坐标大概要移动4个像素。
   move_x = (5 * cos(27 / ((2 * Math::PI))).to_i
   moev_y = (5 * sin(27 / ((2 * Math::PI))).to_i

6、没猜测出来。

7、有点乱,有点麻烦。
class Array
  def dispose_bad_bitmap
    max_area = 0
    the_bad  = -1
    self.each_index do |index|
      next unless self[index].is_a?(Bitmap)
      temp_area = self[index].width * self[index].height
      if temp_areo > max_area
        max_area = temp_areo
        the_bad  = index
      end
    end
    self[the_bad].dispose if the_bad != -1
  end
end

8、ary = [0,1,2,3,4,5]
ary = ary.permutation(4).to_a
ary.each do |e|
  if e[0] != 0
    if e.include?(2) and e.include?(3)
      i = e.index(2)
      if e[i+1] != 3 and e[i-1] != 3
        puts e.to_s
      end
    end
  end
end

输出:
[1, 2, 0, 3]
[1, 2, 4, 3]
[1, 2, 5, 3]
[1, 3, 0, 2]
[1, 3, 4, 2]
[1, 3, 5, 2]
[2, 0, 3, 1]
[2, 0, 3, 4]
[2, 0, 3, 5]
[2, 1, 3, 0]
[2, 1, 3, 4]
[2, 1, 3, 5]
[2, 4, 3, 0]
[2, 4, 3, 1]
[2, 4, 3, 5]
[2, 5, 3, 0]
[2, 5, 3, 1]
[2, 5, 3, 4]
[3, 0, 1, 2]
[3, 0, 2, 1]
[3, 0, 2, 4]
[3, 0, 2, 5]
[3, 0, 4, 2]
[3, 0, 5, 2]
[3, 1, 0, 2]
[3, 1, 2, 0]
[3, 1, 2, 4]
[3, 1, 2, 5]
[3, 1, 4, 2]
[3, 1, 5, 2]
[3, 4, 0, 2]
[3, 4, 1, 2]
[3, 4, 2, 0]
[3, 4, 2, 1]
[3, 4, 2, 5]
[3, 4, 5, 2]
[3, 5, 0, 2]
[3, 5, 1, 2]
[3, 5, 2, 0]
[3, 5, 2, 1]
[3, 5, 2, 4]
[3, 5, 4, 2]
[4, 2, 0, 3]
[4, 2, 1, 3]
[4, 2, 5, 3]
[4, 3, 0, 2]
[4, 3, 1, 2]
[4, 3, 5, 2]
[5, 2, 0, 3]
[5, 2, 1, 3]
[5, 2, 4, 3]
[5, 3, 0, 2]
[5, 3, 1, 2]
[5, 3, 4, 2]

8、MathN库里面已经有了……不写了。要走了……

点评

1、Input 没提供 F12 的接口;8、还是有点问题呢,少了 11 个排列(比如 2013)。  发表于 2011-4-3 19:46

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-3-29 01:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表