当前位置:首页 > 公众号精选 > 嵌入式云IOT技术圈
[导读]前面,我们用C语言实现了列表时的学生信息管理系统,那么,window控制台还能做什么好玩的东西呢? http://blog.csdn.NET/morixinguan/article/details/77511003 这节我们来实现一下Window下的弹弹方块。 设计这个小游戏要考虑的问题 (1)方块:方块的大小,方块

前面,我们用C语言实现了列表时的学生信息管理系统,那么,window控制台还能做什么好玩的东西呢?

http://blog.csdn.NET/morixinguan/article/details/77511003

这节我们来实现一下Window下的弹弹方块。

设计这个小游戏要考虑的问题

(1)方块:方块的大小,方块的颜色,方块在Window控制终端的起始位置(x,y的坐标),方块移动的速度,移动的方向。

(2)边框:弹弹方块需要在一定的空间内弹,而不能超出这个空间,那么这时需要设计一个边框,需要考虑边框的大小。

(3)方块和边框之间的关系:方块不能超出边框之外,也就是要判断一个方块以及方框的临界条件。

方块用" * " 组成的图形来代替,边框长用" - ",宽用方向 " | "代替。

现在可以来实现这个小游戏:



我们需要有以下的接口:

//窗口初始化  

void HANDLE_init(HANDLE hOut);  

//显示边框的函数  

void show_map(HANDLE hOut);  

//显示方块  

void show_block(HANDLE hOut,struct block_t *array , int size);  

//清除方块  

void clear_block(HANDLE hOut,struct block_t *array , int size);  

//移动方块  

void move_block(struct block_t *array , int size);  

//检测方块是否在边框内  

int  check_block(struct block_t *array , int size);



下面开始写代码:


#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

#include <conio.h>

#include <tchar.h>

#define msleep(x)   (usleep(1000*x))

#define   ROW     18

#define   COL     60

#define TITLE "弹弹方块游戏 设计者:杨源鑫 日期:2017年8月24日 版本:1.0"

//在终端上打印信息

#define Print_Info_To_console(str,hOut,pos,x,y,color_type) \

SetConsoleTextAttribute(hOut, color_type); \

pos.X = x; \

pos.Y = y ; \

SetConsoleCursorPosition(hOut,pos);     \

printf("%s",str);

//窗口初始化

void HANDLE_init(HANDLE hOut);

void show_map(HANDLE hOut);

void show_block(HANDLE hOut,int row , int col , int w , int h);

void clear_block(HANDLE hOut,int row , int col , int w , int h);

void move_block(int *row , int *col , int *drow , int *dcol , int h , int w);



//定义设置光标结构体变量

CONSOLE_CURSOR_INFO cci; 

//定义默认的坐标位置  

COORD pos = {0,0};


int main(int argc , char **argv)

{

int row = 5 ; 

int col = 5 ; 

int w = 4 ; 

int h = 2 ;


int drow = 1 ; 

int dcol = 1 ; 

HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);

HANDLE_init(hOut);

//刷方框

show_map(hOut);

while(1)

{

show_block(hOut, row , col , w , h);

//sleep(1);

Sleep(100);

clear_block(hOut,row , col , w , h);

move_block(&row , &col , &drow , &dcol , h , w);

}


return 0 ;

}


//窗口初始化

void HANDLE_init(HANDLE hOut)

{

    SetConsoleTitleA(TITLE);

    //获取当前的句柄---设置为标准输出句柄 

    //获取光标信息

    GetConsoleCursorInfo(hOut, &cci); 

//设置光标大小   

    cci.dwSize = 1; 

//设置光标不可见 FALSE   

    cci.bVisible =  0; 

    //设置(应用)光标信息

    SetConsoleCursorInfo(hOut, &cci); 

}


//画边框 

void show_map(HANDLE hOut)

{

int i ; 

system("cls");  //全局刷

Print_Info_To_console(TITLE,hOut,pos,2,0,FOREGROUND_GREEN | 0x8);

//Print_Info_To_console(str,hOut,pos,x,y,color_type) 

for(i = 1 ; i <= COL ; i++)

{

Print_Info_To_console("-",hOut,pos,i,1,FOREGROUND_GREEN | 0x8);

Print_Info_To_console("-",hOut,pos,i,ROW,FOREGROUND_GREEN | 0x8);

}

for(i = 1 ; i <= ROW ; i++ )

{

Print_Info_To_console("|",hOut,pos,1,i,FOREGROUND_GREEN | 0x8);

Print_Info_To_console("|",hOut,pos,COL,i,FOREGROUND_GREEN | 0x8);

}

fflush(stdout);

}


