VC+6.0 C 언어 러시아 블록 상세 튜 토리 얼 실현
1.먼저 graphics.h 의 헤더 파일 을 다운로드 하여 그림 을 그 려 야 합 니 다.
2.창 초기 화:initgraph(x,y);이것 은 먼저 창 을 만 드 는 함수 입 니 다.왼쪽 상단(0,0),오른쪽으로 x 축,아래로 y 축 입 니 다.그 중에서 x 는 긴 x 단 위 를 표시 하고 y 는 너비 y 단 위 를 표시 합 니 다.
3.그림 창 닫 기:closegraph();끝 날 때 닫 는 데 쓰 는 거 야.
4.임의의 키 를 눌 러 계속:getch();이것 은 getchar()와 함께 합 니 다.거의 다 르 지 않 습 니 다.실행 이 끝나 면 닫 히 는 것 을 방지 하기 위해 서 그의 머리 파일 은 conio.h 입 니 다.
5.선 그리 기:line(x1,y1,x2,y2);창 에(x1,y1)과(x2,y2)두 개의 점 으로 선 을 그립 니 다.
6.직사각형 그리 기:rectangle(x1,y1,x2,y2);(x1,y1)과(x2,y2)을 대각 으로 직사각형 을 그립 니 다.
7.원 그리 기:원(x,y,r);(x,y)를 원점 으로 하고 r 를 반경 으로 원 을 그린다.
8.색상:setcolor(x);색상 을 설정 하 는 데 사용 되 는 것 입 니 다.그 중에서 x 는 당신 이 설정 하고 자 하 는 색상 입 니 다.이 16 가 지 를 채 울 수 있 습 니 다.검은색 BLACK,파란색 BLUE,녹색 GREEN,파란색 CYAN,빨간색 RED,보라색 MAGENTA,갈색 브라운,옅 은 회색 LIGHT GRAY,짙 은 회색 DARKGRAY,밝 은 파란색 LIGHTBLUE,밝 은 녹색 LIGHT GREEN,밝 은 파란색 LIGHT YAN,밝 은 빨간색 LIGHT TRED,밝 은 보라색 LIGHT MAGENTA,노란색 YELLOW,흰색 WHITE;물론 빛 의 삼원 색 에 따라 자신 이 좋아 하 는 색 을 조절 할 수 있 습 니 다.방법 은 setcolor(RGB(x,y,z)입 니 다.그 중에서 RGB 는 각각 빨간색 과 파란색 을 대표 하고 해당 하 는 x,y,z 는 당신 이 선택 한 이 색깔 의 얼마 이 며 범 위 는[0,255]입 니 다.
위의 이것들 에 근거 하여 많은 도형 을 그 릴 수 있다.예 를 들 면:
# include <graphics.h>
# include <conio.h>
void main()
{
initgraph(640,480);
setcolor(BROWN);
line(200,200,300,130);
line(400,200,300,130);
rectangle(200,200,400,380);
setcolor(RGB(100,150,200));
circle(255,260,20);
circle(345,260,20);
rectangle(280,300,310,360);
getch();
closegraph();
}
그리고 이것 은 원 을 그리고 원심 은(320,240),반경 r=200,각도 의 공식 에 따라 원 을 그립 니 다.
# include <graphics.h>
# include <conio.h>
# include <math.h>
# define PI 3.1415926
void main()
{
initgraph(640, 480);
int x,y,r=200,c;
double a;
for(a=0; a<PI*2; a+=0.0001)
{
x=(int)(r*cos(a)+320+0.5);
y=(int)(r*sin(a)+240+0.5);
c=(int)(a*255/(2*PI));
setcolor(RGB(c,200-c/2,100+c/2));
line(320,240,x,y);
}
getch();
closegraph();
}
9.정지:Sleep(x);정지 x/1000 초.Sleep()가 생 겼 습 니 다.함수,선 을 움 직 일 수 있 습 니 다.원 리 는 먼저 선 을 그 은 다음 에 검은색 선 을 그 어 원래 의 선 을 덮 은 다음 에 선 을 그 리 는 것 입 니 다.이렇게 끊임없이 선 을 그 으 면 됩 니 다.
# include <graphics.h>
# include <conio.h>
void main()
{
int i,y;
initgraph(640,480);
for(y=0;y<480-2;y++)
{
setcolor(RGB(y,125,y/2%256));
line(0,y,639,y);
line(0,y+2,639,y+2);
Sleep(10);
setcolor(BLACK);
line(0,y,639,y);
}
getch();
closegraph();
}
10.난수 발생 기:srand();사용 방법:srand(time(NULL);사용 할 때 헤더 파일 time.h 가 있어 야 합 니 다.11.랜 덤 함수:rand();무 작위 로 숫자 를 만 듭 니 다.헤더 파일 은 stdlib.h 입 니 다.예 를 들 어:
# include <stdio.h>
# include <time.h>
# include <graphics.h>
void main()
{
int t=10;
while(t--)
{
srand(time(NULL));
printf("%d
",rand());
Sleep(1000);
}
}
12.키보드 의 입력 여 부 를 판단 합 니 다:kbhit();있 으 면 1 로 돌아 가 고,그렇지 않 으 면 0 으로 돌아간다.13.방향 키:건장 한 ASCII 값 을 우 리 는 모 릅 니 다.일반적인 getchar();입력 할 수도 없 지만 getch();실행 프로그램 을 통 해 방향 이 비교적 특수 하 다 는 것 을 알 수 있다.그것 이 바로 위 224+72,아래 224+80,왼쪽 224+75,오른쪽 224+77 이다.즉,그들 은 두 글자 로 구성 되 어 있 기 때문에 상하 좌우 로 판단 할 때 if(kbhit()를 먼저 판단 한 다음 에 if(getch()==224)를 판단 한다.그렇다면 if(getch()==72)를 판단 한다.그래 야 상하 좌우 가 같다.
# include <stdio.h>
# include <graphics.h>
# include <conio.h>
void main()
{
int key;
while(1)
{
if(kbhit())
{
key=getch();
if(key==224)
key=getch();
printf("%d",key);
}
else
printf("*");
Sleep(500);
}
}
14.출력:outtextxy(x,y,s);좌표 가(x,y)인 곳 에 문자열 s 를 출력 합 니 다.15.숫자 변환 문자열:sprintf(s,"%d",a);숫자 a 를 문자열 s 로 바 꾸 고 헤더 파일 은 stdio.h 입 니 다.
16.글꼴 설정:setfont(x,y,"글꼴");그 중에서 x 는 출력 할 글자 의 크기 를 나타 낸다.y 는 모양 을 바 꾸 는데 보통 0 으로 설정 하고'글꼴'은 출력 하고 자 하 는 글꼴 이다.예 를 들 어 setfont(40,0,'해서 체')이다.
# include <graphics.h>
# include <conio.h>
# include <stdio.h>
void main()
{
char s[10];
initgraph(640,480);
setfont(42,0," ");
outtextxy(200,200," ");
sprintf(s,"%d",2015);
outtextxy(250,250,s);
getch();
closegraph();
}
위 에서 배 웠 다 면 러시아 블록 을 만 들 수 있 을 뻔 했 습 니 다.다음은 제 가 쓴 코드 를 공유 하 겠 습 니 다.
# include <stdio.h>
# include <time.h>
# include <conio.h>
# include <graphics.h>
int a,visit[30][15],Color[30][15],minX=30,minY=30,maxX=310,maxY=610,speed=500,score=0,rank=0;
int color[]={GREEN,CYAN,MAGENTA,BROWN,LIGHTGRAY,LIGHTBLUE,LIGHTGREEN,LIGHTRED,YELLOW};
int block[36][5][5]=
{
{0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0},
{0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0},
{0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0},
{0,1,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,1,1,0,0},
{0,0,0,0,0,1,0,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}
};
void Interface();//
void nextblock();//
void newblock();//
void move(int x,int y,int A);//
int couldmove(int x0,int y0,int A,char dir,int next);//
int couldrotate(int x0,int y0,int A,int next);//
void mark(int x0,int y0,int A,int next);//
void full();//
void down(int x);//
int gameover();//
int main()
{
int i,j;
Interface();
nextblock();
Sleep(500);
memset(visit,0,sizeof(visit));
while(1)
{
newblock();
full();
if(gameover())
break;
}
getch();
closegraph();
return 0;
}
void Interface()
{
int i,j;
char str[10];
initgraph(550, 660);
HWND hwnd = GetHWnd();
SetWindowText(hwnd, "NEW : ");
Sleep(2000);
setfont(40,0," ");
setcolor(RED);
outtextxy(145,200,"NEW");
setfont(40,0," ");
for(i=0;i<=255;i++)
for(j=0;j<=255;j++)
{
setcolor(RGB((i+j+128)%255,i,j));
outtextxy(205,200," !");
}
Sleep(2000);
setcolor(YELLOW);
setfont(22,0," ");
outtextxy(310,300,"←_←");
setfont(22,0," ");
outtextxy(180,300," ");
setcolor(LIGHTMAGENTA);
Sleep(2500);
outtextxy(175,300," !");
getch();
cleardevice();
setcolor(WHITE);
rectangle(29,29,334,633);
rectangle(28,28,335,634);
rectangle(370,50,515,195);
setfont(24,0, " ");
setcolor(LIGHTGRAY);
outtextxy(405,215," :");
setcolor(RED);
outtextxy(405,280," :");
sprintf(str,"%d",score);
outtextxy(415,310,str);
outtextxy(405,375," :");
sprintf(str,"%d",rank);
outtextxy(425,405,str);
setfont(22,0, " ");
setcolor(LIGHTBLUE);
outtextxy(390,475," :");
outtextxy(390,500,"↑: ");
outtextxy(390,525,"↓: ");
outtextxy(390,550,"←: ");
outtextxy(390,575,"→: ");
outtextxy(390,600," : ");
}
void nextblock()
{
int i,j,x=391,y=71;
setfont(23,0," ");
setcolor(BLACK);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
outtextxy(x+20*j,y+20*i,"■");
srand(time(NULL));
a=rand()%9;
setcolor(color[a]);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*a][i][j]==1)
outtextxy(x+20*j,y+20*i,"■");
}
void newblock()
{
int i,j,x=130,y=30,A=a;
if(A==0||A==1||A==6)
y-=60;
else if(A==2||A==3||A==5||A==7||A==8)
y-=40;
else
y-=80;
setfont(23,0," ");
setcolor(color[A]);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A][i][j]==1&&y+20*i>=30)
outtextxy(x+20*j,y+20*i,"■");
Sleep(100);
nextblock();
move(x,y,A);
}
void move(int x,int y,int A)
{
int i,j,f,k=0,next=0,Speed=speed,key,nex;
while(1)
{
f=couldmove(x,y+k,A,'x',next);
if(f==0)
{
mark(x,y+k,A,next);
break;
}
if(kbhit())
{
key=getch();
if(key==32)
getch();
}
setcolor(BLACK);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1&&y+20*i+k>=30)
outtextxy(x+20*j,y+20*i+k,"■");
if(kbhit())
{
key=getch();
if(key==72)
{
nex=(next+1)%4;
if(couldrotate(x,y+k,A,nex))
next=nex;
}
else if(key==80)
Speed=50;
else if(key==75&&couldmove(x,y+k+20,A,'z',next))
x-=20;
else if(key==77&&couldmove(x,y+k+20,A,'y',next))
x+=20;
}
setcolor(color[A]);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1&&y+20*i+k+20>=30)
outtextxy(x+20*j,y+20*i+k+20,"■");
Sleep(Speed);
k+=20;
}
}
int couldmove(int x0,int y0,int A,char dir,int next)
{
int i,j,x,y,f=1;
x=(y0-minY)/20;
y=(x0-minX)/20;
if(dir=='x')
{
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1&&(x+i+1==30||(x+i+1>=0&&x+i+1<30&&y+j>=0&&y+j<15&&visit[x+i+1][y+j]==1)))
f=0;
}
else if(dir=='z')
{
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1&&(y+j==0||(x+i>=0&&x+i<30&&y+j-1>=0&&y+j-1<15&&visit[x+i][y+j-1]==1)))
f=0;
}
else if(dir=='y')
{
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1&&(y+j+1==15||(x+i>=0&&x+i<30&&y+j+1>=0&&y+j+1<15&&visit[x+i][y+j+1]==1)))
f=0;
}
return f;
}
int couldrotate(int x0,int y0,int A,int next)
{
int i,j,x,y,f=1;
x=(y0-minY)/20;
y=(x0-minX)/20;
if(!couldmove(x0,y0,A,'x',next))
f=0;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1&&(y+j==-1||y+j==15||(x+i>=0&&x+i<30&&y+j>=0&&y+j<15&&visit[x+i][y+j]==1)))
f=0;
return f;
}
void mark(int x0,int y0,int A,int next)
{
int i,j,x,y;
x=(y0-minY)/20;
y=(x0-minX)/20;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(block[4*A+next][i][j]==1)
{
visit[x+i][y+j]=1;
Color[x+i][y+j]=color[A];
}
}
void full()
{
int i,j,k=0;
char str[10];
for(i=29;i>=0;i--)
{
for(j=0;j<15;j++)
if(visit[i][j]==0)
break;
if(j==15)
{
k++;
down(i);
i++;
}
}
setcolor(RED);
score+=10*k;
sprintf(str,"%d",score);
outtextxy(415,310,str);
rank=(score/50);
sprintf(str,"%d",rank);
outtextxy(425,405,str);
speed=500-100*rank;
if(speed==0)
speed=100;
if(score>=300)
speed=75;
}
void down(int x)
{
int i,j;
for(i=x;i>0;i--)
for(j=0;j<15;j++)
if(visit[i-1][j]==1)
{
visit[i][j]=visit[i-1][j];
Color[i][j]=Color[i-1][j];
setcolor(Color[i-1][j]);
outtextxy(minX+20*j,minY+20*i,"■");
}
else
{
visit[i][j]=visit[i-1][j];
setcolor(BLACK);
outtextxy(minX+20*j,minY+20*i,"■");
}
setcolor(BLACK);
for(j=0;j<15;j++)
{
visit[0][j]=0;
outtextxy(minX+20*j,minY,"■");
}
}
int gameover()
{
int i,j;
for(i=0;i<15;i++)
if(visit[0][i]==1)
{
for(i=0;i<=7;i++)
{
setcolor(RGB(35*i,255-35*i,255));
for(j=i;j<30-i;j++,Sleep(20))
outtextxy(30+20*i,30+20*j,"■");
for(j=i;j<15-i;j++,Sleep(20))
outtextxy(30+20*j,30+20*(29-i),"■");
for(j=30-1-i;j>=i;j--,Sleep(20))
outtextxy(30+20*(14-i),30+20*j,"■");
for(j=15-1-i;j>=i;j--,Sleep(20))
outtextxy(30+20*j,30+20*i,"■");
}
setcolor(WHITE);
setfont(45,0," ");
outtextxy(75,300,"GAME OVER!");
Sleep(5000);
return 1;
}
return 0;
}
제 가 설정 한 줄 은 15 개의 작은 칸 을 넣 을 수 있 고 모두 30 줄 을 넣 을 수 있 습 니 다.2 차원 배열 visit[30][15]는 특정한 위치 에 사각형 이 있 는 지 판단 할 수 있 습 니 다.예 를 들 어 visit[29][5]=1 은 30 번 째 줄 의 6 번 째 사각형 의 위치 에 사각형 이 있다 는 것 을 나타 내 고 0 은 사각형 이 없다 는 것 을 나타 내 며 Color[30][15]는 특정한 위치 에 있 는 사각형 의 색 을 기록 하 는 데 사 용 됩 니 다.minX=30,minY=30 은 왼쪽 상단 의 사각형,즉 첫 번 째 줄 의 첫 번 째 열 에 대응 하 는 사각형 이 인터페이스의 좌표,maxX,maxY 와 같다 는 것 을 나타 낸다.speed 는 사각형 의 낙하 속 도 를 나타 낸다.처음에 500 으로 초기 화 되 었 고 0.5s 가 한 줄 로 떨 어 지지 않 았 다.score 는 점 수 를 기록 하고 한 줄 에 10 점 을 더 했다.rank 은 등급 을 표시 했다.50 점 당 등급+1 이 고 속도 가 100 으로 떨 어 졌 다.속도 가 100 으로 떨 어 졌 을 때 변 하지 않 는 다.점수 가 300 속 도 를 초과 해 야 75 로 줄 어 들 고 앞으로 더 이상 줄 어 들 지 않 을 것 이다.저 는 9 가지 사각형 을 디자인 했 습 니 다.각 사각형 은 4 가지 형태 가 있 고 시계 방향 으로 90°회전 할 때마다 하나의 형태 가 있 기 때문에 모두 36 개의 사각형 입 니 다.각 사각형 은 5*5 의 2 차원 배열 로 36 가지 가 36 개의 2 차원 배열 이 라 고 표시 하기 때문에 Block[36][5][5]로 블록[k][5][5],(k<36&k%4==0)은 각 사각형 의 초기 형 태 를 나타 낸다.k+1,+2,+3 은 각각 k 가지 사각형 이 90°,180°,270°이후 의 형 태 를 선택한다.예 를 들 어 Block[1][5][5]는 첫 번 째 사각형 이 90°회전 하 는 사각형 을 보존 하고 있 는데 그 중에서 Block[1][i][j]=1 은 이 사각형 의 i+1 줄 을 나타 내 고 j+1 열 은 작은 사각형 이 있 으 며=0 은 없 기 때문에 나의 Block[36][5]는 36 줄 이 고 한 줄 은 25 개의 수열 로 사각형 을 나타 낸다.1 차원 배열 color[]는 9 가지 사각형 의 색 을 차례대로 나타 낸다.
효과 도 첨부:
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Visual Studio 2019의 C++/CLI에서 출력되는 바이너리 경로 변경Visual C++ 프로젝트에서는 디폴트로 솔루션과 같은 계층에 플랫폼의 폴더( Win32 라든지 x64 라든지)나 구성 폴더( Debug 라든지 Release 라든지)가 만들어지지만, 여러가지 구성을 바꾸고 있으면...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.