注册 登录
编程论坛 VB6论坛

开一个帖子发布我现在在做的一个比较大的项目,顺便请各位帮帮忙完成

renxiaoyao36 发布于 2017-01-16 20:00, 4758 次点击
这次我给自己设定的项目比较大,想来不会像以前那样一个项目才一到两个问题,每个问题开个帖子不麻烦,现在我要做的项目是一个军棋游戏
光是现在做了5%就有好多问题了,于是专门开个新帖子,实时跟踪我的项目进程,有一些成果了就在这里发布,顺便在这里提出一些问题。
先把之前的一个帖子发布的一个问题连接传上来,尚未解决https://bbs.bccn.net/thread-473409-1-1.html关于通信的问题。大家看看能不能帮忙解决。
二楼开始放程序代码
21 回复
#2
renxiaoyao362017-01-16 20:03
现在项目处于初始阶段,所以核心还没做出来,我先把现在做了5%不到的版本发上来,里面有两大问题:一个是一楼说的通信问题
还有一个是关于棋子之前互相连线的算法问题,我没想到如何做这个算法
我棋子是用按钮数组代替的,应为我计划以后移动棋子是按按钮之后出现菜单进行移动操作的。
只有本站会员才能查看附件,请 登录

不想下载的可以直接看下面的代码,不过不大完整。
程序代码:
Private Sub Timer1_Timer()
Form4.Show
Dim i As Integer
For i = 0 To 239
DoEvents

 On Error Resume Next
  Load 棋子(i)
   With 棋子(i)
  
   .Visible = True
   .Height = Form2.Height / (竖)
    .Width = Form2.Width / (横)
     .Left = Int(i Mod (横 / 2)) * (Form2.Width / (横 / 2)) '设置棋子所在位置
    .Top = Int(i / (横 / 2)) * (Form2.Height / (竖 / 2)) '这段算法还是不要尝试理解了吧,我折腾了半天乱试出来的,测试可行才用的
    Debug.Print .Left
    Debug.Print .Top
    End With
    Form4.Label1.Caption = "正在加载棋子" & i & "请稍等"
Next i
For i = 0 To 239 '理论上没有那么一点,我现在的算法大家可以运行看看结果非常的不如人意,最好是除了第4列的第4行,8行,以及第八列的4行,8行外,所有格子相邻的连线,这四个格子对角线也连线,大家有想法帮忙想想
DoEvents

 On Error Resume Next
  Load Line1(i): Debug.Print i
   With Line1(i)
    .X1 = 棋子(i).Left + 棋子(i).Width / 2
    .Y1 = 棋子(i).Top + 棋子(i).Height / 2
    .X2 = 棋子(i + 1).Left + 棋子(i + 1).Width / 2
    .Y2 = 棋子(i + 1).Top + 棋子(i + 1).Height / 2
    .Visible = True
   
   End With
  Form4.Label1.Caption = "正在加载线条" & i & "请稍等"
Next i

Unload Form4
Timer1.Enabled = False
End Sub
代码的整理非常差,将就着看吧

[此贴子已经被作者于2017-1-16 20:04编辑过]

#3
renxiaoyao362017-01-16 20:50
想了一下2L的问题,想出来这段代码,可以完成横竖的线条连接,但是只能连接出去一根线,再要连接两根甚至四根线怎么办呢?
程序代码:
Dim w As Integer '再定义一个变量
    For w = 0 To 239 '这样的话需要运行240的平方次计算,速度会很慢,但是这是我能想出来的唯一方案
    DoEvents
    If ((Abs(棋子(w).Left - 棋子(i).Left) = 棋子(2).Left - 棋子(1).Left) And Abs(Abs(棋子(w).Top - 棋子(i).Top) = 0) Or ((Abs(棋子(w).Top - 棋子(i).Top) = 棋子(21).Top - 棋子(0).Top) And (Abs(棋子(w).Left - 棋子(i).Left) = 0))) Then
    '上面这一行长的不得了,大致就是检查是否符合规则
   
    .X1 = 棋子(i).Left + 棋子(i).Width / 2
    .Y1 = 棋子(i).Top + 棋子(i).Height / 2
    .X2 = 棋子(w).Left + 棋子(w).Width / 2
    .Y2 = 棋子(w).Top + 棋子(w).Height / 2
    .Visible = True
    End If
   Next w
   End With
  Form4.Label1.Caption = "正在加载线条" & i & "请稍等"
Next i
#4
xzlxzlxzl2017-01-16 20:55
不知道军旗规则,数组设置好,连线就不是问题吧。我在c里写过一个求最短路径的递归代码,估计和那个差不多。
#5
renxiaoyao362017-01-16 21:41
回复 4楼 xzlxzlxzl
现在还不需要军棋的规则,规则我也是修改的,原版规则参考性不大。
关于这个线的代码,我这个代码只能连接出一条线,实际情况下需要连接出两条线,应该怎么做?
#6
xzlxzlxzl2017-01-17 16:36
是不是就是将棋子用横线、竖线、斜线连接?
在你工程上做了个,不知道是不是你要的效果(我要做这个,是不会用控件做的,会直接画)
下载压缩文件后,解压缩,打开工程直接运行即可。

