用C++编写的小游戏源代码

2024-05-14

1. 用C++编写的小游戏源代码

使用语言:C++使用工具:vs2019

用C++编写的小游戏源代码

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

#include 
#include 
#include 



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

#define	WIDTH	10		// 游戏区宽度
#define	HEIGHT	22		// 游戏区高度
#define	SIZE	20		// 每个游戏区单位的实际像素

// 定义操作类型
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();
}

3. 用C语言编写的小游戏代码是什么?

“猜数字小游戏”,每个数字后按空格,最后按回车确认
#include
#include
#include
int a[4],b[4];
int count=0;  //计算猜测次数
void csh( );  //初始化
void start( );  //开始游戏
int main( )
{ csh( );
start( );
}
void csh( )  //初始化
{ printf("\n\n         猜  数  字  小  游  戏\n\n");
  printf(“    猜四个数字,如数字与顺序都正确记为A,数字正确位置不对记为B.\n”);
}
void start( )  //开始游戏
{int m,n;  //m是完全猜对的个数,n是顺序不对的个数
while(1)
{srand((unsigned)time(NULL));  //初始化随机数发生器srand( )
while(1) { for(int i=0;i<4;i++) a[i]=rand( )%10;  //rand( )函数每次随机产生一个0-9的数
if( (a[3]!=a[2]&&a[3]!=a[1]&&a[3]!=a[0])&&
(a[2]!=a[1]&&a[2]!=a[0])&&a[1]!=a[0] ) break; }  //4个随机数各自不相等
printf("    请依次输入4个一位整数:\n\n   ");
while(1)
{for(int i=0;i<4;i++) scanf(“%d”,&b[i]);
printf("    你输入的是:%d  %d  %d  %d ",b[0],b[1],b[2],b[3]);
m=0;n=0;
for(int i=0;i<4;i++)
{for(int j=0;j<4;j++)
{ if(b[i]==a[j]&&i==j)m=m+1; if(b[i]==a[j]&&i!=j)n=n+1; }
}
count=count+1;
printf("      %dA  %dB   你试了%d次\n   ",m,n,count);
if(m==4)break;
if(count==8){ count=0; break; }
}
printf("\n");
if(m==4)printf("     你猜对了(^-^)! 就是:%d %d %d %d\n",a[0],a[1],a[2],a[3]);
else printf("     你输了(T-T)!哈哈!应该是:%d %d %d %d\n",a[0],a[1],a[2],a[3]);
int z;
printf("     (要继续吗?1或0)\n   ");
scanf(“%d”,&z);
if(z==0) break;
}
}

用C语言编写的小游戏代码是什么?

4. C语言简易文字冒险游戏源代码

记忆游戏
#include
#include
#include
#include
#define N 10
int main(  )
{int i,k,n,a[N],b[N],f=0;
 srand(time(NULL));
 printf("  按1开始\n  按0退出:_");
 scanf("%d",&n);
 system("cls");
 while(n!=0)
 {for(k=0;k<N;k++)a[k] = rand( )%N;
  printf("\n\t\t[请您牢记看到颜色的顺序]\n\n");
  for(k=0;k<N;k++)
   {switch(a[k])
{case 0:system("color 90");printf("  0:淡蓝色\n");break;  //淡蓝色
       case 1:system("color f0");printf("  1:白色\n");break;  //白色
       case 2:system("color c0");printf("  2:淡红色\n");break;  //淡红色
       case 3: system("color d0");printf("  3:淡紫色\n");break;  //淡紫色
       case 4: system("color 80");printf("  4:灰色\n"); break;  //灰色
       case 5: system("color e0");printf("  5:黄色\n");break;  //黄色
       case 6: system("color 10");printf("  6:蓝色\n"); break;  //蓝色
       case 7: system("color 20");printf("  7:绿色\n");break;  //绿色
       case 8: system("color 30");printf("  8:浅绿色\n");break;  //浅绿色
       case 9: system("color 40");printf("  9:红色\n");break;  //红色
      }
    Sleep(1500);
    system("color f");  //单个控制 文字颜色
    Sleep(100);
}
  system("cls");
  printf(" 0:淡蓝色,1:白色,2:淡红色,3:淡紫色,4:灰色,5:黄色,6:蓝色7:绿色,8:浅绿色,9:红色\n");
  printf("\n\t请输入颜色的顺序:");
  for(k=0;k<N;k++)scanf("%d",&b[k]);
  for(k=0;k<N;k++)if(a[k] == b[k]) f++;
  if(f==0) printf("  你的记忆弱爆了0\n");
  else if(f==1) printf("  你的记忆有点弱1\n");
  else if(f<5) printf("  你的记忆一般<5\n");
  else printf("  你的记忆力很强!\n");
  Sleep(2000);
  system("cls");
  printf("\t\t按0退出\n\t\t按任意键继续游戏:\n");
  scanf("%d",&n);
  system("cls");
 }
 return 0;
}
注:DEVc++运行通过,每输入一个数字要加入一个空格。

