盒子接小球改进版

原创 2013年12月01日 20:56:48
改进:
1. 旧版:颜色搭配上,绿边会因为黑色变得很不明显。新版:换了一种有吸引力的颜色。比如,“黑底、白球、绿边”等。
2. 旧版:控制上不是很流畅。新版:使用流畅的按键控制。
3. 旧版:处理移动的方法,是擦掉每一个球。这样做有一个问题:画球的过程涉及到三角函数,当球很多时,擦掉全部的球会消耗很多时间,新版:用 cleardevice 清除整个屏幕更快一些。并且逻辑上也会更简单一些。
4. 旧版:造成屏幕闪烁的问题,是因为不能保证在一瞬间画出来所有物体。新版:建议你使用批量绘图指令。
5. 新版:游戏的逻辑上,用另一种方式。屏幕右侧空出一定区域,写上游戏的运行时间、接到的球的数量以及版权等信息。小球没有一次性全部落下,采用一会儿落一个,然后让屏幕上始终保持 10 个球(或其他数量)。每当接到一个球,就重新产生一个新球落下。
6. 新版:windows.h 已经在 graphics.h 里面包含了,不需要再次引用。
代码如下:
/*
盒子接球
copyright: 圣石
date: 2013.12.01
*/
#include<graphics.h>
#include<conio.h>
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define NUM 10
#define	CMD_LEFT		4
#define	CMD_RIGHT		8
#define	CMD_QUIT		64
int box_x = 10, box_y = 420;


struct Ball
{
	int x;
	int y;
	int v;
	bool exist;
};

int GetCommand()
{
	int c = 0;
	if (GetAsyncKeyState(VK_LEFT) & 0x8000)		c |= CMD_LEFT;
	if (GetAsyncKeyState(VK_RIGHT) & 0x8000)	c |= CMD_RIGHT;
	if (GetAsyncKeyState(VK_ESCAPE) & 0x8000)	c |= CMD_QUIT;
	return c;
}

void time(int hour,int minute, int second)
{
	SYSTEMTIME stLocalagain;
	GetLocalTime(&stLocalagain);
	char strsec[10];
	int houragain = stLocalagain.wHour, minuteagain = stLocalagain.wMinute, 
		secondagain = stLocalagain.wSecond, sec;

	sec = (houragain - hour)*3600 + (minuteagain - minute)*60 + (secondagain - second);
	itoa(sec, strsec, 10);
	outtextxy(570, 110, strcat(strsec,"s"));
}

void menu(int score)
{
	line(449, 0, 449, 480);	
	char strScore[10], runTime[] = "游戏运行时间    : ", 
		receiveBallNum[] = "接到的球的数量:", copyRight[] = "版权所有: 圣石 ",
		finishWorkDate[] = "完成日期:2012年12月1日", 
		introductiona[] = "按方向键控制盒子移动", introductionb[] = "接住小球,按Esc键退出";

	settextcolor(GREEN);
	outtextxy(450, 10, introductiona);
	outtextxy(450, 30, introductionb);
	outtextxy(450, 110, runTime);
	itoa(score, strScore, 10);
	outtextxy(450, 210, receiveBallNum);
	outtextxy(570, 210, strScore);
	outtextxy(450, 310, copyRight);
	outtextxy(450, 410, finishWorkDate);
}

void calculateScore(Ball ball[],int &n,int &score)
{
	
	for(int i=0; i<NUM; i++)
	{
		if(ball[i].exist)
		{
			fillcircle(ball[i].x, ball[i].y, 8);
			if(ball[i].y >= 472)
			{
				ball[i].exist = false;
				n--; continue;
			}
			if(box_x+8<=ball[i].x && ball[i].x<=box_x+72 && ball[i].y>=412)
			{
				score++; n--;
				ball[i].exist = false;
				
			}
		}
		else
		{
			ball[i].x = 16 + 45*i; 
			ball[i].y = 8 + rand()%32;
			ball[i].v = 1 + rand()%5;
			ball[i].exist = true;
			n++;
		}
	}
}