只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录
#7
renxiaoyao362017-01-17 17:09
回复 6楼 xzlxzlxzl
感谢,就是这个意思,我稍微修改一下就好了
另外再问一个问题,如果我想要把游戏做全屏,现在的方案是把窗体模式设置为0-None,最大化。但是这样的话用Ctrl+Tab切换出去以后,任务栏里面没有游戏程序图标,要想让图标显示出来怎么办呢?
除此之外发现一个BUG,你的代码我看了下,Load时用的是屏幕大小,这样的话,如果后台有一些全屏的程序,例如某些游戏(我是后台运行了“守望先锋”)时,会出现加载仅加载了一半大小。这涉及到了Screen.Height和Length在VB中抓取的原理,所以我不想多想了,还是决定用窗体模式0-None+最大化来做全屏效果。
觉得你的棋子加载代码比我的好多了,决定还是全部采用你的代码,稍微做一些修改。

[此贴子已经被作者于2017-1-17 17:25编辑过]

#8
xzlxzlxzl2017-01-17 17:51
使用影子窗口。就是建立一个无用窗口由none窗口加载,在无用窗口的active事件里写一句none窗口的setfocuse。我这样试验成功,就像none窗体在任务栏一样。
#9
renxiaoyao362017-01-17 19:59
回复 8楼 xzlxzlxzl
还能这样哇,真的没想到过,厉害

进度推进了2%左右,将现在的版本发上来,有空的话帮我看看是否需要简化,没空的话就不要下载了,这一次并没有问题,唯一问题依旧是1L的问题,正在继续写代码中……
只有本站会员才能查看附件,请 登录


今天写了一点代码,完成了棋子初始的着色模块,更新一下
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2017-1-18 12:51编辑过]

#10
renxiaoyao362017-01-18 18:10
今天又写了一点,更新一下,加入了棋子的部署模块。(Replace那段代码我真的是眼睛都要炸了)
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2017-1-18 18:48编辑过]

#11
Jamin_Wong2017-01-19 13:05
回复 10楼 renxiaoyao36
看到一点一点的成功,我很激动了,加油!
#12
Jamin_Wong2017-01-19 13:06
以下是引用renxiaoyao36在2017-1-18 18:10:43的发言:

今天又写了一点,更新一下,加入了棋子的部署模块。(Replace那段代码我真的是眼睛都要炸了)

加油!看看一点一点的成功,很高兴啊!
#13
renxiaoyao362017-01-19 13:27
再更新一下,接下来估计要等一周才能更新,接下来要做每一个回合的动作处理代码,会很长。
只有本站会员才能查看附件,请 登录

看到有人支持还是挺开心的,本来还怕我是自作多情没人理我呢。
#14
新手VB2017-01-20 15:28
回复 13楼 renxiaoyao36
很不错,加油。
#15
renxiaoyao362017-01-22 13:07
寒假的时间可能不多,现在只写完了视野处理的那段代码,先更新一下免的你们以为我弃坑了。233
只有本站会员才能查看附件,请 登录
#16
renxiaoyao362017-01-24 14:55
再次出现了严重问题。我现在把方向转向本地多人的代码,先完成这一部分。我用我之前写的一个小程序,吧Form2,也就是本来单人模式的游戏窗体里的Form2更改为"本地双人"后,直接导入到工程中使用
并且为了配合本地双人,进行了一些大改。但是,试运行却发现,本来游戏核心代码部分,也就是没改的那部分,却莫名其妙出现了错误。现在把代码发上来,
错误信息:实时错误380:无效的属性值
错误语句: 本地双人.frm 行284   
棋子(0).Width = (Me.ScaleWidth - 120) / 20 - hg

整体工程文件:
只有本站会员才能查看附件,请 登录
#17
renxiaoyao362017-01-25 14:47
有人帮忙解决这个问题么
#18
xzlxzlxzl2017-01-25 20:24
在form2、本地双人窗体的Timer1_Timer事件里加一句判断窗体是否最大化,如下:
Private Sub Timer1_Timer()
If Me.WindowState <> 2 Then Exit Sub
Call draw棋子 '此段Sub代码由论坛Xzl编写,RXY36调用及修改
DoEvents
'-----------------------------------------以下为加载特定棋子斜线代码
.
.
.
#19
renxiaoyao362017-01-26 12:21
回复 18楼 xzlxzlxzl
那这样做会不会导致过程退出呢?这个Sub要是退出,我后面就没办法运作了。
我能不能把这一段代码改成
Me.WindowState=2
改成这样以后依然出现问题。
换用你的代码,似乎是跳过了这个过程,然后在另外一段代码里出现错误
340:控件数组元素42不存在,错误原因很明显是因为跳过了棋子的加载代码过程
有什么方法可以在不跳过这个过程的前提下解决错误?为什么一模一样的代码在两个窗体中不一样了?

[此贴子已经被作者于2017-1-26 12:29编辑过]

#20
renxiaoyao362017-01-27 10:59
回复 19楼 renxiaoyao36
来个人帮忙解决哎
#21
renxiaoyao362017-02-25 10:18
关于刚才那个问题,近期本人已经查到疑似问题发生原因了
发现的过程还是个巧合,我设置了很多断点,有一个断点一不小心设置到了Form2中,运行 另外一个Form的Call语句 时,发现它不但调用了本窗体的draw棋子Sub,还调用了form2的Sub,致使Form2中的Sub报错。
我设想吧这个Sub直接装到模块中调用,但是里面报错me关键字不能使用。怎么办?
现在感觉这个错误非常的离谱……运行另外一个窗体时,居然会莫名其妙的触发Form2里的代码???


[此贴子已经被作者于2017-2-25 10:25编辑过]

#22
renxiaoyao362017-02-25 10:26
于是我自己发现了错误原因——简单的让人吐血
Form4,也就是加载信息的显示窗体里面有一句让我想买块豆腐撞死的语句:
Me.Caption = Form2.Caption
他导致了Form2的装载……
1