5. 求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语言小游戏源程序

6. c语言小游戏代码

最基础的贪吃蛇的代码

#include
#include//基本型态定义。支援型态定义函数。使用者界面函数 图形装置界面函数。
#include	 //用户通过按键盘产生的对应操作 (控制台) 
#include 
#include //日期和时间头文件 
#define LEN 30
#define WID 25
int Snake[LEN][WID] = {0};	 //数组的元素代表蛇的各个部位 
char Sna_Hea_Dir = 'a';//记录蛇头的移动方向
int Sna_Hea_X, Sna_Hea_Y;//记录蛇头的位置
int Snake_Len = 3;//记录蛇的长度
clock_t Now_Time;//记录当前时间,以便自动移动
int Wait_Time ;//记录自动移动的时间间隔
int Eat_Apple = 1;//吃到苹果表示为1
int Level ;
int All_Score = -1;
int Apple_Num = -1;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);	//获取标准输出的句柄 
//句柄 :标志应用程序中的不同对象和同类对象中的不同的实例 方便操控,
void gotoxy(int x, int y)//设置光标位置
 {
     COORD pos = {x,y};	 //定义一个字符在控制台屏幕上的坐标POS
     
    SetConsoleCursorPosition(hConsole, pos);	//定位光标位置的函数
 
}
 
void Hide_Cursor()//隐藏光标 固定函数 
 {
    CONSOLE_CURSOR_INFO cursor_info = {1, 0}; 
    SetConsoleCursorInfo(hConsole, &cursor_info);	 
 }
 
void SetColor(int color)//设置颜色
 {
     SetConsoleTextAttribute(hConsole, color);
//是API设置字体颜色和背景色的函数 格式:SetConsoleTextAttribute(句柄,颜色);
 }

void Print_Snake()//打印蛇头和蛇的脖子和蛇尾
 {
     int iy, ix, color;
     for(iy = 0; iy < WID; ++iy)
         for(ix = 0; ix < LEN; ++ix)
         {
 
            if(Snake[ix][iy] == 1)//蛇头
             {
                 SetColor(0xf);            //oxf代表分配的内存地址  setcolor:34行自定义设置颜色的函数 
                 gotoxy(ix*2, iy);
                 printf("※");
             }
             if(Snake[ix][iy] == 2)//蛇的脖子
             {
                 color = rand()%15 + 1;	 //rand()函数是产生随机数的一个随机函数。C语言里还有 srand()函数等。
//头文件:stdlib.h 
                 if(color == 14)
                     color -= rand() % 13 + 1;	//变色 
                 SetColor(color);
                 gotoxy(ix*2, iy);
                 printf("■");
             }
             if(Snake[ix][iy] == Snake_Len)
             {
                 gotoxy(ix*2, iy);
                 SetColor(0xe);
                 printf("≈");
             }
         }
 }
 
void Clear_Snake()//擦除贪吃蛇
 {
     int iy, ix;
     for(iy = 0; iy < WID; ++iy)
         for(ix = 0; ix < LEN; ++ix)
         {
             gotoxy(ix*2, iy);
             if(Snake[ix][iy] == Snake_Len)
                 printf("  ");
         }
 }
 
void Rand_Apple()//随机产生苹果
 {
     int ix, iy;
 
    do
     {
         ix = rand() % LEN;
         iy = rand() % WID;
     }while(Snake[ix][iy]);
 
    Snake[ix][iy] = -1;
     gotoxy(ix*2, iy);
     printf("⊙");
     Eat_Apple = 0;
 }
 
void Game_Over()//蛇死掉了
 {
     gotoxy(30, 10);
     printf("Game Over");
     Sleep(3000);
     system("pause > nul");
     exit(0);
 }
 
void Move_Snake()//让蛇动起来
 {
     int ix, iy;
     
    for(ix = 0; ix < LEN; ++ix)//先标记蛇头
         for(iy = 0; iy < WID; ++iy)
             if(Snake[ix][iy] == 1)
             {
                switch(Sna_Hea_Dir)//根据新的蛇头方向标志蛇头
                 {
                     case 'w':
                         if(iy == 0)
                             Game_Over();
                         else
                             Sna_Hea_Y = iy - 1;
                         Sna_Hea_X = ix;
                       
                        break;
                     case 's':
                         if(iy == (WID -1))
                                 Game_Over();
                         else
                             Sna_Hea_Y = iy + 1;
                         Sna_Hea_X = ix;
                     
                         break;
                     case 'a':
                         if(ix == 0)
                                 Game_Over();
                         else
                             Sna_Hea_X = ix - 1;
                         Sna_Hea_Y = iy;
                     
                         break;
                     case 'd':
                         if(ix == (LEN - 1))
                                 Game_Over();
                         else
                             Sna_Hea_X = ix + 1;
                         Sna_Hea_Y = iy;
                 
                        break;
                     default:
                         break;
                 }
             }
      
     if(Snake[Sna_Hea_X][Sna_Hea_Y]!=1&&Snake[Sna_Hea_X][Sna_Hea_Y]!=0&&Snake[Sna_Hea_X][Sna_Hea_Y]!=-1)
         Game_Over();
 
    if(Snake[Sna_Hea_X][Sna_Hea_Y] < 0)//吃到苹果
     {
         ++Snake_Len;
         Eat_Apple = 1;
     }
     for(ix = 0; ix < LEN; ++ix)//处理蛇尾
         for(iy = 0; iy < WID; ++iy)
         {
             if(Snake[ix][iy] > 0)
             {
                 if(Snake[ix][iy] != Snake_Len)
                     Snake[ix][iy] += 1;
                 else
                     Snake[ix][iy] = 0;
             }
         }
     

    Snake[Sna_Hea_X][Sna_Hea_Y] = 1;//处理蛇头    
}
 
void Get_Input()//控制蛇的移动方向
 {
     if(kbhit())
     {
         switch(getch())
         {
         case 87:
             
                 Sna_Hea_Dir = 'w';
             break;
         case 83:
             
             Sna_Hea_Dir = 's';
             break;
         case 65:
             
             Sna_Hea_Dir = 'a';
             break;
         case 68:
             
             Sna_Hea_Dir = 'd';
             break;
         default:
             break;
         }
     }
     
    if(clock() - Now_Time >= Wait_Time)//蛇到时间自动行走
     {
         Clear_Snake();
         Move_Snake();
         Print_Snake();
         Now_Time = clock();
     }
 }
 
void Init()//初始化
 {
     system("title 贪吃毛毛蛇");
     system("mode con: cols=80 lines=25");
     Hide_Cursor();
 
    gotoxy(61, 4);
     printf("You Score:");
     gotoxy(61, 6);
     printf("You Level:");
     gotoxy(61, 8);
     printf("The Lenght:");
     gotoxy(61, 10);
     printf("The Speed:");
     gotoxy(61, 12);
     printf("Apple Num:");
 
    int i;
     for(i = 0; i < Snake_Len; ++i)//生成蛇
         Snake[10+i][15] = i+1;
 
    int iy, ix;//打印蛇
     for(iy = 0; iy < WID; ++iy)
         for(ix = 0; ix < LEN; ++ix)
         {
             if(Snake[ix][iy])
             {
                 SetColor(Snake[ix][iy]);            
                 gotoxy(ix*2, iy);
                 printf("■");
             }
         }
 }
 
void Pri_News()//打印信息
 {
     SetColor(0xe);
     gotoxy(73,4);
     All_Score += Level;
     printf("%3d", All_Score);
     gotoxy(73, 6);
     printf("%3d", Level);
     gotoxy(73, 8);
     printf("%3d",Snake_Len);
     gotoxy(73, 10);
     printf("0.%3ds", Wait_Time/10);
     gotoxy(73, 12);
     printf("%d", Apple_Num);
 }
 
void Lev_Sys()//等级系统
 {
     if(((Apple_Num-1) / 10) == Level)
     {
         ++Level;
         if(Wait_Time > 50)
             Wait_Time -= 50;
         else
             if(Wait_Time > 10)
                 Wait_Time -= 10;
             else
                 Wait_Time -= 1;
     }    
}
 
int main(void)
 {
     Init();
     srand((unsigned)time(NULL));//设置随机数的种子
     Now_Time = clock();
     int speed1=1000,speed2,a;
     printf("\n");
     printf("请输入你想要的速度\n");
     scanf("%d",&speed2);
     Level=1;
     Wait_Time=speed1-speed2;
     printf("请输入你想要的苹果数\n");
     scanf("%d",&a);
     
     while(a--)
     Rand_Apple();
    while(1)
     {
         if(Eat_Apple)
         {
             ++Apple_Num;
             Rand_Apple();
             Lev_Sys();
             Pri_News();
         }
         Get_Input();
         Sleep(10);
     }
     return 0;
 }

7. C++做一个小游戏,有源代码的最好,谢谢

