金牛座对比蒙迪欧:请帮忙回答c设计报告问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/13 05:01:42
源程序如下:
#define UP 18432
#define DOWN 20480
#define LEFT 19200
#define RIGHT 19712
#define LU 7777
#define RU 8051
#define LD 11386
#define RD 11640
#define GAP 14624
#define NEXT 7181
#define BACK 20273
#define OVER 20530
#include <bios.h>
main()
{
struct point
{
int x,y;
}a;
int key;
a.x=40;
a.y=10;
clrscr();
gotoxy(a.x,a.y);
printf("*");
while(bioskey(1)==0)
{
key=bioskey(0);
switch(key)
{
case UP:{
a.y-=1;gotoxy(a.x,a.y);
printf("*");break;
}
case DOWN:{
a.y+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case LEFT:{
a.x-=1;gotoxy(a.x,a.y);
printf("*");break;
}
case RIGHT:{
a.x+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case LU:{
a.y-=1;a.x-=1;gotoxy(a.x,a.y);
printf("*");break;
}
case RU:{
a.y-=1;a.x+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case LD:{
a.x-=1;a.y+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case RD:{
a.x+=1;a.y+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case GAP:{
a.x+=1;gotoxy(a.x,a.y);
printf(" ");break;
}
}
问题:1.程序步骤内容:
2.分析(数学模型)
3.按功能划分模块;
4设计各模块算法(流程图)
并且请问如define up 18432中的数字是什么意思?
以上问题请诸位高手能回答几道答几道 谢谢

1.程序步骤内容:
a.首先清除屏幕,在(40,10)处画出一个*
b.等待键盘输入,如果有键盘输入则读入该键盘扫描码
c.根据键盘扫描码判断下一个*符号的位置:上下左右,左上,右上,左下,右下等.
d.程序一直在c.循环。
define up 18432定义了上箭头的扫描码。
至于:
2.分析(数学模型) :不存在什么数学模型
3.按功能划分模块; :上面流程已经给出模块了。
4设计各模块算法(流程图) :不好画的耶,画了你也看不到

1.让别人能看懂自己的程序。
2.是自己的程序的提纲,便于自己编程。
3.用微软的 visio 我写程序时的流程图都是用它画的,还有其他方面的图都可以用它。

Visio Viewer 2003 V2.0 简体中文版专业制作各类图纸的软件,例如程序流程图、网络拓扑图、数据分布图、地图、室内布置图、规划图、线路图等图纸的软件,包含了非常多的组件。 sn:WFDWY-XQXJF-RHRYG-BG7RQ-BBDHM
: WFDWY-XQXJF-RHRYG-BG7RQ-BBDHM

4.算法是解决问题所需操作步骤的集合,是程序设计的根本,就如同人们为了完成一件事情必须有一个正确的步骤一样.

算法的表示有三种,自然语言,流程图和伪码.

自然语言:来表示具有表示选择结构或循环结构算法时不方便且不清楚.
流程图:优点是直观容易看懂,不足之处就是比较费事.
伪码:非正式语言,采用文字和图形符号表示,介于自然语言和计算机语言,具备了自然语言的通俗易懂,同时兼备了计算机语言的简明紧凑,因此,编程人员常借助此方法完成算法设计.

例如:用伪码表示法,求5!

Begin
置P的初值为1
置i的初值为2
while i <= 5
p <- p * i
i <- i + 1
endwhile
打印P的值
END

*要求改进:用图形模式表示print()函数*/
#include <mem.h>
#include <fcntl.h>
#include <conio.h>
#include <graphics.h>
#include <io.h>chin a i t p oe er . co mugTTCrI

#include <stdlib.h>
#include <stdio.h>
#include <bios.h>
#include <math.h>
#define N 50
#define Time 10000
int A[N][N];
int IE=6;chin a i t p oe er . co mugTTCrI

int SCORE=0;
char a[]="9999";
void *ball;
int maxx;
unsigned int size;chin a i t p oe er . co mugTTCrI

int head=1;/*0,1,2,3*/
int i=3,j=0,ii=0,jj=0;
int length=3;
int x,y;/*蛇头标志*/
int add=1;/*食物标志*/
int tii,tjj;/* 前蛇尾坐标 */
void start_image()
{
setlinestyle(SOLID_LINE,1,2);
setcolor(GREEN);
line(39,39,39,441);
line(39,441,441,441);
line(441,441,441,39);
line(441,39,39,39);chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

}
void draw_image(int x,int y)
{
int i=x*400/N+40;
int j=y*400/N+40;
setfillstyle(1,4);
bar(j,i,j+400/N,i+400/N);
}
void eraser_image(int x,int y)
{
int i=x*400/N+40;
int j=y*400/N+40;
setfillstyle(1,0);
bar(j,i,j+400/N,i+400/N);
}chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

void tu()
{/*tuxing jiemian*/
maxx=getmaxx();
size=imagesize(210,390,450,420);
ball=malloc(size);
setfillstyle(1,10);
bar(160,170,473,253);
setfillstyle(1,9);
bar(163,173,470,250);
setcolor(13);
outtextxy(200,200,"Welcome to Greedy Snake Game");
setcolor(14);
outtextxy(250,220,"Developer :Wu siyuan ");
outtextxy(290,240,"2003.5");
outtextxy(210,390,"Press any key to contunue...");
getimage(210,390,450,420,ball);chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

while(!kbhit())
{/* 没有键盘击键 */
putimage(210,390,ball,XOR_PUT);
delay(30000);
}
cleardevice();
}
void print()/*输出*/
{ /*要将转化成图形模式*/
int a,b;
/*start_image(); */chin a i t p oe er . co mugTTCrI

for(a=0;a<N;a++)
{ for(b=0;b<N;b++)
{if(A[a][b]>1)draw_image(a,b);
if(A[a][b]==0)eraser_image(a,b); }chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

}
}chin a i t p oe er . co mugTTCrI

void snake() /*begin*/
{
int a,b;
for(a=0;a<N;a++)
for(b=0;b<N;b++)
A[a][b]=0;chin a i t p oe er . co mugTTCrI

A[i][j]=5;A[i-1][j]=4;A[i-2][j]=3;A[i-3][j]=2;
}
void del_tail()/*蛇尾的操作*/
{
int number=A[ii][jj];
tii=ii;tjj=jj;/*记录前蛇尾*/chin a i t p oe er . co mugTTCrI

while(1)
{
if(A[ii][jj-1]==number+1||A[ii][jj-1]==2&&number==30)
{jj--;break;}chin a i t p oe er . co mugTTCrI

if(A[ii][jj+1]==number+1||A[ii][jj+1]==2&&number==30)
{jj++;break;}chin a i t p oe er . co mugTTCrI

if(A[ii-1][jj]==number+1||A[ii-1][jj]==2&&number==30)
{ii--;break;}chin a i t p oe er . co mugTTCrI

if(A[ii+1][jj]==number+1||A[ii+1][jj]==2&&number==30)
{ii++;break;}chin a i t p oe er . co mugTTCrI

}
}chin a i t p oe er . co mugTTCrI

void down()
{
head=1;
if(A[i+1][j]>1&&A[i+1][j]!=99)
{printf("I hit myself!");exit(1);}
i++;
if(IE>30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;chin a i t p oe er . co mugTTCrI

}
void up()
{
head=0;
if(A[i-1][j]>1&&A[i-1][j]!=99)
{printf("I hit myself!");exit(1);}
i--;
if(IE>30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;chin a i t p oe er . co mugTTCrI

}
void left()
{
head=2;
if(A[i][j-1]>1&&A[i][j-1]!=99)
{printf("I hit myself!");exit(1);}
j--;
if(IE>30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;chin a i t p oe er . co mugTTCrI

}
void right()
{
head=3;
if(A[i][j+1]>1&&A[i][j+1]!=99)
{printf("I hit myself!");exit(1);}
j++;
if(IE>30)IE=2;
A[i][j]=IE;IE++;
del_tail();
A[tii][tjj]=0;
}chin a i t p oe er . co mugTTCrI

void test()/*测试是否到达边界*/
{
if(i<0||i>N-1||j<0||j>N-1)
{
printf("出界! Game over.");
exit(1);
}
}
void move()/*当前移动*/
{
switch(head)
{
case 0:up();break;
case 1:down();break;
case 2:left();break;
case 3:right();break;
/*default:printf("方向出错!\\n");*/
}chin a i t p oe er . co mugTTCrI

}
int keyboard()
{
/*判断是否有键盘输入
// 有返回值0,1,2,3
// int k=keyboard;
//判断方向是否是有效方向
//无效则什么也不做
//若方向有效则改变head的值*/
int a,key,h;
for(a=0;a<2;a++)
if(bioskey(1))break;
key=bioskey(0);chin a i t p oe er . co mugTTCrI

switch (key)
{
/*up*/
case 18432:h=0;break;
/*down*/
case 20480:h=1;break;
/*left*/
case 19200:h=2;break;
/*right*/
case 19712:h=3;break;
/*Esc*/
case 283:printf("You press the Esc key!");exit(1);break;
/*default: h=999 ;*/chin a i t p oe er . co mugTTCrI

}
return h;
}
void add_point()/* 用于产生食物 */
{chin a i t p oe er . co mugTTCrI

while(1){
x=random(100)%N;
y=random(100)%N;
if(A[x][y]==0)break;
}
A[x][y]=99;/*食物的标志是5*/chin a i t p oe er . co mugTTCrI

add=0;/* 加食物标志清0*/chin a i t p oe er . co mugTTCrI

}
void score()
{chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

setcolor(9);
settextstyle(3,0,4);
outtextxy(450,40,"Score:");chin a i t p oe er . co mugTTCrI

setcolor(RED);
outtextxy(450,200,"Speed:");chin a i t p oe er . co mugTTCrI

}
void number_char(int x)
{chin a i t p oe er . co mugTTCrI

int a0,a1,a2,a3;
if(x>9999){a[0]='9';a[1]='9';a[2]='9';a[3]='9';}
else {
a0=x/1000;
a[0]=a0+48;chin a i t p oe er . co mugTTCrI

a1=(x-a0*1000)/100;
a[1]=a1+48;chin a i t p oe er . co mugTTCrI

a2=(x-a0*1000-a1*100)/10;
a[2]=a2+48;chin a i t p oe er . co mugTTCrI

a3=(x-a0*1000-a1*100-a2*10);
a[3]=a3+48;
a[4]='\\0';chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

}
}chin a i t p oe er . co mugTTCrI

void snake_get()/*吃到食物时*/
{
if(i==x&&j==y)
{
length++;chin a i t p oe er . co mugTTCrI

A[tii][tjj]=A[ii][jj]-1;/*蛇尾加长*/chin a i t p oe er . co mugTTCrI

ii=tii;jj=tjj;/*蛇尾重新定义*/
add=1;/*食物标志置1*/
setfillstyle(1,BLACK);
bar(520,100,650,140);/*clear score*/
setcolor(3);
number_char(SCORE+=100);
outtextxy(550,100,a);chin a i t p oe er . co mugTTCrI

}chin a i t p oe er . co mugTTCrI

}chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

void main()
{
int get_head;/*定义键盘输入*/
int gd=DETECT,gm;
clrscr();chin a i t p oe er . co mugTTCrI

/*regibgiobjdriver(public name)*/
initgraph(&gd,&gm,"c:\\\\bgi");chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

setbkcolor(BLACK);chin a i t p oe er . co mugTTCrI

tu();
snake();/*初始化*/
start_image();
score();/*定义分数界面*/chin a i t p oe er . co mugTTCrI

while(1)
{ while(bioskey(1)==0)/*是否有键盘输入*/
{chin a i t p oe er . co mugTTCrI

if(add)add_point();/*是否可以增加食物*/chin a i t p oe er . co mugTTCrI

print();
move();
snake_get();/* 是否吃到食物 (test)*/
test();
delay(Time);
}
get_head=keyboard();
/* choose */chin a i t p oe er . co mugTTCrI

while(1){/*判断得到的坐标是否合法*/
if(get_head==0&&head==1)break;
if(get_head==1&&head==0)break;
if(get_head==2&&head==3)break;
if(get_head==3&&head==2)break;
else {head=get_head;break;}/*合法给head赋值*/
}chin a i t p oe er . co mugTTCrI

}chin a i t p oe er . co mugTTCrI

chin a i t p oe er . co mugTTCrI

}chin a i t p oe er . co mugTTCrI

#define UP 18432
#define DOWN 20480
#define LEFT 19200
#define RIGHT 19712
#define LU 7777
#define RU 8051
#define LD 11386
#define RD 11640
#define GAP 14624
#define NEXT 7181
#define BACK 20273
#define OVER 20530 //定义键值
#include <bios.h> //调用头文件,见参考资料
main()
{
struct point
{
int x,y;
}a; //定义坐标变量
int key; //定义键变量
a.x=40;
a.y=10; //坐标变量初始
clrscr(); //清屏
gotoxy(a.x,a.y); //移动光标到初始位置
printf("*"); //在初始位置打印星号
while(bioskey(1)==0) //当按键后
{
key=bioskey(0); //读取键值
switch(key)
{
case UP:{
a.y-=1;gotoxy(a.x,a.y);
printf("*");break;
}
case DOWN:{
a.y+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case LEFT:{
a.x-=1;gotoxy(a.x,a.y);
printf("*");break;
}
case RIGHT:{
a.x+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case LU:{
a.y-=1;a.x-=1;gotoxy(a.x,a.y);
printf("*");break;
}
case RU:{
a.y-=1;a.x+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case LD:{
a.x-=1;a.y+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case RD:{
a.x+=1;a.y+=1;gotoxy(a.x,a.y);
printf("*");break;
}
case GAP:{
a.x+=1;gotoxy(a.x,a.y);
printf(" ");break;
}
} //按键值移动光标并打印星号或空格

这是一个显示键盘操作效果的程序吧,敲了那个方向键,"*"符号就往哪个方向走,我不知道bioskey是什么函数,但是直觉上就是得到当前用户敲的键对应的键值,我猜想,18432可能是键盘上"向上的那个箭头"键对应的键值。
以上仅供参考

数学模型?没有必要吧!这个程序也就是初始化之后,先确定bioskey()的值来确定是否循环!由bioskey来确定下边是采取操作!如果bioskey为1,那么又根据你的按键来确定何种操作了!具体何种操作,那就不用我说了吧!up对应的那个数当然就是向上键对应的参数了!

呵呵 向你学习啊!