求一个用C语言绘制的图形代码

求一个用C语言绘制的图形代码,第1张

在DOS模式下,可以用C自带的图形函数:graphicsh

在WINDOWS模式里,用GDI函数或者DIRECTDROW、OPENGL函数

总之自己编写直接访问硬件的图形代码是不切实际的,除非你是硬件厂家的驱动编写人员。

如果你学过C,就会很容易编写出简单的图形代码的。

#include <windowsh>

#include <conioh>

#include <string>

#include <timeh>

#include <iostream>

#define up 72

#define down 80

#define left 75

#define right 77

#define esc 27

using namespace std;//-----------------------

// 重要数据定义

typedef struct m_point { //控制台中的坐标点定义, 其中0<=x<=24, 0<=y<79

int x;

int y;

}m_point;

typedef struct block { //方块定义, 一个方块有四个点, 例如: ■■■

// ■

m_point opt;

m_point pt2;

m_point pt3;

m_point pt4;

}block;

block bloary[6][4]; //方块数组,一共有6种,每种有4个方向

bool scrop[15][10]; //游戏空间定义,初始值全标记为0,向屏幕打印蓝色方块,

//如果标记为1,则向屏幕找印深蓝色方块

// 数据定义完毕//---------------------------

// 功能函数声明

void begin(); //开始函数

void color(int n_color); //设置字符颜色

int getrand(int max); //获得不大于max的随机数

void go(int x, int y); //使光移动到指定位置

void show_unit(); //输出 ■ 字符

char getudlr(); //接受键盘上的上下左右及回车键并返回相应字符 u d l r k

void show_block(block b); //输出方块

void init(); //初始化block bloary[6][4]数组

void show_scrop(); //根据scrop[15][10]的值打印相应颜色的方块

bool isexist(block b); //判断当前方块中的四个坐标是否在游戏空间中被标记为 1

void markspace(block b); //当方块停留时,把方块四个点的坐标在游戏空间数组scrop[][]中的相应位置标记为1

void move_block(block &b, char ch, int &lark); //移动方块

void change_block(block &b, int i, int &j, int lark); //改变当前方块的方向,注:一共有四个方向

void check(int &score); //消行函数

void wait(float secs); //让程序等待secs秒

void othergetch(); //起暂停功能

void out(char chars, int n); //相当于C++中的cout功能

void initb(int optx, int opty, //容易看出这个函数中传递了8个int值,分别用于这四点的横坐标和纵坐标,

//另外bloc是一个block结构体,block结构体中含有8个int值来表示方块的4个点

int pt2x, int pt2y,

int pt3x, int pt3y,

int pt4x, int pt4y,

block &bloc);

// 功能函数声明完毕

void show_unit2()

{

WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE)," ",2,0,0);

}

void show_block2(block b)

{

go(boptx, bopty);

show_unit2();

go(bpt2x, bpt2y);

show_unit2();

go(bpt3x, bpt3y);

show_unit2();

go(bpt4x, bpt4y);

show_unit2();

}

int main()

{

system("color ec");

system("title 俄罗斯方块");

color(0xec);

go(33,2);

out("制作人:赵晨晔",22);

go(33,3);

out("游戏规则:",10);

go(33,4);

out("1按左右下键进行移动",20);

go(33,5);

out("2按向上键改变形状",18);

go(10,0);

for (int ckh=0; ckh<15; ckh++)

{

go(20,ckh);

cout<<"║";

}

go(0,15);

cout<<"══════════■";

begin();

return 0;

}// 以下是功能函数定义部分

void begin()

{

init();

static int score = 0;

for(int i=0; i<15; i++)

for(int j=0; j<10; j++)

scrop[i][j]=0;

int lev=0;

cout<<"请输入速度(1~9)";

cin>>lev;

while(1)

{

block b;

int lark=1;

int i=getrand(6);

int j=getrand(4);

go(20,21);

b = bloary[i][j];

show_scrop();

show_block(b);

if(isexist(b))

{

system("cls");

go(37,12);

out("失败,结束!",10);

othergetch();

exit(-1);

} while(lark!=0)

{

show_scrop();

show_block(b);

int delay=10lev;

int max_delay=100;

char ch='\0';

while(delay<max_delay)

{

if(_kbhit())

{

int key=_getch();

switch (key)

{

case up:

show_block2(b);

change_block(b, i, j, lark);

show_block(b);

break;

case down:

ch='d';

delay=max_delay;

break;

case left:

ch='l';

show_block2(b);

move_block(b, ch, lark);

show_block(b);

break;

case right:

ch='r';

show_block2(b);

move_block(b, ch, lark);

show_block(b);

break;

case esc:

exit(-1);

break;

}

}

_sleep(3);

delay++;

}

if (ch='d'){

show_block2(b);

move_block(b,ch,lark);

show_block(b);

}

}

if(lark==0)

{

markspace(b);

}

check(score);

}

}// 函数作用:初始化bloary[6][4]数组,这个数组表示16个方块的结构体,具体是,

