c gdi

时间:2024-06-20 20:06:08编辑:优化君

c#中GDI 如何用

不知道你说的GDI算不算GDI+。

这样说吧
======调用GDI+
很简单,System.Drawing命名空间就是为GDI+而设计的,用Graphics类进行Draw/Fill函数,就是调用GDI+

======调用GDI
NET中绘图多是GDI+的,但也有托管下的GDI函数,比如TextRender类就是GDI的,(因为GDI+的DrawString绘图不精准,因此NET 2.0引入了GDI的TextRender)

也可以直接调用Windows API中的GDI,用DllImport链接gdi32.dll,调用里面的函数就可以了。


GDI是什么发动机

是直喷式汽油机(缸内喷注式汽油发动机),起源于:日本三菱技术特征:低的燃油消耗、增大功率扭矩。GDI发动机的工作特点是,将燃油直接喷入气缸,利用缸内气流和活塞表面的燃料雾化效果达到燃烧的目的。GDI发动机在工作的均匀性及全负荷下的性能方面都有极佳的表现,而且使汽油机的冷车工作不稳定性问题也有了显著的改善。GDI发动机与一般汽油发动机的主要区别在于汽油喷射的位置,目前一般汽油发动机上所用的汽油电控喷射系统,是将汽油喷入进气歧管或进气管道上,与空气混合成混合气后再通过进气门进入气缸燃烧室内被点燃作功;而GDI缸内喷注式汽油发动机顾名思义是在气缸内喷注汽油,它将喷油嘴安装在燃烧室内,将汽油直接喷注在气缸燃烧室内,空气则通过进气门进入燃烧室与汽油混合成混合气被点燃作功。扩展资料:GDI发动机采用直立进气使得进气阻力减小, 同时进气行程中燃油直接喷射使进气冷却, 因而提高了进气效率, 由于采用缸内直喷, 燃油在燃烧室内气化, 气化热冷却了吸入的空气, 使空气密度增加;同时, 汽油在气缸内气化也冷却了燃烧室, 从而降低了发动机的爆震倾向, 这样在设计发动机时便可提高压缩比(有的可达12)。在超稀薄燃烧时, 喷油时刻为压缩行程后点火前, 此时气缸内空气密度高, 燃油经高压喷嘴喷入后容易雾化;又由于活塞曲顶的作用, 使得混合气形成涡流并呈层状分布, 即混合涡流上行时靠近火花塞部分的混合气浓度高, 而远离火花塞部分的浓度低。参考资料:GDI发动机-百度百科


什么是GDI

两个意思,一个是图形设备接口的英文缩写;另一个是全球防卫组织。GDI(全球防卫组织):全球防御组织是世界上最发达国家的军事化国际联盟,由Westwood Studios(后来的EA)为美国的个人电脑发行了一系列即时战略游戏“命令与征服”,与凯恩领导的NOD兄弟会和入侵地球的思金人斗争。GDI(图形设备接口):GDI的主要任务是在系统和绘图程序之间交换信息,并处理所有Windows程序的图形输出。在Windows操作系统下,大多数具有图形界面的应用程序都离不开GDI。借助GDI提供的功能,图形和文本可以轻松地输出到屏幕、打印机和其他输出设备上。扩展资料:GDI(图形设备接口)的特点:1、不允许程序直接访问物理显示硬件,通过称为“设备环境”的抽象接口间接访问显示硬件;2、程序需要与显示硬件(显示器、打印机等) 进行通讯时,必须首先获得与特定窗口相关联的设备环境;3、用户无需关心具体的物理设备类型;4、Windows参考设备环境的数据结构完成数据的输出。参考资料来源:百度百科-GDI 参考资料来源:百度百科-全球防卫组织

GDI和DX是什么关系

GDI(Graphics Deveice Interface,图形设备接口),利用GDI编程,可以不考虑硬件的具体特性,直接调用Windows API中的图形处理函数处理当前DC即可。这的确很方便,但却是以降低处理速度为代价。因为它不能直接访问硬件,需要通过操作系统间接访问。
Microfost 为迎合市场需求,推出了DirectX。它既能像Windows GDI一样使用方便,又可以直接对硬件抽象层HALL(Hardware Abstranaction Layer)操作,速度比GDI快得多。DirectX 主要包括 DirectDraw Direct3D DirectMusic DirectPaly DirectInput DirectSetup七部分。
也就是说DirectX是GDI的升级。


