最强大脑--51度灰挑战项目

择善教育公开课

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 BrainMaster.rc 使用
//
#define IDD_DIALOG_MAIN                 101
#define IDC_BTN_START                   1001
#define IDC_BUTTON_CHANGE_COLOR         1002
#define IDC_SLIDER_DIF                  1003
#define IDC_STATIC_DIF                  1004
#define IDC_COLORNOW                    1005
#define IDC_GAME_AREA                   1006

// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1007
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

#include <stdio.h>
#include <windows.h>
#include <CommCtrl.h>
#include <list>
using namespace  std;
#include "resource.h"

typedef struct _gameRect{
	RECT rect; //保存一个色块的位置信息
	COLORREF rgb;// 保存一个色块的颜色信息
	bool Win;// 保存这个色块是否唯一的颜色,即正确色块
}GameRect;
typedef list<GameRect> GameList; //游戏色块链表数据类型

GameList g_GameList; // 链表
HINSTANCE g_hInstance;
COLORREF g_ColorNow; // 全局变量保存当前颜色
unsigned int g_GameDiff;//当前游戏难度
unsigned int g_Stage; // 当前第几关?
// 生成随机数 ...0~base
DWORD GetRandrom(DWORD base)
{
	DWORD result;
	__asm{
		rdtsc
		mov result,eax
	}
	return result%base;
}
// 生成本次游戏的数据
void OnInitStageData(HWND hWnd)
{
	g_GameList.clear(); // 清空原来的链表信息
	DWORD nItemNum = g_Stage + 3; // 当前关卡需要显示多少个色块?
	if (nItemNum>8)
	{
		nItemNum = 8;
	}
	HWND GameWnd = GetDlgItem(hWnd, IDC_GAME_AREA); // 获取游戏区域的句柄
	RECT WndRect;
	GetWindowRect(GameWnd, &WndRect); //获取游戏区域的大小
	DWORD nWidth = WndRect.right - WndRect.left;
	DWORD nHeight = WndRect.bottom - WndRect.top;

	DWORD WinItemIndex = GetRandrom(nItemNum); // 生成一个随机数,指示哪一个色块是正确滴
	DWORD nItemCntRow = 3;
	DWORD nItemCntColumn = (nItemNum % 3) ? nItemNum / 3 + 1 : nItemNum / 3;//计算需要多少行色块
	DWORD nItemWidth = (nWidth - 10) / nItemCntRow; // 每个色块的宽度
	DWORD nItemHeight = (nHeight - 10) / nItemCntColumn;// 每个色块的高度

	for (DWORD i = 0; i <= nItemNum;i++)
	{
		GameRect gRect;
		gRect.rect.left = 10 + (i % 3)*nItemWidth;
		gRect.rect.right = gRect.rect.left + nItemWidth - 10;

		gRect.rect.top = 10 + (i / 3)*nItemHeight;
		gRect.rect.bottom = gRect.rect.top + nItemHeight - 10;

		gRect.rgb = g_ColorNow; // 正常的颜色
		gRect.Win = false; //大部分的色块不是正确答案
		if (i == WinItemIndex)
		{
			byte r = GetRValue(g_ColorNow) > 125 ? GetRValue(g_ColorNow) - g_GameDiff : GetRValue(g_ColorNow) + g_GameDiff;
			byte g = GetGValue(g_ColorNow) > 125 ? GetGValue(g_ColorNow) - g_GameDiff : GetGValue(g_ColorNow) + g_GameDiff;
			byte b = GetBValue(g_ColorNow) > 125 ? GetBValue(g_ColorNow) - g_GameDiff : GetBValue(g_ColorNow) + g_GameDiff;
			gRect.rgb = RGB(r, g, b);

			gRect.Win = TRUE;
		}
		g_GameList.push_back(gRect);
	}
	return;
}
void OnShowStage(HWND hWnd)
{
	HWND GameWnd = GetDlgItem(hWnd, IDC_GAME_AREA);
	HDC hdc = GetDC(GameWnd);
	GameList::iterator iter = g_GameList.begin();
	// 遍历链表,取出每个色块的信息,并按信息去进行绘图
	for (; iter != g_GameList.end();iter++)
	{
		GameRect gameRect = *iter;
		HBRUSH hBrush = CreateSolidBrush(gameRect.rgb);
		HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hBrush);

		Rectangle(hdc, gameRect.rect.left, gameRect.rect.top, gameRect.rect.right, gameRect.rect.bottom);
		SelectObject(hdc, hOldBrush);
	}

	ReleaseDC(GameWnd, hdc);
	return;
}

