上回说到下移的问题,这篇就说一下刷新的问题

我们控制台输出一般都是一行一行的输出,所以,在输出屏幕的时候,我们一个画面闪到另一个画面的效果

我刚开始弄的是用system("CLS");进行清屏,但还是会有闪烁的效果,接下来我会在上一个博文的代码,现在贴上代码

// c.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h> #define intX 10 #define intY 20 //显示
void show(char Interface[intY][intX])
{
int i, j; for (i = ; i < intY; i++)
{
printf("%c", );
for (j = ; j < intX; j++)
{ if (Interface[i][j] == )
{
printf(" ");
}
else
{
printf("■");
}
}
printf("%c", );
printf("\n");
} for (i = ; i < * intX + ; i++)
{
printf("%c", );
}
printf("\n");
} int _tmain(int argc, _TCHAR* argv[])
{
//界面数组
char Interface[intY][intX] =
{
{ , , , , , },
{ , , , , },
{ },
{ },
{ },
{ }, { }, { }, { }, { },{ }, { , , , }, { }
}; /*当前状态*/
int i = ;
int j = ; while (true)
{
for (i = intY - ; i >= ; i--) /* 继续下落 */
{
for (j = ; j < intX; j++)
{
if (Interface[i][j] == )
{
Interface[i + ][j] = Interface[i][j]; Interface[i][j] = ; /*方块下移*/
}
}
} show(Interface);
getchar();
/*getchar();*/
}
}

接下来我们写一个函数,命名为gotoxy(int x ,int y),下面是里面的实现

