《通过游戏编程实战教新手学C++编程》学习笔记

来源:互联网 发布:网络安全工程师 英文 编辑:程序博客网 时间:2024/05/17 09:30

    前言:本认为这只是一本教授C++基本语法的小书,仔细翻看过一遍,里面涵盖了C++大部分常用的知识,有些程序和建议都非常精妙,贝海拾遗,恐以后忘记,故书写以记之。


1.rand()函数
下面是随机产生色子随机数的例子:

#include <iostream>#include <cstdlib>#include <ctime>using namespace std;int main(){srand(static_cast<unsigned int>(time(0)));//为随机数生成器设置种子int randomNumber = rand();int num = (randomNumber % 6) + 1;//die的范围为1~6cout << "你摇的色子的数字是:" << num << endl; return 0;}
rand函数的使用:
    rand()在cstdlib头文件中,它生成从0到32767之间的随机数。具体的上界取决于所使用的C++实现。该上界存储在cstdlib定义的常量RAND_MAX中。可以把RAND_MAX发送给cout。
    计算机基于数学公式生成的时伪随机数,而不是真正的随机数。可以把这想象成让计算机从一本包含许多数字的书中读取数字。通过从该书中读取,计算机可以表现的像是在产生随机数序列。
    但是这样存在一个问题:计算机总是从书的起始点读取数字。因此,计算机在程序中总是产生相同的“随机数序列”。
这个问题的解决方法是:告诉计算机从书的某个任意位置开始读取数字。该过程成为为随机数生成器确定种子。程序员为随机数生成器提供一个叫做种子的数来确定伪随机数序列的起始位置。

    下面的代码为随机数生成器确定种子。

srand(static_cast<unsigned int>(time(0)));//为随机数生成器设置种子 

   它基于当前日期和事件为生成器确定种子。
    srand()函数为生成器确定种子,它接收一个unsigned int型的值作为种子。

2.将字符串乱序
法I:对字符串取地址

//实现string单词乱序 for (int i=0; i<length; ++i){int index1 = (rand() % length);//生成随机值int index2 = (rand() % length);char temp = str[index1];str[index1] = str[index2];str[index2] = temp;}
    程序生成string对象中的两个随机位置,并交换两个位置的字符。交换操作的次数等于单词的长度。

法II:random_shuffle()

vector<string> words; // collection of possible words to guesswords.push_back("GUESS");words.push_back("HANGMAN");words.push_back("DIFFICULT");srand(static_cast<unsigned int>(time(0)));random_shuffle(words.begin(), words.end());//shuffle:洗牌,随手放,搬移
    random_shuffle用于打乱向量或字符串中的顺序。详细内容参见定义:
     The function swaps the value of each element with that of some other randomly chosen element. When provided, the function rand chooses which element.

    另外,random_shuffle还可以处理其它类型数组:

int n[4] = {0,1,2,3};random_shuffle(n, n+4);

3.动态分配内存

动态分配内存时较好的编程方法:

    int* pHeap = new int;    *pHeap = 10;     int* pHeap2 = new int[20];    delete pHeap;    delete pHeap2;        pHeap = 0;     pHeap2 = 0;

因为需要释放掉不再使用的已经分配过的内存,所以一个较好的准则但是每个new都应当有一个响应的delete。实际上,有些程序员尽可能编写new语句之后就编写delete语句,这样就不会忘记释放内存。

    int* pHeap = new int;    *pHeap = 10;     int* pHeap2 = new int[20];    delete pHeap;    delete pHeap2;
重点:上面的两条语句释放掉堆中的内存,但是他们没有直接影响到局部变量pHeap和pHeap2。这造成一个潜在的问题,因为pHeap和pHeap2现在指向已经返回给堆的内存,即它们所指向计算机可能在任意某个时刻以某种方式使用的内存。像这样的指针成为野指针,它们相当危险,绝不应当对它们解引用。

一种处理野指针的方法是将它们赋值为0.使得它们不再指向不应当使用的内存。

    pHeap = 0;     pHeap2 = 0;






如需转载,请注明出处:http://blog.csdn.net/rehongchen/article/details/8038551