// 功能:更新当前颜色
bool OnChangeColor(HWND hWnd)
{
	HWND hColorWnd = GetDlgItem(hWnd, IDC_COLORNOW);//获取当前颜色指示器控件的句柄
	// 初始化一个结构体...
	CHOOSECOLOR chs;
	memset(&chs, 0, sizeof(CHOOSECOLOR));
	chs.lStructSize = sizeof(CHOOSECOLOR);
	chs.hwndOwner = hColorWnd;
	chs.rgbResult = g_ColorNow;
	chs.lpCustColors = &g_ColorNow;
	chs.Flags = CC_ANYCOLOR | CC_RGBINIT;
	ChooseColor(&chs);
	g_ColorNow = chs.rgbResult; //获取到选择的颜色

	HDC hdc = GetDC(hColorWnd);
	RECT rect;
	GetWindowRect(hColorWnd, &rect);//获取的是指示器控件的大小
	// 创建一个笔刷
	HBRUSH hBrush = CreateSolidBrush(g_ColorNow);
	SelectObject(hdc, hBrush);
	Rectangle(hdc, 0, 0, rect.right - rect.left, rect.bottom - rect.top);
	ReleaseDC(hColorWnd, hdc);
	return true;
}
bool OnStartGame(HWND hWnd)
{
	if (g_ColorNow == 0) // 如果点击开始游戏的时候,没有选择颜色,先要求选择一次
	{
		OnChangeColor(hWnd);
	}
	OnInitStageData(hWnd);
	OnShowStage(hWnd);
	return false;
}
// 初始化的函数
bool OnInitDialog(HWND hWnd)
{
	g_Stage = 1;
	return false;
}
// 检查一个点是否在规定矩形内
bool PointInRect(HWND hWnd,POINT pt, RECT rect)
{
	return pt.x < (rect.right - rect.left) && pt.y < (rect.bottom - rect.top);
}
// 检查一个点是否是全局链表中的正确色块信息
bool PointIsRight(HWND hWnd, POINT pt)
{
	//遍历链表,对比每个色块的位置信息与鼠标点
	HWND gameWnd = GetDlgItem(hWnd, IDC_GAME_AREA);
	RECT WndRect;
	GetWindowRect(gameWnd, &WndRect);
	// 将屏幕坐标转换成客户区坐标并减去
	POINT lefttop;
	lefttop.x = WndRect.left;
	lefttop.y = WndRect.top;
	ScreenToClient(hWnd, &lefttop);
	//570427370
	//
	pt.x -= lefttop.x;
	pt.y -= lefttop.y;

	bool bIsRight = false;
	GameList::iterator iter = g_GameList.begin();
	for (; iter != g_GameList.end();iter++)
	{
		GameRect gameRect = *iter;
		// 如果鼠标点在矩形区域内,且矩形区域是不同颜色滴...找到了正确答案
		if (PointInRect(hWnd,pt,gameRect.rect) && gameRect.Win)
		{
			bIsRight = true;
			break;
		}
	}

	return bIsRight;
}
// Windows通过消息来驱动,
INT_PTR CALLBACK GameProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	RECT gameArea;
	switch (uMsg)
	{
	case WM_INITDIALOG://首次创建窗口时产生
		OnInitDialog(hWnd);
		break;
	case WM_LBUTTONUP:
		POINT pt;
		GetCursorPos(&pt);//获取当前鼠标的位置
		ScreenToClient(hWnd, &pt);//鼠标点也转成客户区坐标系
		GetWindowRect(GetDlgItem(hWnd, IDC_GAME_AREA), &gameArea);
		if (PointInRect(hWnd,pt,gameArea)) // 检查鼠标点是否在游戏区域内
		{
			if (PointIsRight(hWnd, pt))
			{
				g_Stage++; // 当前关卡加1
				SendMessage(hWnd, WM_COMMAND, IDC_BTN_START, 0);//模拟鼠标点击窗口中开始游戏按钮

			}
			else
				MessageBox(hWnd, L"选择错误", L"Wrong", MB_OK | MB_ICONINFORMATION);
		}
		break;
	case WM_NOTIFY://获取通知消息
		if (wParam == IDC_SLIDER_DIF)
		{
			g_GameDiff = (unsigned int)SendMessage(GetDlgItem(hWnd, IDC_SLIDER_DIF), TBM_GETPOS, 0, 0);
			if (g_GameDiff <1)
			{
				g_GameDiff = 1;
			}
			char szTmp[MAX_PATH];
			sprintf_s(szTmp, MAX_PATH, "当前游戏难度:%d", 100-g_GameDiff);
			SetDlgItemTextA(hWnd, IDC_STATIC_DIF, szTmp);
		}
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case IDC_BUTTON_CHANGE_COLOR:
			OnChangeColor(hWnd);
			break;
		case IDC_BTN_START:
			OnStartGame(hWnd);
			break;
		default:
			break;
		}
		break;
	case WM_CLOSE:
	case WM_DESTROY:
		PostQuitMessage(0);
		return TRUE;
	default:
		break;
	}
	return FALSE;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
	g_hInstance = hInstance;
	HWND hWnd = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, GameProc);
	if (hWnd == 0)
	{
		MessageBox(0, L"创建窗口失败", 0, 0);
		return -1;
	}
	// 获取窗口大小,将窗口设置到整个屏幕的中心
	RECT rect;
	GetWindowRect(hWnd, &rect);
	int nScreenX = GetSystemMetrics(SM_CXSCREEN); //获取屏幕的宽度
	int nScreenY = GetSystemMetrics(SM_CYSCREEN); //获取屏幕的高度

	SetWindowPos(hWnd, HWND_TOP, nScreenX / 2 - (rect.right - rect.left) / 2,
		nScreenY / 2 - (rect.bottom - rect.top) / 2, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);//不改变窗口大小,只将窗口置顶显示,并移动到屏幕中心

	MSG msg;
	while (GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return 0;
}

鼠标点击色块区域的算法,还需进一步的修改。

时间: 2024-11-28 21:45:57

最强大脑--51度灰挑战项目的相关文章

李彦宏搭档周杰伦亮相《最强大脑》获点赞

在江苏卫视<最强大脑>节目惊艳首播的时候,百度创始人李彦宏搭档音乐才子周杰伦亮相了首期节目,并且他们和陶晶莹.梁冬.李永波.魏坤琳四位跨界评审一起找寻了中国"最强大脑".李彦宏的计算机科学背景.缜密分析逻辑还有他在人工智能的造诣,让这位技术男神对挑战选手的分析点评一语中的,从而成为整场节目亮点.李彦宏从人工智能.图像识别角度的专业分析,让现场的音乐天才周杰伦.脑力科学家魏博士都为李彦宏频频点头称赞. 而李彦宏本人,其实正是业界公认的"最强脑力".根据节目

【深度】小度VS最强大脑声纹识别战成平局,吴恩达详解技术原理

2016年1月13日晚,百度人工智能代表"小度"与最强大脑选手孙亦廷在声纹识别上展开人机大战,最终双方战平.在总比分上,小度凭借着上周险胜王峰,继续保持领先优势.这场人机大战依然留有悬念,双方将在下周迎来终极决战. 本周比赛的项目是凭借既有声音片段识别发声者身份,也就是所谓的声纹识别(Speaker Recognition).比赛的设置是,最强大脑"听音神童"孙亦廷和小度需要凭借3位目标对象残缺的声音资料,在性别相同.年龄相仿.声线极为相似的专业合唱团中将她们分别找

《最强大脑》中日激烈对抗,中国虽败犹荣

上周<最强大脑>中日对抗赛紧张激烈,最终比分1比3,中国队战败."魔方机器人"孙虹烨遭遇世界排名第三的郡司光贵甘拜下风,日本九岁女孩辻洼凛音更以惊人的闪电心算速度征服全场,虽然中国"速算兄弟"也被其激发出了超越年龄的抗压能力.中国队唯有"鬼才之眼"王昱珩在眼力上战胜了原口证老先生,但他在比赛时放弃两小时观察的傲骄态度在赛后备受争议. 中国对抗赛共三轮比赛,孙虹烨首战失利后,"鬼才之眼"王昱珩与原口证老先生比拼的&q

《最强大脑》国际赛如火如荼,王昱珩回应傲慢说

<最强大脑>国际赛如火如荼,3月13日在江苏卫视终于迎来首次中日脑力竞技. 在刚刚播出的比赛中,"鬼才之眼"王昱珩力挽狂澜,拿到对中国战队来说至关重要的一分.尽管王昱珩神一般的技能再度在中日脑力PK中得到验证,但他的台风表现,似乎遭到评审质疑.他放弃两小时的赛前观察,中途打盹,种种举动让人疑惑,甚至有人质疑他"傲慢""没礼貌".王昱珩对此首度回应:"当时在台上还想说更多的,但怕打乱节奏没说." 王昱珩解释,他挑战扇

李彦宏坐镇《最强大脑》,一次与众不同的跨界

中介交易 SEO诊断 淘宝客 云主机 技术大厅 按:1月3日,2014年首个周末,卫视台开始收视率大战,湖南卫视<我是歌手>,江苏卫视<最强大脑>都有意思.<我是歌手> 亮点是京东广告,<最强大脑>亮点是百度李彦宏,近期比较闲散,看电视,做点与互联网有关的点评. 去年开始,互联网大佬都流行跨界,最近百度创始人李彦宏重磅加盟了国内首档科学真人秀节目<最强大脑>.当然,李彦宏的跨界却与之前大佬的跨界不同,找到了属于自己的独特跨界方式--纯技术范儿.我

国内首档大型科学类励志类真人秀:《最强大脑》

最近火了一档电视综艺节目,而且是"国内首档大型科学类励志类真人秀":<最强大脑>.据说这个节目借鉴自德国,经过本土化改造后,把<非诚勿扰>都挤出了黄金时间段,来势汹汹啊! 国内的综艺节目起步比较晚,但步伐不慢.从<快乐大本营>开创综艺新风后,情感和家庭纠纷节目.选秀大会.相亲节目此起彼伏,力撑着电视媒体.2013年的<爸爸去哪儿>更是萌童出世,谁与争锋!益智类也有过一段值得回忆的日子,比如<开心辞典>.<幸运52>

讲了一天课回到酒店打开电视,正放着《最强大脑》

昨天晚上,讲了一天课回到酒店打开电视,正放着<最强大脑>,刚好到了奶茶妹妹做主持人的那个环节,我看得很享受,看起来她主持得也很享受. 做为一个网红,奶茶妹妹红了这么多年,有绯闻没丑闻,更是从网上走到电视里,简直是女神到了极点,这到底为什么? 今天我就跟大家聊聊奶茶妹妹的钱规则,一个超级网红的的品牌符号学. 过去几年,从论坛上红起来了很多网络红人,但这些大多是草根和奇葩,比如奇葩路线的罗玉凤.励志路线的芙蓉姐姐,清纯路线的天仙姐姐,甚至包括最近超级草根的庞麦郎等,最后都成了流星. 其实奶茶妹妹更

DNF阿拉德最强大脑 预约4·16答题领神秘大奖

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; [科技讯]3月24日消息,DNF阿拉德最强大脑活动即将开启,预约416新内容揭晓提醒,即可领取预约奖励.玩家每天可以进行一次答题,十道与游戏内容相关的题目分别会获得与题目有关的不同的神秘奖励.每答对一题即可获得一次抽奖机会. 4月16日进入获得神秘内容新专题领取预约完成奖励. 下面是此次活动的具体内容.

CF挑战项目团队活动 胜者可获永久火麒麟

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;   [科技讯]5月21日消息,CF日前又推出全新战队活动.玩家挑战CF项目团队,获胜队伍将会获得永久火麒麟奖励.此次竞技将启用全新战场模式,在冰封要塞中,玩家将与CF项目团队一争高下. 集结火线兄弟挑战CF项目团队 本次活动将由五名玩家组成队伍在活动页面报名,报名时间从5月17日持续至5月21日,以随机摇号的方式抽取队伍与CF项目组进行战场对决,本次活动将比赛大区选