📄 game_push_box.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 + -