//画方块 

void show_block(HANDLE hOut,int row , int col , int w , int h)

{

int i , j ; 

for(i = 0 ; i < h ; i++)

{

for(j = 0 ; j < w ; j++)

{

Print_Info_To_console("*",hOut,pos,col+j,row+i,FOREGROUND_RED | FOREGROUND_GREEN | 0x8);

}

}

fflush(stdout);

}


void move_block(int *row , int *col , int *drow , int *dcol , int h , int w)

{

if((*row == ROW-h) || (*row == 2) )

*drow = -*drow ; 

if((*col == COL-w) || (*col == 2)) 

*dcol = -*dcol;

*row += *drow ;

*col += *dcol ; 

}

void clear_block(HANDLE hOut,int row , int col , int w , int h)

{

int i , j ; 

for(i = 0 ; i < h ; i++)

{

for(j = 0 ; j < w ; j++)

{

Print_Info_To_console("*",hOut,pos,col+j,row+i,0);

}

}

fflush(stdout);

}

运行结果演示:



那么既然可以实现一个,可以实现多个方块同时运行吗?当然是可以的!

多个方块,这时候要考虑什么问题?

前面我们知道,关于方块我们设计的时候需要考虑的问题:方块的起始位置,方块的大小,方块的移动方向,方块的颜色。现在我们要实现多个方块,那么就需要设计一个结构体,然后定义一个结构体数组来存储这些方块。


我们设计的结构体如下:

struct  block_t

{

//方块的起始位置

int row; 

int col; 

//方块的大小

int w; 

int h;

//方块的移动方向

int drow ; 

int dcol ; 

//方块着色

int color ;

};



当然,上面的接口内存需要改动一下,参数传参改为结构体数组的形式即可,这样就方便很多了。

接口修改如下:

//窗口初始化

void HANDLE_init(HANDLE hOut);

//显示边框的函数

void show_map(HANDLE hOut);

//显示方块

void show_block(HANDLE hOut,struct block_t *array , int size);

//清除方块

void clear_block(HANDLE hOut,struct block_t *array , int size);

//移动方块

void move_block(struct block_t *array , int size);

//检测方块是否在边框内

int  check_block(struct block_t *array , int size);



下面开始修改代码:

#include <stdio.h>

#include <stdlib.h>

#include <Windows.h>

#include <conio.h>

#include <tchar.h>


#define msleep(x)   (usleep(1000*x))

#define NR(x) (sizeof(x)/sizeof(x[0]))

//定义边框的行为18,列为60

#define   ROW     18

#define   COL     60

#define TITLE "弹弹方块游戏 设计者:杨源鑫 日期:2017年8月24日 版本:2.0"

//在终端上打印信息

#define Print_Info_To_console(str,hOut,pos,x,y,color_type) \

SetConsoleTextAttribute(hOut, color_type); \

pos.X = x; \

pos.Y = y ; \

SetConsoleCursorPosition(hOut,pos);     \

printf("%s",str);


struct  block_t

{

//方块的起始位置

int row; 

int col; 

//方块的大小

int w; 

int h;

//方块的移动方向

int drow ; 

int dcol ; 

//方块着色

int color ;

};


//窗口初始化

void HANDLE_init(HANDLE hOut);

//显示边框的函数

void show_map(HANDLE hOut);

//显示方块

void show_block(HANDLE hOut,struct block_t *array , int size);

//清除方块

void clear_block(HANDLE hOut,struct block_t *array , int size);

//移动方块

void move_block(struct block_t *array , int size);

//检测方块是否在边框内

int  check_block(struct block_t *array , int size);


//定义设置光标结构体变量

CONSOLE_CURSOR_INFO cci; 

//定义默认的坐标位置  

COORD pos = {0,0};


int main(void)

{

//定义方块结构体数组

struct block_t  array[] = {

{3,4,3,2,1,1,FOREGROUND_RED | FOREGROUND_GREEN | 0x8},

{6,7,3,2,1,1,FOREGROUND_RED | 0x8},

{8,9,3,2,1,1,FOREGROUND_GREEN | FOREGROUND_BLUE | 0x8},

};

//刷方框

if(check_block(array , NR(array)))

{

printf("方块定义不在界线内\n");

return -1 ; 

}

HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);

HANDLE_init(hOut);

fflush(stdout);

//显示边框

show_map(hOut);

while(1)

{

//显示方块

show_block(hOut ,array , NR(array));

//延时

msleep(100);

//清除方块

clear_block(hOut ,array , NR(array));

//移动方块

move_block(array , NR(array));

}

return 0 ;

}


//窗口初始化

void HANDLE_init(HANDLE hOut)

{

SetConsoleTitleA(TITLE);

//获取当前的句柄---设置为标准输出句柄 

    //获取光标信息

    GetConsoleCursorInfo(hOut, &cci); 

//设置光标大小   

    cci.dwSize = 1; 

//设置光标不可见 FALSE   

    cci.bVisible =  0; 

    //设置(应用)光标信息

    SetConsoleCursorInfo(hOut, &cci); 

}


//画边框 

void show_map(HANDLE hOut)

{

int i ; 

system("cls");  //全局刷

Print_Info_To_console(TITLE,hOut,pos,2,0,FOREGROUND_GREEN | 0x8);

for(i = 1 ; i <= COL ; i++)

{

Print_Info_To_console("-",hOut,pos,i,1,FOREGROUND_GREEN | 0x8);

Print_Info_To_console("-",hOut,pos,i,ROW,FOREGROUND_GREEN | 0x8);

}

for(i = 1 ; i <= ROW ; i++ )

{

Print_Info_To_console("|",hOut,pos,1,i,FOREGROUND_GREEN | 0x8);

Print_Info_To_console("|",hOut,pos,COL,i,FOREGROUND_GREEN | 0x8);

}

fflush(stdout);

}


//显示方块子函数

static void _show_block(HANDLE hOut,struct block_t block)

{

int i , j ; 

for(i = 0 ; i < block.h ; i++)

{

for(j = 0 ; j < block.w ; j++)

{

Print_Info_To_console("*",hOut,pos,block.col+j,block.row+i,block.color);

//Print_Info_To_console("*",hOut,pos,block.col+j,block.row+i,FOREGROUND_RED | FOREGROUND_GREEN | 0x8);

//printf("\033[%d;%dH\033[%dm \033[0m" , block.row+i , block.col+j , block.color);

}

}

fflush(stdout);

}


void show_block(HANDLE hOut ,struct block_t *array , int size)

{

int i ; 

for(i = 0 ; i < size ; i++)

{

_show_block(hOut,array[i]);

}

}

//移动方块子函数

static void _move_block(struct block_t *block)

{

if((block->row >= ROW-block->h) || (block->row <= 2) )

block->drow = -block->drow ; 

if((block->col >= COL-block->w) || (block->col <= 2)) 

block->dcol = -block->dcol;

block->row += block->drow ;

block->col += block->dcol ; 

}

void move_block(struct block_t *array , int size)

{

int i ; 

for(i = 0 ; i < size ; i++)

{

_move_block(&(array[i]));

}

}


//清除方块子函数

static void _clear_block(HANDLE hOut,struct block_t block)

{

int i , j ; 

for(i = 0 ; i < block.h ; i++)

{

for(j = 0 ; j < block.w ; j++)

{

Print_Info_To_console("*",hOut,pos,(block.col)+j,(block.row)+i,0);

//printf("\033[%d;%dH " , (block.row)+i , (block.col)+j);

}

}

fflush(stdout);

}

void clear_block(HANDLE hOut,struct block_t *array , int size)

{

int i ; 

for(i = 0 ; i < size ; i++)

{

_clear_block(hOut,array[i]);

}

}


//检测方块是否在允许的方块内

static int _check_block(struct block_t block)

{

if((block.row == 2) || (block.col == 2) || 

(block.row == ROW - block.h) || (block.col == COL-block.w))

{

return 1 ; 

}

return 0 ; 

}


int  check_block(struct block_t *array , int size)

{


int i ; 

for(i = 0 ; i < size ; i++)

{

if(_check_block(array[i]))

return 1 ; 

}

return 0 ; 

}

运行结果演示:



那么该游戏还能继续拓展,比如,方块的移动方式修改用手动用键盘的上下左右按键来进行控制,还有,方块如果碰撞到了,会弹开一段距离。甚至,我们还可以借助这个,设计一个控制台版本的坦克大战。

        更多脑洞,需要你仔细的斟酌与思考,一个游戏不是轻轻松松就做出来的。发挥你的脑洞,想你所想,编你所编!!

原文链接:http://blog.csdn.net/morixinguan/article/details/77541343


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