中国虚拟军事网(VME)- 专注于武装突袭系列虚拟军事游戏

 找回密码
 加入VME

QQ登录

只需一步,快速开始

搜索
查看: 2996|回复: 25

如何把这个C++程序转为SQF格式?

[复制链接]
发表于 2016-1-23 10:55:30 | 显示全部楼层 |阅读模式
这段时间看了一下C++教程,本着看百遍不如做一遍的人生经验,于是就自己尝试着写了一个简单的计算器的程序【       
#include "stdafx.h"
#include <iostream.h>


int main(int argc, char* argv[])
{
        double num1;
        double num2;
        double result;
        char qq;
        bool ww;
        cout <<"请输入首列数"<<'\n';
        cin >> num1;
        cout <<"请输入+ - * / 中的任一个符号"<< '\n';
        cin >> qq;
        cout <<"请输入第二个变量数"<<'\n';
        cin >> num2;
        if (qq == '+')

        {
                result= num1+num2;
        }
        if ( qq == '-')
       
        {
                result = num1-num2;
        }
        if (qq =='*')
        {
                result = num1*num2;
        }
        if (qq == '/')
        {
                if ( num2 == 0)
                {
        cout <<"除数不能是为零";
                return -1;
                }
        result = num1/num2;

       
        }
        cout <<num1<<qq<<num2<<'='<<result;
                return 0;
}
】这样,如果你电脑上有装这个C++的编译器的话那么你就可以利用他来作计算了,呵呵呵,见笑了,那么现在问题来了如何把它转为ARMA的SQF格式的,思路是怎么样的?后面我还想学着写一个银行取款界面的程序等等其它现实中的情况来提高自己的逻辑分析及其它的熟练化
 楼主| 发表于 2016-1-23 11:07:36 | 显示全部楼层
本帖最后由 曾经沧海 于 2016-1-23 11:14 编辑

大家不要以为是我吃饱了撑的发这个跟ARMA无关的贴子,其实呢这就像闪点行动的SQS格式的脚本与现在的SQF,FSM格式的脚本是一样的连襟关系,完全可以触类旁通,举一反三的,[4+3=7,5+2也等于7,1+6还是可以等于7],并不是只有一条路可走的啊。@cycle6,  老大,我这前面 中括号里面的情况是不是就是你此前跟我常讲的写ARMA脚本要时常注意的并发关系啊,是这个思路不?
发表于 2016-1-23 11:26:29 | 显示全部楼层
主函数里一个线程 算毛并发 (╯°□°)╯︵  ┻━┻

所谓并发在这里实际上是一个不太严谨的术语,要理解并发,本质上你要先理解多线程。
我举个简单的例子,假设我要在你这个程序里实现一个功能,就是做一个计时器,每秒钟数字加1。
我问你,你在cin >> num1;的位置上怎么不中断程序,让他数字依然每秒钟加1?

到这里你真想继续弄C++不但要懂指针,还要懂函数指针。你道行差太远了,先学会写函数和类吧,不要折腾C++了
发表于 2016-1-23 13:26:40 | 显示全部楼层
楼主选择了一条艰难的道路,旁边的捷径视而不见
上面的东东完全看不懂只是路过帮顶
 楼主| 发表于 2016-1-23 13:42:52 | 显示全部楼层
cycle6 发表于 2016-1-23 11:26
主函数里一个线程 算毛并发 (╯°□°)╯︵  ┻━┻

所谓并发在这里实际上是一个不太严谨的术语,要理解 ...

这脸丢大了
 楼主| 发表于 2016-1-23 13:45:25 | 显示全部楼层
啤酒冲米二 发表于 2016-1-23 13:26
楼主选择了一条艰难的道路,旁边的捷径视而不见
上面的东东完全看不懂只是路过帮顶

我是不识庐山真面目啊,捷径在哪啊啤酒兄?给兄弟指一条明路吧
 楼主| 发表于 2016-1-23 13:49:41 | 显示全部楼层
啤酒冲米二 发表于 2016-1-23 13:26
楼主选择了一条艰难的道路,旁边的捷径视而不见
上面的东东完全看不懂只是路过帮顶

晚上上q聊不?
发表于 2016-1-23 13:54:46 | 显示全部楼层
曾经沧海 发表于 2016-1-23 13:45
我是不识庐山真面目啊,捷径在哪啊啤酒兄?给兄弟指一条明路吧

阿玛2,3版块的教程区隐藏着一些入门秘籍,快找找吧
发表于 2016-1-23 13:56:00 | 显示全部楼层

有空会上的
发表于 2016-1-23 14:37:49 | 显示全部楼层

没有没有,不是丢脸的问题,多线程编程我个人体会是一种编程思维的急剧变化。即使是有很多年编程经验的程序员如果不是经常接触多线程编程,也会出现逻辑上的混淆和错误。

我先给你解释解释什么叫多线程。
所谓多线程编程,就是指一个程序里面同时运行着多个“微型程序”,每一个“微程序”之间既可以相互通信合作,也可以互不理睬,好不干涉对方而各干各的。那么这时候每一个“微程序”就构成了自己的“线程”。

比方说你在游戏里要跟队友用文字通信,你打开输入菜单的时候服务器在等待你输入文字,但是AI和你的队友不会等你输入完才能行动,而是同时他们各干各的,子弹照样飞,枪炮照样打。

就拿我刚才说的那个举例,你的程序,在cin >> num1;的时候一定会停止,等待你输入完才会继续执行,那么假设这是ArmA游戏里的一个程序,结果就是所有的人,AI、玩家、飞行的子弹、飞机,都要等你输入完num1才会继续执行,然后到cin >> qq;又停止。

多线程的程序应该怎么写呢?就拿我给你提的那个问题吧,我要一个计数器每秒增加一个数然后输出,不停顿。这个要求的程序要怎么写呢?(事先声明,我C++多线程只记得一点pthread,也忘得差不多了。我写的代码是不能执行的,我只给你讲个大概意思。)
1,你的计算相关的程序要写到一个函数内,比如
void func1_calculater(){
        double num1;
        double num2;
        double result;
        cout <<"请输入首列数"<<'\n';
        ....以下省略
}

2. 我要求的那个计数器要写到另外一个函数里
void func2_counter(){
        int num=0;
        while(ture){
               cout<<num;
               num++;
               sleep(1000);//停顿1000毫秒
        }
}

3然后主函数里这样
int main(){
       pthread_create( func1_calculater);//启动第一个计算器的线程
       pthread_create( func2_counter);//启动第二个计数的线程
       pthread_exit(NULL); //要求主函数等待俩线程都结束,主函数才结束。
}

这样func1_calculater和func2_counter就可以并发执行,func2_counter不会等待你func1_calculater里面的cin或者cout

这里再次负责任的告诉你,上面的C++代码仅供学习理解,语法绝对是错的。pthread启动一个线程需要很多很多参数。而且交给pthread运行的函数也必须以函数指针的形式写。但是我估计你不理解什么是指针,我猜你也不太理解什么是函数,上面的代码权当伪代码看就行了。

归根揭底要告诉你的事情就是,用C++学脚本太复杂,不要这么干!!
发表于 2016-1-23 14:46:19 | 显示全部楼层
回归本质,ArmA里脚本为什么要考虑多线程,为什么要考虑并发?
拿你的脚本举例子,为什么不能用
if(count units _grp<4)  而必须要用 waitUntil {count units _grp<4};

因为游戏本身就是一个多线程环境,你的脚本仅仅是诸多线程的一个,游戏主题的线程不会等待你的条件达成才运行你的脚本。
if(count units _grp<4)在游戏开始的第一毫秒就已经运行了,这个时候假设你的人群数量大于4,游戏判定条件不符,于是你的脚本已经结束了。等到你过三五分钟,或者两三个钟头的时候,人数降到4以下的时候,脚本早就结束了,所以根本不会运行。
waitUntil 是告诉游戏系统,我这个脚本的线程先不要运行,等到满足count units _grp<4的时候再运行。这样才能执行你的脚本。


 楼主| 发表于 2016-1-23 17:31:49 | 显示全部楼层
本帖最后由 曾经沧海 于 2016-1-23 17:33 编辑
cycle6 发表于 2016-1-23 14:46
回归本质,ArmA里脚本为什么要考虑多线程,为什么要考虑并发?
拿你的脚本举例子,为什么不能用
if(count ...


谢谢老大的详细而又通俗的解说,这样我理解起来就容易多了,又明白了一点要点,对于c6老大的真诚的劝导我都记在心呐,感 谢您的善意劝告,在这里我要解释一下不是我非得要不自量力来学c++,而是我实在是想学会arma的脚本编写知识啊,但是在官网也好在论坛也好我都没找到详细通俗的脚本编写教材所以才赶鸭子上架来试试,看别人的脚本如果看到自己也能懂的语法也好单词意思也好那倒没什么,但是碰到从没看过的语法与陌生单词所能达到的功能那就要抓 狂了,偏偏那些没有理解通的陌生功能关键字所能达到的效果又不可能在脚本文本环境中以图像语音的形像表现出来,都不知道它在游戏中起什么作用,太抽像了,所以说教程要以图文并茂加范例解说的更能让人懂就是这个意思,【我是指有一定难度的知识才要这样啊】
发表于 2016-1-23 18:10:51 | 显示全部楼层
曾经沧海 发表于 2016-1-23 17:31
谢谢老大的详细而又通俗的解说,这样我理解起来就容易多了,又明白了一点要点,对于c6老大的真诚的劝导 ...

学C++会遇到指针这个瓶颈,脚本里又完全没这个概念,不如去学Java或C#
 楼主| 发表于 2016-1-23 19:00:55 | 显示全部楼层
cycle6 发表于 2016-1-23 18:10
学C++会遇到指针这个瓶颈,脚本里又完全没这个概念,不如去学Java或C#

其实呢我学C++并不是说要把它 学全来而是最低目标是能在ARMA里自如加自由的编写脚本与写CLASSNAME做插件就够了
发表于 2016-1-24 03:40:49 | 显示全部楼层
曾经沧海 发表于 2016-1-23 19:00
其实呢我学C++并不是说要把它 学全来而是最低目标是能在ARMA里自如加自由的编写脚本与写CLASSNAME做插件 ...


但是学C++本身就很难,对于迅速增进对编程概念理解是不利的。
C#的class定义跟C++其实很相似,不如学C#
您需要登录后才可以回帖 登录 | 加入VME

本版积分规则

小黑屋|中国虚拟军事网

GMT+8, 2024-4-19 09:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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