⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 game_push_box.cpp

📁 哈工大的几个人开发的操作系统pyos的部分源码
💻 CPP
字号:
#include "video.h"
#include "message.h"
#include "keyboard.h"
#include "buffer.h"

const int MessageQueueLength = 32 ; // 消息队列长度
struct_pyos_Message GameMessage[ MessageQueueLength ] ; // 定义消息队列空间
class_template_pyos_Buffer< struct_pyos_Message > GameMessageQueue ;

/* 打印棋盘函数 */
void PrintChess( char chess[][ 9 ] )
{
  for( int i = 0 ; i < 9 ; ++i ){
    class_pyos_Video::SetCursorPosition( 36 , 9 + i ) ; 
    for( int j = 0 ; j < 9 ; ++j ){      
      if( chess[ i ][ j ] == '-' || chess[ i ][ j ] == '|' ){
        class_pyos_Video::PrintMessage( ' ' , clGreen , false , clGreen ) ;
      }
      else if( chess[ i ][ j ] == '*' ){
        class_pyos_Video::PrintMessage( 1 , clWhite , true ) ;
      }
      else if( chess[ i ][ j ] == 'o' ){
        class_pyos_Video::PrintMessage( 'o' , clRed ) ;
      }
      else if( chess[ i ][ j ] == 'O' ){
        class_pyos_Video::PrintMessage( ' ' , clBlue , false , clBlue) ;
      }
      else if( chess[ i ][ j ] == 'Q' ){
        class_pyos_Video::PrintMessage( 8 , clBlue ) ;
      }
      else{
        class_pyos_Video::PrintMessage( ' ' ) ;
      }
    }
  } 
  /* 检查是否胜利 */
  if( chess[ 1 ][ 4 ] == 'Q' && chess[ 4 ][ 1 ] == 'Q' && chess[ 4 ][ 7 ] == 'Q' && chess[ 7 ][ 4 ] == 'Q' ){
    class_pyos_Video::SetCursorPosition( 13 , 24 ) ;
    class_pyos_Video::PrintMessage( "Oh , You are very " ) ;
    class_pyos_Video::PrintMessage( "clever!" , clRed , true ) ;
    class_pyos_Video::PrintMessage( "Please press R to replay ^_^" ) ;
  }  
  class_pyos_Video::SetCursorPosition( 0 , 4 ) ; 
}

/* 备份棋盘数据 */
void BakGame( char chess[][ 9 ] , char bakchess[][ 9 ] )
{
  for( int i = 0 ; i < 9 ; ++i ){
    for( int j = 0 ; j < 9 ; ++j ){
      bakchess[ i ][ j ] = chess[ i ][ j ] ;
    }
  }
}
/* 恢复棋盘数据 */
void RestoreGame( char bakchess[][ 9 ] , char chess[][ 9 ] )
{
  BakGame( bakchess , chess ) ;
}
/* 初始化游戏,主要任务时初始化游戏的消息队列 */
void GameInit()
{
  GameMessageQueue.Init( GameMessage , MessageQueueLength ) ;
}
/* 显示信息 */
void DisplayInfo()
{
  /* 清屏 */
  class_pyos_Video::ClearScreen() ;
  
  /* 打印信息 */
  class_pyos_Video::PrintMessage( "Hello! Welcome to play the game Push_Box on the PYOS platform!\n" ) ;
  class_pyos_Video::PrintMessage( "you can get more info about pyos at http://purec.binghua.com\n" ) ;
  class_pyos_Video::PrintMessage( "Help:use I,J,K,L to play game and use" );
  class_pyos_Video::PrintMessage( "\"Esc\"" , clBlue ) ;
  class_pyos_Video::PrintMessage( " to exit, " ) ;
  class_pyos_Video::PrintMessage( "R" , clBlue ) ;
  class_pyos_Video::PrintMessage( " to Replay~:)\n" ) ; 
  class_pyos_Video::SetCursorPosition( 35 , 24 ) ;
  class_pyos_Video::PrintMessage( "Go! Go! Go!" ) ;
}