windows gdi是什么?

GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。
  在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。
  GDI具有如下特点: 1. 不允许程序直接访问物理显示硬件,通过称为“设备环境”的抽象接口间接访问显示硬件;
  2. 程序需要与显示硬件(显示器、打印机等) 进行通讯时,必须首先获得与特定窗口相关联的设备环境;
  3. 用户无需关心具体的物理设备类型;
  4. Windows参考设备环境的数据结构完成数据的输出。


什么是GDI对象?

GDI是图形设备接口(Graphics Device Interface, 或Graphical Device Interface)的简称,它是微软公司的视窗操作系统(Microsoft Windows)的三大内核部件(也称“子系统”)之一。

GDI是微软视窗系统(Microsoft Windows)表征图形对象及将其传送给诸如显示器、打印机之类输出设备的标准。

在DOS时期,应用程序如果要对于显示设备做输出的话,必须使用INT 10[1],或对于VGA卡直接I/O,或直接对VRAM所在的记忆体位置作填值。但VGA卡当时日新月异,各家的VGA卡在其I/O ports的定义并不一致,虽中间有推出一个名为VESA SVGA的显卡驱动程序的共用标准,但由于DOS时先天的64KB的分页限制,仍有许多不便。

Microsoft在开发Windows时,发现这个问题,于是决定打造一个GDI子系统,将显示设备改以API的方式进行操作,以便将各VGA卡的差异通过各VGA卡厂商自行制作的驱动程序来衔接GDI,来打消各VGA卡在操作上的彼此差异。

但Microsoft很快就被其他的程序开发者告知,GDI太慢了,因此Microsoft就再出一个WING[2]用于Windows 3.0/3.1,让应用程序能够直接对VRAM进行填值,以加速绘图的相关计算。

后来,Microsoft再推 .Net Framework,又再把 GDI 用 .Net Framework方式进行封装,可是由于GDI本身的限制,再加上Microsoft自己在MSDN Library上面用来写着爽的文件(有些功能已有技术文件,但从未实做出可用之功能过),再加上GDI+在图形计算与显示很慢,以及GDI+先后饱受远程代码运行的漏洞的困扰,因此GDI+无法成为Microsoft在图形子系统的主流。

再后来,DirectX 10进入XNA的时代,XNA是以DirectX的COM为基础,以.Net Framework方式进行封装,所以XNA身兼DirectX的效能与.Net Framework的使用便利性。XNA目前被应用于XBOX系列的游戏主机上,已成为新一代的图形子系统的主流。


c++中调用了GDI+画图,但是不知道怎么释放Bitmap资源

c++中调用了GDI+画图,但是不知道怎么释放Bitmap资源
1?C语言简洁、紧凑,使用方便、灵活。ANSI C一共只有32个关键字:
auto break case char const continue default
do double else enum extern float for
goto if int long register return short
signed static sizof struct switch typedef union
unsigned void volatile while
9种控制语句,程序书写自由,主要用小写字母表示,压缩了一切不必要的成分。
Turbo C扩充了11个关键字:
asm _cs _ds _es _ss cdecl far
huge interrupt near pascal
注意:在C语言中,关键字都是小写的。


VC++图像处理中对BItmap文件结构的读取

如果位图已经通过LoadBitmap加载到内存,则内存中的图像与显示设备紧密相关,比如原图是彩色图片,显示器是黑白色,通过bmp.LoadBitmap(我的图片)后,内存中的图像数据是黑白色的数据,而且还与显示器位数有关。如果需要在原位图数据上进行图像处理,就不要bmp.LoadBitmap来加载位图,而是打开文件获取位图数据。如果仅仅是在当前显示设备下进行效果处理,则可以使用bmp.LoadBitmap加载位图,通过CBitmap的GetBitmapBit函数可以获取位图数据,如果是24位显示器,则每3个字节表示一个像素,其中第一个字节是B,第二个字节是G,第3个字节是R;如果是32位的显示器,每4个字节表示一个像素,一般前3个字节与24位显示器一样,第4个字节一般没有什么意义。Microsoft Visual C++,(简称Visual C++、MSVC、VC++或VC)是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。它以拥有“语法高亮”,IntelliSense(自动完成功能)以及高级除错功能而著称。比如,它允许用户进行远程调试,单步执行等。还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。这些特征明显缩短程式编辑、编译及连结花费的时间,在大型软件计划上尤其显著。

求一个用C语言编写的小游戏代码

#include
#include
#include



/////////////////////////////////////////////
// 定义常量、枚举量、结构体、全局变量
/////////////////////////////////////////////

#defineWIDTH10// 游戏区宽度
#defineHEIGHT22// 游戏区高度
#defineSIZE20// 每个游戏区单位的实际像素

// 定义操作类型
enum CMD
{
CMD_ROTATE,// 方块旋转
CMD_LEFT, CMD_RIGHT, CMD_DOWN,// 方块左、右、下移动
CMD_SINK,// 方块沉底
CMD_QUIT// 退出游戏
};

// 定义绘制方块的方法
enum DRAW
{
SHOW,// 显示方块
HIDE,// 隐藏方块
FIX// 固定方块
};

// 定义七种俄罗斯方块
struct BLOCK
{
WORD dir[4];// 方块的四个旋转状态
COLORREF color;// 方块的颜色
}g_Blocks[7] = {{0x0F00, 0x4444, 0x0F00, 0x4444, RED},// I
{0x0660, 0x0660, 0x0660, 0x0660, BLUE},// 口
{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA},// L
{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW},// 反L
{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN},// Z
{0x0360, 0x4620, 0x0360, 0x4620, GREEN},// 反Z
{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}};// T

// 定义当前方块、下一个方块的信息
struct BLOCKINFO
{
byte id;// 方块 ID
char x, y;// 方块在游戏区中的坐标
byte dir:2;// 方向
}g_CurBlock, g_NextBlock;

// 定义游戏区
BYTE g_World[WIDTH][HEIGHT] = {0};



/////////////////////////////////////////////
// 函数声明
/////////////////////////////////////////////

void Init();// 初始化游戏
void Quit();// 退出游戏
void NewGame();// 开始新游戏
void GameOver();// 结束游戏
CMD GetCmd();// 获取控制命令
void DispatchCmd(CMD _cmd);// 分发控制命令
void NewBlock();// 生成新的方块
bool CheckBlock(BLOCKINFO _block);// 检测指定方块是否可以放下
void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW);// 画方块
void OnRotate();// 旋转方块
void OnLeft();// 左移方块
void OnRight();// 右移方块
void OnDown();// 下移方块
void OnSink();// 沉底方块



/////////////////////////////////////////////
// 函数定义
/////////////////////////////////////////////

// 主函数
void main()
{
Init();

CMD c;
while(true)
{
c = GetCmd();
DispatchCmd(c);

// 按退出时,显示对话框咨询用户是否退出
if (c == CMD_QUIT)
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)
Quit();
}
}
}


// 初始化游戏
void Init()
{
initgraph(640, 480);
srand((unsigned)time(NULL));

// 显示操作说明
setfont(14, 0, _T("宋体"));
outtextxy(20, 330, _T("操作说明"));
outtextxy(20, 350, _T("上:旋转"));
outtextxy(20, 370, _T("左:左移"));
outtextxy(20, 390, _T("右:右移"));
outtextxy(20, 410, _T("下:下移"));
outtextxy(20, 430, _T("空格:沉底"));
outtextxy(20, 450, _T("ESC:退出"));

// 设置坐标原点
setorigin(220, 20);

// 绘制游戏区边界
rectangle(-1, -1, WIDTH * SIZE, HEIGHT * SIZE);
rectangle((WIDTH + 1) * SIZE - 1, -1, (WIDTH + 5) * SIZE, 4 * SIZE);

// 开始新游戏
NewGame();
}