#include 
#include
#include 
#include 
#include 
#include //时间 //文件
#include 
#define random(x)(rand()%x)
using namespace std;
void thunder(int Dif,int Row,int Column,char *USer)
{
	int r,c,alls[22][22],backstage[22][22]={0};
	srand((int)time(0));
	for(r=1;r<=Row;r++)                                      // 生成alls(0~1)1是雷
	{
		for(c=1;c<=Column;c++)
		{
			if(random(6)<1)  {alls[r][c]=1;} else{alls[r][c]=0;};
		}
	};
	for(r=0;r<=Row+1;r++)                                //生成 backstage(正确答案)
	{
		for(int c=0;c<=Column+1;c++)
		{
			if(alls[r][c]==1)  
			{
				(int)backstage[r][c]='*';             //将1变为 *  代表雷
			}
			else
			{
				for(int i=r-1;i<=r+1;i++)             //将0变为数字 (代表周围雷数)
					for(int j=c-1;j<=c+1;j++)
					{
						
						if(alls[i][j]!=alls[r][c]&&alls[i][j]==1){backstage[r][c]++;};
					}
			};  //else 结束 
		};    // for 结束
	};          // for 结束 
	cout<<"======================*********================================"<<endl;
	char surface[22][22];              //生成surface(用户界面)
	for(r=0;r<22;r++)                  //全部为零
		for(c=0;c<22;c++)
		{
			surface[r][c]='0';
		}
	for(r=1;r(*||数字) 的个数  赢的时候停止循环)
		for(c=1;c<=Column;c++)
		{
			surface[r][c]='#';
		}
	for(r=1;r<=Row;r++)                      //输出  surface   界面  便于检查
	{
		for(c=1;c<=Column;c++) {cout<<"  "<<surface[r][c];}; 
		cout<<endl;
	};
	cout<<"请按格式输入"<<endl
		<<"前两个数字为坐标,最后一个数字“1”表示此位置为雷,“0”则表示不是。"<<endl
		<<"如:1 3 1  表示一行三列是雷;2 4 0 表示二行四列不是雷"<<endl
		<<"提示:当数字周围雷都被扫出时,可再次按要求输入此位置,可得到周围数字。"<<endl;
	long  i=10000000L;         //计算时间开始
	clock_t start,finish;
	double duration;
	start=clock();             
	while(i--);                //计算时间开始
	int num=Row*Column;        //计算#号个数
	while(num!=0)              //控制 是否点完所有位置
	{
		int x,y,judge;
	   cin>>x>>y>>judge; 
	   if(alls[x][y]!=judge)
		{
			cout<<"you lose!!!"<<endl;
			cout<<"The answer is:"<<endl;
			for(r=1;r<=Row;r++)                    //输了   输出backstage  显示正确答案
				{
		          for(int c=1;c<=Column;c++)
				  {
			         cout<<"  "<<(char)(backstage[r][c]==42?backstage[r][c]:backstage[r][c]+'0');  //输出backstage
				  }
		          cout<<endl;
				}
			break;
		}
	   else                                      
		{
			if(alls[x][y]==1)  {if(surface[x][y]=='#'){num--;}surface[x][y]='@'; }      // 雷 判断正确 显示“@”;数“#”
			else
			{
				if(backstage[x][y]!=0)                                                  //  数字 判断正确 显示数字
				{
					if(surface[x][y]=='#'){num--; surface[x][y]=backstage[x][y]+'0'; }  //   数“#”
				   else
					{
						int lei_num=0;
				       for(int i=x-1;i<=x+1;i++)                                         //数 数字周围 雷的个数                                     
							for(int j=y-1;j<=y+1;j++)
							{
								if(surface[i][j]=='@')
							   lei_num++;
							}
					   if(backstage[x][y]==lei_num)                                   // 看数字周围雷是否全部扫出  提示 显示数字周围
						{
							for(int i=x-1;i<=x+1;i++)
								for(int j=y-1;j<=y+1;j++)
										if(surface[i][j]=='#')                         //数“#”
										{
											surface[i][j]=backstage[i][j]+'0';
											num--;   
										}
						}
					}
				}
				else                                                                   // 数字为零时   显示零周围的零
				{
					if(surface[x][y]=='#'){num--;};                                    //数“#”
				   surface[x][y]=backstage[x][y]+'0';
					for(int i=x-1;i<=x+1;i++)                                          //  显示零周围的数字
						for(int j=y-1;j<=y+1;j++)
							if(surface[i][j]=='#')                                     // 避免 死循环
							{
								surface[i][j]=backstage[i][j]+'0';               
								num--;  				                               //数“#”
							}
							for(int k=0;k<20;k++)                                       //最多20层零 (点出最边上的零)
							{
								for (int R=1;R<=Row;R++)                                //检查所有零
									for(int C=1;C<=Column;C++)                          //再次显示零周围的数字
									{
										if(surface[R][C]=='0')
										{
											for(int i=R-1;i<=R+1;i++)
												for(int j=C-1;j<=C+1;j++)
												{
													if(surface[i][j]=='#')                         // 避免 死循环 数“#”
													{
														surface[i][j]=backstage[i][j]+'0';
														num--;
													}  
												}
										}
									} //匹配for 内 
							} //匹配 for 外
				}//匹配else
			}//匹配else
		}//匹配els
		cout<<endl;
		cout<<"======================*********================================"<<endl;
		for(r=1;r<=Row;r++)                                                                          //输出界面(已修改)
		{
			for(c=1;c<=Column;c++) {cout<<"  "<<surface[r][c];};
			cout<<endl;
		};
	}                                                                                               //匹配while
	finish=clock();                                                                                //计算时间结束
    duration=(double)(finish-start)/CLOCKS_PER_SEC;                                                //时间变量
    if(num==0)                                                                                      //所有
	{
		cout<<"              You win!  Congratulations!!                 "<<endl;
        cout<<"                Your time is: "<<duration<<endl;
		if(Dif==1)                                                                            //读取 简单扫雷 的存储文件
		{
			string Name;
	       string name[6];
	       double Time,rang;
	       double times[6];
	       int i=0;
	       ifstream inf("扫雷 简单.txt");
	       for(i=0;i<5;i++)                                                                    //文件中信息导入到数组里
			{
				inf>>Name;inf>>rang>>Time;
		       name[i]=Name;
		       times[i]=Time;
			}
			inf.close();
			name[5]=USer;                                                                   //本轮玩家信息
			times[5]=duration;
	       double t1=0;
	       string t2;
            for(int j=0;j<5;j++)                                                               //冒泡排序法
			{                    
				for(i=0;i<5-j;i++)
				{
					if(times[i]>times[i+1])
					{
						t1=times[i];
				       times[i]=times[i+1];
				       times[i+1]=t1;
				       t2=name[i];
				       name[i]=name[i+1];
				       name[i+1]=t2;
					}
				}
			}
			ofstream outf("扫雷 简单.txt");
	       for(i=0;i<5;i++)                                                                   //将前五名玩家信息存储到文件中
			{
				cout<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
		       outf<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
			}
	       outf.close();
		}
        if(Dif==2)                                                                            //读取 一般扫雷 的存储文件
		{
			string Name;
	       string name[6];
	       double Time,rang;
	       double times[6];
	       int i=0;
	       ifstream inf("扫雷 一般.txt");
	       for(i=0;i<5;i++)                                                                    //文件中信息导入到数组里
			{
				inf>>Name;inf>>rang>>Time;
		       name[i]=Name;
		       times[i]=Time;
			}
			inf.close();
			name[5]=USer;                                                                   //本轮玩家信息
			times[5]=duration;
	       double t1=0;
	       string t2;
            for(int j=0;j<5;j++)                                                               //冒泡排序法
			{                    
				for(i=0;i<5-j;i++)
				{
					if(times[i]>times[i+1])
					{
						t1=times[i];
				       times[i]=times[i+1];
				       times[i+1]=t1;
				       t2=name[i];
				       name[i]=name[i+1];
				       name[i+1]=t2;
					}
				}
			}
			ofstream outf("扫雷 一般.txt");
	       for(i=0;i<5;i++)                                                                   //将前五名玩家信息存储到文件中 并输出
			{
				cout<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
		       outf<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
			}
	       outf.close();
		}
		if(Dif==3)                                                                            //读取 困难扫雷 的存储文件
		{
			string Name;
	       string name[6];
	       double Time,rang;
	       double times[6];
	       int i=0;
	       ifstream inf("扫雷 困难.txt");
	       for(i=0;i<5;i++)                                                                    //文件中信息导入到数组里
			{
				inf>>Name;inf>>rang>>Time;
		       name[i]=Name;
		       times[i]=Time;
			}
			inf.close();
			name[5]=USer;                                                                   //本轮玩家信息
			times[5]=duration;
	       double t1=0;
	       string t2;
            for(int j=0;j<5;j++)                                                               //冒泡排序法
			{                    
				for(i=0;i<5-j;i++)
				{
					if(times[i]>times[i+1])
					{
						t1=times[i];
				       times[i]=times[i+1];
				       times[i+1]=t1;
				       t2=name[i];
				       name[i]=name[i+1];
				       name[i+1]=t2;
					}
				}
			}
			ofstream outf("扫雷 困难.txt");
	       for(i=0;i<5;i++)                                                                   //将前五名玩家信息存储到文件中
			{
				cout<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
		       outf<<name[i]<<"    "<<i+1<<"   "<<times[i]<<endl;
			}
	       outf.close();
		}
    }
}
void scale(int dif,char *User)    //选择难度
{
	int row,column;
	if(dif==1) {row=3;column=3;}
	if(dif==2) {row=7;column=7;}
	if(dif==3)  {row=10;column=10;}
	cout<<"The scale is: "<<row<<"*"<<column<<endl;
	thunder(dif,row,column,User);
};
int main()
{	
	int Continue=1;
	int difficulty;
	char user[10];
	cout<<"                       Welcom to the game!                  "<<endl
		<<"                         请输入用户名!                      "<<endl;
	cin>>user;
	while(Continue==1)
	{
	   cout<<"=======================*******************======================="<<endl
		   <<"                          请选择难度!                        "<<endl
		   <<"                          简单——1                           "<<endl
		   <<"                          一般——2                           "<<endl
		   <<"                          困难——3                           "<<endl;
	   cin>>difficulty;
	   scale(difficulty,user);
		cout<<"继续游戏——1     结束游戏——0"<<endl;
		cin>>Continue;
	}
	return 0;
}
扫雷小游戏,自己编的代码