/* 游戏主函数 */
void game_push_box_main() 
{
  
  /* 棋盘数据 
  ** "空格" 表示没有
  ** - | 表示墙
  ** * 表示人
  ** o 表示球
  ** O 表示没有球的箱子
  ** Q 表示有球的箱子
  */
  char chess[ 9 ][ 9 ] = {{ ' ' , ' ' , ' ' , '-' , '-' , '-' , ' ' , ' ' , ' '} ,
                          { ' ' , ' ' , ' ' , '|' , 'o' , '|' , ' ' , ' ' , ' '} ,
                          { ' ' , ' ' , ' ' , '|' , ' ' , '|' , ' ' , ' ' , ' '} , 
                          { '-' , '-' , '-' , '|' , 'O' , '|' , '-' , '-' , '-'} ,
                          { '|' , 'o' , ' ' , 'O' , '*' , 'O' , ' ' , 'o' , '|'} ,
                          { '-' , '-' , '-' , '|' , 'O' , '|' , '-' , '-' , '-'} ,
                          { ' ' , ' ' , ' ' , '|' , ' ' , '|' , ' ' , ' ' , ' '} ,
                          { ' ' , ' ' , ' ' , '|' , 'o' , '|' , ' ' , ' ' , ' '} ,
                          { ' ' , ' ' , ' ' , '-' , '-' , '-' , ' ' , ' ' , ' '} } ;   
  char bakchess[ 9 ][ 9 ] ;
  
  /* 记录人员位置 */
  int x = 4 ;
  int y = 4 ; 
  /* 备份棋盘 */
  BakGame( chess , bakchess ) ;

  DisplayInfo() ;
  // 构造一条重画消息发送
  struct_pyos_Message message ;
  message.MessageType = pyos_message_type_Repaint ;
  GameMessageQueue.PutData( message ) ;
  /* 进入消息循环 */
  bool Loop = true ;
  while( Loop ){
    /* 取出一条消息 */
    if( GameMessageQueue.ReadData( message ) ){
      // 返回 1 表示取到了消息
      if( message.MessageType == pyos_message_type_Keyboard ){  // 键盘消息
        /* 取得键盘扫描码,并翻译为Ascii码 */
        char ch = class_pyos_Keyboard::TraslateScanCodeToAsciiCode( message.KeyboardScanCode ) ;
        // 忽略释放键
        if( !class_pyos_Keyboard::StateKey.Down ){
          continue ;
        }
        else{       
          if( ch == 27 ){ // Esc 键
            // 构造一条退出消息发送
            message.MessageType = pyos_message_type_Exit ;
            GameMessageQueue.PutData( message ) ;
          }
          else if( ch == 'i' || ( ch == 0 && class_pyos_Keyboard::StateKey.FunctionKey == keyUpArrow ) ){ // i 或“上方向”键
            if( chess[ x - 1 ][ y ] == '|' || chess[ x - 1 ][ y ] == '-' || chess[ x - 1 ][ y ] == 'Q' ){
              // 如果上方是墙,或有球的箱子,则不能通过,直接返回
              continue ;
            }
            else{
              // 可以移动
              // 把老地方置空
              chess[ x ][ y ] = ' ' ;
              // 检测人欲移到的位置现在是不是一个箱子
              if( chess[ x - 1 ][ y ] == 'O' ){
                // 是一个箱子,则把箱子移动一下
                // 检测箱子移动到的地方是不是球
                if( chess[ x - 2 ][ y ] == 'o' ){
                  // 是球,则把此地作为有球的箱子
                  chess[ x - 2 ][ y ] = 'Q' ;
                }
                else{
                  // 不是球,则把此地作为箱子
                  chess[ x - 2 ][ y ] = 'O' ;
                }
              }
              // 人向上走一格
              --x ; // 因为,x 是行,
              chess[ x ][ y ] = '*' ;
              // 构造一条重画消息,并发送
              message.MessageType = pyos_message_type_Repaint ;
              GameMessageQueue.PutData( message ) ;
            }
          }// i 键处理结束
          else if( ch == 'k' || ( ch == 0 && class_pyos_Keyboard::StateKey.FunctionKey == keyDownArrow ) ){ // k 或“下方向”键
            if( chess[ x + 1 ][ y ] == '|' || chess[ x + 1 ][ y ] == '-' || chess[ x + 1 ][ y ] == 'Q' ){
              // 如果下方是墙,或有球的箱子,则不能通过,直接返回
              continue ;
            }
            else{
              // 可以移动
              // 把老地方置空
              chess[ x ][ y ] = ' ' ;
              // 检测人欲移到的位置现在是不是一个箱子
              if( chess[ x + 1 ][ y ] == 'O' ){
                // 是一个箱子,则把箱子移动一下
                // 检测箱子移动到的地方是不是球
                if( chess[ x + 2 ][ y ] == 'o' ){
                  // 是球,则把此地作为有球的箱子
                  chess[ x + 2 ][ y ] = 'Q' ;
                }
                else{
                  // 不是球,则把此地作为箱子
                  chess[ x + 2 ][ y ] = 'O' ;
                }
              }
              // 人向下走一格
              ++x ; // 因为,x 是行,
              chess[ x ][ y ] = '*' ;
              // 构造一条重画消息,并发送
              message.MessageType = pyos_message_type_Repaint ;
              GameMessageQueue.PutData( message ) ;
            }
          }// k 键处理结束
          else if( ch == 'j' || ( ch == 0 && class_pyos_Keyboard::StateKey.FunctionKey == keyLeftArrow ) ){ // j 或“左方向”键
            if( chess[ x ][ y - 1 ] == '|' || chess[ x ][ y - 1 ] == '-' || chess[ x ][ y - 1 ] == 'Q' ){
              // 如果左方是墙,或有球的箱子,则不能通过,直接返回
              continue ;
            }
            else{
              // 可以移动
              // 把老地方置空
              chess[ x ][ y ] = ' ' ;
              // 检测人欲移到的位置现在是不是一个箱子
              if( chess[ x ][ y - 1 ] == 'O' ){
                // 是一个箱子,则把箱子移动一下
                // 检测箱子移动到的地方是不是球
                if( chess[ x ][ y - 2 ] == 'o' ){
                  // 是球,则把此地作为有球的箱子
                  chess[ x ][ y - 2 ] = 'Q' ;
                }
                else{
                  // 不是球,则把此地作为箱子
                  chess[ x ][ y - 2 ] = 'O' ;
                }
              }
              // 人向左走一格
              --y ; // 因为,y 是列,
              chess[ x ][ y ] = '*' ;
              // 构造一条重画消息,并发送
              message.MessageType = pyos_message_type_Repaint ;
              GameMessageQueue.PutData( message ) ;
            }
          }// j 键处理结束
          else if( ch == 'l' || ( ch == 0 && class_pyos_Keyboard::StateKey.FunctionKey == keyRightArrow ) ){ // l 或“右方向”键            
            if( chess[ x ][ y + 1 ] == '|' || chess[ x ][ y + 1 ] == '-' || chess[ x ][ y + 1 ] == 'Q' ){
              // 如果左方是墙,或有球的箱子,则不能通过,直接返回
              continue ;
            }
            else{
              // 可以移动
              // 把老地方置空
              chess[ x ][ y ] = ' ' ;
              // 检测人欲移到的位置现在是不是一个箱子
              if( chess[ x ][ y + 1 ] == 'O' ){
                // 是一个箱子,则把箱子移动一下
                // 检测箱子移动到的地方是不是球
                if( chess[ x ][ y + 2 ] == 'o' ){
                  // 是球,则把此地作为有球的箱子
                  chess[ x ][ y + 2 ] = 'Q' ;
                }
                else{
                  // 不是球,则把此地作为箱子
                  chess[ x ][ y + 2 ] = 'O' ;
                }
              }
              // 人向左走一格
              ++y ; // 因为,y 是列,
              chess[ x ][ y ] = '*' ;
              // 构造一条重画消息,并发送
              message.MessageType = pyos_message_type_Repaint ;
              GameMessageQueue.PutData( message ) ;
            }
          }// l 键处理结束
          else if( ch == 'r' ){ // R 键
            RestoreGame( bakchess , chess ) ;
            x = 4 ;
            y = 4 ;
            DisplayInfo() ;
            message.MessageType = pyos_message_type_Repaint ;
            GameMessageQueue.PutData( message ) ;
          }
        }
      }
      else if( message.MessageType == pyos_message_type_Repaint ){ // 重画消息
        PrintChess( chess ) ;
      }
      else if( message.MessageType == pyos_message_type_Exit ){ // 退出消息
        Loop = false ;
      }
    }    
  }//while 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -