在这个数字化的时代,cell connect游戏攻略的更新速度越来越快。今天,我将和大家分享关于cell connect游戏攻略的今日更新,让我们一起跟上时代的步伐。
通过运用crt单元,可以编出一些简单的游戏。例如贪吃蛇、推箱子、扫雷等。这些都是我编过的游戏下面附上代码。
贪吃蛇:
program she;
uses crt;
label 1,2,3;
type point=record
x,y:1..20;
end;
type shuzu=array[1..20,1..20] of char;
var a:shuzu;s:string;b:array[1..1000]of point;i,j,f,fen:integer;
head,tail:0..1001;c:boolean;
procedure ran2;
var p,q:integer;
begin
randomize;
p:=random(17)+2;
q:=random(17)+2;
if a[p,q]=' ' then a[p,q]:='#' else ran2;
end;
procedure ran;
var p,q:integer;
begin
randomize;
p:=random(17)+2;
q:=random(17)+2;
if a[p,q]=' ' then a[p,q]:=chr(2) else ran;
end;
procedure print(x:shuzu);
var i,j:1..20;
begin
for i:=1 to 20 do
for j:=1 to 20 do
begin
textcolor(15);
if a[i,j]=chr(2) then textcolor(12);
write(a[i,j]);
if j=20 then writeln
end;
writeln('Score:',fen);
end;
begin
textmode(1);cursoroff;
3:fillchar(a,sizeof(a),' ');
head:=0;tail:=3;fen:=0;f:=4;
b[1].x:=2;b[1].y:=2;
b[2].x:=2;b[2].y:=3;
b[3].x:=2;b[3].y:=4;
for i:=1 to 20 do
begin
a[1,i]:='#';a[i,1]:='#';
a[20,i]:='#';a[i,20]:='#';
end;
a[2,2]:='o';a[2,3]:='o';a[2,4]:='?;
ran;
1:
c:=false;
clrscr;
print(a);
for i:=1 to 300 do
begin
delay(1);
if (keypressed)and(not(c)) then
case readkey of
#72:
if (f=3)or(f=4) then begin f:=1;c:=true; end;
#80:
if (f=3)or(f=4) then begin f:=2;c:=true end;
#75:
if (f=1)or(f=2) then begin f:=3;c:=true end;
#77:
if (f=1)or(f=2) then begin f:=4;c:=true end;
#27:
begin
writeln('Do you want to exit(Y/N)?');
repeat
readln(s);
if (s='Y')or(s='y') then halt;
until (s='N')or(s='n');
goto 1;
end;
end;
end;
a[b[tail].x,b[tail].y]:='o';
case f of
1:
begin
if (a[b[tail].x-1,b[tail].y]='#')or
((a[b[tail].x-1,b[tail].y]='o')and(not((b[tail].x-1=b[head mod 1000+1].x)and(b[tail].y=b[head mod 1000+1].y)))) then goto 2;
if a[b[tail].x-1,b[tail].y]=chr(2) then
begin
fen:=fen+10;
ran;ran2
end
else
begin
head:=head mod 1000+1;
a[b[head].x,b[head].y]:=' ';
end;
tail:=tail+1;
if tail=1001 then
begin
tail:=1;
b[1].x:=b[1000].x-1;b[1].y:=b[1000].y;
end
else
begin
b[tail].x:=b[tail-1].x-1;b[tail].y:=b[tail-1].y;
end;
end;
2:
begin
if (a[b[tail].x+1,b[tail].y]='#')or
((a[b[tail].x+1,b[tail].y]='o')and(not((b[tail].x+1=b[head mod 1000+1].x)and(b[tail].y=b[head mod 1000+1].y)))) then goto 2;
if a[b[tail].x+1,b[tail].y]=chr(2) then
begin
fen:=fen+10;
ran;ran2
end
else
begin
head:=head mod 1000+1;
a[b[head].x,b[head].y]:=' ';
end;
tail:=tail+1;
if tail=1001 then
begin
tail:=1;
b[1].x:=b[1000].x+1;b[1].y:=b[1000].y;
end
else
begin
b[tail].x:=b[tail-1].x+1;b[tail].y:=b[tail-1].y;
end;
end;
3:
begin
if (a[b[tail].x,b[tail].y-1]='#')or
((a[b[tail].x,b[tail].y-1]='o')and(not((b[tail].x=b[head mod 1000+1].x)and(b[tail].y-1=b[head mod 1000+1].y)))) then goto 2;
if a[b[tail].x,b[tail].y-1]=chr(2) then
begin
fen:=fen+10;
ran;ran2
end
else
begin
head:=head mod 1000+1;
a[b[head].x,b[head].y]:=' ';
end;
tail:=tail+1;
if tail=1001 then
begin
tail:=1;
b[1].x:=b[1000].x;b[1].y:=b[1000].y-1;
end
else
begin
b[tail].x:=b[tail-1].x;b[tail].y:=b[tail-1].y-1;
end;
end;
4:
begin
if (a[b[tail].x,b[tail].y+1]='#')or
((a[b[tail].x,b[tail].y+1]='o')and(not((b[tail].x=b[head mod 1000+1].x)and(b[tail].y+1=b[head mod 1000+1].y)))) then goto 2;
if a[b[tail].x,b[tail].y+1]=chr(2) then
begin
fen:=fen+10;
ran;ran2
end
else
begin
head:=head mod 1000+1;
a[b[head].x,b[head].y]:=' ';
end;
tail:=tail+1;
if tail=1001 then
begin
tail:=1;
b[1].x:=b[1000].x;b[1].y:=b[1000].y+1;
end
else
begin
b[tail].x:=b[tail-1].x;b[tail].y:=b[tail-1].y+1;
end;
end;
end;
a[b[tail].x,b[tail].y]:='?;
goto 1;
2:writeln('Game Over!Score:',fen);
writeln('Play again(Y/N)?');
repeat
readln(s);
if (s='Y')or(s='y') then goto 3;
if (s='N')or(s='n') then halt;
until (s='Y')or(s='y')or(s='N')or(s='n');
end.
推箱子(主文件):
program tuixiang;
uses crt,tx,dos;
label 1,2,3,4,5;
var f:text;n,p,q,i,j:integer;s1,s:string;
a:sz1;b:sz2;top:integer;ren:poi;
procedure wrong;
begin
sound(300);
delay(100);
nosound;
end;
function over:boolean;
var i:integer;
begin
for i:=1 to top do
if a[b[i].x,b[i].y]<>'? then exit(false);
exit(true);
end;
begin
textmode(1);cursoroff;
highvideo;
window(15,7,30,25);
write('Please choose a unit(1~11):');
read(n);
2:str(n,s1);s:='c:\map'+s1+'.in';
print(n,ren,a,b,top);
assign(f,s);
reset(f);
readln(f,i);
for j:=1 to i do
readln(f,p,q);
readln(f,p,q);
close(f);
1:case readkey of
#72:
if (a[ren.x-1,ren.y]=' ')or(a[ren.x-1,ren.y]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x-1,ren.y]:=chr(2);
ren.x:=ren.x-1;
end
else
if a[ren.x-1,ren.y]=chr(233) then
if (a[ren.x-2,ren.y]=' ')or(a[ren.x-2,ren.y]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x-1,ren.y]:=chr(2);a[ren.x-2,ren.y]:=chr(233);
ren.x:=ren.x-1;
end
else wrong
else
wrong;
#80:
if (a[ren.x+1,ren.y]=' ')or(a[ren.x+1,ren.y]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x+1,ren.y]:=chr(2);
ren.x:=ren.x+1;
end
else
if a[ren.x+1,ren.y]=chr(233) then
if (a[ren.x+2,ren.y]=' ')or(a[ren.x+2,ren.y]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x+1,ren.y]:=chr(2);a[ren.x+2,ren.y]:=chr(233);
ren.x:=ren.x+1;
end
else wrong
else
wrong;
#75:
if (a[ren.x,ren.y-1]=' ')or(a[ren.x,ren.y-1]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x,ren.y-1]:=chr(2);
ren.y:=ren.y-1;
end
else
if a[ren.x,ren.y-1]=chr(233) then
if (a[ren.x,ren.y-2]=' ')or(a[ren.x,ren.y-2]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x,ren.y-1]:=chr(2);a[ren.x,ren.y-2]:=chr(233);
ren.y:=ren.y-1;
end
else wrong
else
wrong;
#77:
if (a[ren.x,ren.y+1]=' ')or(a[ren.x,ren.y+1]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x,ren.y+1]:=chr(2);
ren.y:=ren.y+1;
end
else
if a[ren.x,ren.y+1]=chr(233) then
if (a[ren.x,ren.y+2]=' ')or(a[ren.x,ren.y+2]='o') then
begin
if dong(ren.x,ren.y,top,b) then a[ren.x,ren.y]:='o' else a[ren.x,ren.y]:=' ';
a[ren.x,ren.y+1]:=chr(2);a[ren.x,ren.y+2]:=chr(233);
ren.y:=ren.y+1;
end
else wrong
else
wrong;
#27:
begin
write('Are you sure to exit(Y/N)?');
4:readln(s1);
if (s1='y')or(s1='Y') then
begin
textmode(lo(lastmode));
halt
end
else
if (s1<>'n')and(s1<>'N') then goto 4;
end;
else
goto 1;
end;
pr(p,q,top,a,b);
if over then
begin
erase(f);
if n=11 then
begin
write('Congratulations!Play again(Y/N)?');
5:readln(s1);
if (s1='y')or(s1='Y') then
begin
n:=1;goto 2;
end
else
if (s1='n')or(s1='N') then halt
else goto 5;
end;
write('Congratulations!Go to next unit(Y/N)?');
3:readln(s1);
if (s1='y')or(s1='Y') then
begin
n:=n+1;goto 2;
end
else
if (s1='n')or(s1='N') then halt
else goto 3;
end;
goto 1;
end.
推箱子(附带单元):
unit tx;
interface
uses crt;
type poi=record
x,y:integer;
end;
type sz1=array[1..50,1..50]of char;
type sz2=array[1..10]of poi;
function dong(x,y,top:integer;var b:sz2):boolean;
procedure print(x:integer;var ren:poi;var a:sz1;var b:sz2;var top:integer);
procedure pr(x,y,top:integer;a:sz1;b:sz2);
implementation
function dong(x,y,top:integer;var b:sz2):boolean;
var i:integer;
begin
for i:=1 to top do
if (b[i].x=x)and(b[i].y=y) then exit(true);
exit(false);
end;
procedure print(x:integer;var ren:poi;var a:sz1;var b:sz2;var top:integer);
var f:text;s1,s:string;
procedure prsc;
var i,j,m,n:integer;
begin
clrscr;
assign(f,s);
reset(f);
readln(f,top);
for i:=1 to top do
readln(f,b[i].x,b[i].y);
readln(f,m,n);
for i:=1 to m do
for j:=1 to n do
begin
textcolor(15);
if dong(i,j,top,b) then textcolor(12);
read(f,a[i,j]);write(a[i,j]);
if a[i,j]=chr(2) then
begin
ren.x:=i;
ren.y:=j;
end;
if j=n then
begin
readln(f);
writeln
end;
end;
close(f);
end;
begin
str(x,s1);s:='c:\map'+s1+'.in';
assign(f,s);rewrite(f);
case x of
1:
begin
writeln(f,3);
writeln(f,5,' ',2);
writeln(f,6,' ',2);
writeln(f,7,' ',2);
writeln(f,9,' ',8);
writeln(f,' #####');
writeln(f,'#### #');
writeln(f,'# # ?#');
writeln(f,'# ? #');
writeln(f,'#o ####');
writeln(f,'#o# ?# ');
writeln(f,'#o# # # ');
writeln(f,'### # ');
writeln(f,' ##### ');
end;
2:
begin
writeln(f,5);
writeln(f,6,' ',2);
writeln(f,7,' ',2);
writeln(f,7,' ',3);
writeln(f,7,' ',4);
writeln(f,7,' ',5);
writeln(f,8,' ',6);
writeln(f,' #### ');
writeln(f,'## # ');
writeln(f,'#?# ');
writeln(f,'##?##');
writeln(f,'## ?#');
writeln(f,'#o? #');
writeln(f,'#oo閛# ');
writeln(f,'###### ');
end;
3:
begin
writeln(f,3);
writeln(f,4,' ',8);
writeln(f,5,' ',8);
writeln(f,6,' ',8);
writeln(f,9,' ',9);
writeln(f,'##### ');
writeln(f,'# # ');
writeln(f,'# 殚# ###');
writeln(f,'# ?# #o#');
writeln(f,'### ###o#');
writeln(f,' ## o#');
writeln(f,' # # #');
writeln(f,' # ####');
writeln(f,' ##### ');
end;
4:
begin
writeln(f,4);
writeln(f,3,' ',5);
writeln(f,3,' ',6);
writeln(f,4,' ',5);
writeln(f,4,' ',6);
writeln(f,10,' ',7);
writeln(f,' #### ');
writeln(f,'### ##');
writeln(f,'# ?oo#');
writeln(f,'# # oo#');
writeln(f,'# #?##');
writeln(f,'# # #');
writeln(f,'# ?#');
writeln(f,'## ? #');
writeln(f,' # ###');
writeln(f,' #### ');
end;
5:
begin
writeln(f,3);
writeln(f,5,' ',2);
writeln(f,6,' ',2);
writeln(f,7,' ',2);
writeln(f,8,' ',8);
writeln(f,' #### ');
writeln(f,' # ### ');
writeln(f,' # ? # ');
writeln(f,'### # ##');
writeln(f,'#o# # #');
writeln(f,'#o? # #');
writeln(f,'#o ?#');
writeln(f,'########');
end;
6:
begin
writeln(f,5);
writeln(f,2,' ',7);
writeln(f,3,' ',7);
writeln(f,4,' ',7);
writeln(f,5,' ',7);
writeln(f,6,' ',7);
writeln(f,10,' ',8);
writeln(f,' ###');
writeln(f,' #o#');
writeln(f,' #####o#');
writeln(f,'## ? o#');
writeln(f,'# 殚o#');
writeln(f,'# ? o#');
writeln(f,'### ## #');
writeln(f,'# ? #');
writeln(f,'# ###');
writeln(f,'###### ');
end;
7:
begin
writeln(f,5);
writeln(f,2,' ',4);
writeln(f,2,' ',5);
writeln(f,3,' ',3);
writeln(f,3,' ',4);
writeln(f,3,' ',5);
writeln(f,10,' ',7);
writeln(f,' #### ');
writeln(f,' ##oo# ');
writeln(f,' #ooo# ');
writeln(f,'## ?# ');
writeln(f,'# ');
writeln(f,'# #?##');
writeln(f,'# # ?#');
writeln(f,'# #');
writeln(f,'######');
writeln(f,' ### ');
end;
8:
begin
writeln(f,6);
writeln(f,5,' ',5);
writeln(f,5,' ',6);
writeln(f,6,' ',5);
writeln(f,6,' ',6);
writeln(f,7,' ',5);
writeln(f,7,' ',6);
writeln(f,11,' ',9);
writeln(f,' ####');
writeln(f,'###### #');
writeln(f,'# #');
writeln(f,'# ## #');
writeln(f,'## #oo #');
writeln(f,'##?oo?#');
writeln(f,'# #oo ##');
writeln(f,'# ## #');
writeln(f,'# #');
writeln(f,'###### #');
writeln(f,' ####');
end;
9:
begin
writeln(f,5);
writeln(f,4,' ',5);
writeln(f,5,' ',4);
writeln(f,5,' ',5);
writeln(f,6,' ',4);
writeln(f,6,' ',5);
writeln(f,8,' ',7);
writeln(f,' #### ');
writeln(f,' # # ');
writeln(f,'### ? ');
writeln(f,'# 殚o##');
writeln(f,'# 閛o #');
writeln(f,'# 閛o #');
writeln(f,'# ###');
writeln(f,'##### ');
end;
10:
begin
writeln(f,4);
writeln(f,5,' ',4);
writeln(f,6,' ',4);
writeln(f,7,' ',4);
writeln(f,8,' ',4);
writeln(f,12,' ',6);
writeln(f,' #### ');
writeln(f,'## ##');
writeln(f,'# ? #');
writeln(f,'# ?#');
writeln(f,'###o #');
writeln(f,' #o #');
writeln(f,' #o##');
writeln(f,'###o #');
writeln(f,'# ?#');
writeln(f,'# ?#');
writeln(f,'# ##');
writeln(f,'##### ');
end;
11:
begin
writeln(f,4);
writeln(f,5,' ',4);
writeln(f,5,' ',5);
writeln(f,6,' ',4);
writeln(f,6,' ',5);
writeln(f,9,' ',7);
writeln(f,'##### ');
writeln(f,'# ###');
writeln(f,'# ? #');
writeln(f,'# ? #');
writeln(f,'# 閛o #');
writeln(f,'###oo #');
writeln(f,' ##?#');
writeln(f,' # #');
writeln(f,' ####');
end;
end;
close(f);
prsc;
end;
procedure pr(x,y,top:integer;a:sz1;b:sz2);
var i,j:integer;
begin
clrscr;
for i:=1 to x do
for j:=1 to y do
begin
textcolor(15);
if dong(i,j,top,b) then textcolor(12);
write(a[i,j]);
if j=y then writeln
end;
end;
end.
扫雷:
program saolei;
uses crt;
label 1,2,3,4;
var a,b:array[1..14,1..14]of char;i,j,t,t2,l:integer;s:string;
procedure ran;
var p:integer;nu:integer;
begin
randomize;
for i:=1 to t do
for j:=1 to t do
begin
b[i,j]:='?;a[i,j]:='?;
end;
for p:=1 to t2 do
begin
repeat
i:=random(t)+1;j:=random(t)+1;
until (a[i,j]='?)and(not((i=1)and(j=1)));
a[i,j]:='';
end;
for i:=1 to t do
for j:=1 to t do
if a[i,j]='? then
begin
nu:=0;
if (i>1)and(j>1) then if a[i-1,j-1]='' then inc(nu);
if (i>1) then if a[i-1,j]='' then inc(nu);
if (i>1)and(j<t) then if a[i-1,j+1]='' then inc(nu);
if (j>1) then if a[i,j-1]='' then inc(nu);
if (j<t) then if a[i,j+1]='' then inc(nu);
if (i<t)and(j>1) then if a[i+1,j-1]='' then inc(nu);
if (i<t) then if a[i+1,j]='' then inc(nu);
if (i<t)and(j<t) then if a[i+1,j+1]='' then inc(nu);
if nu>0 then a[i,j]:=chr(ord('0')+nu);
end;
i:=1;j:=1;
end;
procedure print;
var p,q:integer;
begin
clrscr;
for p:=1 to t do
for q:=1 to t do
begin
if b[p,q]='' then textcolor(12);
if (p=i)and(q=j) then textcolor(8);
write(b[p,q]);
if q=t then writeln;
textcolor(15);
end;
writeln('last:',l);
end;
procedure wrong;
begin
sound(300);
delay(100);
nosound
end;
procedure find(x,y:integer);
begin
b[x,y]:=a[x,y];
if b[x,y]<>'? then exit;
if (x>1)and(b[x-1,y]='?) then find(x-1,y);
if (y>1)and(b[x,y-1]='?) then find(x,y-1);
if (x<t)and(b[x+1,y]='?) then find(x+1,y);
if (y<t)and(b[x,y+1]='?) then find(x,y+1);
if (x>1)and(y>1)and(b[x-1,y-1]='?) then find(x-1,y-1);
if (x>1)and(y<t)and(b[x-1,y+1]='?) then find(x-1,y+1);
if (x<t)and(y>1)and(b[x+1,y-1]='?) then find(x+1,y-1);
if (x<t)and(y<t)and(b[x+1,y+1]='?) then find(x+1,y+1);
end;
procedure print2;
var p,q:integer;
begin
clrscr;
for p:=1 to t do
for q:=1 to t do
begin
if b[p,q]='' then
begin
textcolor(12);
write(b[p,q]);
end
else
if (a[p,q]='') then
begin
textcolor(9);
write(a[p,q]);
end
else write(b[p,q]);
if q=t then writeln;
textcolor(15);
end;
end;
function wan:boolean;
var p,q:integer;
begin
for p:=1 to t do
for q:=1 to t do
if b[p,q]='? then exit(false);
exit(true);
end;
begin
textmode(1);cursoroff;
window(12,8,30,25);
3:clrscr;
writeln('Please choose the level:');
writeln('1--easy 2--normal3--hard');
4:case readkey of
'1':begin t:=11;t2:=20; end;
'2':begin t:=12;t2:=30; end;
'3':begin t:=14;t2:=50; end;
else goto 4;
end;
l:=t2;
ran;
print;
1:case readkey of
#72:if i>1 then dec(i) else wrong;
#80:if i<t then inc(i) else wrong;
#75:if j>1 then dec(j) else wrong;
#77:if j<t then inc(j) else wrong;
#27:
begin
writeln('Do you want to exit(Y/N)?');
repeat
readln(s);
if (s='Y')or(s='y') then halt;
until (s='n')or(s='N');
end;
'j':
begin
b[i,j]:=a[i,j];
if b[i,j]='? then find(i,j);
if b[i,j]='' then begin print2;goto 2;end;
end;
'k':if (l>0)and(b[i,j]='?) then begin b[i,j]:='';dec(l); end;
'l':if b[i,j]='' then begin b[i,j]:='?;inc(l); end;
else goto 1;
end;
print;
if not(wan) then goto 1;
writeln('Congratulations!Play once again(Y/N)?');
repeat
readln(s);
if (s='N')or(s='n') then halt;
if (s='Y')or(s='y') then goto 3;
until s='y';
2:writeln('Game Over!Play once again(Y/N)?');
repeat
readln(s);
if (s='N')or(s='n') then halt;
if (s='Y')or(s='y') then goto 3;
until s='y';
end.
另外我又用c++编了一次贪吃蛇,也一起提供给你。
#include<iostream>
#include<windows.h>
using namespace std;
struct point
{short x,y;
};
char a[22][42];bool f;short i,j,fa;short x[5],y[5];
point s[1001];short h,t,p,q;char st;
short juage()
{if (GetKeyState(VK_UP)<0)
if (fa>=3) {f=true;fa=1;return(0);}
if (GetKeyState(VK_DOWN)<0)
if (fa>=3) {f=true;fa=2;return(0);}
if (GetKeyState(VK_LEFT)<0)
if (fa<=2) {f=true;fa=3;return(0);}
if (GetKeyState(VK_RIGHT)<0)
if (fa<=2) {f=true;fa=4;return(0);}
if (GetKeyState(27)<0)
{cout<<"您真的要退出吗(Y/N) ?";
while (true)
{cin>>st;
if (st=='Y' || st=='y') exit(0); else
if (st=='N' || st=='n') break;
}
}
}
short ran()
{srand(time(0));
short x,y;
while (true)
{
x=rand()%20+1;y=rand()%40+1;
if (a[x][y]==' ') a[x][y]='T';return(0);
}
}
int main()
{x[1]=-1;y[1]=0;
x[2]=1;y[2]=0;
x[3]=0;y[3]=-1;
x[4]=0;y[4]=1;
cout<<" 贪吃蛇\n";
cout<<"本程序由聊城一中09级12班张凯开发\n";
cout<<" 版权所有,翻版必究\n";cout<<endl<<endl;
cout<<"游戏说明:\n";
cout<<" 方向键控制方向,Esc退出\n";
system("pause");
sta:
for (i=1;i<=20;i++)
for (j=1;j<=40;j++)
a[i][j]=' ';
for (i=0;i<=41;i++) {a[0][i]='#';a[21][i]='#';}
for (i=1;i<=20;i++) {a[i][0]='#';a[i][41]='#';}
a[1][1]='0';a[1][2]='0';a[1][3]='8';ran();
h=0;t=3;s[1].x=1;s[1].y=1;s[2].x=1;s[2].y=2;s[3].x=1;s[3].y=3;fa=4;
l1:
system("cls");
for (i=0;i<=21;i++)
{for (j=0;j<=41;j++) cout<<a[i][j];
cout<<endl;
}
f=false;
for (i=1;i<=15;i++)
{Sleep(1);if (!f) juage();}
p=s[t].x+x[fa];q=s[t].y+y[fa];
if (a[p][q]=='#' || (a[p][q]=='0' && !(p==s[h+1].x && q==s[h+1].y))) goto l2;
a[s[t].x][s[t].y]='0';
if (a[p][q]=='T')
{a[p][q]='8';t++;if (t==1001)t=1;s[t].x=p;s[t].y=q;ran();
}
else
{h++;if (h==1001) h=1;a[s[h].x][s[h].y]=' ';a[p][q]='8';
t++;if (t==1001) t=1;s[t].x=p;s[t].y=q;
}
goto l1;
l2:
cout<<"游戏结束!再玩一次吗(Y/N) ?";
while (true)
{cin>>st;
if (st=='Y' || st=='y') goto sta; else
if (st=='N' || st=='n') return(0);
}
}
connect怎么读
connect的读音:英 [k?nekt] 美 [k?nekt];意思:v.(使计算机)连接(到互联网或计算机网络);接通;联结;使…连接;与…有联系(或关联);注意到…有关联;衔接;为(某人)接通电话;(与某人)建立良好关系,沟通
connect的造句如下:
1、How do you influence the way people?connect?the way they think about something and the way they act about something.(你是如何影响人们,让人们将其所想与所为联系起来的呢?)
2、We can?connect?it to the screens we already have.(我们可以将它连接到我们已经有的屏幕上。)
3、Each turbine will be mounted on a tower which will?connect?to the national power supply grid via underwater cables.(每个涡轮机将被安装在一个塔上,塔将通过水下电缆连接到国家电网。)
4、The key to successful small talk is learning how to?connect?with others, not just communicate with them.(与别人成功闲聊的关键是学会如何与他人建立联系,而不仅仅是与他们沟通。)
5、They wanted to?connect?with a community of like-minded people.(他们想和一群志同道合的人建立联系。)
6、In addition to?connecting peers, cell phones?connect?children and parents.(手机不仅将同龄人们连接起来,还将孩子和父母连接起来。)
游戏发展史!
呵呵,看来你很念旧哈
一、红白机时代
据说世界上第一台家用游戏机诞生于上世纪七十年代,只能呈现简单的方块线条,而且还是单色的,那时还不能称这是一个“产业”,改变历史的是日本任天堂(Nintendo),在上世纪八十年代,日本的任天堂开辟了一个崭新的红白机时代,这时,真正意义上的家用游戏机FC开始风靡世界,并逐步产生了一个庞大的家用游戏机产业。
任天堂FC 世嘉MD 任天堂SFC
发布日期 1983年7月15日 1988年10月29日 1990年11月21日
累计销量 6291万台 3075万台 4910万台
其中日本 1935万台 875万台 1717万台
其中美国 4256万台 2200万台 3193万台
CPU 摩托罗拉6502 摩托罗拉M68000 摩托罗拉65836
CPU运行频率 1.79MHz 7.67MHz 3.58MHz
画面解析度: 256X240 320X224 512X448
最大发色数 52色 512色 32768
同屏发色数 16色 64色 256色
最多活动块数量 64个 80个 128个
内存 2KB 64KB 128KB
显存 2KB 64KB 128KB
软件载体 32KB卡带ROM 容量为4MB的卡带 容量6MB的卡带
日本游戏产业的起点
任天堂的FC全称为Family Computer,是日本任天堂公司1983年生产的游戏主机,现在很多游戏的前身就是来自于FC。FC为游戏产业做出了相当大的贡献,甚至可以说FC游戏机是日本游戏产业的起点。FC也曾在80年代风靡中国大陆,那个时候很多人管它叫红白机。FC上出了非常多的经典游戏,例如大名鼎鼎的魂斗罗、勇者斗恶龙、超级马里奥、沙罗曼蛇、塞尔达传说、最终幻想、恶魔城、洛克人等等……
FC上市之后,Sega(世嘉)同期的游戏机SG-1000被彻底压制。不过FC上市不久,由于首批FC的硬件设计存在可能导致死机的严重Bug。为了挽救任天堂的声誉,山内溥毅然决定回收主机,因此而损失了15亿日元。不过这起事件让任天堂树立了卓越的品牌形象,次年FC重新上市后于一年内卖出了165万台。FC在美国的首发更加成功。1985年10月NES在纽约率先上市,首发游戏共15款。到1985年底,NES在纽约卖出了5万台。随后NES开始在美国全国上市,一年内卖出了100万台,让一度崩溃的美国家用机市场开始复苏。
16位主机时代
16位主机时代是以日本世嘉(SEGA)1988年推出的16位游戏机MD(Mega Driver)为起点的。对于世嘉而言,美国市场才是真正的战略重心。1989年9月15日该主机在全美上市,售价为190美元。由于当时美国游戏市场已经基本被任天堂垄断,世嘉决定开拓较高年龄层的新玩家群体,推出了大批面向成年玩家群体的游戏。
之后任天堂的SFC上市,世嘉与任天堂的竞争进入白热化。1992年,世嘉占领了北美55%的市场份额;1993年,世嘉家用机业务达到了空间绝后的顶峰,占据市场份额高达65%。
2D游戏最后的王朝
1987至1988年间,FC丰厚的收入让任天堂对于开发次世代主机毫无兴趣。然后,世嘉MD的市场占有率节节攀升迫使任天堂不得不开始投入16位主机的开发。SFC在设计上最大的特点就是采用了两颗图形协处理器。
SFC最初预定于1989年7月发售,其后数度延期。不过由于任天堂有大批第三方的支持,SFC虽然姗姗来迟,却毅然是日本玩家最关注的主机。在SFC发售之前,任天堂已经接到了150万台的订单。11月21日当天,东京街头的各电器店充满了排队等候SFC的人群,很多家长为了能给孩子买部主机而旷工排队,庞大的人流甚至严重影响了东京的交通。1991年8月13日,任天堂在美国推出了经过重新设计的SNES。可惜SNES的上市时间实在太晚,当时MD已经在美国建立了足够庞大的群众基础。SNES发售第一年就被MD轻易击败。任天堂势力的削弱业为其后PS轻易占领美国市场提供了契机。
然而这时候,任天堂的好日子却快要到头了。
二、索尼的PS帝国
1993年,任天堂和SONY开始合作并研发次时代主机,然而在研制期间,任天堂和SONY在游戏的存储介质上发生了严重冲突,SONY提出应该用CD光盘来做游戏的介质,因为光盘储存容量大,成本低,方便轻巧,而任天堂坚持使用卡带,认为卡带读取速度更快。双放争执很大,最终,任天堂单方面终止了合作。这无疑激怒了SONY,为了不让成型的产品流产,SONY决定独自将计划进行下去,SONY可能也没有想到,这个决定将会改变整个家用游戏机的发展进程。
1994年是游戏机具有历史意义的一年,这一年,SONY发布了32位基于CD的家庭电视游戏系统索尼PS游戏机(PlayStation)。秋叶原等地出现了数百人排队购买的浩大场面,首批出货的10万台在中午前被抢购一空,甚至连索尼社长大贺典雄的孙子都不得不空手而归。由于PS的品牌号召力使得众多知名软件厂商纷纷加盟,PS主机上开始逐渐呈现出百花齐放的局面,直至两大白金级游戏厂商Square与Enix陆续宣布将携巨作《最终幻想VII》与《勇者斗恶龙VII》投奔PS,它们所引起的雪崩效应无异于提早宣判了32位主机时代战争的完结。
世嘉SS 索尼PS 任天堂N64
发布日期 1994年11月22日 1994年12月3日 1996年6月23日
累计销量 926万台 1亿台以上 3293万台
CPU 日立32位SH2 32位RISC 64位MIPS R4300i
CPU运行频率 28.6MHz 33.8688MHz 94 MHZ
画面解析度: 640X480 640X480 640X480
最大发色数 1677万色 1677万色 1670万色
多边形处理能力 30万/秒 36万/秒 15万/秒
内存 32Mbit 28Mbit 4MB RDRAM
软件载体 2倍速CD-Rom CD-Rom 64MB的卡带
世嘉土星SS的溃败
1994年,世嘉也发布了自己的新一代游戏机,世嘉将该主机定名为“土星”(SS,SEGA SATURN)-太阳系的第六行星,代表世嘉的第六部主机。
在主机发售前一个月,首批20万台土星几乎已经被全部预订,首发当日15万台主机迅速售罄。购买土星的玩家多数都是冲着《VR战士》而来。1994年底,土星在日本总共卖出了50万台,销售成绩超过了同一时期的PS。1995年5月7日,索尼与世嘉同时宣布PS和SS销量超过100万台,两大32位主机的竞争进入白热化状态。
然而在美国市场,世嘉却没有继承MD的市场优势。美版土星的价格比PS高100美元,实际性能却不及PS。1995年世嘉与索尼狂打价格战,土星以微弱的优势领先,然后由于土星的造价比PS高,到了1996年之后,世嘉再也无法承受巨大的成本压力,土星在美国和日本全线溃败。
短命的任天堂N64
N64虽然比SS和PS晚上市了一年半,但是在日本由着雄厚根基的任天堂依然得到了玩家的广泛支持,N64在日本的首发规模比PS和SS强大得多,首批50万台主机只用了10天时间就已售罄。1996年9月30日,N64在北美上市后同样大获成功。人们对于在游戏机市场上垄断了十年的任天堂依然信心十足,N64似乎比PS和SS更受欢迎。
然后由于采用卡带为媒体,让所有第三方大失所望。N64的卡带制造成本高达25美元,而CD-ROM只要10美分,因此N64的游戏售价一般比PS高20~25美元。N64时历史上游戏种类最少的主流游戏机,其发售之后的好几个月内一直缺乏软件支持,而PS和SS却有着空前强大的游戏阵容。N64首发的强劲势头很快被《生化危机》等大作牢牢压制。由始至终,N64基本上都是任天堂只身作秀的舞台。
世嘉的末日之作DC
由于主机设计的缺陷,世嘉的SS在与PS的竞争中吃了大亏。在开发下一代主机时,当时世嘉的社长中山隼雄决定外聘IBM的高级工程师在美国成立了一个单独的开发组,而日本方面由佐腾秀树率领团队叶在同时进行主机设计,1997年7月,世嘉高层决定采用日本组的方案,并定名为Dreamcast,是梦(Dream)与传播(Broadcast)的合成词。意思是将梦传播给玩家。
该主机在发售之前,世嘉已经拿到了50万台的订单,然而世嘉的生产合作伙伴NEC却碰上了严重的生产问题。由于图形芯片的生产速度跟不上,DC在日本的首批出货只有15万台。1999年9月9日,DC在美国上市,当天就卖出了22万台。
截至1999年2月,DC在日本的总销量为90万台,未能达到当初预计的100万台。尽管尽管DC的性能远远高于PS,但是在《最终幻想VII》等PS大作的冲击下,缺乏软件支持的DC开始呈现颓势。进入2000年,随着PS2的上市,DC在日本和美国全面溃退。2001年3月,世嘉宣布DC停产,并彻底退出主机市场。
赢家和输家的经验教训
在这一次的游戏机大战中,索尼的PS成为最后的赢家,关于索尼的PS战胜劲敌世嘉的土星,原因很多,一些说法是土星的价格比PS高,而实际性能却不及PS。虽然土星和PS都不凡有大作支持,但是PS的大作相对多一些,最终决定PS命运的可能是那些名垂青史的游戏大作,例如《生化危机》、《寂静岭》、《合金装备》、《最终幻想》等等。
而任天堂的失败在于其落伍的观念,直到1996年,任天堂推出的游戏机N64还是基于游戏卡的主机。任天堂为他的这个愚蠢的决定付出了代价,而等到任天堂清醒过来,并于2001年推出以光盘做为介质的NGC(NINTENDO GAME CUBE)游戏机时,SONY的PS/PS2早已成为游戏机领域的新霸主。
三、索尼的PS2帝国
2000年初,PS2的网上预约正式开始,然而令人始料未及的是,网站竟然在开始的1分钟内接到了10万多份的订单。服务器不堪重负,当场瘫痪。狂热的预约活动一直持续到2月底,共有38万份PS2被订了出去。
2000年3月4日,PS2的发售引起了新一轮的抢购热潮。东京秋叶原电器街甚至出现了5000余人的长队,排在队首的几人则在四天前就已经搭好了帐篷,狂热度令人叹为观止。最后SCEI再次创造了业界的神话:三天内PS2总计销量达到了98万台,成为有史以来销量速度最快的电视游戏主机。
PS2在日本地区的首发出货量为115万台,超过了当年的初代PS主机。但由于市场需求量极为庞大,最终还是出现了供不应求的现象,价格炒作现象也开始在eBay等拍卖网站上蔓延,许多PS2被以数倍于官方零售价的价格拍卖,即便如此,照价买单的玩家依然大有人在。
PS2在2000年首发之初的游戏数量并不算少,但真正有影响力的大作并不多,再加上首发缺货情况严重,软件的销量也因此十分低靡。然而到了转年,随着主机供货的逐步趋于稳定和大作的陆续发售,PS2的销量也开始扶摇直上,直至最后坐上现有主机平台霸主的宝座。
该主机上诞生的著名游戏系列包括:《鬼泣》、《鬼武者》、《真三国无双》、《王国之心》。
世嘉DC 索尼PS2 任天堂NGC 微软Xbox
发布日期 1998年11月27日 2000年3月4日 2001年9月14日 2001年11月15日
累计销量 1045万台 1.11亿台以上 1850万台 2200万台以上
CPU 128位SH4 128位EE IBM PowerPC 750CXe Intel特制Pentium III
CPU运行频率 206MHz 295MHz 485MHz 733MHz
GPU PowerVR2 GS,主频 147.456MHz ATI Flipper 主频162MHz nVidia NV2A
最大发色数 1677万色(16位色) 1677万色(16位色) 1677万色(16位色) 429496万色(32位色)
多边形处理能力 300万/秒 7500万/秒 1200万/秒 1.165亿/秒
内存 16MB 32MB RDRAM 24MB 64MB
显存 8MB 4MB 16MB 显存和内存共用
软件载体 GD-Rom 4倍速DVD-Rom 特制8cm DVD DVD-Rom
任天堂NGC的反击
1999年3月3日,在索尼公开PS2的第二天,任天堂与松下共同召开记者招待会,宣布了新一代游戏机的开发,并宣布其性能规格将会在PS2之上。然后NGC的首发游戏阵容太过薄弱,NGC首批出货共有45万台,而首周之内只卖出了30万台,与其他主机普遍存在的缺货现象形成了鲜明对比。
NGC的仓促上阵不仅没有起到压制PS2的作用,反而让任天堂陷入进退两难的境地。NGC的美版首发又很不幸地遇到了Xbox这个强劲的对手,结果其在北美的首批销量为46.9万台,比Xbox少了将近10万台。游戏阵容薄弱,这是NGC从发售日起就从未跳脱的窘境。在《光环2》发售后,NGC在欧美被Xbox远远抛在了身后。
微软XBOX的挑战
2001年11月15日,微软发布了Xbox游戏主机。虽然Xbox在美国上市时,PS2的全球销量已经突破了2000万台,然而来势汹汹的Xbox依然令人畏惧。微软在纽约和旧金山举办了盛大的Xbox午夜首卖活动,比尔盖茨亲临纽约时代广场,并在零点一分亲自将第一部Xbox递给热心的玩家,并与其一同体验了Xbox的魅力。
不过,相对于Xbox强大的硬件性能而言,299美元这低廉的售价在当时而言简直与恶性倾销无异。以这样的价位销售,每卖一台Xbox,微软将会亏125美元。事实也确实如此,虽然现在全球销量两千万台的Xbox已经稳稳坐上了第二把交椅,但这些年来微软在硬件上10亿美元/年的蒸发式挥霍实在有些惊人。“第一代就像一局游戏,如果你玩得好,那么到最后他会说:‘你可以再玩一遍了。’就是这样!”比尔盖茨说。几十亿美元的亏损仅仅是为了“再玩一遍”!世界首富的耐心令所有人胆寒。
索尼帝国的成功
到这里,索尼的游戏机帝国已经初具雏形,索尼也从游戏的门外汉摇身一变成了电视游戏界最大的赢家。虽然在2001年微软的突然杀出和任天堂的蓄力反击为市场的走向带来了一些变数,但历史和事实证明,PS2是有史以来最成功的游戏主机。
四、次世代游戏机
时光流转,三大厂商的新世代主机已经全面上市,SONY、微软和任天堂都拿出了自己的侃价本事来推广各自的新产品,这一次游戏机大战到底是鹿死谁手呢?
随着微软的XBOX360、索尼PS3和任天堂Wii的发售,次世代游戏机大战日渐白热化。自从索尼PS系列一直领军游戏机市场独占鳌头以来,十年间都没有这样激烈的“战争”了。如今索尼、微软、任天堂三强鼎立,各自的次世代游戏机都有其优势和弱势,目前看来很难预料最后的结果会怎样,而且更大的竞争应该在于索尼和微软之间。任天堂很聪明的选择了另外一种方式。
索尼PS3 任天堂Wii 微软XBOX360
发布日期 2006年11月11日 2006年11月6日 2005年11月22日
累计销量(截至07年4月) 184万台 584万台 1000万台
CPU Cell处理器,每秒2.18T浮点运算 IBM Broadway 90nm IBM PowerPC
CPU频率 3.2Ghz 729MHz 3.2 GHz
GPU 550MHz RSX(NVIDIA) ATI Hollywood 定制的ATI图形处理器
视频 解析度最高1080i;HDMI输出端子(60GB版本),支持HDMI1.3标准 解析度最高853×480;输出端子AV多重 解析度最高1080i;输出端子:标准AV线、HDAV线
内存 512MB(256MB XDR主内存;256MB GDDR3显存) 系统内存650MHz;512MB闪存 512 MB GDDR3 内存,700 MHz DDR 频率
网络功能 网络平台:PlayStation Network Platform 网络平台:Wii Connect24 网络平台:XBOX Live是目前最成熟的游戏网络平台;服务:Live Anywhere
控制器 PS3手柄使用蓝牙技术,搭载动作感应技术,6轴感应系统,无震动功能。无线手柄有效距离30英尺 Wiimote,支持四个控制器,支持蓝牙,信号有效范围达到10米。具备震动功能,内置3轴动作感应器。 无动作感应功能;具备震动功能;最大支持4个无线手柄;无线手柄有效距离10米,电池时间40小时。
媒体和其他功能 USB2.0 × 6;
向下兼容PS、PS2;
Blue-ray 光驱,5.1声道的声卡
MemoryStickDuo记忆卡或SD记忆卡或CF卡;10/100/1000Mbps宽带以太网络接口;可外接2.5吋的硬盘;
可与PSP连动,通过无线LAN或者USB 2.0与PSP连动 USB2.0 × 2;
内存扩展槽:2个SD插槽;
向下兼容GameCube、NES、SNES、N64游戏;
光驱兼容8厘米GameCube光盘、12厘米Wii光盘;Wii主机GameCube存储卡插槽2个 USB2.0 × 3;
2个记忆卡插槽;
硬盘可拆卸并可升级的;
支持更换个性主机面板;
可拆卸并可升级的20GB硬盘;
12 速双层 DVD-ROM;
64 MB 起始的记忆卡容量;
对应视频摄像头
微软的XBOX360先发制人
2005年11月22日,微软推出了XBox360游戏机,这台“潘多拉的魔盒”实在充满了诱惑。次世代战争的帷幕已由Xbox360率先掀起。XBOX360拥有众多欧美玩家用户,在欧美占天时地利。提前发售的一年之中,占有了大量的欧美游戏市场,然而由于文化的差异,XBOX360始终难以打入日本市场。
索尼的PS3出师不利
直到2006年11月11日,索尼才推出了新一代的PS3游戏机,由于PS3使用的CELL处理器、蓝光DVD的成本都非常高,因此就算PS3的价格比Xbox360与Wii加起来还多,外界都一致认为SONY还是赔本在卖,如果按照SONY预期的,PS3要在发售半年内达到全球600万台的数量来预估,PS3在发售第一年就可能让SONY赔本20亿美金。
任天堂的Wii另辟蹊径
任天堂在2006年11月6日发布的Wii游戏机,虽然也加入了次世代游戏机的战役,但是游戏机的性能和XBOX360及PS3相差实在太大,因此不要指望Wii上的游戏画面能达到前两者的水准。
不过,Wii的成本是三个之中最低的,耗电量也非常低,Wii最大优势在于它独特的动作感应控制器,Wii能识别出玩家做出的动作,它将创造一种全新游戏方式。Wii的游戏手柄和其以往的手柄形状完全不同,它采用了一个运动感应控制器,用无线蓝牙与主机直接相连。这款新手柄突出“仿真体验”,通过放置在显示设备中的感应器,感知玩家的手臂运动。
Wii的这种建议操作使得很多非传统玩家(女性和中老年人)都乐意来玩这种游戏,有些人认为Wii可以用来健身。
谁会笑到最后?
目前进行的次世代游戏机大战到底谁会成为最后的赢家呢?其实看一看前几代游戏机大战,我们都会知道决定因素是什么,主机的胜败很大程度上在于第三方软件厂商的支持,而不是游戏机的机能。因此,越多的游戏开发商支持、越多的游戏大作的出现,将决定谁会是最后的赢家。
育碧账号怎么更换关联的Switch 账号?
要连接您的任天堂Switch账户至您的育碧账户,您需要先在主机上创建一个账户并关联至任天堂账户。
一旦任天堂账户设置并完成关联:开启任一育碧游戏。在主菜单选择UbisoftConnect选项。登录您的育碧账户,一旦成功登录关联流程即完成。
介绍
育碧娱乐软件公司(Ubisoft Entertainment)是一家跨国的游戏制作、发行和代销商。作为多媒体工业的佼佼者,其广泛的业务稳步扩展,在和各老牌游戏公司合作的基础上,也在不断推出独特的产品,加强自己在国际市场上的影响力。
其中优秀的作品有《雷曼》(Rayman)、《刺客信条》系列(Assassin's Creed)、《孤岛惊魂》系列(Far Cry)《波斯王子》(Prince of Persia)、《细胞分裂》(Tom Clancy's Splinter Cell)。
如何在gridx的cell中显示控件
在gridx的列定义中,一个decorator方法可以被用来在cell中显示任何HTML/CSS. 但是有时候这稍显不够。当cell中需要放入复杂的控件时,从decorator方法中返回的纯string不再有效。所以gridx/modules/CellWidget模块在这是显示了作用。
为何是CellWidget
CellWidget模块通过grid的body模块中的onAfterRow事件将widget附加到cell节点中。其中的关键是如何才能高效地完成这个工作。
Grid的body随着时间不断刷新,刷新的原因可以是排序,过滤,分页,虚拟滚动,改变值,展开树节点,等等。每次body被刷新,行被重新,并且onAfterRow事件将会被处罚。如果我们总是在onAfterRow事件中创建新的widget,那将会非常浪费。如果你点击header两次为了要是的一列降序排序,许多widget将会被立刻摧毁。所以一些缓存机制必须被建立。第一个方法是为在每个cell中使用一个widget,无论被刷新多少次。这解决了一些刷新问题,但是如果我们有100000行,这仍然不高效。试想如果一个用户慢慢地滚动这个巨大的grid来看每一行,最终将会有多少widget被创建!
所以CellWidget的目的是创建尽可能少的控件。方法是使用set('value',...)方法在row之间重用控件。
如何使用CellWidget
在控件上设置值通常比创建一个新控件快。这是一个好方法,但是需要用户意识到重用这件事情。让我们首先看一下如何使用CellWidget模块:
var grid = new Grid({
cacheClass: 'gridx/core/model/cache/Async',
store: someStore,
structure: [
{ id: 'progress', field: 'progress', name: 'Install Progress',
widgetsInCell: true,
decorator: function(){
return "<div data-dojo-type='dijit.ProgressBar' data-dojo-props='maximum: 1' " +
"class='gridxHasGridCellValue' style='width: 100%;'></div>";
}
}
],
modules: [
"gridx/modules/CellWidget"
]
});
首先,不要忘记载入所有必要的资源: store, cache, 模块和你想要在cell中展示的widget。如果你仍然在创建一个gridx的时候遇到麻烦,请阅读 这篇教程 .
第二,在你想要显示widgets的列中将 widgetsInCell 属性设置为true。CellWidget模块将只会在这些列上有效。
第三,在你的设置 widgetsInCell 的列中提供 decorator 方法。
从decorator方法中返回模板字符串
这里你将看到第一个小技巧: decorator 并没有任何的参数。这并不是当 widgetsInCell 为false的情况。通常当前的cell数据会被传入,和row Id和Index一起。如果某些特定的cell数据被传入,我们将如何重用他们?所以这个template string不能包含任何特定的行信息。在上面的示例中,一个dijit/ProgressBar被放进template中,他的参数可以在data-dojo-props中被加入。注意这个 gridxhasGridCellValue class ,这是关于widgets被重用的第二个技巧。CellWidget模块将会在渲染每一行时自动查找所有含有这个class的widget,并且调用set('value')在widget中设置合适的值。
在setCellValue中设置widgets
在上面的例子中,在调用 widget 的 set('value') 之前不需要转换数据,因此事情显得比较简单。在设置widget值的时候,如果你想做一些有趣的事情,该怎么办? setCellValue 方法在这个时候派上了用处。
{ id: 'progress', field: 'progress', name: 'Install Progress',
widgetsInCell: true,
decorator: function(){
return "<div data-dojo-type='dijit.ProgressBar' data-dojo-props='maximum: 1' " +
"data-dojo-attach-point='progBar' style='width: 100%;'></div>";
},
setCellValue: function(gridData, storeData, cellWidget){
var data = doSomethingIntersting(gridData);
cellWidget.progBar.set('value', data);
// cellWidget.cell give you full access to everything you want.
var rowIndex = cellWidget.cell.row.index();
}
}
setCellValue 方法会在每一行被render的时候被调用。当这个方法被调用时,widget已经被创建并且你能完全控制widget。你可以在widgets上设置值,改变css,或者操纵dom节点并且添加事件。这个方法中的第三个参数'cellWidget'引用了cell widget本身,这是拥有从'decorater'方法中返回的template string的widget,所以你可以访问任何的在控件中定义的“dojo attach point”。第一和第二个参数是当前cell的grid data与store data。他们只有当'formatter'方法被提供时才会有差别。你可以通过cellWidget.cell来获取当前的cell,从中你可以获取任何你需要的东西。
如何处理widget事件
但是请记住widgets("cell widget"作为一个整体)是在不同的行之间被重用。所以如果你在setCellValue方法中绑定了一些事件或者改变了一些dom节点的时候,这些改变将会在被其他行重用时被保留。如果你一直连接事件而不断开事件,将会有巨大的内存泄漏风险。所以合适的方法是在setCellValue中连接并且断开事件。例如
{ id: 'progress', field: 'progress', name: 'Install Progress',
widgetsInCell: true,
decorator: function(){
return "<button data-dojo-type='dijit.form.Button' data-dojo-attach-point='btn'></button>";
},
setCellValue: function(gridData, storeData, cellWidget){
cellWidget.btn.set('label', gridData);
if(cellWidget.btn._cnnt){
// Remove previously connected events to avoid memory leak.
cellWidget.btn._cnnt.remove();
}
cellWidget.btn._cnnt = dojo.connect(cellWidget.btn, 'onClick', function(e){
alert(gridData);
// do your job here......
});
}
}
我承认,这看起来不怎么直观。所以在gridx 1.2中一个新的方法(回调)在会被引入以使得这个工作更加简便:
{ id: 'progress', field: 'progress', name: 'Install Progress',
widgetsInCell: true,
decorator: function(){
return "<button data-dojo-type='dijit.form.Button' data-dojo-attach-point='btn'></button>";
},
setCellValue: function(gridData, storeData, cellWidget){
cellWidget.btn.set('label', gridData);
},
getCellWidgetConnects: function(cellWidget, cell){
// return an array of connection arguments
return [
[cellWidget.btn, 'onClick', function(e){
alert(cell.data());
// do your job here.....
}]
];
}
}
有了这个getCellWidgetConnects,gridx可以为你管理事件链接(句柄)。连接和断开都会被自动执行。
其他高级的回调函数
初次之外,gridx 1.2添加了另外2个方法来为你的工作提供更加有意义的命名:
{ id: 'progress', field: 'progress', name: 'Install Progress',
widgetsInCell: true,
decorator: function(){
return "<button data-dojo-type='dijit.form.Button' data-dojo-attach-point='btn'></button>";
},
setCellValue: function(gridData, storeData, cellWidget){
cellWidget.btn.set('label', gridData);
},
getCellWidgetConnects: function(cellWidget, cell){
// return an array of connection arguments
return [
[cellWidget.btn, 'onClick', function(e){
alert(cell.data());
// do your job here.....
}]
];
},
initializeCellWidget: function(cellWidget, cell){
// create extra widgets or manipulate dom nodes that depends on current cell context.
cellWidget.anotherButton = new Button({...});
cellWidget.domNode.append(cellWidget.anotherButton.domNode);
},
uninitializeCellWidget: function(cellWidget, cell){
// don't forget to undo the changes you made in initializeCellWidget, so that it can be reused among different rows.
cellWidget.anotherButton.destroy();
}
}
如你所见,事实上你可以在setCellValue方法中做这些事情。这个新方法只是提供了更多的语义,使你的代码更加易于阅读并且省去了你添加额外的注释的功夫。
创建控件的编程方式
如果你 曾经用过DataGrid , 你可能会对于在 f ormatter 方法中返回widget的方式感到熟悉,并且对于写 t emplate string的方式感到 变扭。因此你可以使用 onCellWidgetCreated 事件,甚至 省略“ decorator ” 方法(gridx 1.2之后) :
{ id: 'progress', field: 'progress', name: 'Install Progress',
widgetsInCell: true,
onCellWidgetCreated: function(cellWidget, column){
var btn = new Button({...});
btn.placeAt(cellWidget.domNode);
}
}
onCellWidgetCreated 只当一个新的cell widget被创建 时 被调用。它不会在widget 重用时 被调用。跟decorator 方法 相同,不应该在此处使用特定行的信息。
以下是如何在gridx的cell 中显示widget的结论:
为grid 引入 gridx/moduels/CellWidge t模块
在列设置中将 widgetsIn Cell 设置为true
在 decorator 方法 中返回模板string ,或者在 onCellWidgetCreated 事件处理 函数中创建 控件,或者两者皆执行
在 setCell Value 方法中设置widget的值(可选)
在 getCellWidgetConnects 中提供 事件 连接(可选, gridx 1.2 之后 )
在 initialCellWidget 和 Uninit ialCellWidget 中做额外的操作(可选,gridx 1.2之后)
好了,今天关于“cell connect游戏攻略”的话题就讲到这里了。希望大家能够对“cell connect游戏攻略”有更深入的认识,并从我的回答中得到一些启示。如果您有任何问题或需要进一步的信息,请随时告诉我。