C++做一个小游戏,有源代码的最好,谢谢

8. 求纯C语言打字游戏源代码及解析

# include "Typer.h"
# include 
# include 
# include 
//download by http://www.codefans.net
void main()
{
  BOOL bQuit=FALSE;             /* 是否退出 */
  BOOL bPause=FALSE;                /* 是否暂停 */
  int  tm1,tm2;
  BYTE Key;

  randomize();                  /* 初始化随机数种子 */
  SetGraphMode();
  SelectLevel();
  ShowBar();
  tm1=CreateTimer(1,MoveLetter);        /* 创建移动字符对象时钟 */
  tm2=CreateTimer(Interval,CreateLetter);   /* 创建产生字符对象时钟 */
  CreateLetter();

  Key=AscKey();
  while (!bQuit)
  {
    TimerEvent();
    switch (Key)
    {
      case NULL:
       break;
      case KEY_ESC:
       bQuit=TRUE;
       break;
      case KEY_SPACE:
       bPause=!bPause;
           tmTM[tm1].Enable=!bPause;
       tmTM[tm2].Enable=!bPause;
       break;
      default:
       if (!bPause) Check(Key);
    }
    Key=AscKey();
  }
  CloseGraphMode();
}

void SetGraphMode()
{
  int Device=VGA,Mode=VGAHI;
  initgraph(&Device,&Mode,"");
  settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
  setfillstyle(SOLID_FILL,0);
  setcolor(7);
}

