捣鼓了将近半个月的控制台.还是小有成就.
熟悉了许多操作控制台的函数.
用控制台作为绘图工具,绘制出了俄罗斯方块和贪食蛇.
在公司用控制台模拟了一个用于显示信息的"多窗口".
尝试了一把控制台显示3D的感觉.
一切都很美妙.但时时候停下来了.解决当前应该在意的问题.
当再有闲暇时间时,再回来慢慢回味,去体会那种在简陋的设备下开发游戏的快感.
无奈,我是一个八0后,没有经历过那晦涩而难忘的DOS游戏开发年代. 因此,只有自己来找罪受了.
我喜欢造轮子.喜欢在造轮子的时候用一些比较落后的工具. 想细细体会一般那神奇的感觉.
此次完善的内容:
俄罗斯方块已经做完. 开始,游戏,结束场景都已做完.
贪食蛇能加分.(但没有做升级).
新增了几个小例子.用于快速了解这个控制台绘制层.
解析了_kbhit( )函数的返回值. 使之可以取得上,下,左,右光标,以及ESC,空格,回车键.
图形的显示又回到了开始的彩色绘图.相比之前几帧的效率,不能和现在的同日 而语.
其中,完成度较高的要属俄罗斯方块了.基本上是一个成型的小游戏.
由于刷新率很高.我这机器跑40帧,在公司机器跑200帧.虽然用了双缓冲,在在快速交换缓冲的时候,也会闪屏.因此我将其限制为了10帧. 但画面的更新是按时间来的.因此不会影响.
不说了,上码,发图.
下载地址.CCGE v1.0.1
摘要: 这里设计了一个类,通过4个字节存储日期,8个字节存储DateTime,并添加了一些跟时间日期相关的函数, 如:星期几查询,特定日期之后多少天是几号, 两个日期之间相隔多少天等等。对于一般的用途,基本上够用了头文件:
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.... 阅读全文
之前的一篇文章曾经说过我在准备一个面向组合子编程的ppt和demo。在公司内部进行试运行之后,今天终于开讲了。
当然在这之间的几个星期里面,我修改了ppt的内容,还有为demo添加了单元测试。所以我把ppt的内容和demo的代码也一起打包上来了。
ppt包含2003和2007两种格式,demo使用的是Visual Studio2010的C#,当然是为了使用那个激动人心的“缺省参数”语法了。如果没装2010的话,那就赶紧装一个哈,如果不想装,那看看代码就行了。
摘要: MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 做ACM题目的时候 , 经常使用到 fill, memset , for 操作对 数据进行初始化操作, 在测试数据不大,而且数组范围也不大的情况下,这几种操作的时间差距不是很明显. 但是!... 阅读全文
很久没有用WindowsAPI来读取INI,在公司写服务器逻辑需要用到,拿来试了下。
记得很早以前就用过GetPrivateProfile*系的INI读取函数,有一个问题很烦:ini的文件路径必须是绝对路径,否则即便工作路径是设置正确的,也是无法读取到ini文件。以前有查过,说是内部搜索路径的问题。默认是在system32去找。4,5年前的处理方法就是把绝对路径拿过来和当前路径组合后传给GetPrivateProfile*系API。
之后,我自己一直是用自己封装的文本解析类来读取ini,很久没碰这个API,也就没有路径烦恼
今天再次碰到,故询问了下其他人有没有什么好的方法:
只需要将路径改为当前路径标识即可,即:
setting.ini --> ./setting.ini
再次诅咒这个恶心的API
一直在想控制台既然能表示像素,那也可以显示3D咯.虽然看起来粗粗的,但的确是3D哈.
用积木的HGL修改了其绘制的地方.得到了控制台下的3D立方体.还能旋转,效果简陋,但很拉风.
演示程序下载
由于是一个测试,3D计算的代码并没不是自己写的.就不发源码了.
启动程序后,将其最大化即可. 将其字体换成3x5效果更好.
摘要: 多重背包O(N*V)算法详解(使用单调队列)
多重背包问题:
有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件。怎样装才能使背包内的物品总价值最大?
网上关于“多重背包”的资料倒是不少,但是关于怎么实现O(N*V)算法的资料,真得好少呀,关于“单调队列”那部分算法,又没说... 阅读全文
opengl中
gluBuild2DMipmaps()与glTexImage2D()
是很常用的函数
他们的作用是绑定函数
但是有时候使用
glTexImage2D
并不能正确绑定纹理
其原因据我所知有2个
1个是图形大小不是2的整数次幂
还有一个就是
如果使用glTexImage2D,则在纹理包裹模式中不适用MIPMAP系列
摘要: MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 C ++ STL 中与heap 有关的操作有 如下几个 : make_heap(), pop_heap(), push_heap(), sort_heap(), is_heap... 阅读全文
摘要: 输入文件:
1 string abc,def; 2 3 void main() 4 { 5 int abc,def; 6 read(abc);&nb... 阅读全文
摘要: MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 vector – 一. vector可以模拟动态数组 – 二. vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public &nb... 阅读全文
摘要: • MiYu原创, 转帖请注明 : 转载自 ______________白白の屋 几种常用的容器: map, vector, list, queue,stack, string ( 这个字符串也算个容器 ) STL容器的共通操作 –一. 初始化(initi... 阅读全文
摘要: 代码:uniobj.h
1 /************************************************************************ 2 * 3 * Created by kusamba@126.com at 2009-2-12 16... 阅读全文
摘要: _MSC_VER 定义编译器的版本。下面是一些编译器版本的_MSC_VER值 MS VC++ 9.0 _MSC_VER = 1500 MS VC++ 8.0 _MSC_VER = 1400 MS VC++ 7.1 _MSC_VER = 1310 &nbs... 阅读全文
摘要: 原文链接:
http://www.wutianqi.com/?p=1181
大家在学习C++编程时,一般在输入方面都是使用的cin.而cin是使用空白(空格,制表符和换行符)来定字符串的界的。这就导致了对于带有空格的字符串,比如”I
Love www.CppLeyuan.com”只能读入”I”,后面的都无法读入。这时怎么办?
... 阅读全文
摘要: 编写一个DirectShow应用程序大体需要3个步骤
创建一个Filter Graph Manager的实例
使用Filter Graph Manager创建一个filter graph,此时需要必备的filter
使用Filter Graph Manager控制filter graph和通过这些filter的流,在这个过程中,应用程序会收到Filter Grap... 阅读全文
摘要: 电信provisioning系统中,常常需要与远程服务器实时交换一些数据,以完成用户的请求。由于简单对象访问协议(Simple Object Access Protocol, SOAP)的流行,许多涉及到第三方的应用,我们一般都比较乐意使用SOAP来开发。不过,由于可能涉及到公司的机密,本系列教程的开发实例尽量采用在网上已经公开的Web Service资源。
前面四节的教程,分别... 阅读全文
摘要: 在游戏服务器中,处理玩家登陆需要向数据库查询玩家的账号和密码,玩家上线和下线需要对玩家的角色数据从数据库中读取和保存。可以说,相对于游戏逻辑处理来说,数据库操作是一种相对很慢的操作,即便你通过使用多个线程多个数据库连接来提高数据库操作的处理能力,但是,在高并发高负载的服务器应用中,这样仍然会是相当的负载瓶颈。设想这样一种设计方案,见下图... 阅读全文
摘要: Muduo 是我在业余时间编写的基于 Reactor 模式的 C++ 网络库,适用于 Linux 平台,支持多线程。本文主要介绍 muduo 网络库的使用。其设计与实现将有另文讲解。 阅读全文
SceneLib:
C/C++的win32编程库,可以创建智能的图形窗口,以及标准的2D和基于 OpenGL的实时3D图形,不必在真实的WIN32窗口里进行任何WINDOWS编程去建立2D和3D图形.
如下:
摘要: 具体见:http://www.uipower.com/index.php使用方法
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->/* 1、将SkinPPWTL.lib skinppwtl.dll&nbs... 阅读全文
摘要: DirectShow:我们熟悉的 DirectX家族中的一个组件,主要针对程序员开发数字音/视频程序提供支持。使用DirectShow可以在很短的时间内搭建自己的视频播放、捕获和编辑应用程序,不必对有关视频硬件如显卡、视频捕获设备、视频编码算法、解码算法、音/视频数据同步等复杂技术做细节的掌握。一、DirectShow SDKDirectX中的一个组件,DX是Microsoft为流媒体应用开发的一... 阅读全文
作者:CppExplore http://www.cppblog.com/CppExplore/和http://blog.csdn.net/cppexplore同步发布
一 semaphore机制
古老的信号量机制,80年代初,从System V体系中产生,称为System v信号量。90年代,Posix标准确立,其中的信号量称为posix信号量。当前linux系统支持这两种信号量(man semget/ man sem_post)。System v信号量为有名信号量,可以用于多进程间的互斥同步。posix信号量分有名和无名两种,当前linux只支持无名信号量,可以用于多线程之间的互斥同步,通过共享内存也可以用于多进程之间。
信号量属于内核级别的互斥同步机制,相关调用总是陷入内核态,属于功能强大/重量级的实现。
二 spinlock机制
多核SMP的cpu流行后,出现的新的互斥同步机制。spinlock实现原理为用户态循环尝试机制,不陷入内核态进行线程切换。spinlock的原子性通过CAS(CompareAndSwap)原语实现。使用spinlock时,应该保证保护区间内代码执行迅速,不应该存在io等耗时操作。
多核系统下,针对可快速执行的保护区使用用户态循环尝试机制,可以保证执行线程不需要引起上下文切换即可快速执行通过,这种机制也被形象的称为lock-free机制。我们可以这样理解:lock-free机制即为循环尝试,spinlock是它的具体实现。
spinlock的实现有多种,常见的有pthread_spin_lock,该spinlock无限制循环尝试,在多核环境下并且保护区代码执行迅速时,执行线程很快可以拿到锁,但当单核环境或者保护区代码执行慢速时,则会耗尽该线程拥有的时间片之后交出cpu,造成cpu的浪费。另一常见的spinlock是boost智能指针中的实现,进行3次无间断的循环CAS原语判断,之后若再次失败,则调用sleep族函数,交出cpu执行权,待再次分配到cpu时间片后继续进行CAS原语判断操作。
三 mutex机制
mutex属于os之上的再次封装实现。在linux2.6内核上,线程库为nptl,其中的mutex基于futex机制实现,它的实现原理,简单说就是spinlock+semaphore,首先使用spinlock尝试,可以拿到锁则直接向下执行,拿不到锁则执行semaphore机制,陷入内核态,进入线程切换。
在多核环境下,当mutex保护的代码段内无io操作,执行很快时,大多数情况下通过spinlock都可拿到锁,不需要陷入内核态。
四 为智能指针正名(boost)
智能指针的引用计数仅仅为一个整型变量的增减,属于执行迅速的典型,使用spinlock机制保护,最新boost版本中仅仅是spinlock,而非mutex。从性能角度说,使用智能指针的现象是cpu略微上升(循环尝试导致),而并发量/单个请求的响应时间并无明显影响。proactor机制实现的网络层,智能指针基本无法绕过,刻意避免带来的只能是丑陋的代码和维护量的上升。但线程之间尽量避免传递指针(智能指针),通过传递id等代替。
智能指针有它使用的场景,不能滥用,也不能刻意避免。
摘要: 因为在开发CMinus的过程中为了异常处理(最终没有实现进CMinus),曾经学习了一下怎么用汇编语言写try-catch,因此这个CPU相关的处理方法就被我偷了哈,实现在了NativeX的虚拟机里。 在NativeX里面,try-catch和throw非常简单。throw你可以加一个值当异常数据,也可以不加(不会修改上次的... 阅读全文
摘要: 最近在Android平台上写NDK程序,使用OpenGL ES(注意:这里是OpenGL ES 1.0和1.1版本),发现程序在运行过程中出现如下错误:
通过log,在android的源码中的\frameworks\base\opengl\libs\EGL\目录下有Loader.cpp文件,通过这 个文件我们可以发现,我们的OpenGL的调用都是通过加载实现了OpenGL ES的dll,然后在该dll中查找我们调用的接口,如果接口没有找到,EGL就会打印出log,如上所示。
阅读全文
摘要: 本文来自《程序员》杂志0906期)
公司的价值取决于他的商业模式。软件在进化,在网络化的软件商业模式下,每个网民都在接触Linux,IT从业者应该更多接触Linux 平台的知识。云计算、上网本、智能手机、网络游戏、SNS发迹、微软收购雅虎等其实反映了这种软件的网络化趋势。
Windows 与Linux 哪个更好? 好像已经争论了近10年。为什么微软认为一个“搜索引擎”Google是他... 阅读全文
学了三种简单博弈(前一篇)之后,我又在这篇博文这学了HDU1907的解法
下面说下我的理解,有些借鉴原博文。
这题和下面的题有点相似,但是又不一样
也就是说把最后取完的定为输家改成,最后取完的定为赢家。
后面的这个要简单一点,下面是简单分析,先来看这个简单的
首先我们用T表示当前状态的所有火柴数异或为0,否则极为S。
1.S可以转化成T
我们设一共有n堆火柴,每堆有k(i)根.
那么S态中k(1)^k(2)^……^k(n) != 0,这个值我们记为c
那么肯定有某个k(i)的最高位和c的最高位同为1,不然c的最高位变成了0
假设这个最高位和c的最高位同为1的是第m堆,这样我们可以得到x = k(m)^c < k(m)(x的最高位为0)
k(1)^k(2)^……^x^……^k(n)
=k(1)^k(2)^……^k(m)^c^……^k(n)
=k(1)^k(2)^……^k(m)^k(m+1)^……^k(n)^(k(1)^k(2)^K(3)^……^k(n))
= 0
这样我们只要从第m堆中取出k(m)-x根火柴,那么剩下的就变成了T态。
2.T一定会转化成S
假设T不转化成S,
我们从第m堆中取出一定的火柴数那么我们得到
0 = k(1)^k(2)^……^k(m)^……^k(n)
0 = k(1)^k(2)^……^k(m')^……^k(n)(k(m)表示取之前的 k(m')表示取最后的)
那么我们得到k(m)^k(m')=0也就是说k(m)==k(m')矛盾。
3.S态,只要方法得当就可以取胜
每一个S态可以转化成T态,然后每一个T态必然转化成S态,所以每一次只要把S态变成T态,那么对手就只能把T态变成S态,这样自己就一直控制着S态,最后一定可以取完(变成T态)成为胜利者
4.T态,只要对手方法得当就必输
同3
下面我们来看看该题的思路
我们设只有一根火柴的堆为单根堆,否则为充裕堆,充裕堆>=2的T用T2表示,全是单根堆的T用T0表示(没有T1)
同样的充裕堆>=2的S用S2表示,全为单根堆的S用S0表示,只有一堆充裕堆的用S1表示
5.S0必败,T0必胜
每次自己取奇数堆的,那么最后一堆一定由自己取.T0必胜同理
6.S1只要方法得当,必胜
如果单根堆的堆数为偶数,那么把充裕堆中取成只剩下1根,变成S0,对手必败.如果单根堆的堆数为奇数,那么把充裕堆全取完,同样对手必败
7.S2不可以一次转化到T0
每次最多只能取完一堆,所以2堆充裕堆不可能一次就没了
8.S2可以一次变成T2
用1可知S可以变成T,由7可知S不可一次变成T0,所以S可以一次变成T2
9.T2不可以一次变成S0
同7
10.T2一定变成S1或者S2中的一种
由2知T一定变成S,由9知T2不可一次变成S0,所以一定变成S1或S2中的一种
11.S2,只要方法得当一定胜
S2可以变成T2,然T2一定变成S1或者S2,如果变成S1,已胜,变成S2,则继续,直到T2只能变成S1为止。
12.T2,只要对手方法得当必输
同11
综上所述先手必胜态为T0 S2 S1
必输态为S0 T2
到这这两题就可以轻松搞定了。
1.开机自动启动备份功能
2.备份文件名按照日期及时间分文件
3.包含存储过程的备份
主要有两个文件:
1.mysqlbackup.py是定时驱动脚本(这里没用cron),内容如下:
---------------------------------------------------------分割线---------------------------------------------------------------------------
import time,os,sys
while 1:
os.system("sh /root/mysql/mysqlbackup.sh")
time.sleep(60*60)
---------------------------------------------------------分割线----------------------------------------------------------------------------
2.mysqlbackup.sh是具体的备份脚本,实现备份表和存储过程,内容如下:
---------------------------------------------------------分割线---------------------------------------------------------------------------
#!/bin/sh
Time=`date +%Y_%m_%d_%H_%M_%S`
mysqldump -uroot -pmysql sns2 -R > /root/mysql/logs/sns2.$Time.sql
---------------------------------------------------------分割线---------------------------------------------------------------------------
3.开机启动备份功能:在/etc/rc.local 文件里面添加下面内容,注意要指定python的可执行文件目录,此处为/usr/bin/python,后面是py脚本的目录:
---------------------------------------------------------分割线---------------------------------------------------------------------------
/usr/bin/python /root/mysql/mysqlbackup.py &
---------------------------------------------------------分割线---------------------------------------------------------------------------
摘要: 如上一篇文章所说,Vczh Library++3.0的NativeX语言实现了计划的所有泛型语法。让我们来看一个简单的例子:我们为类型写一个Equals函数。我们可以为普通类型,譬如int32写一个Equals函数。我们有Vector<T>类型,只要T类型拥有一个Equals函数,那么Vector<T>显然也可以有Equals函数。问题... 阅读全文