// 退出游戏
void Quit()
{
closegraph();
exit(0);
}


// 开始新游戏
void NewGame()
{
// 清空游戏区
setfillstyle(BLACK);
bar(0, 0, WIDTH * SIZE - 1, HEIGHT * SIZE - 1);
ZeroMemory(g_World, WIDTH * HEIGHT);

// 生成下一个方块
g_NextBlock.id = rand() % 7;
g_NextBlock.dir = rand() % 4;
g_NextBlock.x = WIDTH + 1;
g_NextBlock.y = HEIGHT - 1;

// 获取新方块
NewBlock();
}


// 结束游戏
void GameOver()
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("游戏结束。\n您想重新来一局吗?"), _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)
NewGame();
else
Quit();
}


// 获取控制命令
DWORD m_oldtime;
CMD GetCmd()
{
// 获取控制值
while(true)
{
// 如果超时,自动下落一格
DWORD newtime = GetTickCount();
if (newtime - m_oldtime >= 500)
{
m_oldtime = newtime;
return CMD_DOWN;
}

// 如果有按键,返回按键对应的功能
if (kbhit())
{
switch(getch())
{
case 'w':
case 'W':return CMD_ROTATE;
case 'a':
case 'A':return CMD_LEFT;
case 'd':
case 'D':return CMD_RIGHT;
case 's':
case 'S':return CMD_DOWN;
case 27:return CMD_QUIT;
case ' ':return CMD_SINK;
case 0:
case 0xE0:
switch(getch())
{
case 72:return CMD_ROTATE;
case 75:return CMD_LEFT;
case 77:return CMD_RIGHT;
case 80:return CMD_DOWN;
}
}
}

// 延时 (降低 CPU 占用率)
Sleep(20);
}
}


// 分发控制命令
void DispatchCmd(CMD _cmd)
{
switch(_cmd)
{
case CMD_ROTATE:OnRotate();break;
case CMD_LEFT:OnLeft();break;
case CMD_RIGHT:OnRight();break;
case CMD_DOWN:OnDown();break;
case CMD_SINK:OnSink();break;
case CMD_QUIT:break;
}
}


// 生成新的方块
void NewBlock()
{
g_CurBlock.id = g_NextBlock.id,g_NextBlock.id = rand() % 7;
g_CurBlock.dir = g_NextBlock.dir,g_NextBlock.dir = rand() % 4;
g_CurBlock.x = (WIDTH - 4) / 2;
g_CurBlock.y = HEIGHT + 2;

// 下移新方块直到有局部显示
WORD c = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
while((c & 0xF) == 0)
{
g_CurBlock.y--;
c >>= 4;
}

// 绘制新方块
DrawBlock(g_CurBlock);

// 绘制下一个方块
setfillstyle(BLACK);
bar((WIDTH + 1) * SIZE, 0, (WIDTH + 5) * SIZE - 1, 4 * SIZE - 1);
DrawBlock(g_NextBlock);

// 设置计时器,用于判断自动下落
m_oldtime = GetTickCount();
}


// 画方块
void DrawBlock(BLOCKINFO _block, DRAW _draw)
{
WORD b = g_Blocks[_block.id].dir[_block.dir];
int x, y;

int color = BLACK;
switch(_draw)
{
case SHOW: color = g_Blocks[_block.id].color; break;
case HIDE: color = BLACK;break;
case FIX: color = g_Blocks[_block.id].color / 3; break;
}
setfillstyle(color);

for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _block.x + i % 4;
y = _block.y - i / 4;
if (y < HEIGHT)
{
if (_draw != HIDE)
bar3d(x * SIZE + 2, (HEIGHT - y - 1) * SIZE + 2, (x + 1) * SIZE - 4, (HEIGHT - y) * SIZE - 4, 3, true);
else
bar(x * SIZE, (HEIGHT - y - 1) * SIZE, (x + 1) * SIZE - 1, (HEIGHT - y) * SIZE - 1);
}
}
b <<= 1;
}
}


