| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1282 人关注过本帖
标题:求大神讲解此代码 快要考试答辩了 是关于俄罗斯方块的
取消只看楼主 加入收藏
xc1091249165
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-12-23
结帖率:0
收藏
 问题点数:0 回复次数:0 
求大神讲解此代码 快要考试答辩了 是关于俄罗斯方块的
#include<stdio.h>  
#include<stdlib.h>  
#include<windows.h>  
#include<time.h>  
#include<conio.h>  
  
#define MOD 28  
#define SIZE_N 19  
#define SIZE_M 12  
  
int cur_x,cur_y,score,mark,next,map[SIZE_N][SIZE_M],Gamespeed=300;  
char key1,key;  
  
  
int shape[28][6]={//这是个比较偷懒的方法,就是7种方块,加上旋转总共28种  
{0,-1,0,-2,1,0}, {0,1,1,0,2,0}, {-1,0,0,1,0,2}, {0,-1,-1,0,-2,0},  
{0,-1,0,1,-1,0}, {0,1,1,0,-1,0}, {1,0,0,-1,0,1}, {1,0,-1,0,0,-1},  
{-1,1,0,1,1,0}, {0,-1,1,0,1,1}, {-1,0,0,-1,1,-1}, {-1,-1,-1,0,0,1},  
{-1,0,0,1,1,1}, {0,1,1,-1,1,0}, {-1,0,0,1,1,1}, {0,1,1,-1,1,0},  
{-1,0,0,-1,0,-2}, {-1,0,-2,0,0,1}, {0,1,0,2,1,0}, {0,-1,1,0,2,0},  
{0,1,1,0,1,1}, {0,-1,1,0,1,-1}, {-1,0,0,-1,-1,-1}, {-1,0,-1,1,0,1},  
{0,1,0,2,0,3}, {1,0,2,0,3,0}, {0,-1,0,-2,0,-3}, {-1,0,-2,0,-3,0}  
};  
  
  
void gotoxy(int x,int y){//gotoxy在TC中是在system.h库文件里的一个函  
COORD c;  
c.X=x-1; c.Y=y-1;  
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);  
}  
void Gameover(){//游戏结束的判断  
int i,j,flag=0;  
for(j=1;j<SIZE_M-1;j++){  
if(map[1][j]!=0){  
flag=1;break;  
}  
}  
if(flag==1){  
for(i=1;i<SIZE_N-1;i++){  
gotoxy(2,i+1);  
for(j=1;j<SIZE_M-1;j++){  
printf("□");  
}puts("");  
}  
gotoxy(7,9);  
printf("GAME OVER!");  
gotoxy(1,SIZE_N+1);  
exit(0);  
}  
}  
void ShowMap(int id){  
int i,j;  
gotoxy(1,1);  
if(id!=-1){  
for(i=0;i<SIZE_N;i++){  
for(j=0;j<SIZE_M;j++){  
if(i==0&&j==0 || i==0&&j==SIZE_M-1 || j==0&&i==SIZE_N-1 || j==SIZE_M-1&&i==SIZE_N-1)printf(" ");  
else if(i==0 || i==SIZE_N-1)printf("--");  
else if(j==0 || j==SIZE_M-1)printf("|");  
else if(map[i][j]==2) printf("■");  
else if(i==cur_x+shape[id][0] && j==cur_y+shape[id][1] ||  
i==cur_x+shape[id][2] && j==cur_y+shape[id][3] ||  
i==cur_x+shape[id][4] && j==cur_y+shape[id][5] ||  
i==cur_x && j==cur_y)  
printf("■");  
else if(map[i][j]==0) printf("  ");  
}  
if(i==1)printf("   next:");  
if(i==11)printf("   score :   %d",score);  
if(i==14)printf("   speed :   %d",score/100+1);  
puts("");  
}  
}  
else {  
mark=1;  
for(i=0;i<SIZE_N;i++){  
for(j=0;j<SIZE_M;j++){  
if(i==0&&j==0 || i==0&&j==SIZE_M-1 || j==0&&i==SIZE_N-1 || j==SIZE_M-1&&i==SIZE_N-1)printf(" ");  
else if(i==0 || i==SIZE_N-1)printf("--");  
else if(j==0 || j==SIZE_M-1)printf("|");  
else if(map[i][j]==2) printf("■");  
else if(map[i][j]==0) printf("  ");  
}  
if(i==1)printf("   next:");  
if(i==11)printf("   score :   %d",score);  
if(i==14)printf("   speed :   %d",score/100+1);  
puts("");  
}  
}  
/*对于 next 方块的处理,先擦除再画图*/  
for(i=2;i<=10;i++){  
for(j=23;j<=34;j++){  
gotoxy(j+1,i+1);printf("  ");  
}  
}  
gotoxy(29,6); printf("■");  
for(i=0;i<6;i=i+2){  
gotoxy(29+2*shape[next][i+1],6+shape[next][i]); printf("■");  
}  
Sleep(Gamespeed);  
}  
  
  
void init(int id){//初始化函数,cur_x,cur_y是全局变量,标记了移动方块的位置  
memset(map,0,sizeof(map));  
for(int i=0;i<SIZE_N;i++){  
for(int j=0;j<SIZE_M;j++)  
if(i==SIZE_N-1 || j==0 || j==SIZE_M-1)  
map[i][j]=-1;  
}  
cur_x=0; cur_y=6;  
ShowMap(id);  
}  
  
  
int judge_in(int x,int y,int id){//判断是否出界,或者说是否合法  
if(map[x][y]!=0)return 0;  
for(int i=0;i<6;i=i+2){  
if(map[ x+shape[id][i] ][ y+shape[id][i+1] ]!=0)return 0;  
}return 1;  
}  
  
  
void fun_score(){//得分,擦除行的闪烁,还有图形的向下平移  
for(int i=1;i<SIZE_N-1;i++){  
int flag=0;  
for(int j=1;j<SIZE_M-1;j++){  
if(map[i][j]!=2){ flag=1;break; }  
}  
if(flag==0){  
int k=3;  
while(k--){  
gotoxy(2,i+1);  
for(int ii=1;ii<SIZE_M-1;ii++){  
if(map[i][ii]==2){  
if(k%2==1)printf("  ");  
else printf("■");  
}  
}Sleep(100);  
}  
for(int ii=i;ii>1;ii--){  
for(int jj=1;jj<SIZE_M-1;jj++)map[ii][jj]=map[ii-1][jj];  
}  
ShowMap(-1);  
score+=10;  
if(score%100==0 && score!=0)Gamespeed-=50;  
}  
}  
}  
  
  
int main(){  
int i,id,set=1;  
  
srand(time(NULL));  
id=rand()%MOD; id=(id+MOD)%MOD;  
next=rand()%MOD; next=(next+MOD)%MOD;  
  
  
init(id);  
  
while(1){  
Here:mark=0;  
if(set==0){  
id=next;  
next=rand()%MOD; next=(next+MOD)%MOD;  
cur_x=0;cur_y=6;  
set=1;  
}  
  
while(!kbhit()){  
Gameover();  
if(judge_in(cur_x+1,cur_y,id)==1) cur_x++;  
else {  
map[cur_x][cur_y]=2;  
for(i=0;i<6;i=i+2)  
map[ cur_x+shape[id][i] ][ cur_y+shape[id][i+1] ]=2;  
set=0;  
}  
fun_score();  
if(mark!=1)ShowMap(id);  
goto Here;  
}//end of while(!kbhit())  
  
  
key=getch();  
if(key1==-32 && key==72){  
int tmp=id;  
id++;  
if( id%4==0 && id!=0 )id=id-4;  
if(judge_in(cur_x,cur_y,id)!=1)id=tmp;  
}  
else if(key1==-32 && key==80 && judge_in(cur_x+1,cur_y,id)==1)cur_x++;  
else if(key1==-32 && key==75 && judge_in(cur_x,cur_y-1,id)==1)cur_y--;  
else if(key1==-32 && key==77 && judge_in(cur_x,cur_y+1,id)==1)cur_y++;  
else if(key==27)return 0;  
key1=key;  
}return 0;  
}  

搜索更多相关主题的帖子: 俄罗斯方块 include 
2016-12-26 18:47
快速回复:求大神讲解此代码 快要考试答辩了 是关于俄罗斯方块的
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032026 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved