植物大战僵尸 PVZ Qt版
一、初步设计 1. 框架 本程序分为两个部分:菜单界面采用QWidget实现,有一个父窗口,通过信号槽机制调用各种子窗口;游戏界面使用QGraphicsScene框架实现,里面包含view和各种图形项item。 本程序采用面向对象程序设计思路,创建基类植物Plant、僵尸Zombie、卡牌Cards,在这基础上派生出不同的类,如豌豆射手、路障僵尸等。创建一个Map类,用以记录植物的位置,以及是否可以种植。 2. 界面 首先,整个窗口界面是900X600的大小,并且大小不可调。 菜单界面依然是植物大战僵尸的那个味道,放置熟悉的菜单背景,在右侧放置游戏开始按钮,玩家点击后程序会展示僵尸的一封信,再次点击即可进入游戏界面。 游戏界面也依然是植物大战僵尸的那个味道,几乎差不多。最上方是卡牌选择框,在选择框左侧显示阳光点数。左上角是返回菜单和游戏暂停按钮,在左侧摆放割草机,右侧出僵尸,正中一大片区域放植物,最下方展示游戏目标。 游戏开始,依然是植物大战僵尸的味道。玩家选择卡牌,在地图中央点击放置植物;若想铲除植物,则需点击右上方的铲子进行铲除操作。 3. 图形项Item 基于QGraphi...
C++学习笔记(7)——标准模板库STL之set和map
零、pair类模板 pair与python中字典的键值对非常像。在C++中,pair的定义是: 12345template <typename T1, typename T2>struct pair{ T1 first; T2 second; ...下面都是各种构造函数重载版本,不写了 可以不写参数:pair<string, double> p 可以写参数(常用):pair<string, double> p1("xiaoming", 78) 可以这样初始化:pair<string, double> p2(pair<string, double>("xiaoming", 78)),当这样写的时候,其实是用了定义中的函数模板,参数必须是pair模板类对象的引用。 也可以这样初始化:pair<string, double> p3 = make_pair("xiaoming", 78) 访问pair对象的“键”(Key):p.first 访问pa...
C++学习笔记(6)——标准模板库STL之vector和list
一、动态数组vector 1.初始化 初始化为空:vector<int> v; 用另一个vector来初始化,即构造一个副本:vector<int> v(v1); 大小为n,并全部初始化为元素i :vector<int> v(n, i); 构造大小为n的容器,没有初始化里面的元素:vector<int> (n); 构造大小为4,并初始化里面的各个元素:vector<int> {1,2,3,4}; 数组a[0]到a[5]的内容放进v:vector<int> v(a, a+5); 2.元素个数 v.size(); //返回容器中元素的个数,返回类型是int v.capacity(); //返回容器中的容量,容器的预留空间也会计算在内 3.添加/插入元素 v.push_back(n); //将n加到容器末尾 v.insert(i, n); //将n插入到迭代器i指向的位置,并返回i v.insert(i, i_first, i_end); //将其他容器上的区间[i_first,i_end)中的元素插入到迭代器i指...
C语言中的函数指针
直接上程序说明函数指针是怎么写的: 1234567891011121314151617181920212223242526272829#include <iostream>using namespace std;int power(int a){ return a*a;}int cube(int a){ return a*a*a;}void aPrint(int a){ cout<<"test:"<<a<<endl;}int main(){ int (*p)(int); void (*print)(int); p = power; print = aPrint; print((*p)(6)); p = cube; print((*p)(6)); return 0;} 输出: 12test:36test:216
C++自己实现cout
接触这么久C++了,我们得尝试写一个自己的cout了。在实现之前,先扯扯几个概念: 一、cout是谁? 不就是输出语句嘛?!这个答案太浅显。正确答案:cout是类ostream的一个对象,而这个对象有一个成员重载运算符函数:operator <<。顺便一说,类ostream又属于iostream库中,iostream是标准的C++头文件。既然如此,那么这个头文件里应该是这样写的: 123456789//iostreamclass ostream{ public: ostream operator << (int n){输出n} ostream operator << (double n){输出n} ...}ostream cout; 这个ostream::operator <<有多个重载版本,所以形参什么类型都有,包括int,double,char等等。当我们写cout<<a时,其实也可以写成cout.operator<<(a)。 cout的语...
【POJ C++题目】魔兽世界之二:装备(简化)
今天把代码稍微简化了一下,主要改动是: 武士类构造函数形参的简化,形参直接来一个Command类更加方便,但是这样做Command类就必须放在程序开头,所以就有了: 类声明和成员函数的顺序有所改动,顺序是:Command类声明 -> Warrior类声明+各武士类声明 -> Command类成员函数实现 -> Warrior类+各武士类成员函数实现,个人认为这种顺序也是挺合理的 以下为代码: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132...
【POJ C++题目】魔兽世界之二:装备
一、题目描述 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值这两种属性。 有的武士可以拥有武器。武器有三种,sword, bomb,和arrow,编号分别为0,1,2。 双方的武士编号都是从1开始计算。红方制造出来的第 n 个武士,编号就是n。同样,蓝方制造出来的第 n 个武士,编号也是n。 不同的武士有不同的特点。 dragon 可以拥有一件武器。编号为n的dragon降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量。 ninja可以拥有两件武器。编号为n的ninja降生时即获得编号为 n%3 和 (n+1)%3的武器。 iceman有一件武器。编号为n的iceman降生时即获得编号为 n%3 的武器。 lion 有“忠诚度”这...
【POJ C++题目】魔兽世界之一:备战
一、题目描述 描述 魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。 红司令部,City 1,City 2,……,City n,蓝司令部 两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值、攻击力这三种属性。 双方的武士编号都是从1开始计算。红方制造出来的第n个武士,编号就是n。同样,蓝方制造出来的第n个武士,编号也是n。 武士在刚降生的时候有一个生命值。 在每个整点,双方的司令部中各有一个武士降生。 红方司令部按照iceman、lion、wolf、ninja、dragon的顺序循环制造武士。 蓝方司令部按照lion、dragon、ninja、iceman、wolf的顺序循环制造武士。 制造武士需要生命元。 制造一个初始生命值为m的武士,司令部中的生命元就要减少m个。 如果司令部中的生命元不足以制造某个按顺序应该制造的武士,那么司令部就试图制造下一个。如果所有武士都不能制造了,则司令部停止制造武士。 给定一个时间,和双方司令部的初始生命元数目,要求你将从0点0...
C++学习笔记(5)——标准模板库STL之概述
STL指的是C++的标准模板库(Standard Template Library,STL),本篇将介绍STL的基本概念。 一、容器 容器是用于存放数据的类模板。我们在使用容器类模板时,要将它实例化,指明容器中存放的元素是什么类型。 1.容器的分类 容器有以下几种分类: (1)顺序容器 元素在容器中的位置与元素的值无关,你想在什么位置插入元素就在什么位置插入。顺序容器分为三种:可变长动态数组vector、双端队列deque、双向链表list。 (2)关联容器 关联容器内的元素是排好序的,它是按照某种规则将元素插入到合适的位置上。因为是排好序的,所以关联容器在查找时具有非常好的性能。关联容器有四种:set、multiset、map、multimap。 (3)容器适配器 STL还在两类容器的基础上屏蔽了一部分功能,突出或增加另一部分的功能,实现了容器适配器。容器适配器分为三种:栈stack、队列queue、优先级队列priority_queue。 2.容器对象的定义方法 如何定义一个容器对象呢?跟以前所说的模板类似,写成例如vector<int> a;就行了,其中vect...
C++学习笔记(4)——模板
一、函数模板 函数模板格式(其中class可以替换为typename): 12345template <class 类型参数1, class 类型参数2, ...>返回值类型 模板名(参数名){ 函数体;} 例如: 123456789101112131415161718192021222324252627282930313233#include<iostream>using namespace std;template <typename T> //typename可以替换为classvoid cswap(T &x, T &y) //交换数值{ T tmp = x; x = y; y = tmp;}template <typename T>T test(T o){ return o+1;}int main(){ int n = 1, m = 2; cswap(n, m); //模板被替换为cswap(int &x, int &y),...



