用c语言编的蓝天画面 很酷哦(不是我编的)

wednking 2002-12-01 06:53:24
#include "stdio.h"
#include "dos.h"
#include "math.h"
long Addr[768];
int Mode;
Set_Mode(int mode)
{
union REGS r;
r.h.ah=0;
r.h.al=mode;
int86(0x10,&r,&r);
}
Set_Graphics_Mode(unsigned x,unsigned y)
{
long i;
if((x<321)&&(y<201)){
Set_Mode (0x13);
Mode=0x13;
for(i=0;i<200;i++) Addr[i]=320*i;
}
else if((x<641)&&(y<401))
{ Set_Mode(0x5c);
Mode=0x5c;
for(i=0;i<400;i++)Addr[i]=640*i;
}
else
if((x<641)&&(y<481)){
Set_Mode(0x5d);
Mode=0x5d;
for(i=0;i<480;i++)Addr[i]=640*i;
}
else if((x<801)&&(y<601)){
Set_Mode(0x5e);
Mode=0x5e;
for(i=0;i<600;i++) Addr[i]=800*i;
}
else if((x<1025)&&(y<769)){
Set_Mode(0x62);
Mode=0x62;
for(i=0;i<768;i++) Addr[i]=1024*i;
}
else {Set_Mode(3);
printf("Not support this mode.\n");
getch();
}
}
set_pattern()
{
int i;
unsigned char pat[256][3];
struct SREGS inreg;
union REGS reg;
pat[0][0]=0;pat[0][1]=0;pat[0][2]=0;
for(i=1;i<=255;i++) {
pat[i][0]= (unsigned char)((float)(abs(i-127)*63)/127.0+0.5);
pat[i][1]= (unsigned char)((float)(abs(i-127)*63)/127.0+0.5);
pat[i][2]=63;
}
reg.x.ax=0x1012;
reg.x.bx=0;
reg.x.cx=256;
reg.x.dx=FP_OFF(pat);
inreg.es=FP_SEG(pat);
int86x(0x10,?,?,&inreg);
}
plot (int x,int y,unsigned char color)
{
long offset;
char Page;
unsigned char far *address;
switch(Mode) {
case 0x13:
offset=Addr[y]+x;
address=(unsigned char far *)(0xa0000000L+offset);
*address=color;
break;
case 0x5c:
case 0x5d:
case 0x5e:
offset=Addr[y]+x;
Page=(offset>>16);
outportb(0x3c4,0xe);
outportb(0x3c5,Page^0x02);
offset=offset&65535;
address=(unsigned char far *)(0xa0000000L+offset);
*address=color;
break;
}
}
get_pixel(int x,int y)
{
long offset;
char Page;
unsigned char far *address;
unsigned char color;
switch(Mode){
case 0x13:
offset=Addr[y]+x;
address=(unsigned char far *)(0xa0000000L+offset);
color=*address;
break;
case 0x5c:
case 0x5d:
case 0x5e:
offset=Addr[y]+x;
Page=(offset>>16);
outportb(0x3c4,0xe);
outportb(0x3c5,Page^0x02);
offset=offset&65535;
address=(unsigned char far *)(0xa0000000L+offset);
color =*address;
break;
case 0x62:
offset=Addr[y]+x;
Page=y>>6;
outportb(0x3c4,0xe);
outportb(0x3c5,Page^0x02);
offset=offset&65535;
address=(unsigned char far *)(0xa0000000L+offset);
color=*address;
break;


}
return(color);
}
randint(unsigned int range)
{
float sigma=423.1966;
static double OldRand=0.4231967;
double temp;
temp=sigma*OldRand;
OldRand=temp-(int)temp;
return (int)(OldRand*(float)range);
}
void New_Col(int xa,int ya,int x,int y,int xb,int yb)
{
unsigned int color;
color=abs(xa-xb)+abs(ya-yb);
color=randint(color<<1)-color;
color=color+(get_pixel(xa,ya)+get_pixel(xb,yb)+1)>>1;
if(color<1) color=1;
else if(color>255) color=255;
if((get_pixel(x,y)==0))plot(x,y,color);
}
void Sub_Divide(int x1,int y1,int x2,int y2)
{
int x,y;
unsigned char color;
if(!((x2-x1<2)&&(y2-y1<2))){
x=(x1+x2)>>1;
y=(y1+y2)>>1;
New_Col(x1,y1,x,y1,x2,y1);
New_Col(x2,y1,x2,y,x2,y2);
New_Col(x1,y2,x,y2,x2,y2);
New_Col(x1,y1,x1,y,x1,y2);
color=(get_pixel(x1,y1)+get_pixel(x2,y1)+get_pixel(x2,y2)+get_pixel(x1,y2)+2)>>2;
plot(x,y,color);
Sub_Divide(x1,y1,x,y);
Sub_Divide(x,y1,x2,y);
Sub_Divide(x,y,x2,y2);
Sub_Divide(x1,y,x,y2);
}
}
main()
{
int x,y;
x=320;y=200;
Set_Graphics_Mode(x,y);
set_pattern();
plot(0,0,randint(254)+1);
plot(x-1,0,randint(254)+1);
plot(x-1,y-1,randint(254)+1);
plot(0,y-1,randint(254)+1);
Sub_Divide(0,0,x-1,y-1);
getch();
Set_Mode(0x03);
}

...全文
101 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
mafuguo168 2002-12-04
  • 打赏
  • 举报
回复
搞不来哈,是不是C哈?
还是编译程序有问题啊!
feup 2002-12-03
  • 打赏
  • 举报
回复
to pick() 你已经介绍过了,
是的定义一个union regs outreg;
我就没说了。
earnest810 2002-12-02
  • 打赏
  • 举报
回复
to feup(乱弹琴)
还是运行不了 提示OUTREG没定义
关注中
youname123 2002-12-02
  • 打赏
  • 举报
回复
j是在那个网站的…………
boris_hz 2002-12-02
  • 打赏
  • 举报
回复
不错啊
pick 2002-12-02
  • 打赏
  • 举报
回复
earnest810(木容智)
"to feup(乱弹琴)
还是运行不了 提示OUTREG没定义
关注中"
你定义一个
union REGS outreg;



sylmoon 2002-12-02
  • 打赏
  • 举报
回复
UP
nothing707 2002-12-01
  • 打赏
  • 举报
回复
不幸~~~~
feup 2002-12-01
  • 打赏
  • 举报
回复
up,
我也试过了,在(TC2.0),
不过int86要改成int86x(0x10,®,&outreg,&inreg);
pick 2002-12-01
  • 打赏
  • 举报
回复
我试过了(TC3.0),就是分辨率低了一点,颜色也不是很鲜艳。
不过在上面的set_pattern()函数中(改函数最后一行),有一代码如下
int86x(0x10,?,?,&inreg);
把它改成
union REGS outreg;
int86(0x10,®,&outreg,&inreg);就行了。
yetze 2002-12-01
  • 打赏
  • 举报
回复
编译时出错:
REGS没有定义
SREGS没有定义
能不能把这个加上

winmains 2002-12-01
  • 打赏
  • 举报
回复
windows就是用C,汇编开发的
kuten 2002-12-01
  • 打赏
  • 举报
回复
不能通过编译呀?
skymost 2002-12-01
  • 打赏
  • 举报
回复
ASM做比这个简单不少 :-)
Perrin 2002-12-01
  • 打赏
  • 举报
回复
真的是C吗
我运行不出来
C也可以做出图形界面?

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