// handle keyboard void HandleKeyPress(unsigned char key, int x, int y){ switch(key){ case 27: exit(1); } // Control keys if(loseFlag==FALSE){ switch(key){ case 's': tetrisFigure.Translate(0,-1); glutPostRedisplay(); break; case 'a': tetrisFigure.Translate(-1,0); glutPostRedisplay(); break; case 'd': tetrisFigure.Translate(1,0); glutPostRedisplay(); break; case 'w': tetrisFigure.Rotate(LEFT); glutPostRedisplay(); break; case 'e': tetrisFigure.Translate(0,1); glutPostRedisplay(); break; default: break; } } else{ switch(key){ case 'n': tetrisGame.New(); loseFlag=FALSE; glutPostRedisplay(); break; default: break; } } }
// update function void Update(int value){ if(loseFlag==FALSE){ newFigureFlag=tetrisFigure.Translate(0, -1); if(!newFigureFlag){ tetrisGame.Update(tetrisFigure); tetrisFigure.New(rand()%NUM_FIGURE); } } glutPostRedisplay(); // Refresh Display glutTimerFunc(100, Update, 0); }
// 键盘输入处理函数 // 第一个参数是按键的ASCII码, // 剩下的是按键时候的鼠标坐标. 鼠标坐标是相对窗口的左上角的 void HandleKeyPress(unsigned char key, int x, int y) { // 控制按键,如果游戏还没有失败则支持: // a:形状向左移动 // s:形状向下移动 // d:形状向右移动 // w:向左旋转90度 if(tetrisGame.GetStatus()){ switch(key){ case 'a': tetrisFigure.Translate(-1,0); glutPostRedisplay(); break; case 's': tetrisFigure.Translate(0,-1); glutPostRedisplay(); break; case 'd': tetrisFigure.Translate(1,0); glutPostRedisplay(); break; case 'w': tetrisFigure.Rotate(); glutPostRedisplay(); break; default: break; } } else { // 如果游戏已经失败,支持: // n:开始新的游戏 switch(key){ case 'n': tetrisGame.New(); glutPostRedisplay(); break; default: break; } } }
// 更新函数 void Update(int value){ // 如果游戏没有结束 if(tetrisGame.GetStatus()){ // 向下移动形状 int moveSuccess = tetrisFigure.Translate(0, -1); // 如果移动失败表示当前形状已经无法继续下移 // 更新游戏状态并创建新的形状 if(!moveSuccess){ tetrisGame.Update(tetrisFigure); tetrisFigure.New(rand()%NUM_FIGURE); } } // 刷新显示 glutPostRedisplay(); // 设置每0.5秒刷新一次 glutTimerFunc(500, Update, 0); }