// 一共有6种方块,每种方块又有4种不同的方向(也就是种不同的形状)

// 其中initb函数将在下面定义

void init(){

////////////////////////////////////////////////////////////

// initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][0]); /////

// initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][1]); /////

// initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][2]); /////

// initb(2, 1, 0, 0, 2, 0, 0, 1, bloary[0][3]); /////

// initb(2, 1, 0, 1, 4, 1, 6, 1, bloary[1][0]); /////

// initb(2, 1, 2, 0, 2, 2, 2, 3, bloary[1][1]); /////

// initb(2, 1, 0, 1, 4, 1, 6, 1, bloary[1][2]); /////

// initb(2, 1, 2, 0, 2, 2, 2, 3, bloary[1][3]); /////

// initb(2, 1, 0, 0, 0, 1, 4, 1, bloary[2][0]); /////

// initb(2, 1, 2, 0, 4, 0, 2, 2, bloary[2][1]); /////

// initb(2, 1, 0, 1, 4, 1, 4, 2, bloary[2][2]); /////

// initb(2, 1, 2, 0, 0, 2, 2, 2, bloary[2][3]); /////

// initb(2, 1, 4, 0, 0, 1, 4, 1, bloary[3][0]); /////

// initb(2, 1, 2, 0, 2, 2, 4, 2, bloary[3][1]); /////

// initb(2, 1, 0, 1, 4, 1, 0, 2, bloary[3][2]); /////

// initb(2, 1, 0, 0, 2, 0, 2, 2, bloary[3][3]); /////

// initb(2, 1, 2, 0, 0, 1, 4, 1, bloary[4][0]); /////

// initb(2, 1, 2, 0, 4, 1, 2, 2, bloary[4][1]); /////

// initb(2, 1, 0, 1, 4, 1, 2, 2, bloary[4][2]); /////

// initb(2, 1, 2, 0, 0, 1, 2, 2, bloary[4][3]); /////

// initb(2, 1, 2, 0, 4, 0, 0, 1, bloary[5][0]); /////

// initb(2, 1, 2, 0, 4, 1, 4, 2, bloary[5][1]); /////

// initb(2, 1, 2, 0, 4, 0, 0, 1, bloary[5][2]); /////

// initb(2, 1, 2, 0, 4, 1, 4, 2, bloary[5][3]); /////

////////////////////////////////////////////////////////////

}

// 函数作用:初始化方块,一个方块具有四个坐标,如 ■■■

// ■

// 容易看出这个函数中传递了8个int值,分别用于这四点的横坐标和纵坐标,

// 另外bloc是一个block结构体,block结构体中含有8个int值来表示方块的4个点

void initb(int optx, int opty,

int pt2x, int pt2y,

int pt3x, int pt3y,

int pt4x, int pt4y,

block &bloc)

{

blocoptx = optx;

blocopty = opty;

blocpt2x = pt2x;

blocpt2y = pt2y;

blocpt3x = pt3x;

blocpt3y = pt3y;

blocpt4x = pt4x;

blocpt4y = pt4y;

}

// 函数作用:这个函数的作用是在控制台下打印游戏空间,即数组scrop[15][10],

// 如果scrop[i][j]是0,则用0xab色打印■字符

// 如果scrop[i][j]是1,则用0xb3色打印■字符

// 打印效果为1015的矩形方块,我把它称为游戏空间

void show_scrop(){

go(0,0);

for (int i=0; i<15; i++)

{

for (int j=0; j<10; j++)

{

if (0==scrop[i][j])

{

color(0x00);

show_unit();

}

else

{

color(0x03);

show_unit();

}

}

go(0,i+1);

}

go(0,0);

color(0x0c);

}

//函数作用:判断当前方块中的四个坐标是否在游戏空间中被标记为 1

bool isexist(block b)

{

if (scrop[bopty][boptx/2]==1||

scrop[bpt2y][bpt2x/2]==1||

scrop[bpt3y][bpt3x/2]==1||

scrop[bpt4y][bpt4x/2]==1)

return true;

else

return false;

}

//函数作用:移动方块

void move_block(block &b, char ch, int &lark){

block copyb = b;

switch(ch)

{

case 'l': //左移

boptx=boptx-2;

bpt2x=bpt2x-2;

bpt3x=bpt3x-2;

bpt4x=bpt4x-2;

break;

case 'r': //右移

boptx=boptx+2;

bpt2x=bpt2x+2;

bpt3x=bpt3x+2;

bpt4x=bpt4x+2;

break;

case 'd': //下移

bopty=bopty+1;

bpt2y=bpt2y+1;

bpt3y=bpt3y+1;

bpt4y=bpt4y+1;

break;

}

if(boptx<0||boptx>18||

bpt2x<0||bpt2x>18||

bpt3x<0||bpt3x>18||

bpt4x<0||bpt4x>18

) //过左右界还原

{

b = copyb;

}

if(bopty>14||

bpt2y>14||

bpt3y>14||

bpt4y>14||

isexist(b)

) //到底还原或重叠还原

{

b = copyb;

lark = 0; //lark = 0 表示方块停下

}

//消除按左右键导致重叠时发生停留现象

if(ch=='l'||ch=='r')

{

lark = 1;

}

//消除按左右键导致重叠时发生停留现象

}

