小编推荐一个学 C 语言 / C++ 的学习裙 二六三, 六八八, 二七六 , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
- #include
- #include
- #include
- #include
- #define MAX_WIDE 50
- #define MAX_HIGH 16
- short dx = 1, dy = 0, randxy, score = 0;
- COORD coord;
- struct Snake{
- short len;
- short body[MAX_WIDE*MAX_HIGH];
- }snake;
- void draw()
- {
- for(short i = 0; i < snake.len; i++){
- coord.X = snake.body[i] & 127;
- coord.Y = snake.body[i] >> 8;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
- putchar('*');
- }
- coord.X = randxy & 127;
- coord.Y = randxy >> 8;
- SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
- putchar('*');
- }
- void run()
- {
- char key;
- short i, j;
- while( snake.body[0] > 0 && ( (snake.body[0] & 127) < MAX_WIDE) && (snake.body[0]>>8 < MAX_HIGH) ){
- draw();
- for(;kbhit();) key = getch();
- switch(key){
- case 'W': dx = 0, dy = -1; break;
- case 'S': dx = 0, dy = 1; break;
- case 'A': dx = -1, dy = 0; break;
- case 'D': dx = 1, dy = 0; break;
- }
- for(j = 1; j < snake.len; j++)
- if(snake.body[j] == snake.body[0])
- return;
- if(randxy == snake.body[0]){
- snake.len++, score += 10;
- randxy = ((rand() % 16 + 0) <<8) | (rand() % 50 + 0);
- }
- for(i = snake.len-1; i > 0; i--)
- snake.body[i] = snake.body[i-1];
- snake.body[0] = ((snake.body[0] & 127) + dx) | ((snake.body[0] >>8) + dy)<<8;
- Sleep(500);
- system("cls");
- }
- }
- int main()
- {
- snake.body[MAX_WIDE*MAX_HIGH] = 0;
- snake.body[0] = (MAX_HIGH/2)<<8 | MAX_WIDE/2;
- snake.len = 1;
- srand((unsigned)time(NULL));
- randxy = ((rand() % 16 + 0) <<8) | (rand() % 50 + 0);
- SMALL_RECT rect;
- rect.Top = 0, rect.Left = 0;
- rect.Bottom = MAX_HIGH, rect.Right = MAX_WIDE;
- SetConsoleWindowInfo(GetStdHandle(STD_OUTPUT_HANDLE), true, &rect);
- run();
- printf("Your Score:%d", score);
- return 0;
- }
讲一下大概的实现思想吧:
.: 其中用一个 MAX_WIDE * MAX_HIGH 大的数组来虚拟化 snake 的躯干, 数组中的项保存该 snake 的坐标值, 并且该值用一个 short(16byte)类型的值表示, 高 8byte 表示它的 Y 坐 标, 低 8byte 表示它的 X 坐标, 然后就可以遍历该数组画出各个坐标点
.: 至于它的移动就是通过数组的前一个项的值复制给后一个项, 以此达到它的移动
当然也可以用链表代替数组实现该 snake 躯干, 而且不会像数组一样浪费内存, 但是用链表的话, 就增加了代码行 ^_^
小编推荐一个学 C 语言 / C++ 的学习裙 二六三, 六八八, 二七六 , 无论你是大牛还是小白, 是想转行还是想入行都可以来了解一起进步一起学习! 裙内有开发工具, 很多干货和技术资料分享!
这些是 C/C++ 能做的
服务器开发工程师人工智能云计算工程师信息安全 (黑客反黑客) 大数据 数据平台嵌入式工程师流媒体服务器数据控解图像处理音频视频开发工程师游戏服务器分布式系统游戏辅助等
来源: http://www.jianshu.com/p/4d633fd17afe