void CloseGraphMode()
{
  restorecrtmode();
}

/* 从键盘缓冲区内直接读出ASC码 */
BYTE AscKey(void)
{
  int  start,end;
  WORD key=0;
  start=peek(0,0x41a);
  end=peek(0,0x41c);
  if (start==end) return(0);
  else
  {
    key=peek(0x40,start);
    start+=2;
    if (start==0x3e) start=0x1e;
    poke(0x40,0x1a,start);
    return(key&0xff);
  }
}

void MoveLetter(void)
{
  int  i;

  for (i=0;i<MAX_LETTER;i++)
  {
      if (Letter[i].Used)
      {
     HideLetter(i);
     Letter[i].y+=Step;
         ShowLetter(i);
         /* 字符对象下落到最底部 */
         if (Letter[i].y>MAX_HEIGHT) KillLetter(i);
      }
  }
}

void KillLetter(int LetterID)
{
  if (Letter[LetterID].Used)
  {
     Letter[LetterID].Used=FALSE;
     LetterUsed--;
     HideLetter(LetterID);
  }
  /* 删除字符对象后马上再创建一个 */
  CreateLetter();
}

void CreateLetter()
{
  int  i=0;
  int  x;
  BYTE val;

  if (LetterUsed==MAX_LETTER) return;   /* 无字符对象可用则返回 */
  while (Letter[++i].Used);     /* 找到第一个空闲的字符对象,产生一个字符对象 */
  x=i;
  Letter[i].x=x*640/MAX_LETTER;
  Letter[i].y=0;
  Letter[i].val=random(26)+'A';
  Letter[i].Used=TRUE;
  LetterUsed++;
}

void HideLetter(int ID)
{
  /* 用填充矩形来消隐字符 */
  bar(Letter[ID].x,Letter[ID].y,Letter[ID].x+16,Letter[ID].y+20);
}

void ShowLetter(int ID)
{
  char str[2]={0,0};
  str[0]=Letter[ID].val;
  outtextxy(Letter[ID].x,Letter[ID].y,str);
}

void Check(BYTE Key)
{
  int  i;
  char str[6];

  Hits++;
  for (i=0;i<MAX_LETTER;i++)
      /* 击中 */
      if (Letter[i].Used&&Letter[i].val==toupper(Key))
      {
     sound(1000);
     delay(10);
         KillLetter(i);
     Right++;
     nosound();
      }
  /* 显示状态 */
  setfillstyle(SOLID_FILL,5);
  bar(260,430,320,450);
  bar(410,430,470,450);
  setcolor(2);
  sprintf(str," %4ld",Hits);
  outtextxy(260,430,str);
  sprintf(str," %4ld",Right);
  outtextxy(410,430,str);
  setcolor(7);
  setfillstyle(SOLID_FILL,0);
}

