会移动的爱心 + 对话框小程序,代码会在底部会发出来;
创建一个txt文本,把文件后缀改成 .c ;
一、移动爱心的制作
( 爱心的写法有很多,不管怎么写,最重要的是实现 )
1.1
先写出 c 语言的主函数 main ;
1.2
很明显,爱心上三行有自己的规律,先将上三行单独制作出来;
定义一个 for 循环控制执行 3 次代码;
由效果图可以看出来上三行左边的空格数量每行减少 2 个,最低行只有一个空格,故得出规律:空格个数 = 2 * ( 自下从上数的行数 - 1 ) + 1 ;
将前三行分成两个半圆,可以看出半圆的每行减少四个 '*' 号,因为首行是 5 个 '*' 号,所以得出规律: '*' 号个数 = 首行个数 + ( 总行数 - 自下从上数的行数 ) * 4 ;
因为两个半圆间的空格数量有每行减少 4 个,首行有 9 个空格,故得出规律:空格个数 = 首行个数 - ( 总行数 - 自下从上数的行数 ) * 4;
最后在最外层循环中打印一个换行,确保格式;
这里因为经常用到 ( 总行数 - 自下从上数的行数 ) * 4 ,所以单独对此公式进行了宏定义,让代码在视觉上更为直观;
1.3
第二步将中间三行 '*' 打印出来;
同样是定义一个 for 循环控制执行 3 次代码;
第三行的 '*' 号个数过多不可以一个一个去数,不过我们刚才在打印前三行的时候得到了两个半圆每行 '*' 的个数,而在前三行执行完毕之后 j = 所保留的值必定是一个半圆最后一行'*' 的个数,而中间三行的 '*' 个数为两个半圆第三行 '*' 个数相加再加上 3 个空位,那么就得出规律:'*' 的个数 = 半圆最后一行 '*' 的个数 * 2 + 3;
最后补上一个换行;
1.4
第三步把下半部分的 '*' 打印出来;
因为行数过多也不好去数有多少行数,所以这次循环的结束条件更变为无打印内容时跳出循环;
可以看出下半部分的空格每行增加两个首行为一个空格,则可得出规律:空格个数 = 2 * ( 当前行数 - 1 ) + 1;
而每行的 '*' 个数的变化是每行递减 4 个,首行为第二次打印的三行的每行个数 - 2 ,则可得出规律:'*' 个数 = 中心 '*' 个数 - 4 * ( 行数 - 1 ) - 2 ;
因为打印的爱心大小不一可能出现倒数第二行只有 3 或 4 个 '*' 的情况,所以要进行一个判断如果是倒数第二行只有 3 个 '*' 的情况就回退一格再打印一个 '*' 号,如果是倒数第二行只有 4 个 '*' 的情况就回退一格再打印两个 '*' 号;
1.5
至此一个简单的爱心就打印出来了,而为了更加的美观,我们可以让每一行单独出现;
这我们就要用到 Sleep() 函数了,使用 Sleep() 函数要先调用 windows 函数库,然后根据自己的喜好调节 Sleep() 函数里面的时间;
另外我们还可以通过增加每行前面的空格数量来使爱心的位置更好看;
因为有三个循环需要编写三次,我这边是直接写了一个函数调用3次实现;
最后还有一个移动效果,移动效果也是介于 Sleep 实现的,原理就是先用换行填满整个控制台,然后再将爱心一行一行漏出来,爱心全部出现后输出换行,每个换行都用 Sleep 延时操作,换行的输出个数为大概将爱心移动到中心时即可;
二、对话框的制作
2.1
定义一个接收窗口回应的变量,方便进行判断;
MessageBox() 函数功能是弹出一个 windows 对话框;
MessageBox() 函数有四个参数:
第一个参数是⼀个窗⼝句柄,指定该对话框的所有者窗⼝。如果该参数为空(0/NULL),则该对话框不属于任何窗⼝,第二个参数是填写对话框内容,第三个参数是对话框的标题名,最后一个参数是对话框的显示按钮 ( 如 MB_OK 有一个确定选项 );
2.2
写一个标记 SUBMIT ,如果在对话框选否就利用 goto 一直重复跳转,直至选择是;
2.3
因为控制台的特性,对话框关闭后控制台也会关闭,为了让对话框关闭后爱心还显示在控制台,可以添加一个程序暂停指令;
三、编译和运行
3.1
文件目录输入 cmd 回车;
3.2
在控制台输入 gcc 文件名.c -o 生成的可执行文件的命名 进行编译;
3.3
双击打开生成的 exe 可执行文件;
四、代码分享
#include<stdio.h>
#include<windows.h>
#define N ( ( 3 -i ) * 4 )
int main(){
int i , j ;
void Adjust( ) ;
for( i = 0 ; i < 40 ; i++ )
printf("\n");
for( i = 3 ; i > 0 ; i-- ){
Adjust( ) ;
for( j = 0 ; j < 2 * (i - 1) + 1 ; j++ )
printf( " " );
for( j = 0 ; j < 5 + N ; j++ )
printf( "*" );
for( j = 0 ; j < 9 - N ; j++ )
printf( " " );
for( j = 0 ; j < 5 + N ; j++ )
printf( "*" );
printf( "\n" );
Sleep(200);
}
int k ;
for( i = 0 ; i < 3 ; i++ ){
Adjust();
for( k = 0 ; k < 2 * j + 3 ; k++ )
printf( "*" );
printf( "\n" );
Sleep(200);
}
#define M ( k - 4 * i - 2 )
int n;
for( i = 0 ; M >= -1 ; i++ ){
Adjust();
for( n = 0 ; n < 2 * i + 1 ; n++ )
printf( " " );
for( j = 0 ; j < M ; j++ )
printf( "*" );
if( M == -1 )
printf( "\b*" );
else if( M == 0 )
printf( "\b**" );
printf( "\n" );
Sleep(200);
}
for( i = 0 ; i < 6 ; i++ ){
printf("\n");
Sleep(200);
}
int submit;
submit = MessageBox(NULL, "宝,恁喜欢俺吗?", "love", MB_YESNO);
SUBMIT:if (submit == IDNO)
{
submit = MessageBox(NULL, "宝,恁其实还是喜欢俺的对吗?", "love", MB_YESNO);
}
if (submit == IDNO)
{
submit = MessageBox(NULL, "宝,恁是喜欢俺的对吗?", "love", MB_YESNO);
}
if (submit == IDNO) goto SUBMIT;
MessageBox(NULL, "俺也喜欢你.", "love", MB_OK);
system("pause");
return 0;
}
void Adjust( ){
int a ;
for( a = 0 ; a < 45 ; a++ )
printf( " " );
}