// 检测指定方块是否可以放下
bool CheckBlock(BLOCKINFO _block)
{
WORD b = g_Blocks[_block.id].dir[_block.dir];
int x, y;

for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _block.x + i % 4;
y = _block.y - i / 4;
if ((x = WIDTH) || (y < 0))
return false;

if ((y < HEIGHT) && (g_World[x][y]))
return false;
}
b <<= 1;
}

return true;
}


// 旋转方块
void OnRotate()
{
// 获取可以旋转的 x 偏移量
int dx;
BLOCKINFO tmp = g_CurBlock;
tmp.dir++;if (CheckBlock(tmp)){dx = 0;goto rotate;}
tmp.x = g_CurBlock.x - 1;if (CheckBlock(tmp)){dx = -1;goto rotate;}
tmp.x = g_CurBlock.x + 1;if (CheckBlock(tmp)){dx = 1;goto rotate;}
tmp.x = g_CurBlock.x - 2;if (CheckBlock(tmp)){dx = -2;goto rotate;}
tmp.x = g_CurBlock.x + 2;if (CheckBlock(tmp)){dx = 2;goto rotate;}
return;

rotate:
// 旋转
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.dir++;
g_CurBlock.x += dx;
DrawBlock(g_CurBlock);
}


// 左移方块
void OnLeft()
{
BLOCKINFO tmp = g_CurBlock;
tmp.x--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.x--;
DrawBlock(g_CurBlock);
}
}


// 右移方块
void OnRight()
{
BLOCKINFO tmp = g_CurBlock;
tmp.x++;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.x++;
DrawBlock(g_CurBlock);
}
}


// 下移方块
void OnDown()
{
BLOCKINFO tmp = g_CurBlock;
tmp.y--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlock.y--;
DrawBlock(g_CurBlock);
}
else
OnSink();// 不可下移时,执行“沉底方块”操作
}


// 沉底方块
void OnSink()
{
int i, x, y;

// 连续下移方块
DrawBlock(g_CurBlock, HIDE);
BLOCKINFO tmp = g_CurBlock;
tmp.y--;
while (CheckBlock(tmp))
{
g_CurBlock.y--;
tmp.y--;
}
DrawBlock(g_CurBlock, FIX);

// 固定方块在游戏区
WORD b = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
for(i = 0; i < 16; i++)
{
if (b & 0x8000)
{
if (g_CurBlock.y - i / 4 >= HEIGHT)
{// 如果方块的固定位置超出高度,结束游戏
GameOver();
return;
}
else
g_World[g_CurBlock.x + i % 4][g_CurBlock.y - i / 4] = 1;
}

b <<= 1;
}

// 检查是否需要消掉行,并标记
int row[4] = {0};
bool bRow = false;
for(y = g_CurBlock.y; y >= max(g_CurBlock.y - 3, 0); y--)
{
i = 0;
for(x = 0; x < WIDTH; x++)
if (g_World[x][y] == 1)
i++;
if (i == WIDTH)
{
bRow = true;
row[g_CurBlock.y - y] = 1;
setfillstyle(WHITE, DIAGCROSS2_FILL);
bar(0, (HEIGHT - y - 1) * SIZE + SIZE / 2 - 2, WIDTH * SIZE - 1, (HEIGHT - y - 1) * SIZE + SIZE / 2 + 2);
}
}

if (bRow)
{
// 延时 200 毫秒
Sleep(200);

// 擦掉刚才标记的行
IMAGE img;
for(i = 0; i < 4; i++)
{
if (row[i])
{
for(y = g_CurBlock.y - i + 1; y < HEIGHT; y++)
for(x = 0; x < WIDTH; x++)
{
g_World[x][y - 1] = g_World[x][y];
g_World[x][y] = 0;
}

getimage(&img, 0, 0, WIDTH * SIZE, (HEIGHT - (g_CurBlock.y - i + 1)) * SIZE);
putimage(0, SIZE, &img);
}
}
}

// 产生新方块
NewBlock();
}