void ShowBar()
{
  FILE *bmp;
  BYTE r,g,b,t;
  int  i,x,y;

  bmp=fopen("bar.bmp","rb");
  fseek(bmp,54,SEEK_SET);
  for (i=0;i<16;i++)
  {
      setpalette(i,i);
      b=fgetc(bmp)>>2;
      g=fgetc(bmp)>>2;
      r=fgetc(bmp)>>2;
      t=fgetc(bmp)>>2;
      setrgbpalette(i,r,g,b);
  }
  for (y=0;y<80;y++)
      for (x=0;x<320;x++)
      {
      t=fgetc(bmp);
      putpixel(x*2,479-y,t>>4);
      putpixel(x*2+1,479-y,t&15);
      }
  fclose(bmp);
}

void SelectLevel()
{
  int  Steps[3]={1,2,4};
  int  Intervals[3]={18,9,5};
  int  Sel=0;
  FILE *bmp;
  BYTE r,g,b,t,Key;
  int  i,x,y;

  bmp=fopen("sel.bmp","rb");
  fseek(bmp,54,SEEK_SET);
  for (i=0;i<16;i++)
  {
      setpalette(i,i);
      b=fgetc(bmp)>>2;
      g=fgetc(bmp)>>2;
      r=fgetc(bmp)>>2;
      t=fgetc(bmp)>>2;
      setrgbpalette(i,r,g,b);
  }
  for (y=0;y<200;y++)
      for (x=0;x<160;x++)
      {
      t=fgetc(bmp);
      putpixel(x*2+160,339-y,t>>4);
      putpixel(x*2+161,339-y,t&15);
      }
  fclose(bmp);
  while (TRUE)
  {
    Key=toupper(AscKey());
    if (Key=='A') Sel=1;
    if (Key=='B') Sel=2;
    if (Key=='C') Sel=3;
    if (Sel) break;
  }
  Step=Steps[Sel-1];
  Interval=Intervals[Sel-1];
  cleardevice();
} 

/*********************************************************/
/*                     文件:TIMER.H                     */
/*********************************************************/
/*********************************************************/

/* 系统可用计时器的最大数目 */
# define  MAXTIMER     10
# ifndef  NULL
#   define NULL        0
# endif

/* 计时器结构 */
struct TM
{
  DWORD Interval;              /*      间隔       */
  DWORD LastTimer;             /* 上次事件发生时间*/
  BOOL  Enable;                /*      活动       */
  BOOL  Used;                  /*      可用       */
  void  (*Pointer)();          /*   事件远指针    */
};

struct TM tmTM[MAXTIMER+1];
int    TimerUsed=0;

/* 获取BIOS计数器数值 */
DWORD BiosTimer(void)
{
  DWORD BIOSTIMER=0;
  BIOSTIMER=peek(0x0,0x46e);
  BIOSTIMER<<=8;
  BIOSTIMER+=peek(0x0,0x46c);
  return (BIOSTIMER);
}

/* 时间事件(时钟系统核心) */
void TimerEvent()
{
  int   i;
  DWORD TimerDiff;

  for (i=1;i<=MAXTIMER;i++)
  {
      if (tmTM[i].Used&&tmTM[i].Enable)
      {
         TimerDiff=BiosTimer()-tmTM[i].LastTimer;
  if (tmTM[i].Interval<=TimerDiff)
         {
            tmTM[i].Pointer();
            tmTM[i].LastTimer=BiosTimer();
         }
      }
  }
}

/* 创建一个时钟(成功返回时钟的句柄,否则返回NULL) */
int CreateTimer(DWORD Interval,void (*Pointer)())
{
  int i=0;
  if (TimerUsed==MAXTIMER) return NULL;

  while (tmTM[++i].Used);

  tmTM[i].Pointer=Pointer;
  tmTM[i].Interval=Interval;
  tmTM[i].Enable=TRUE;
  tmTM[i].Used=TRUE;
  tmTM[i].LastTimer=BiosTimer();

  TimerUsed++;
  return i;
}

/* 删除一个时钟 */
void KillTimer(int *TimerID)
{
  if (tmTM[*TimerID].Used)
  {
     TimerUsed--;
     tmTM[*TimerID].Used=FALSE;
  }
  *TimerID=0;
}

/* 删除所有时钟 */
void KillAllTimer()
{
  int i;
  for (i=0;i<=MAXTIMER;i++) tmTM[i].Used=FALSE;
  TimerUsed=0;
}