void gotoxy(int x, int y)
{
COORD c; c.X = x;
    c.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

上面那个函数要用到引用一个windows.h的文件,这个函数的作用就是直接跳到指定的位置坐标进行输出,这样做就是一点一点的把原先的输出屏幕上的东西覆盖住,这样减少闪烁效果很

明显,下面是完全代码

// c.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "windows.h"
#include "time.h"
#define intX 10 #define intY 20 void gotoxy(int x, int y)
{
COORD c;
c.X = x;
c.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
//显示
void show(char Interface[intY][intX])
{
int i, j; for (i = ; i < intY; i++)
{
printf("%c", );
for (j = ; j < intX; j++)
{ if (Interface[i][j] == )
{
printf(" ");
}
else
{
printf("■");
}
}
printf("%c", );
printf("\n");
} for (i = ; i < * intX + ; i++)
{
printf("%c", );
}
printf("\n");
} int _tmain(int argc, _TCHAR* argv[])
{
//界面数组
char Interface[intY][intX] =
{
{ , , , , , },
{ , , , , },
{ },
{ },
{ },
{ }, { }, { }, { }, { },{ }, { , , , }, { }
}; /*当前状态*/
int i = ;
int j = ; while (true)
{
for (i = intY - ; i >= ; i--) /* 继续下落 */
{
for (j = ; j < intX; j++)
{
if (Interface[i][j] == )
{
Interface[i + ][j] = Interface[i][j]; Interface[i][j] = ; /*方块下移*/
}
}
} show(Interface);
gotoxy(, ); }
}

因为我一讲到一个功能性代码的时候,就会把整个代码发上来,占了一大幅字,这不是我想要凑字数,是我说了这些东西,有些初学者,可能不知道怎么用,也是时间问题,只能慢慢来

上面解决下移问题和刷屏的问题,可以看到一个方块往下掉后就消失不见了,我们来弄一个手动控制下移,按一次5就下移一次。

因为很多函数都要用到界面数组信息,所以把它提取出来做成一个全局变量

要做成这个效果,就要用到一个函数了,_kbhit,或者是kbhit,两个函数的功能是一样的,只是版本不同,我这里是vs2013,所以是第一个,这个函数在#include "conio.h",引用这个头文件。kbhit() 功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。看我代码里是怎么用的,不懂多看几遍。下面贴出整个代码:

// c.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include "windows.h"
#include "time.h" #include "conio.h"
#define intX 10 #define intY 20 //记录方块左上角的行和列的位置坐标
int Row = , Column = ; //界面数组
char Interface[intY][intX] =
{
{ , , , , , },
{ , , , , },
{ },
{ },
{ },
{ }, { }, { }, { }, { }, { }, { , , , }, { }
}; /*当前状态*/ void Down()
{
int i,j;
for (i = intY - ; i >= ; i--) /* 继续下落 */
{
for (j = ; j < intX; j++)
{
if (Interface[i][j] == )
{
Interface[i + ][j] = Interface[i][j]; Interface[i][j] = ; /*方块下移*/
}
}
}
}
//指定位置输出
void Gotoxy(int x, int y)
{
COORD c;
c.X = x;
c.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
//显示
void Show()
{
int i, j; for (i = ; i < intY; i++)
{
printf("%c", );
for (j = ; j < intX; j++)
{ if (Interface[i][j] == )
{
printf(" ");
}
else
{
printf("■");
}
}
printf("%c", );
printf("\n");
} for (i = ; i < * intX + ; i++)
{
printf("%c", );
}
printf("\n");
} int _tmain(int argc, _TCHAR* argv[])
{
Show();
int i = ;
int j = ;
char control = '';
while (true)
{
if (!_kbhit())
{
control = '';
}
else
{
control = _getch();
} if (control == '')
{
Down();
Gotoxy(, );
Show(); } }
}

这里我们已经做出了手动控制移动效果,下一次,就是到达底部碰撞停止的功能了。

从零开始---控制台用c写俄罗斯方块游戏(2)的更多相关文章

  1. 从零开始---控制台用c写俄罗斯方块游戏(1)

    从零开始---控制台用c写俄罗斯方块游戏(1) 很少写博文,一来自身知识有限,二来自己知道,已经有很多这样的博文了,三就是因为懒,文笔也一般,四来刚出来工作,时间也不多 之所以写这篇博文,是因为应群里 ...

  2. Javascript写俄罗斯方块游戏

    俄罗斯方块这个游戏也做了移动端的兼容, 这个游戏难点是怎么翻转方块, 自己实现的方式是把方块放到一个二维数组, 然后逆时针旋转二维数组. 也有别的方法,比如直接用一个全局变量代表一个方向, 翻转的时候 ...

  3. electron写俄罗斯方块游戏(Tetris)

    背景 在折腾ES6,突然想起大学时用c语言写过俄罗斯方块,本项目中主要是利用ES6的Class特性进行面向对象编程.项目采用node.js v6.2.0 + electron v1.1.0 进行桌面开 ...

  4. 【转】shell脚本写的俄罗斯方块游戏

    亲测一个很好玩的shell脚本写的俄罗斯方块游戏,脚本来自互联网 先来讲一下思维流程 一.方块的表示 由于shell不能定义二维数组,所以只能用一维数组表示方块,俄罗斯方块主要可以分为7类,每一类方块 ...

  5. Python 写一个俄罗斯方块游戏

    使用 Python 的 PyGame 库写一个俄罗斯方块游戏的逐步指南 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人 ...

  6. 用C写的俄罗斯方块游戏 By: hoodlum1980 编程论坛

    /************************************ * Desc: 俄罗斯方块游戏 * By: hoodlum1980 * Email: jinfd@126.com * Dat ...

  7. DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色

    本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用.本文属于入门级博客,期望本文能让大家了解 Vortic ...

  8. 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏

    早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...

  9. 俄罗斯方块游戏JavaScript代码

    JavaScript代码俄罗斯方块游戏 早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用 ...

随机推荐

  1. [从产品角度学EXCEL 01]-EXCEL是怎样运作的

    这是<从产品角度学EXCEL>系列第二篇. 前言请看:从产品角度学EXCEL-系列0-为什么要关注EXCEL的本质 本文不接受无授权转载,如需转载,请先联系我,非常感谢. 1.EXCEL是 ...

  2. ibatis 轻松入门

    1.总中的配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig ...

  3. Alpha阶段项目总结

    1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件是一款面向高校学生的简单快速的云笔记,不仅具有笔记的添加.修改.查看和删除功能,还有笔记公开功能,用户 ...

  4. Java Abstract Class & Interface

    一. 抽象类 1. 抽象类:包含了一个抽象方法的类就是抽象类 2. 抽象方法:声明而未被实现的方法,用关键字abstract声明 3. 抽象类被子类继承,子类(如果不是抽象类)必须重写(overrid ...

  5. fzf by ruby

    fzf by ruby */--> fzf by ruby 1 github地址 https://github.com/junegunn/fzf 2 简介 软件通过匿名管道和grep扩展了bas ...

  6. 检查日期是否为节假日api

    http://www.easybots.cn/api/holiday.php?d=20160104 返回值: 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2: 检查一个日期是否 ...

  7. PHP之compact()函数

    PHP之compact()函数 compact()函数将变量转化为数组: <?php //直接调用函数 $a=1;$b=3;$c=4; var_dump($a,$b,$c); //自定义函数实现 ...

  8. css3 自定义字体的使用方法

    @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许 ...

  9. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  10. Andrew Ng在coursera上的ML课程_知识点笔记_(1)

    1.Feature Scaling(特征缩放): 如上图所示,x1是房屋面积,x2是房间个数,若不进行特征缩放,则代价函数J的曲线近似为一个瘦长的椭圆(我暂时这么理解,θ1和θ2分别是x1和x2的权值 ...