VC++6.0 下 C语言做俄罗斯方块 (<graphics.h> )图形函数库问题

求救 很急 急救~~~我想在 VC++6.0下 用C语言运行俄罗斯方块 已近有了一套成型的代码了 可是 在VC++6.0下运行不了 一运行就说有一个错误是“#include <graphics.h> /*图形函数库*/ ”这里的错误 这个问题怎么解决啊 我上网查 他们有的说 用什么 MFC做? 我听不懂~~~各位高手帮忙救急 还有我是个 新手 小白 说的太难我听不懂 只要让我明白了该怎样建立程序就行了。只要我能看懂就给分哈 满分

第1个回答  2013-08-07
#include <windows.h>
#include <conio.h>
#include <string>
#include <time.h>
#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(b.opt.x, b.opt.y);
show_unit2();
go(b.pt2.x, b.pt2.y);
show_unit2();
go(b.pt3.x, b.pt3.y);
show_unit2();
go(b.pt4.x, b.pt4.y);
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=10*lev;
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)
{
bloc.opt.x = optx;
bloc.opt.y = opty;
bloc.pt2.x = pt2x;
bloc.pt2.y = pt2y;
bloc.pt3.x = pt3x;
bloc.pt3.y = pt3y;
bloc.pt4.x = pt4x;
bloc.pt4.y = pt4y;
}
// 函数作用:这个函数的作用是在控制台下打印游戏空间,即数组scrop[15][10],
// 如果scrop[i][j]是0,则用0xab色打印■字符
// 如果scrop[i][j]是1,则用0xb3色打印■字符
// 打印效果为10*15的矩形方块,我把它称为游戏空间
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[b.opt.y][b.opt.x/2]==1||
scrop[b.pt2.y][b.pt2.x/2]==1||
scrop[b.pt3.y][b.pt3.x/2]==1||
scrop[b.pt4.y][b.pt4.x/2]==1)
return true;
else
return false;
}
//函数作用:移动方块
void move_block(block &b, char ch, int &lark){
block copyb = b;
switch(ch)
{
case 'l': //左移
b.opt.x=b.opt.x-2;
b.pt2.x=b.pt2.x-2;
b.pt3.x=b.pt3.x-2;
b.pt4.x=b.pt4.x-2;
break;
case 'r': //右移
b.opt.x=b.opt.x+2;
b.pt2.x=b.pt2.x+2;
b.pt3.x=b.pt3.x+2;
b.pt4.x=b.pt4.x+2;
break;
case 'd': //下移
b.opt.y=b.opt.y+1;
b.pt2.y=b.pt2.y+1;
b.pt3.y=b.pt3.y+1;
b.pt4.y=b.pt4.y+1;
break;
}

if(b.opt.x<0||b.opt.x>18||
b.pt2.x<0||b.pt2.x>18||
b.pt3.x<0||b.pt3.x>18||
b.pt4.x<0||b.pt4.x>18
) //过左右界还原
{
b = copyb;
}
if(b.opt.y>14||
b.pt2.y>14||
b.pt3.y>14||
b.pt4.y>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 = b.opt.x;
int ory = b.opt.y;
j = j+1;
j = j%4;
b = bloary[i][j];

if(b.opt.x<orx)
{
int i = orx - b.opt.x;
for(int j=0; j<i/2; j++)
{
b.opt.x=b.opt.x+2;
b.pt2.x=b.pt2.x+2;
b.pt3.x=b.pt3.x+2;
b.pt4.x=b.pt4.x+2;
}
}
if(b.opt.y<ory)
{
int i = ory - b.opt.y;
for(int j=0; j<i; j++)
{
b.opt.y=b.opt.y+1;
b.pt2.y=b.pt2.y+1;
b.pt3.y=b.pt3.y+1;
b.pt4.y=b.pt4.y+1;
}
}
if(b.opt.x<0||b.opt.x>18||
b.pt2.x<0||b.pt2.x>18||
b.pt3.x<0||b.pt3.x>18||
b.pt4.x<0||b.pt4.x>18
)
{
b = copyb;
j--;
}
if(b.opt.y>14||
b.pt2.y>14||
b.pt3.y>14||
b.pt4.y>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((b.opt.x==2*j && b.opt.y==i)||
(b.pt2.x==2*j && b.pt2.y==i)||
(b.pt3.x==2*j && b.pt3.y==i)||
(b.pt4.x==2*j && b.pt4.y==i))
{
scrop[i][j]=1;
}
}
}
}
//函数作用:输出方块
void show_block(block b)
{
go(b.opt.x, b.opt.y);
show_unit();
第2个回答  2013-08-07
换 TUROBO C吧 那个有汉化版的 其实用着挺简单的 你这个东西要是用VC改来改去太麻烦了 而且你还不太熟练 很难的
第3个回答  2013-08-07
要你看懂? 你先看书吧。先学C++,《window程序设计》,再学VC++,然后学MFC,要C++都看不懂,退回去从C学起。
第4个回答  2013-08-07
那代码是在Turbo C下编的吧?

VC++6.0 下 C语言做俄罗斯方块 (<graphics.h> )图形函数库问题
graphics.h 是TC下的图形库,VC不能直接使用这个。如果想在VC下用graphics.h的话,推荐你使用easyX,百度一下,到easyX官网下最新的graphics.h,然后按提示安装到VC下,然后就可以在VC下用graphics.h了。

VC6.0环境下的俄罗斯方块C语言源代码
include <stdlib.h> include <graphics.h> include <bios.h> define mDRAW 5 define mLINE 6 define mADOWN 7 define mGEN 8 define mLEFT 75 define mRIGHT 77 define mSPACE 57 define mDOWN 80 define mESC 1 define TIMEINT 2 define MAXX 9 define M...

用c语言编写俄罗斯方块程序 求详解
int nextRockIndex ; \/\/下一个方块,在数组中的下标 } RockType ;这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。参考资料:C语言图形界面篇

