今天尝试做在TC下让一个 星号动起来,基本成功了,所以来分享一下
主要思想就是打印星号,使用gotoxy()函数控制光标位置, 让新的位置打印星号,原来的地方用空格键覆盖。而光标位置 使用bios.h库函数下的bioskey()实现,这里bioskey() 就不解释了,大家不知道的百度吧。
其中first()函数是初始时星号在屏幕中央循环打印,实现直线初始移动。
控制上下左右的函数循环控制条件尤为重要,即不能“跑”的越界,并随时监测用户是否中途按其他键需要改变运动方向,若按下其他键立马返回该键值到show()函数,在show()函数 中判断走哪边。
这里具体解释一下show()函数 中的if(key || bioskey(1)) ,这是一个短路运算,当key有值则不用再输入,直接用上一层函数返回值就好; key = (key == 0 ? bioskey(0) : key);用来区分是第一次改变还是已经改变。好吧,本人口才也不怎么的。
本人小白,学习编程仅一年,不足之处请多多指教。
#include <stdio.h>
#include <stdlib.h>
#include <bios.h>
#define TIME 100
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define ESC 283
#define SPACE 14624
int show(int key);
void first(int *i, int *j);
int up(int *i, int *j, int key);
int down(int *i, int *j, int key);
int left(int *i, int *j, int key);
int right(int *i, int *j, int key);
void first(int *i, int *j) {
delay(TIME);
gotoxy(*j, *i);
printf(" ");
gotoxy(++(*j), *i);
cprintf("*");
}
int up(int *i, int *j, int key) {
while(*i != 0 && key == UP) {
delay(TIME);
gotoxy(*j, *i);
cprintf(" ");
gotoxy(*j, --(*i));
cprintf("*");
if(bioskey(1))
key = bioskey(0);
}
return key;
}
int down(int *i, int *j, int key) {
while(*i <26 && key == DOWN) {
delay(TIME);
gotoxy(*j, *i);
cprintf(" ");
gotoxy(*j, ++(*i));
cprintf("*");
if(bioskey(1))
key = bioskey(0);
}
return key;
}
int left(int *i, int *j, int key) {
while(*j > 0 && key == LEFT) {
delay(TIME);
gotoxy(*j, *i);
cprintf(" ");
gotoxy(--(*j), *i);
cprintf("*");
if(bioskey(1))
key = bioskey(0);
}
return key;
}
int right(int *i, int *j, int key) {
while(*j < 80 && key == RIGHT) {
delay(TIME);
gotoxy(*j, *i);
cprintf(" ");
gotoxy(++(*j), *i);
cprintf("*");
if(bioskey(1))
key = bioskey(0);
}
return key;
}
int show(int key) {
int j = 39;
int i = 10;
int flag = 1;
clrscr();
gotoxy(j, i);
cprintf("*");
while(j < 80 && j > 0 && i > 0 && i < 26 && key != 283) {
if(key || bioskey(1)) {
flag = 0;
key = (key == 0 ? bioskey(0) : key);
flag = 0;
if(key == UP) {
key = up(&i, &j, key);
}
if(key == DOWN) {
key = down(&i, &j, key);
}
if(key == LEFT) {
key = left(&i, &j, key);
}
if(key == RIGHT) {
key = right(&i, &j, key);
}
if(key == ESC)
break;
}
if(flag) {
first(&i, &j);
}
}
return key;
}
int main() {
int key = 0;/*键盘输入的 */
key = show(key);
if(key != 283) {
clrscr();
gotoxy(25, 13);
printf("It is a pity,you have died!!!\n");
}
else{
clrscr();
gotoxy(40, 13);
printf("exited!\n");
}
getch();
return 0;
}