游戏开发面试知识点汇总
情景设计
排行榜设计
- 利用MySQL来实现,存放一张用户积分表user_score
- 积分排名数组实现
- 自己实现排序树
玩家实力匹配
碰撞检测算法
算法
Top K
在数据中找到前K大
经典的 Top K 问题
692. Top K Frequent Words
堆(heap),它是一种优先队列。优先队列让你能够以任意顺序添加对象,并随时(可能是在两次添加对象之间)找出(并删除)最小的元素。
函 数 | 描 述 |
---|---|
heappush(heap, x) | 将x压入堆中 |
heappop(heap) | 从堆中弹出最小的元素 |
heapify(heap) | 让列表具备堆特征 |
heapreplace(heap, x) | 弹出最小的元素,并将x压入堆中 |
nlargest(n, iter) | 返回iter中n个最大的元素 |
nsmallest(n, iter) | 返回iter中n个最小的元素 |
Python
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
count = collections.Counter(words)
# -freq: 出现freq最高的word变成了最小,方便堆弹出最下元素
heap = [ (-freq, word) for word, freq in count.items()]
heapq.heapify(heap) # 将列表变成heap, 按照-freq的大小排序放入heap中
return [heapq.heappop(heap)[1] for _ in range(k)] # 弹出最小的k个值
Counter
import collections
obj = collections.Counter('aabbccc')
print(obj)
#输出:Counter({'c': 3, 'a': 2, 'b': 2})
C++
typedef pair<string, int> PAIR;
class Solution {
public:
vector<string> topKFrequent(vector<string>& words, int k) {
unordered_map<string, int> dict;
for (string s: words)
{
dict[s]++;
}
struct cmp
{
bool operator()(const PAIR &a,const PAIR &b)
{
return (a.second == b.second)?
(a.first > b.first):
(a.second < b.second);
};
};
priority_queue<PAIR, vector<PAIR>, cmp> pq(dict.begin(), dict.end());
vector<string> res;
while (!pq.empty() && res.size() < k) {
PAIR top = pq.top();
res.push_back(top.first);
pq.pop();
}
return res;
}
};
24点算法
从n个村庄选m个点建邮局,使得每个村庄到邮局的距离和最小
POJ 1160 Post Office
在v个村庄中建立p个邮局,求所有村庄到它最近的邮局的距离和,村庄在一条直线上,邮局建在村庄上。
首先求出在连续的几个村庄上建立一个邮局的最短距离(邮局的位置应该在中位数上,如果村庄个数为偶数,则处于最中间的两个村庄都可以),用数组dis[i][j]表示在第i个村庄和第j个村庄之间建一个邮局的最短距。
dis[i][j]=dis[i][j-1]+x[j]-x[(i+j)/2]; (村庄位置为x[i])
用数组dp[i][j]表示在前i个村庄中建立j个邮局的最小距离。即在前k(k<i)个村庄建立j-1个邮局,在k+1到j个村庄建立一个邮局。
dp[i][j]=min(dp[i][j],dp[k][j-1]+dis[k+1][i])
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 305
const int inf=0x3fffffff;
int dp[N][35]; //在前i个村庄中建立j个邮局的最小耗费
int dis[N][N];//dis[i][j]:第i个村庄到第j个村庄建一个邮局的最短距离
int x[N]; //村庄位置
int main()
{
int v,p,i,j,k;
while(~scanf("%d%d",&v,&p))
{
for(i=1;i<=v;i++)
scanf("%d",&x[i]);
sort(x, x + i);//如果是乱序输入的话需要按照非降序排一下
//memset(dis,0,sizeof(dis));
for(i=1;i<=v;i++)
{
for(j=i+1;j<=v;j++)
{
dis[i][j]=dis[i][j-1]+abs(x[j]-x[(i+j)/2]);
}
}
for(i=1;i<=v;i++)
{
dp[i][i]=0; //一个村庄一个邮局距离为零
dp[i][1]=dis[1][i]; //前i个村庄建立一个邮局
}
for(j=2;j<=p;j++)
{
for(i=j+1;i<=v;i++)
{
dp[i][j]=inf;
for(k=j-1;k<i;k++)
{
dp[i][j]=min(dp[i][j],dp[k][j-1]+dis[k+1][i]);
}
}
}
printf("%d\n",dp[v][p]);
}
return 0;
}
游戏常识
游戏类型
- RPG= Role-playing Game∶角色扮演游戏
- ACT= Action Game∶动作游戏
- AVG= Adventure Game ∶冒险游戏
- SLG= Strategy Game∶策略游戏
- RTS=Real-Time Strategy Game:即时战略游戏
- FGT= Fighting Game∶格斗游戏
- STG= SHOTING GAME∶射击类游戏
- FPS=First Personal Shooting Game:第一人称视角射击游戏
- PZL= Puzzle Game∶益智类游戏
- RCG= Racing Game∶竞速游戏 [也有称作为RAC的]
游戏引擎
- Frostbite:主要玩过寒霜的极品飞车系列,支持大规模全方位的渲染,地图细节也优良,尤其大型地图的内容十分丰富,场景整体展示十分好看。但是细节表现不足(寒霜的极品飞车经不起停车细看),同时优化不是很好,在显卡够用的情况下很吃内存。
- Infinity Ward:使命召唤全系列。环境渲染优秀,光影效果在全局光照系统的加持下十分优秀,室内战斗效果和战火效果在同期很优秀,使用最新的DirectX来弥补自身的贴图粗糙。远景渲染及大地图较为粗糙。
- Rage:神作GTA5 200小时玩家。高强度开放大地图缓冲无敌,逼真的大规模动态天气系统,大批量的AI管控,贴图逼真,优化很好。但是穿模经常出现,渲染效果欠佳。