寻求c语言版的俄罗斯方块程序
\/*bioskey(1)是用来检测是否按下案件的函数*\/ if(c!=0) { c=bioskey(0); if(c==8292||c==19712) { for(i=0;i<4;i++) { dx[i]=dotx[i]+1;dy[i]=doty[i]; } jiance(); for(i=0;i<4;i++) dotx[i]=(j)? dx[i] : dotx[i]; an=(j||bn); } if(c==7777||c==192...

求一个用C语言编写的小游戏代码
\/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++6.0、turbo………)上都能运行,你还可以进一步改进。这是一个类似贪吃蛇的小游戏。祝你好运*\/\/*贪吃蛇*\/#include<stdio.h>#include<time.h>#include<conio.h>#include<stdlib.h>int head=3 ,...

我想学着做一些小的游戏,比如俄罗斯方块,学那种语言比较好。
一、基础语言开发工具 诸如Delphi、VC++、VB等语言都是一种面向对象的程序设计语言,虽然每种语言在对面向对象的支持不尽相同,但它们始终贯穿整个程序设计的思维方式的主线。因此,要学好这些语言最开始不应该将重点放在某种语言的具体语法格式上,而应该注重学习面向对象的基本理论 最容易的入门语言——Visual Basic 在...

...windows程序设计实例 用C写的API,要在VC++6.0下实现,只是一个小程...
wndclass.lpfnWndProc = WndProc ; \/\/回调函数为一开始申明的函数 wndclass.cbClsExtra = 0 ; \/\/类的附加内存(额外的),不需要就设为0 wndclass.cbWndExtra = 0 ; \/\/窗口的附加内存,同上 wndclass.hInstance = hInstance ;\/\/ 当前实例为系统传递过来的实例,只能是这样,其它系统帮你做好了 ...

windows环境,多线程情况下,C语言向文件写入数据。
C#:C#里集合了当代和前沿计算机科学里最先进的一些语法(虽然执行效率一直被人质疑),但是你学完C#并深入后,至少能够算是对计算机语言有一个更加深刻的理解了。如何证明你C#学的不错了?也很简单,再次写一个随便什么游戏,比如俄罗斯方块。如果更加证明自己呢?用它写一个P2P网络对战游戏。(如果你...

vs2010与vc++6.0的编程有什么区别?
1、编译器的不同 VC6.0更初级,更适合初学C语言的人使用,但是由于VC6.0推出的时间比较久,因此有很多变量和函数定义的方法都跟不上时代了,而且与win7会有一些不兼容;VS2010:相对功能比较完善,兼容性更好,代码风格和代码提示对于编程者来说更完善,编写程序更方便。2、实现功能的不同 从VS2002...

c语言 头文件
具体来说:a.h中声明了了 int a( int x);a.c中实现这个函数,需要有类似代码 include "a.h"\/\/...其他代码 int a(int x){ return x*x;} 如果在b.c中想使用这个,则只要在b.c中这样就可以:include "a.h"\/\/...其他代码 x = a(x);\/\/...其他代码 ...

相似回答