int main()
{
	SYSTEMTIME stLocal;
	GetLocalTime(&stLocal);
	int hour = stLocal.wHour, minute = stLocal.wMinute, second = stLocal.wSecond;
	initgraph(640, 480);
	srand(time(NULL));

	struct Ball ball[100];
	int dx, i, n = NUM,score = 0;
	bool flag = true;

	for(i=0; i<NUM; i++)
	{
		ball[i].x = 16 + 45*i; 
		ball[i].y = 8 + rand()%32;
		ball[i].v = 1 + rand()%5;
		ball[i].exist = true;
	}

	char strScore[10], str[] = "your score:";
	while(flag)
	{
		//画球和盒子
		dx = 0; time(hour, minute, second);
		setlinecolor(GREEN); setfillcolor(WHITE);
		BeginBatchDraw();
	
		menu(score);

		calculateScore(ball,n,score);

		fillrectangle(box_x, box_y, box_x+80, box_y+60);
		FlushBatchDraw();

		if (GetCommand() & CMD_LEFT)	dx = -10;
		if (GetCommand() & CMD_RIGHT)	dx = 10;
		if (GetCommand() & CMD_QUIT) flag = false;
		Sleep(25);
		//擦除球和盒子

		cleardevice();
		for(i=0; i<NUM; i++)
		{
			ball[i].y += ball[i].v;
		}
		box_x = box_x + dx;

	}

	itoa(score, strScore, 10);
	outtextxy(292, 250, strcat(str, strScore));
	outtextxy(290, 310, "按任意键退出");
	EndBatchDraw();
	getchar();
	closegraph();

	return 0;
}


[ACM] POJ 1664 放苹果(n个相同小球放入m个相同盒子)

放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 25952   Accepted:...
  • sr19930829
  • sr19930829
  • 2014年07月30日 09:35
  • 2413

openjudge 9286:盒子与小球之四 (dp)

9286:盒子与小球之四 总时间限制: 1000ms 内存限制: 131072kB 描述 给定N个各不相同的小球,和M个不同的BOX,有多少种不同的放球方法,使得...
  • clover_hxy
  • clover_hxy
  • 2016年10月26日 16:40
  • 559

盒子与小球系列题解

盒子与小球,NOI网站题库的一系列题,可在NOI题库中提交。
  • TSOI_Vergil
  • TSOI_Vergil
  • 2016年11月09日 17:56
  • 761

Java 碰壁小球游戏实例教程

本教程会举例用Java实现简单的小球碰壁反弹游戏,效果如图所示: JFrame: 窗体部分 首先创建一个窗体界面,下面举一个简单的例子(Jframe是自己定义的类名,注意和JFrame的区...
  • Wiiix
  • Wiiix
  • 2015年07月31日 00:00
  • 1499

Canvas画板实现一个简单的球在盒子内随机移动效果

HTML5入门之Canvas:如何用Canvas画板实现一个简单的球在盒子内随机移动效果 作者:html5Game | 时间:2014-2-25 17:05:14 | [小 ...
  • qq_18832439
  • qq_18832439
  • 2015年10月26日 20:38
  • 1942

排列组合 "n个球放入m个盒子m"问题 总结

求,盒子都可以分成是否不能区分,和能区分,还能分成是否能有空箱子,所以一共是8种情况,我们现在来一一讨论。 1.球同,盒不同,无空箱 C(n-1,m-1), n>=m 0, n 使用插板法:n个...
  • qwb492859377
  • qwb492859377
  • 2016年02月12日 15:11
  • 7105

c语言实现小球反弹

1.c语言实现小球反弹 #include #include #include void ball()//1.画出小球 { printf("\t\t\t◎"); } int main() { ...
  • qq_35038153
  • qq_35038153
  • 2017年04月19日 20:28
  • 785

把m个球放到n个盒子里,有多少种方法 球盒问题,8种情况

一、序言 这个“N个球放M盒子问题”是很经典的排列组合了,论坛上也有经典的8种情况的解法。 论坛上讨论这8种情况的,我搜索了下(点左边查看搜索结果,还是有很多人在讨论的) 看了部分搜索结果,...
  • zhangjie1989
  • zhangjie1989
  • 2016年05月24日 10:54
  • 5264

荣耀盒子如何连接电视机/电脑显示器/投影仪设备

1.连高清电视机 用盒子标配的HDMI线连接即可,以荣耀盒子voice为例。 连传统老电视 荣耀盒子自带AV接口,可连接老电视,单独购买官方专用的...
  • yelin042
  • yelin042
  • 2017年11月01日 11:30
  • 146

小球落地反弹问题

/** * 文件名称:2012-2.cpp * 作 者: 胡颖 * 完成日期:2017 年 3月 13 日 * 输入描述:无输入 * 问题描述:一小球从100米的高...
  • huying1144
  • huying1144
  • 2017年03月13日 15:00
  • 520
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:盒子接小球改进版
举报原因:
原因补充:

(最多只允许输入30个字)