求C语言小游戏源程序

  我的楼主可以自己玩一下
  试试吧
  #define N 200
  #include
  #include
  #include
  #define LEFT 0x4b00
  #define RIGHT 0x4d00
  #define DOWN 0x5000
  #define UP 0x4800
  #define ESC 0x011b
  int i,key;
  int score=0;/*得分*/
  int gamespeed=50000;/*游戏速度自己调整*/
  struct Food
  {
  int x;/*食物的横坐标*/
  int y;/*食物的纵坐标*/
  int yes;/*判断是否要出现食物的变量*/
  }food;/*食物的结构体*/
  struct Snake
  {
  int x[N];
  int y[N];
  int node;/*蛇的节数*/
  int direction;/*蛇移动方向*/
  int life;/* 蛇的生命,0活着,1死亡*/
  }snake;
  void Init(void);/*图形驱动*/
  void Close(void);/*图形结束*/
  void DrawK(void);/*开始画面*/
  void GameOver(void);/*结束游戏*/
  void GamePlay(void);/*玩游戏具体过程*/
  void PrScore(void);/*输出成绩*/
  /*主函数*/
  void main(void)
  {
  Init();/*图形驱动*/
  DrawK();/*开始画面*/
  GamePlay();/*玩游戏具体过程*/
  Close();/*图形结束*/
  }
  /*图形驱动*/
  void Init(void)
  {
  int gd=DETECT,gm;
  initgraph(&gd,&gm,"c:\\tc");
  cleardevice();
  }
  /*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/
  void DrawK(void)
  {
  /*setbkcolor(LIGHTGREEN);*/
  setcolor(11);
  setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/
  for(i=50;i<=600;i+=10)/*画围墙*/
  {
  rectangle(i,40,i+10,49); /*上边*/
  rectangle(i,451,i+10,460);/*下边*/
  }
  for(i=40;i<=450;i+=10)
  {
  rectangle(50,i,59,i+10); /*左边*/
  rectangle(601,i,610,i+10);/*右边*/
  }
  }
  /*玩游戏具体过程*/
  void GamePlay(void)
  {
  randomize();/*随机数发生器*/
  food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
  snake.life=0;/*活着*/
  snake.direction=1;/*方向往右*/
  snake.x[0]=100;snake.y[0]=100;/*蛇头*/
  snake.x[1]=110;snake.y[1]=100;
  snake.node=2;/*节数*/
  PrScore();/*输出得分*/
  while(1)/*可以重复玩游戏,压ESC键结束*/
  {
  while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
  {
  if(food.yes==1)/*需要出现新食物*/
  {
  food.x=rand()%400+60;
  food.y=rand()%350+60;
  while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
  food.x++;
  while(food.y%10!=0)
  food.y++;
  food.yes=0;/*画面上有食物了*/
  }
  if(food.yes==0)/*画面上有食物了就要显示*/
  {
  setcolor(GREEN);
  rectangle(food.x,food.y,food.x+10,food.y-10);
  }
  for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/
  {
  snake.x[i]=snake.x[i-1];
  snake.y[i]=snake.y[i-1];
  }
  /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/
  switch(snake.direction)
  {
  case 1:snake.x[0]+=10;break;
  case 2: snake.x[0]-=10;break;
  case 3: snake.y[0]-=10;break;
  case 4: snake.y[0]+=10;break;
  }
  for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/
  {
  if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])
  {
  GameOver();/*显示失败*/
  snake.life=1;
  break;
  }
  }
  if(snake.x[0]595||snake.y[0]<55||
  snake.y[0]>455)/*蛇是否撞到墙壁*/
  {
  GameOver();/*本次游戏结束*/
  snake.life=1; /*蛇死*/
  }
  if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/
  break;
  if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
  {
  setcolor(0);/*把画面上的食物东西去掉*/
  rectangle(food.x,food.y,food.x+10,food.y-10);
  snake.x[snake.node]=-20;snake.y[snake.node]=-20;
  /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
  snake.node++;/*蛇的身体长一节*/
  food.yes=1;/*画面上需要出现新的食物*/
  score+=10;
  PrScore();/*输出新得分*/
  }
  setcolor(4);/*画出蛇*/
  for(i=0;i<snake.node;i++)
  rectangle(snake.x[i],snake.y[i],snake.x[i]+10,
  snake.y[i]-10);
  delay(gamespeed);
  setcolor(0);/*用黑色去除蛇的的最后一节*/
  rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
  snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);
  } /*endwhile(!kbhit)*/
  if(snake.life==1)/*如果蛇死就跳出循环*/
  break;
  key=bioskey(0);/*接收按键*/
  if(key==ESC)/*按ESC键退出*/
  break;
  else
  if(key==UP&&snake.direction!=4)
  /*判断是否往相反的方向移动*/
  snake.direction=3;
  else
  if(key==RIGHT&&snake.direction!=2)
  snake.direction=1;
  else
  if(key==LEFT&&snake.direction!=1)
  snake.direction=2;
  else
  if(key==DOWN&&snake.direction!=3)
  snake.direction=4;
  }/*endwhile(1)*/
  }
  /*游戏结束*/
  void GameOver(void)
  {
  cleardevice();
  PrScore();
  setcolor(RED);
  settextstyle(0,0,4);
  outtextxy(200,200,"GAME OVER");
  getch();
  }
  /*输出成绩*/
  void PrScore(void)
  {
  char str[10];
  setfillstyle(SOLID_FILL,YELLOW);
  bar(50,15,220,35);
  setcolor(6);
  settextstyle(0,0,2);
  sprintf(str,"score:%d",score);
  outtextxy(55,20,str);
  }
  /*图形结束*/
  void Close(void)
  {
  getch();
  closegraph();
  }


