移动的心

#include <stdio.h>
#include <windows.h>
#include <time.h>


void print_heart(int r, int c);
void print_row(int n);
void print_column(int n);
int get_direct(int r, int c);


#define MAX_ROW 20 // 最大行数,根据具体机器测试调整
#define MAX_COL 100 // 最大列数,根据具体机器测试调整


// 心形数组
int heart[8][18] = {
{0,0,0,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0},
{0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0}
};


// 让一个心型图案在屏幕范围内移动
main()
{
int cur_row = 0; // 当前行位置
int cur_column = 0; // 当前列位置
int cur_direct = 3; // 当前方向


while (1)
{
switch (cur_direct)
{
case 0: // 向上
cur_row--;
if (cur_row == 0)
{
cur_direct = get_direct(cur_row, cur_column);
}
break;
case 1: // 向下
cur_row++;
if (cur_row == MAX_ROW)
{
cur_direct = get_direct(cur_row, cur_column);
}
break;
case 2: // 向左
cur_column-=2;
if (cur_column == 0)
{
cur_direct = get_direct(cur_row, cur_column);
}
break;
case 3: // 向右
cur_column+=2;
if (cur_column == MAX_COL)
{
cur_direct = get_direct(cur_row, cur_column);
}
break;
}

print_heart(cur_row, cur_column);
Sleep(50);
}
}


// 在第r行 第c列打印出心形
void print_heart(int r, int c)
{
int i, j;


system("cls");


// 打印出空行
print_row(r);
for (i = 0; i < 8; i++)
{
// 打印符号前先打印出空格
print_column(c);
for (j = 0; j < 18; j++)
{
if (heart[i][j] == 0)
{
printf(" "); // 0打印出空格
}
else
{
printf("*"); // 1打印出*
}
}
// 一行打印完要换行
printf("\n");
}
}


// 打印n个空行
void print_row(int n)
{
int i;
for (i = 0; i < n; i++)
{
printf("\n");
}
}


// 打印n个空格
void print_column(int n)
{
int i;
for (i = 0; i < n; i++)
{
printf(" ");
}
}


// 移动到角落时,变更移动方向
int get_direct(int r, int c)
{
int dir = 3;


if (r == 0 && c == 0) // 当前移动到左上角(r为0、c为0),只能朝下(1)/右(3)移动
{
dir = 1 + rand() % 2 * 2; // 1 + [0,1]*2 结果只能为1(下)或3(右)
}
else if (r == MAX_ROW && c == 0) // 当前移动到左下角(r为最大、c为0),只能朝上(0)/右(3)移动
{
dir = rand() % 2 * 3; // [0,1]*3 结果只能为0(上)或3(右)
}
else if (r == 0 && c == MAX_COL) // 当前移动到右上角(r为0、c为最大),只能朝左(2)/下(1)移动
{
dir = 1 + rand() % 2; // 1 + [0,1] 结果只能为1(下)或2(左)
}
else if (r == MAX_ROW && c == MAX_COL) // 当前移动到右下角(r为最大、c为最大),只能朝上(0)/左(2)移动
{
dir = rand() % 2 * 2; // [0,1]*2 结果只能为0(上)或2(左)
}

return dir;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值