C语言小游戏 - 俄罗斯方块
2015-09-17 16:18
621 查看
(转载,注释本人加的,可能有些地方理解错误)代码如下:
后记:自己加的注释,可能会有些地方理解错误。另外对里面的算法不太了解。
#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; int score,mark,next,map[SIZE_N][SIZE_M],Gamespeed=300; int shape[28][6]={ {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) { 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("--"); //y轴,打印上下边界线 else if(j==0 || j==SIZE_M-1)printf("|"); //x轴,打印左右边界线 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(" "); //打印SIZE_N(y轴),SIZE_M(x轴)界线内的其它空白区域 } if(i==1)printf(" 下一个 :"); if(i==11)printf(" 等分 : %d",score); if(i==14)printf(" 速度 : %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(""); } } //显示右边下一个的方块 gotoxy(30,6); printf(" "); for(i=0;i<6;i=i+2){ gotoxy(30+2*shape[id][i+1],6+shape[id][i]); printf(" "); } gotoxy(30,6); printf("■"); for(i=0;i<6;i=i+2){ gotoxy(30+2*shape[next][i+1],6+shape[next][i]); printf("■"); } Sleep(Gamespeed); //每次休眠Gamespeed毫秒 } void init(int id){ int i,j; memset(map,0,sizeof(map)); //初使化数组map for(i=0;i<SIZE_N;i++){ for(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=5; //第一块方块的初始位置 ShowMap(id); } int judge_in(int x,int y,int id){ int i; if(map[x][y]!=0)return 0; for(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(){ int i,j,ii,jj; for (i=1;i<SIZE_N-1;i++) { int flag=0; for (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(ii=1;ii<SIZE_M-1;ii++){ if(map[i][ii]==2){ if(k%2==1)printf(" "); else printf("■"); } }Sleep(100); } for(ii=i;ii>1;ii--){ for(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; int key; srand(time(NULL)); //先设置种子 id = rand() % MOD; //然后产生随机数 对28取模 //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=5; set=1; } while (!kbhit()) { Gameover(); //判断是否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; fun_score(); set=0; } if(mark!=1) { ShowMap(id); } goto Here; } key = getch(); if (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(key==80 && judge_in(cur_x+1,cur_y,id)==1){cur_x++;} else if(key==75 && judge_in(cur_x,cur_y-1,id)==1){cur_y--;} else if(key==77 && judge_in(cur_x,cur_y+1,id)==1){cur_y++;} else if(key==27){gotoxy(1,SIZE_N+1);exit(0);} } getch(); return 0; }
后记:自己加的注释,可能会有些地方理解错误。另外对里面的算法不太了解。
相关文章推荐
- 浅谈C++中对象的复制与对象之间的相互赋值
- C语言二维数组剖析【元素及元素地址的指针操作】
- c++11基础学习(2)std::bind与std::function特性
- C++ 函数指针
- Python C++ interoperability
- c语言小工具
- Effective C++ ——初始化
- C++ Primer Plus(第6版) 第2章编程练习
- WinRT C++ byte* 转为 Ibuffer^(笔记)
- C++的异常处理
- C++中对象的常引用、动态建立和释放相关知识讲解
- 深入理解C++
- STL之vector的实现
- Effective C++ 改善程序与设计的55个具体做法 二周目笔记03
- 解析C++中指向对象的指针使用
- STL中的uninitialize系列
- Eclipse cdt c++11 blade 设置
- OSX Missing C++ header <__debug>修复
- C/C++结构体和类中的内存对齐
- C++编译程序时的内存分配