如何学习C语言?

学习方法是:1、课前预习,课后复习,认真做课堂、课后的作业,理解理论知识。2、记住语法规则。3、加强逻辑思维。4、多动手,通过练习上机了解它的运行过程。5、实践—>理论—>再实践,刚开始学习C语言时,按示例练习,并推动理论的学习,然后再自己多思考,多上机实践。拓展资料C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。参考资料:c语言_百度百科 网页链接

C语言怎么学

相对于其他编程语言,C语言还是比较难的。初学者需要注意一下几点:
一是学习顺序
先从熟悉简单的C语言语法开始入门,然后再循序渐进,学习C++语法,WIN32、MFC、QT、网络编程,数据库、数据结构、算法、COM、STL等。构建一个完整的C语言知识体系。这需要一个比较漫长的学习积累的过程。语法入门部分大概2-3个月,其他部分需要学习和工作中慢慢理解和消化了。
二是学习方法
人的知识80%是通过眼睛获取的,但是学习编程有所不同,除了看书、看视频之外,关键是要勤动手,勤动脑。通过做大量的练习、项目实战不断积累代码量。只有代码量足够多了,项目做的多了,才能算是真正学会了。项目能否完成,就是衡量是否学会的唯一标准。后期就是代码的质量和优化问题了,这个只能在项目工作中慢慢积累经验了。
最后强调一点,很多人学不会编程是因为掉坑里了。就是教程或者书上的知识点之间跨越太大,作为一个初学者很难自己摸索出来,前面的知识点没有掌握,接着学习后面的知识,肯定是学不会了。目前绝大多数编程书籍和教程或多或少都有这样的弊端。自学能力比较强的人可以通过各种方法,参考各种网上的资料自己解决。但是大多数自学能力不是很强的人,只能依赖老师、同学、同事或者朋友帮忙指导,或者报名培训机构,老师指导完成了。学习编程通常需要一些好的学习资料,包括纸质的书籍,视频教程,课件,项目练习,代码。零基础入门的书籍推荐《明解C语言》、《C Primer Plus》,还有一本非常特别的汇编和C语言正向逆向结合的书编程达人内部教材《汇编、C语言基础教程》也非常不错,讲解汇编和C语言的本质非常透彻,非常细致。视频资料也是特别多了,各种视频网站、论坛、自媒体都有,比如网易课堂、腾讯课堂、慕客网这些。还有一些论坛,比如CSDN、编程中国等。最重要的一点就是答疑服务,推荐爱达人的网站也很不错,从零基础入门到应用课程,配套的视频、课件、代码、项目、答疑服务都有,还可以兼职接单,学以致用。


上一篇:俊升

下一篇:estas tonne