第一篇:泄露游戏源代码的严重性
泄露游戏源代码的严重性
(相关法律知识及案例)为了防止因员工将公司开发的网络游戏的源代码泄露或擅自复制设立私服,进而导致公司遭受不可逆转的经济损失;公司欲向员工普及相关法律知识,从而使员工能够了解私自泄露源代码的严重性,提高其自身职业素养。
I.网络游戏源代码概述
网络游戏,英文名称为Online Game,又称 “在线游戏”,简称“网游”。指以互联网为传输媒介,以游戏运营商服务器和用户计算机为处理终端,以游戏客户端软件为信息交互窗口的旨在实现娱乐、休闲、交流和取得虚拟成就的具有可持续性的个体性多人在线游戏。网络游戏形式分为浏览器形式和客户端形式两种。
网络游戏存在的形式为计算机软件,计算机软件(以下简称软件),是指计算机程序及其有关文档。计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。同一计算机程序的源程序(又称源代码)和目标程序为同一作品。文档是指用来描述程序的内容、组成、设计、功能规格、开发情况、测试结果及使用方法的文字资料和图表等,如程序设计说明书、流程图、用户手册等。
源代码是用源语言编制的计算机程序。因此,源代码是计算机软件的核心内容,是软件设计方案的具体表现,一旦被公开,软件的核心技术即泄露,从而会失去应有的商业价值。由此可以看出源代码是网络游戏软件构成的最为重要的基本元素。
II.网络游戏源代码泄露形式介绍
网络游戏是有其生命周期的,在绝大部分情况下,网络游戏源代码的泄露和公开将直接导致网络游戏的死亡或者导致网络游戏平衡性的丧失而失去玩家。最终导致网络游戏开发公司和运营公司的巨额亏损直至破产清算。
网络游戏源代码的泄露,通常分成三种情况:
私服;
法为依据要求对方承担相应的法律责任。当然,根据其技术原理,这种擅自开设“私服”行为,同时也侵犯了游戏软件版权人的使用权,因此,属于版权侵权行为,应该承担版权法上的侵权责任。对于
输入游戏的账号和密码后,很有可能发生丢号事件、丢失虚拟物品事件。还有部分外挂程序制作分子利用玩家贪图一时便利而注册外挂的途径,大肆实施窃取他人账号行径。更有甚者打出了免费的旗帜,当玩家在使用一定时期后,逐渐依赖外挂而游戏时,再收取费用。
四个账户,建立了私服《天子传奇》。
2005年5月25日晚,经过周密准备,上海市公安局普陀分局将该私服的服务器、远程维护电脑等设备同时起获,并抓获了犯罪嫌疑人游某。至案发时,该私服所设立的账户共收到会员缴费53万余元(均为非法获利)。
2005年6月30日,犯罪嫌疑人游某被检察机关以侵犯著作权罪批准逮捕。2005年11月,游某被判处有期徒刑三年缓刑三年。2006年7月,主犯罗治国向公安机关投案自首。
这是以刑事手段打击“私服”活动的全国
罚金70万元;以侵犯著作权罪判处梁文宇有期徒刑三年六个月,并处罚金60万元;以销售侵权复制品罪判处阮晓霞拘役六个月,并处罚金30万元;以销售侵权复制品罪判处刘阳拘役六个月,并处罚金20万元;各被告人的违法所得及被扣押的电子设备予以没收。
本案是全国“扫黄打非”办、新闻出版总署(国家版权局)、公安部、高法院、高检院五部门挂牌督办的专项行动重点案件,本案中提出的“未经权利人许可,以营利为目的,制作游戏软件的外挂程序,是复制游戏软件客户端程序的行为,应以侵犯著作权罪查处”等法律适用意见,以及本案从淘宝网店铺销售侵权复制品入手对案件的全面深入查处,对于办理网络游戏“外挂”案件、严厉打击通过网络渠道销售侵权复制品等违法案件具有指导意义。
3.员工故意泄露源代码侵犯网络游戏《征途》著作权的刑事案件 游戏公司内部员工故意泄露源代码给从事私服和外挂业务的犯罪嫌疑人,将构成侵犯著作权罪共犯。不但要承担侵权赔偿民事责任,还有可能承担刑事犯罪责任。其典型案例为征途“内贼”案件。
2006年3月,拥有大学文凭的王予川进入上海征途网络公司,担任研发中心开发部程序员一职,负责征途网络游戏部分源代码的研发工作。3个月后,王予川离开征途公司,临走时,他私自复制并带走了服务端源代码、客户端源代码及辅助文档,这是征途公司具有独立著作权的征途游戏的程序。
失业后的王予川经济拮据,于是他想到了手中的“宝贝”、也就是征途游戏的源代码。今年3月,他通过互联网发布相关信息,并很快找到了江苏和东北的两名买家。同月15日、30日,王予川在上海浦东某酒店内,将上述服务端源代码等分别以7万元和6万元的价格卖给了王岩等人。不日,王岩和汤帅前往南京,又以20万元的价格将这些源代码转手卖给了另一名下家。与此同时,征途公司发现了征途游戏源代码被秘密复制外泄的情况,并立即报警。4月4日,王岩和汤帅在江苏和下家交易时被公安人员人赃俱获。同月8日,王予川被公安人员抓获。
法院经审理后查明,被告人王予川利用职务便利,未经著作权人许可,复制计算机软件并予以发行,违法所得数额较大,其行为已构成侵犯著作权罪,应予处罚。被告人王岩明知是侵权复制品仍予以购买,并伙同被告人汤帅进行非法销售,其行为已构成销售侵权复制品罪,且系共同犯罪,也应予处罚。被告人王予川到案后主动交代了以6万元将源代码等销售给他人的事实,属于坦白,并退出了全部违法所得。
据此,为严肃国家法制,维护社会主义市场经济秩序,保障著作权人的合法权益不受侵害,2007年12月7日,上海市徐汇区人民法院对此案作出一审判决,被告人王予川犯侵犯著作权罪,被判处有期徒刑1年零6个月,并处罚金5万元;被告人王岩、汤帅犯销售侵权复制品罪,分别被判处有期徒刑1年、10个月,并处罚金4万元、3万元。
4.员工故意泄露源代码侵犯网络游戏《JGnet》著作权的刑事案件
内部员工泄露网络游戏源代码的另一个著名案例是,2009年8月,刘波从成都汉森信息技术有限公司离职后,将其私自复制的该公司拥有著作权的“JGnet”游戏引擎程序、“倾城”网络游戏软件等在互联网上公开出售。据成都市高新区法院公布的案情调查显示,2009年9月17日下午16时,刘波将“JGnet”游戏引擎程序以10万元的价格出售给了高飞,在刘波与高飞交易时,被警方当场抓获。2009年10月20日,刘波被成都市高新检察院批捕;2010年2月底,成都市高新区法院宣布,驳回被告刘波的上诉,并维持原判,以“侵犯著作权”的罪名判处刘波有期徒刑两年,并处罚款一万元人民币。
小结:
基于上述分析可以看出,网络游戏非法外挂给网络游戏公司造成重大损失的案件。网络游戏源代码的泄露,将带来无休止的游戏私服和外挂问题,加速了游戏的死亡时间,给游戏开发和运营公司将造成巨大的损失。同时擅自泄露网络游戏源代码的内部员工将构成版权侵权,甚至版权犯罪,不但要承担侵权赔偿责任,有可能也会承担刑事责任。
基于目前中国大陆地区由于网络游戏源代码泄露而引发的刑事案件已有30余起、因此而获刑的人员也有50余人。还有更多的网络游戏源代码泄露导致网络游戏的死亡和游戏公司的巨额亏损案件不停的披露出来。
附件
一、网络游戏源代码保护的相关法律法规
根据《刑法》
款;违法经营额不足1万元的,并处1万元以上5万元以下罚款;情节严重的,责令限期停业整顿或者撤销批准。“私服”经营者经营的内容侵犯合法厂商的权益,应当依据该条承担行政责任。
2005年文化部等五部委联合发出通知,指出“私服”等侵犯知识产权、扰乱市场秩序的问题突出,需要严厉打击。
《互联网文化管理暂行规定》
闭网站。“私服”经营者应当承担该项行政责任。
根据《著作权法》
第二篇:数据结构24点游戏源代码
#include
eOperator = 1 //算子 };
int oper[7]={43,45,42,47,40,41,35};
char OPSET[OPSETSIZE]={'+' , '-' , '*' , '/' ,'(' , ')' , '#'};
typedef struct sqlist{ int bol;//bol 是 0 时,num-ch是一个数字;bol 是 1 时 num_ch 运算符
int num_ch;struct sqlist *next;}sqlist;//线性表
typedef struct sqstack{ int *base;int *top;int stacksize;}sqstack;//栈的定义
unsigned char Prior[7][7] = {// 课本 表3.1 算符间的优先关系
'>','>','<','<','<','>','>','>','>','<','<','<','>','>','>','>','>','>','<','>','>','>','>','>','>','<','>','>','<','<','<','<','<','=',' ','>','>','>','>',' ','>','>','<','<','<','<','<',' ','=' };
int init_sq(sqlist *l){//初始化链表
l=(sqlist*)malloc(sizeof(sqlist));if(l==NULL){
exit(-2);} l->next=NULL;return 1;}
int insert_sq(sqlist **p,int e,int bl){//链表插入操作
sqlist *q;q=(sqlist*)malloc(sizeof(sqlist));q->num_ch=e;q->bol=bl;q->next=NULL;(*p)->next=q;(*p)=(*p)->next;return 1;}
int check(sqlist l)//保证输入的数字是给出的四个数字 { int right=1,find=0,i;sqlist *q=&l;q=q->next;for(;q->next!=NULL;q=q->next){
if(q->bol==1){
if(q->num_ch <=39||q->num_ch>57||q->num_ch==44||q->num_ch==46){
right=0;
printf(“%c不是有效的运算符!n”);
}
}
else {
find=0;
for(i=0;i<4;i++){
if(number[1][i]==0&&number[0][i]==q->num_ch){
number[1][i]=1;
find=1;
break;
}
}
if(find==0){
printf(“%d 不在给出的四个数字中!n”,q->num_ch);
right=0;
}
} }//end for for(i=0;i<4;i++){
if(number[1][i]==0){
printf(“%d没有用上!n”,number[0][i]);
right=0;
} } return right;}
int chang(char *s,sqlist *l){//将用户的输入转化为单链表
int t=0;unsigned int i=0;int bl,ch;int a1,a2,a;sqlist *p=l;for(;i if(s[i]>47&&s[i]<58&&t==0){ a1=(int)s[i]-48; t++; } else if(s[i]>47&&s[i]<58&&t==1){ a2=(int)s[i]-48; a=a1*10+a2; t++; } else if(s[i]<48&&s[i]>39&&s[i]!=44&&s[i]!=46){ if(t==1){ bl=0; insert_sq(&p,a1,bl); t=0; } else if(t==2){ bl=0; insert_sq(&p,a,bl); t=0; } bl=1; ch=(int)s[i]; insert_sq(&p,ch,bl); t=0; } else { printf(“%c不是有效的运算符!n”,s[i]); } } //end for i=strlen(s)-1;if(s[i]>47&&s[i]<58){ if(s[i-1]>47&&s[i-1]<58){ bl=0; insert_sq(&p,a,bl); } else { bl=0; insert_sq(&p,a1,bl); } } bl=1;a=35;insert_sq(&p,a,bl);return(check(*l));} int Operate(int a,int theta, int b){//计算 switch(theta){ case 43: return a+b;case 45: return a-b;case 42: return a*b;case 47: { if(b==0){ return-2000; } if(a%b==0){ return a/b; } else {//printf(“不能为小数n”); return-10000; } } default : return 0;} } int ReturnOpOrd(char op,char* TestOp)// precede()函数调用求优先级 { int i;for(i=0;i< OPSETSIZE;i++){ if(op == TestOp[i])return i;} return 0;} char precede(char Aop, char Bop){ return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];} int initstack(sqstack *s){(s)->base =(int*)malloc(STACK_INIF_SIZE*sizeof(int));if((s)->base==NULL)exit(-2);(s)->top=(s)->base;(s)->stacksize = STACK_INIF_SIZE;return 1;} int gettop(sqstack *s){ //取得栈顶元素 int e;if(s->top==s->base){ printf(“栈空,无法取得栈顶元素!n”); return 0;} e=*(s->top-1);return e;} int push(sqstack *s,int e){ //压栈 if(s->top-s->base>=s->stacksize){ s->base=(int*)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(int)); if(!s->base)exit(-2); s->stacksize+= STACKINCREMENT;} *(s->top++)=e;return 1;} int pop(sqstack *s,int *e){ //出栈 if(s->top==s->base){ printf(“栈空,出栈错误!n”); return 0;} *e=*(--s->top);return 1;} int EvaluateExpression(char* MyExpression){ // 算法3.4----计算表达式的值 // 算术表达式求值的算符优先算法。 // 设OPTR和&&OPND分别为运算符栈和运算数栈 int result;sqstack OPTR; // 运算符栈,字符元素 sqstack OPND; // 运算数栈,实数元素 int c,bl,a,b,theta,top;sqlist *q,l;char *s=MyExpression;init_sq(&l);if(chang(s,&l)!=0){ q=&l; initstack(&OPTR); push(&OPTR, 35); initstack(&OPND); q=q->next; c=q->num_ch; bl=q->bol; while((c!= 35 || gettop(&OPTR)!=35)){ if(bl!=1){ push(&OPND, c); q=q->next; c=q->num_ch; bl=q->bol; } // 不是运算符则进栈 else{ top=gettop(&OPTR); switch(precede((char)top,(char)c)){ case '<': // 栈顶元素优先权低 push(&OPTR, c); q=q->next; c=q->num_ch; bl=q->bol; break; case '=': // 脱括号并接收下一字符 pop(&OPTR, &c); q=q->next; c=q->num_ch; bl=q->bol; break; case '>': // 退栈并将运算结果入栈 pop(&OPTR, &theta); pop(&OPND, &b); pop(&OPND, &a); push(&OPND, Operate(a, theta, b)); break; default : printf(“没有这个运算符!n”); return 0; } // switch }//else } // while result=gettop(&OPND); return result;} else { printf(“你的输入有错误!n”); return 0;} } int randomm()//产生四个随机数 { int i=0;srand((unsigned)time(NULL));for(;i<4;i++){ number[0][i]=0; number[0][i]=rand(); number[0][i]%=13; number[0][i]++; number[1][i]=0;} return number[2][4];} int CalcOneExpress(int expression[][2])// 计算表达式 { // 算术表达式求值的算符优先算法。 // 设OPTR和&&OPND分别为运算符栈和运算数栈,OP为运算符集合。int index=0,result,c,theta,a,b;sqstack OPTR; // 运算符栈,字符元素 sqstack OPND; // 运算数栈,实数元素 initstack(&OPTR);push(&OPTR, 35);initstack(&OPND);c=expression[index][0];while(c!= 35 || gettop(&OPTR)!=35){ if(expression[index][1]!=1){ push(&OPND, c); index++; c=expression[index][0];} // 不是运算符则进栈 else { switch(precede((char)gettop(&OPTR),(char)c)) { case '<': // 栈顶元素优先权低 push(&OPTR, c); index++; c=expression[index][0]; break; case '=': // 脱括号并接收下一字符 pop(&OPTR, &c); index++; c=expression[index][0]; break; case '>': // 退栈并将运算结果入栈 pop(&OPTR, &theta); pop(&OPND, &b); pop(&OPND, &a); push(&OPND, Operate(a, theta, b)); break; default : printf(“没有这个运算符n”); return 0; } // switch }//else } // while result=gettop(&OPND);return result;} int Equal24(int n){ if(n==24){ return 1;} else return 0;} //括号的几种情况 //1 无括号 //2(a b)c d 同a b(c d), 下省略 //3(a b c)d //4(a b)(c d)//5((a b)c)d int CalcArray1(int iNumInput[2][4]){ // a * b * c * d 7 个字符 int expression[8][2],ii,jj,kk;int i,j,k,l,dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[0][0]=iNumInput[0][i]; expression[2][0]=iNumInput[0][j]; expression[4][0]=iNumInput[0][k]; expression[6][0]=iNumInput[0][l]; expression[0][1]=eNumber; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[6][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[1][0] = oper[ii]; expression[1][1] = eOperator; expression[3][0] = oper[jj]; expression[3][1] = eOperator; expression[5][0] = oper[kk]; expression[5][1] = eOperator; expression[7][0] = oper[6]; expression[7][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以这样运算:%d%c%d%c%d%c%dn”,expression[0][0],oper[ii],expression[2][0],oper[jj],expression[4][0],oper[kk],expression[6][0]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray2(int iNumInput[2][4]){ //(a * b)* c * d //9 number int expression[10][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[6][0]=iNumInput[0][k]; expression[8][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[6][1]=eNumber; expression[8][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[2][0] = oper[ii]; expression[2][1] = eOperator; expression[4][0] = oper[5]; expression[4][1] = eOperator; expression[5][0] = oper[jj]; expression[5][1] = eOperator; expression[7][0] = oper[kk]; expression[7][1] = eOperator; expression[9][0] = oper[6]; expression[9][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以这样运算:%c%d%c%d%c%c%d%c%dn”,oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],expression[6][0],oper[kk],expression[8][0]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray3(int iNumInput[2][4]){ //(a * b * c)* d //9 number int expression[10][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[5][0]=iNumInput[0][k]; expression[8][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[5][1]=eNumber; expression[8][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[2][0] = oper[ii]; expression[2][1] = eOperator; expression[4][0] = oper[jj]; expression[4][1] = eOperator; expression[6][0] = oper[5]; expression[6][1] = eOperator; expression[7][0] = oper[kk]; expression[7][1] = eOperator; expression[9][0] = oper[6]; expression[9][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以这样运算:%c%d%c%d%c%d%c%c%dn”,oper[4],expression[1][0],oper[ii],expression[3][0],oper[jj],expression[5][0],oper[5],oper[kk],expression[8][0]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray4(int iNumInput[2][4]){ //(a * b)*(c * d)//11 numbers int expression[12][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[1][0]=iNumInput[0][i]; expression[3][0]=iNumInput[0][j]; expression[7][0]=iNumInput[0][k]; expression[9][0]=iNumInput[0][l]; expression[1][1]=eNumber; expression[3][1]=eNumber; expression[7][1]=eNumber; expression[9][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[2][0] = oper[ii]; expression[2][1] = eOperator; expression[4][0] = oper[5]; expression[4][1] = eOperator; expression[5][0] = oper[jj]; expression[5][1] = eOperator; expression[6][0] = oper[4]; expression[6][1] = eOperator; expression[8][0] = oper[kk]; expression[8][1] = eOperator; expression[10][0] = oper[5]; expression[10][1] = eOperator; expression[11][0] = oper[6]; expression[11][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以这样运算:%c%d%c%d%c%c%c%d%c%d%cn”,oper[4],expression[1][0],oper[ii],expression[3][0],oper[5],oper[jj],oper[4],expression[7][0],oper[kk],expression[9][0],oper[5]); return 1; } } } }//end of for oper } } } } return 0;} int CalcArray5(int iNumInput[2][4]){ //((a * b)* c)* d //11 numbers int expression[12][2];int ii,jj,i,j,k,l,kk;int dRes;for(i=0;i<4;i++){ for(j=0;j<4;j++) { if(j==i) { continue; } for(k=0;k<4;k++) { if(k==i||k==j) { continue; } for(l=0;l<4;l++) { if(l==i||l==j||l==k) { continue; } expression[2][0]=iNumInput[0][i]; expression[4][0]=iNumInput[0][j]; expression[7][0]=iNumInput[0][k]; expression[10][0]=iNumInput[0][l]; expression[2][1]=eNumber; expression[4][1]=eNumber; expression[7][1]=eNumber; expression[10][1]=eNumber; for(ii=0;ii<4;ii++) { for(jj=0;jj<4;jj++) { for(kk=0;kk<4;kk++) { expression[0][0] = oper[4]; expression[0][1] = eOperator; expression[1][0] = oper[4]; expression[1][1] = eOperator; expression[3][0] = oper[ii]; expression[3][1] = eOperator; expression[5][0] = oper[5]; expression[5][1] = eOperator; expression[6][0] = oper[jj]; expression[6][1] = eOperator; expression[8][0] = oper[5]; expression[8][1] = eOperator; expression[9][0] = oper[kk]; expression[9][1] = eOperator; expression[11][0] = oper[6]; expression[11][1] = eOperator; dRes = CalcOneExpress(expression); if(Equal24(dRes)) { printf(“可以这样运算:%c%c%d%c%d%c%c%d%c%c%dn”,oper[4],oper[4],expression[2][0],oper[ii],expression[4][0],oper[5],oper[jj],expression[7][0],oper[5],oper[kk],expression[10][0]); return 1; } } } }//end of for oper } } } } return 0;} int Calc24(int number[2][4]){ int find=0;//括号的 5 种情况 //1 a b c d //2(a b)c d 同 a b(c d)和 a(b c)d //3(a b c)d //4(a b)(c d)//5((a b)c)d 同(a(b c))d if(CalcArray1(number)){ find=1; return 1;} if(CalcArray2(number)){ find=1; return 1;} if(CalcArray3(number)){ find=1; return 1;} if(CalcArray4(number)){ find=1; return 1;} if(CalcArray5(number)){ find=1; return 1;} if(find==0){ printf(“这四个数字算不出24点.n”); return 0;} return 0;} void gameinformation(){ printf(“┌────────────────────────┐n”);printf(“│ 点 游 戏 │n”);printf(“│ 学号: │n”);printf(“│ 设计人:XXX │n”);printf(“│ 完成时间:2015年7月20日 │n”);printf(“└────────────────────────┘nn”);} void menu(){ char s[40],ch,mood;int result,t=1,t0=1,nall=0,nright=0,t1=1;double right;while(t==1){ printf(“本游戏有以下三种模式可选择↓n”); printf(“┌────────────────────────┐n”); printf(“│→ 0.开始游戏 │n”); printf(“│◇ 1.游戏规则 │n”); printf(“│→ 2.退出游戏 │n”); printf(“└────────────────────────┘nn”); printf(“请输入选项所对应的数字↑:”); scanf(“ %c”,&mood); if(mood=='0'){ //计算机成四个数字,游戏者求表达式 nall=0; nright=0; t0=1; while(t0==1) { number[2][4]=randomm(); printf(“这四个数是: %d %d %d %dn”,number[0][0],number[0][1],number[0][2],number[0][3]); printf(“请输入算式n”); printf(“如果你认为这四个数算不出24点,请输入'?'n”); printf(“计算机将会给出答案,算不出也是一种答案!n”); printf(“你的算式是:”); scanf(“%s”,s); if(s[0]=='?'){ if(Calc24(number)==0){ nright++; } nall++; } else { result=EvaluateExpression(s); printf(“你输入的算式的结果是: %d n”,result); if(result==24) { printf(“你赢了!n”); nright++; nall++; } else { 字 printf(“你输了!n”); nall++; } }//else right=(double)nright/nall; printf(“你共做了 %d 道,做对了 %d 道,正确率为:%.2f%%n”,nall,nright,right*100); printf(“继续这个模式吗?请选择: 'y':继续 'n':退出?n”); scanf(“ %c”,&ch); if(ch=='n'||ch=='N'){ t0=0; } else if(ch=='Y'||ch=='y')t0=1; else{ printf(“你的选择(输入)有误!n”); t0=0; } } }//end mood 0 else if(mood=='1'){ //游戏规则说明 printf(“ 规则其实很简单: n”); printf(“ 只能使用+,-,*,/,(,)这6种符号完成表达式 printf(” 当然也允许改变数字顺序n“); printf(” 下面请看示例:n“); printf(” 系统给出的数字为:1 5 5 5n“); printf(” 你只要输入(5-1/5)*5 即可n“); printf(”n“); printf(”n“); printf(”n“); }//end mood 1 else if(mood=='2'){//退出游戏 printf(”游戏结束!n“); t=0; } else { printf(”mood =%cn“,mood); printf(”您的输入有误,游戏结束!n“); t=0; } }//end big while n”);} void main(){ gameinformation();//输出作者信息 menu();//输出功能菜单,游戏开始 } 《源代码》观后感 看完电影《源代码》后,我们几个人都感叹不已,围绕着该如何解释剧情展开了激烈的讨论,各有各的说法,电影嘛,要的就是这个效 果。从能吸引几个不同年龄段不同工种的人聚精会神的看下去,看完还能讨论很久这个现状来说,这部电影还是很牛叉的。 我对该片的理解是这样的:我们生活的这个宇宙存在无数的平行世界,每个平行世界之间的间隔是微乎其微。影片中有个最新研究发现,说是人类死亡后,能残留8分钟的记忆碎片,这个其实也可以看做我们这个世界通往其它时段世界的入口,男主人公在现代科技的帮助下,多次穿越到不同的平行世界里,但每次穿越时在不同世界里的相对时间点都是一样的。但由于他的非法侵入,每个平行世界在这个时间点以 后的发展都发生了或多或少的改变。男主人公在我们这个所谓的现实世界里已经处于半死亡状态,因此他选择留在最后一次穿越进去的平行 世界里。 一直以来我都在思索过去的某件事如果我换个种方法去做会是怎么去样发展?会不会在另一个时空发展?另一个时空的我会是怎么样得 ?每下秒发生的事都会有N种不同发展方向他们都沿着自己固定的时空在法展。《源代码》让我明晰了我模糊的想法,有很多朋友说看不懂结尾,其实影片只是起到我们自己去思考,每一秒有N个分支沿自己的时空位面发展下去,影片的前一部分我们只是看到 N个分支的其中一个分支,结尾画面一转那个女的接到了短信,这只是那女的让男主角最后一次进入源代码的N个分支中的另一个,如果按博 士说的那么那个女的永远也接不到那条短信那么这个镜头我们还是在这个位面。那个女的接到短信的时候我们就已经进入了另一个位面也就 是在火车上发短信那个位面的其中一个分支,这个分支跟我们影片前面看到的不是同一个分支,但是时间是统一的,只是发展不同。 ***0128于海洋 这是结束了还是另一个延续? ——《源代码》影评及观后感 说道穿越,应该是最近最火的电影电视剧喜欢使用的内容了。其实穿越的另一个名字叫做“时空旅行”。其指的是人从某一时间点移动到另外一个时间点。事实上,所有的人都顺着时间一分一秒的自然前进,所以时间旅行就是违反这种自然时间变化的方式,大幅度的前往未来或者回到过去。本来一个数学几何学非常重要的节点被运用到一些电影电视剧上后,显得苍白与无聊,比如电视剧:《宫锁心玉》、《步步惊心》等。反观国外特别是欧美的穿越电影,不论是从科学还是可看性的角度上来说,都达到了寓教于乐却又不失品味的作用,而今天我想拿出来说说的就是著名后起之秀导演邓肯·琼斯导演的《源代码》。(该片形容起来容易让听者无法理解,没看过或者不到最后一刻是无法理解电影到底说什么的,这正是时光旅行电影的魅力所在,所以恳请老师观看这部电影之后再看看我写的影评~) 人物介绍: 柯尔特史蒂文:主角,美军上尉(作者注:以后用上尉代替)肖恩:历史教师,主角对应的源代码穿越者。 克里斯蒂娜:肖恩的朋友,坐在主角的对面,对肖恩有好感。拉特里奇博士:研发源代码系统的人 古德温:负责与主角联络。内容简要: (摘自“百度百科”,有改动)本片说的是在阿富汗执行任务的美国空军飞行员科特史蒂文斯上尉在火车上突然惊醒,而他的身边坐着一个素不相识的女子克里斯蒂安正在与自己讲话。上尉不知自己为什么会在这辆车上,而且他发现自己居然是以另一个人的身份存在,(火车爆炸中死去的历史老师)正当他迷惑不解的时候,列车上忽然发生爆炸。 上尉又一次惊醒,发现自己身处一个密闭的太空仓里(这是他想象的一个空间,后面会解释),有一位女军官古德温正在通过视频和自己对话,并要求自己报告列车上发生的事情。一头雾水的科特还没搞明白是怎么回事时,他又一次被送上那辆列车,但每次只能回到爆炸前最后的8分钟(爆炸时间是7:48),也就是这一天清晨的7点40分。 理论上,“源代码”并不是时光机器,“回到”过去的柯尔特无法改变历史,也并不能阻止爆炸发生。之所以大费周折让上尉进入源代码,是因为制造这起爆炸的凶手宣称将于6小时后在芝加哥市中心制造另一次更大规模的恐怖行动!为了避免上百万人丧生,在调察的过程中,科特发现自己已在一周前的一次军事任务中去世,原来他正在参与是一项“脑波原代码”的秘密任务,这项任务通过已经死 亡的科特尚未完全死亡的脑细胞影像来还原事件,调查事情的真相,找到连环爆炸案的罪犯。最终,上尉顺利完成了任务,但是他却决定再一次返回列车,拯救列车上那些无辜的生命。同时更是拯救那个“陪伴”自己在源代码里的那个女主角克里斯蒂安。最后他成功的阻止了爆炸,借用者肖恩的身体与克里斯蒂安幸福的生活在一起。 疑点分析: 1.为什么一开始上尉会出现在一个太空舱里? 因为他早在2个月前就死在了战场上,只剩一个活着的大脑,影片中正常的上尉与太空舱(可能是太空舱想象起来比较安全,毕竟他是从直升机上炸死的)是他脑中想象的影子,指挥中心与他视频其实根本看不到他的样子(指挥中心的屏幕是黑的)。 2.这部电影中博士说只有8分钟回到过去的时间,为什么有几次却超过了8分钟他还没回去? 我认为,8分钟只是一个研究性的概念,每个人的短时记忆长短不一。真正让上尉回来的节点是火车爆炸,从那时开始,肖恩(死去的历史老师)的记忆才真正终结。 3.关于源代码的作用机制? 之前我也提到,源代码绝非时光机器,可以回到过去改变历史。正如博士所说的,进入源代码只是发现过去发生了什么,就算改变了也对现实产生不了任何影响。这里还有一个理论就是关于平行世界。顾名思义,假设我们这个世界为真实世界,就存在着很多个同时存在的你跟我、还有所有事件的重新演绎。 引用著名的“祖母悖论”(摘自“百度百科”,有改动):假如小明回到过去把他的祖母给杀了,就是说他祖母在年轻时就死了,因此来讲小明的母亲也就没出生,这个人也就不可能再出生。而历史的发展到现在,按理来说小明是不存在的。而现实中小明的确是存在的。这两个情况就出现 了相互矛盾的情况。从而证明了人是不能回到过去。小明回到她祖母的时代,从那一时刻开始,宇宙的发展及演化就分成了两个平行的宇宙。第一种情况,他把他的祖母杀掉了,在第一个宇宙中的发展是这个人把她的祖母杀了,而到现在这个人也就不再存在了;而在现实的宇宙中的发展还是像现在一样,这个人还是存在的,祖母也是安好的,并没有什么事情发生。 正如影片中一开始,上尉第一次穿越的时候,女主角克里斯蒂娜在看到突如其来打翻在上尉鞋子上的热饮无动于衷,而第二次穿越的时候帮助上尉擦拭鞋子上的污渍;还有影片中部,当上尉穿越之后想打个电话给博士结果博士还没有上班所以无人接听(爆炸是7点48,博士还没上班,8点上班制),回到现实后,博士告诉他无论如何他都接不到,就算接到电话的也仅仅是平行世界的博士而已;同时在影片的最后,上尉在穿越的时候发了一条短信给 古德温,在这里很多包括我第一次看的时候都没有看明白,以为他真的发了一条短信给现实世界的古德温。其实后来一想,现实世界的上尉在古德温按下终止按钮的那一瞬间已经完全与现实世界切断了,根据刚刚的祖母原理,我们可以发现,他所联系到的一定是他穿越的那个平行世界的古德温而不是现实的。因此在此得出结论:上尉一共穿越了9次,这9次事件都是与真实世界不同并且不会影响真实世界,但是却又真实发生并且都对其所对应的平行世界产生了影响。 我的看法: 只要搞明白了平行世界这个理论,很多的穿越电影都能够迎刃而解。所以综上所述,对于这部电影的结局我又有了自己的看法:上尉能够回现实世界的唯一方法就是被火车炸死。因而博士和古德温都非常强调一点,上尉需要专心在车上寻找嫌犯,尽量不要参与其它的不相关事物。这点其实是在保证上尉可以在8分钟之后的爆炸时留在车上,从而被炸死送回现实世界。博士谎称源代码是一个8分钟的虚拟世界,同样是防止上尉逃离火车的另一手段,如果上尉得知自己可以通过避免死亡而继续生存在源代码内,那么相较于自己现实世界的悲惨处境(他已经死了),他可能选择逃离列车而以肖恩的身份继续活下去,博士从而失去了他们手上唯一的合格穿越者。所以我的结论是:源代码系统并非由死者8分钟记忆而来的仿真系统,而是一个可以将穿越者送入某个平行世界的系统,博士作为研发者无疑是知道内情的人,古德温有可能也知道这一点,而上尉则蒙在鼓里被利用。 有一个细节,在上尉在每次穿越回来时,都能看到模糊的影像,最后证明这是最后一次穿越他和克里斯蒂娜下火车之后看到的场景。这有可能是由于他在平行世界中穿越过程中,看到了某个时间处于未来的平行世界的影像所致。 我的感想: 终于,一部史诗级的时空之旅电影穿越完了,这是我迄今为止觉得看过的最完美的一部穿越电影,不论是从音质音效还是画面构造以及内容的严密性而言,都达到了一个大师级的水平,对于一个电影新秀来说更是了不起的作为。透过这部电影,我们可以深刻的感受到人类对于未知事物的充分好奇欲以及探索欲。其实我想说,关于电影的缜密性我们大可不必去探究他的漏洞,毕竟这不是科学论文。反观其中的亲情戏我认为嚼头更大:在最后的时刻,上尉邀请了克里斯蒂安去喝咖啡,而这是她期待了几个星期的事情。之后上尉离开了一会儿,去阻止爆炸,接着他以上尉同事的身份打电话给自己的父亲,向他的父亲道歉。他把最后的几分钟留给了自己和克里斯蒂安。8分钟后,古德温终止了源代码程序,时间定格在上尉和克里斯蒂安接吻的一刻。也许我们的生命也是一样,会在某一天突然地终止,而也许在这时,我们才会发现什么才是自己真正想要的,我们会后悔自己对亲人、朋友太过苛责,会发现自己曾经执着的东西原来毫无价值,然而到了这时,一切都无法改变。 仔细想想,其实我们的一生也是这样,当死亡降临时,我们又还会剩下什么呢?也许我们终究会被遗忘然后删除,就好像一段从未出现过的代码一样。也许到那时,我们回顾自己的一生,才会发现什么才是自己真正想要的。幸运的是,我们的美好生活可不仅仅只有那短暂的8分钟。我们需要让生活中的每一秒都变得有意义就像台词里说的: If your life just have 1 minute, what will do? 当时间只剩下1分钟时,你会做什么? I will let every seconds be meaningful.Everything is gonna be OK.我会让每一秒钟都变得有意义,所有的事情都会好起来的。 【作者注:本文中关于“内容简要”、“祖母悖论”等较为官方的内容均为网络资源,均已标出,其余均为本人观点及看法,与任何团体和个人无关,本文未经允许严禁在任何其他公共页面展示。】 江西师范大学 音乐学院 10播音班 1005046051涂明鉴 看完了源代码,好吧首先来简述一下影片的情节:一位名叫柯尔特·史蒂文的上尉,某日当他醒来时发现自己正在一辆前往芝加哥的火车上,而他在火车的主要目的就是要找到是谁把炸弹放在了火车上。就是这样过程,却被重复的“播放”(因为这是Source Code世界)。Source Code世界是由博士制造的,根据人在死后,大脑的电磁场仍然带着电,并没有完全死去,还能够运转,但是只有短暂的8分钟之久。换句话说,当柯尔特·史蒂文回到已经发生过爆炸的列车上时(是通过仪器把他传送到过去),他只有8分钟时间可以用。在8分钟之内无论他是否找到凶手,他都会死去(但是最后他打破了这个定论)。 这个利用的是量子力学中所谓的平行世界理论。平行世界理论有两种,一种是前置平行世界理论,一个是后置平行世界理论。本片利用的是后置平行世界理论。 回到《源代码》,有个疑问,博士虽然设定的时间是8分钟,按理说科特史蒂文斯到了时间就会回来,无论是否死亡。博士和他自己应该都是这样认为,前几次无一例外正好第8分钟爆炸死亡,然后回来.后来有两次时间过了他却还在那个平行世界里,一次因为他和女主下了火车,火车爆炸(正好是第8分钟)后,掉入铁轨死亡后回来。另一次是被那个反派恐怖分子枪杀后死亡回来。电影里我忘记这里是否交代清楚了,8分钟以后好像博士他们无法联系到科特史蒂文斯,直到他再次死亡以后才联系上。这个情节非常令人熟悉,如果你看过《盗梦空间》的话,《迷离档案》里也是这样处理的,在梦里死亡的话,现实中的你就清醒过来了;没死的话,也可以用其他方法唤醒。经过这两次例外,科特史蒂文斯想到也许8分钟并不是一个限制,但他也不十分确定(后面接吻的镜头定格),所以他想到自己是可以在这一个平行的世界里继续活下去,但如果现实中的大脑还未完全死亡的话,还会被召回来,这也是他请求那个女上尉让他真正死亡的原因。我的疑问,如果他的大脑还未完全死亡,他在另一个平行世界里怎么被召回? 平行世界是否存在至少现在没人知道。如果存在的话,我想那绝不应该只是一个,而应是无数个。我们所处的每一时刻都应该是一个世界,只是现在我们的科技没有人能回到过去,也没有人去过未来,所以这些平行世界没有发生任何改变,是完全一模一样的,重叠在一起的就像是一个世界一样。 假如我回到昨天的某个时刻,那么这个时刻的世界就改变了,而和我们所在的现实世界是毫无联系的,因为他们是平行的关系。回到前天某个时刻,那么另一个平行世界又发生了改变,这与昨天的平行世界和现实世界都没有联系。 但是,当我回到了昨天某个时刻,如果另一个人想回到昨天来找我的话,他应该出现在哪个世界里?他怎么来到我去过的世界,因为我去过的那个世界已经发生了改变。 好吧,最后的结局是圆满的,整辆车的人都活了下来,男女主角都得到幸福。唯一被忽略的只有一个人,只有一个人死了——被男主角占据了身体的历史老师。那个人本该活着的,不是吗?这是我对本片最后的疑问。第三篇:源代码读后感
第四篇:影评《源代码》
第五篇:源代码影评