//函数作用:改变当前方块的方向,注:一共有四个方向

void change_block(block &b, int i, int &j, int lark){

block copyb = b;

int orx = boptx;

int ory = bopty;

j = j+1;

j = j%4;

b = bloary[i][j];

if(boptx<orx)

{

int i = orx - boptx;

for(int j=0; j<i/2; j++)

{

boptx=boptx+2;

bpt2x=bpt2x+2;

bpt3x=bpt3x+2;

bpt4x=bpt4x+2;

}

}

if(bopty<ory)

{

int i = ory - bopty;

for(int j=0; j<i; j++)

{

bopty=bopty+1;

bpt2y=bpt2y+1;

bpt3y=bpt3y+1;

bpt4y=bpt4y+1;

}

}

if(boptx<0||boptx>18||

bpt2x<0||bpt2x>18||

bpt3x<0||bpt3x>18||

bpt4x<0||bpt4x>18

)

{

b = copyb;

j--;

}

if(bopty>14||

bpt2y>14||

bpt3y>14||

bpt4y>14||

isexist(b)

)

{

b = copyb;

j--;

lark = 0;

}

}

// 函数作用:消行

void check(int &score){

bool mark = 1;

int line = 0;

int line_marked[4] = {0, 0, 0, 0}; // line_marked用于记录游戏空间中被全部标记的某一行的行号,(即需要被消去的行的行号)

int kai=0; // s 用于记录line_marked中当前被标记的个数

//检查哪些行需要消去

for(int i=0; i<15; i++)

{

for(int j=0; j<10; j++)

{

if(scrop[i][j]==0)

mark = 0;

}

if(mark==1)

{

line++;

line_marked[kai++] = i;

score++;

}

mark=1;

}

//检查哪些行需要消去

go(25,21);

go(28, 21);

cout<<"分数: "<<score; //打印分数

if(score==100)

{

system("cls");

go(37,12);

out("通关",4);

othergetch();

exit(-1);

}

int dis = line;

//消行前闪烁

for(int goline=0; goline<kai; goline++)

{

color(0x04);

go(0,line_marked[goline]);

int s=0;

for(; s<10; s++)

{

out("■",2);

}

wait(1f);

color(0x0d);

go(0,line_marked[goline]);

for(s=0; s<10; s++)

{

out("■",2);

}

wait(1f);

}

//消行前闪烁

kai = 0;

//消行

for(int k=1; k<=dis; ++k)

{

for (int p=line_marked[kai++]; p>=1; p--)

{

for (int q=0; q<10; q++)

{

scrop[p][q]=scrop[p-1][q];

}

}

for(int h=0; h<10; h++)

{

scrop[0][h]=0;

}

}

//消行

}

//函数作用:当方块停留时,把方块四个点的坐标在游戏空间数组scrop[][]中的相应位置标记为1

void markspace(block b)

{

for (int i=0; i<15; i++)

{

for (int j=0; j<10; j++)

{

if((boptx==2j && bopty==i)||

(bpt2x==2j && bpt2y==i)||

(bpt3x==2j && bpt3y==i)||

(bpt4x==2j && bpt4y==i))

{

scrop[i][j]=1;

}

}

}

}

//函数作用:输出方块

void show_block(block b)

{

go(boptx, bopty);

show_unit();

你好,

C语言编程比较好的图形库有以下几种:

2、ege(EasyGraphicsEngine),是windows下的简易绘图库,是一个类似BGI(graphicsh)的面向C/C++语言新手的图形库,它的目标也是为了替代TC的BGI库而存在。

它的使用方法与TC中的graphicsh相当接近,对新手来说,简单,友好,容易上手,免费开源,而且接口意义直观,即使是完全没有接触过图形编程的,也能迅速学会基本的绘图。

3、OpenGL,是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。这个接口由近350个不同的函数调用组成,用来从简单的图形比特绘制复杂的三维景象。

4、easyX,在官网安装之后,就可以使用

graphicsh

中的绘图 *** 作。

以上就是关于求一个用C语言绘制的图形代码全部的内容,包括:求一个用C语言绘制的图形代码、VC++6.0 下 C语言做俄罗斯方块 (<graphics.h> )图形函数库问题、用C语言编程有哪些比较好的图形库等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10111864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存