1.俄罗斯方块的源代码?
2.3d稀疏卷积——spconv源码剖析(三)
3.python显示数组多少列
俄罗斯方块的源代码?
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
void draw_block(int x,int y,int style,int way);
void kill_line(int y);
void draw_little_block(int x,int y,int z,int style);
int check_block(int x,int y,int style);
int change(int *i,int *j,int key);
int style1,style,score,speed,l;
int board[][];
char str[];
struct shape
{
int xy[8],next;
};
struct shape shapes[]= /* 种方块(前
8个点表示4个小方块的相对位置 第9点表示类型) */
{
{
0,-2, 0,-1, 0, 0, 1, 0, 1
},
{ -1, 0, 0, 0, 1,-1, 1, 0, 2},
{ 0,-2, 1,-2, 1,-1, 1, 0, 3},
{ -1,-1,-1, 0, 0,-1, 1,-1, 0},
{ 0,-2, 0,-1, 0, 0, 1,-2, 5},
{ -1,-1, 0,-1, 1,-1, 1, 0, 6},
{ 0, 0, 1,-2, 1,-1, 1, 0, 7},
{ -1,-1,-1, 0, 0, 0, 1, 0, 4},
{ -1, 0, 0,-1, 0, 0, 1, 0, 9},
{ 0,-2, 0,-1, 0, 0, 1,-1,},
{ -1,-1, 0,-1, 1,-1, 0, 0,},
{ 0,-1, 1,-2, 1,-1, 1, 0, 8},
{ -1, 0, 0,-1, 0, 0, 1,-1,},
{ 0,-2, 0,-1, 1,-1, 1, 0,},
{ -1,-1, 0,-1, 0, 0, 1, 0,},
{ 0,-1, 0, 0, 1,-2, 1,-1,},
{ 0,-3, 0,-2, 0,-1, 0, 0,},
{ -1, 0, 0, 0, 1, 0, 2, 0,},
{ 0,-1, 0, 0, 1,-1, 1, 0,}
};
#define MAPXOFT 9 /* 第1个方块的位置 */
#define MAPYOFT 5
#define MAPXOFT1 /* 下一个方块的位置 */
#define MAPYOFT1
#define LEFT 0x4b
#define RIGHT 0x4d
#define DOWN 0x
#define UP 0x
#define ESC 0xb
#define ENTER 0x1c0d
int main()
{
int gdriver,gmode,
i,j,key,x0=5,y0=1,m,n,c,key1,p,q,le=0,b;
l=1,score=0;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"D:\\TURBOC2");
randomize();
for(m=0;m<=;m++)
for(n=0;n<=;n++)
board[m][n]=0; /* 初始游戏版 */
setcolor(); /* 开机的画面 */
settextstyle(0,0,3);
outtextxy(,,"WELCOME TO RUSSIS");
outtextxy(,,"READY GO");
setcolor();
settextstyle
(0,0,4);
outtextxy(,,"^_^");
/
*circle(,,);
ellipse(,,,,,);
ellipse(,,,,,);
ellipse(,,,,,);*/
getch();
settextstyle(0,0,1);
cleardevice();
setcolor(LIGHTRED); /* 画出游戏所在的范围图
*/
setlinestyle(0,0,3);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,BLUE);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor();
for(m=0;m<=;m=m+2)
ellipse(,,0,,+m,+m);
setcolor();
setfillstyle(1,0);
circle(,,);
floodfill(,,);
outtextxy(,,"* you can change the game");
/* 对游戏的说明 */
outtextxy(,,"-speed and the gradth by"); /
*上为变形 左右 为 调整
下为快下 ESC为退出 */
outtextxy(,," using 'up'and'down'.");
outtextxy(,,"* when you are plying the");
outtextxy(,,"game,you can use these pu");
outtextxy(,,"-tturns.");
outtextxy(,,"* if you want to go into t");
outtextxy(,,"-he game,please 'enter'.");
outtextxy(,,"* you can chang shapes ");
outtextxy(,," using UP");
outtextxy(,,"* RIGHT and LEFT can" );
outtextxy(,," move shapes");
outtextxy(,,"GAMESPEED:");
outtextxy(,,"GRADTH:");
printf("\n\n\n 1");
printf("\n\n\n\n 0");
/* setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED); */
outtextxy(,,"SCORES:");
outtextxy(,,"**The speed will");
outtextxy(,,"increas if score");
outtextxy(,,"increas 3");
for(p=0;p<=;p++) /* 对速度的调整 */
{ key=bioskey(0);
if(key==ENTER)
break;
if(key==UP)
{
if(l==9)
l=9;
if(l<9)
l++;
}
if(key==DOWN)
{
if(l==1)
l=l;
if(l>1)
l--;
}
gotoxy(2,4);
printf("%d",l);
}
for(q=0;q<=;q++) /* 对高度的调整 */
{
key=bioskey(0);
if(key==ENTER)
break;
if(key==UP)
{
if(le==5)
le=le;
if(le<5)
le++;
}
if(key==DOWN)
{
if(le==0)
le=le;
if(le>0)
le--;
}
gotoxy(2,8);
printf("%d",le);
}
key=bioskey(0);
if(key==ENTER)
{
style=random();
for(m=1;m<=le;m++) /* 具体的对高度的调整 */
{
b=random(7)+1;
for(n=1;n<=;n++)
{
if(random(2))
{
board[n-1][-m]=1;
draw_little_block(MAPXOFT+n,MAPYOFT+-m,1,b);
}
}
}
while(1)
{
while(1)
{
i=x0,j=y0;
style1=random();
setcolor(); /* 画出下一个方
块 */
draw_block(MAPXOFT1,MAPYOFT1,style1,1);
for(j=y0;j<=;j++)
{
while(1)
{
if(bioskey(1)) /* 方块的
调整 */
{
key=bioskey(0);
change(&i,&j,key);
}
if(!check_block
(i,j+1,style)) /* 判断方块能不能下降 */
break;
if(j==)
break;
if(speed==1)
{
draw_block
(i,j,style,0); /* 方块的下降 */
j++;
draw_block
(i,j,style,1);
delay();
}
if(speed!=1)
{
m++;
delay
();
if(m>=3*(-l))
{
m=0;
draw_block
(i,j,style,0); /* 方块的下降 */
j++;
draw_block
(i,j,style,1);
}
}
}
speed=0;
for(m=0;m<=6;m+=2) /* 对有方块的位置给予1
的数值 */
board[i+shapes[style].xy[m]-1]
[j+shapes[style].xy[m+1]-1]=1;
if(board[ i][4]==1)
{
setcolor();
settextstyle(0,0,2);
outtextxy(,,"CAREFUL -_-");
delay();
delay();
setcolor(0);
outtextxy(,,"CAREFUL -_-");
settextstyle(0,0,1);
setcolor(LIGHTRED);
}
/* setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);*/
if(l==1) /* 显示当前游戏等级 */
{
setcolor(LIGHTRED);
setlinestyle(0,0,1); /* 容易的速度 */
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
outtextxy(7,," easy speed");
}
if(l==4)
{
setcolor(BLACK);
outtextxy(7,," easy speed");
setcolor(LIGHTRED); /* 中等难度 */
setlinestyle(0,0,1);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
outtextxy(7,," normal speed");
}
if(l==7)
{
setcolor(BLACK);
outtextxy(7,," normal speed");
setcolor(LIGHTRED);
setlinestyle(0,0,1); /* 困难的难度 */
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
outtextxy(7,," hard speed");
}
kill_line(j);
if(j==)
break;
if(!check_block(i,j+1,style))
break;
}
draw_block(MAPXOFT1,MAPYOFT1,style1,0);
/* 对下1个方块显示位置进行覆盖 */
style=style1; /* 使的方块和显示的方块一样
*/
if(j==1) /* 关机的画面 */
{
setcolor();
settextstyle(0,0,2);
outtextxy(,,"GAME OVER");
outtextxy(,,"THANK YOU");
sleep(3);
exit(0);
}
}
}
}
getch();
}
int change(int *i,int *j,int key) /* 方块的具体的变化(
移动 变形 下降) */
{
if(key==UP&&check_block(*i,*j,shapes[style].next)) /
*变形 */
{
draw_block(*i,*j,style,0);
style=shapes[style].next;
draw_block(*i,*j,style,1);
}
else if(key==LEFT&&check_block(*i-1,*j,style)) /* 移动
*/
{
draw_block(*i,*j,style,0);
(*i)--;
draw_block(*i,*j,style,1);
}
else if(key==RIGHT&&check_block(*i+1,*j,style))
{
draw_block(*i,*j,style,0);
(*i)++;
draw_block(*i,*j,style,1);
}
else if(key==DOWN&&check_block(*i,*j+1,style)) /* 下降
*/
{
draw_block(*i,*j,style,0);
(*j)++;
draw_block(*i,*j,style,1);
speed=1;
}
else if(key==ESC) /* 退出 */
exit(0);
}
void draw_block(int x,int y,int style,int way) /* 画出方块
的位置 */
{
int x1=x+MAPXOFT,y1=y+MAPYOFT;
int i;
if(way==1)
{
setcolor(WHITE);
}
else
{
setcolor(BLACK);
}
for(i=0;i<=6;i+=2)
{
draw_little_block(x1+shapes[style].xy[
i],y1+shapes[style].xy[i+1],way,style);
}
}
void draw_little_block(int x,int y,int z,int style) /* 画
出方块的每一个小方块的形状(方块的色彩) */
{ int m,n;
if(z==1) /* 对色彩的调整 */
{
if(0<=style&&style<=3)
n=2;
if(4<=style&&style<=7)
n=3;
if(8<=style&&style<=)
n=4;
if(<=style&&style<=)
n=5;
if(<=style&&style<=)
n=6;
if(<=style&&style<=)
n=7;
if(style==)
n=8;
m=1;
}
if(z==0)
{
m=0,n=0;
}
setcolor(m);
setfillstyle(1,n);
rectangle(x*,y*,x*+,y*+);
floodfill(x*+2,y*+2,m);
}
void kill_line(int y) /* 消行 */
{
int i,t=1,j,k,color=random(7)+1;
for(;y>=1&&t<=4;y--,t++) /* 对4行进行验证 */
{
for(i=1;i<=;i++)
if(!board[i-1][y-1]) /* 严整1行的数组是不是全
为1 */
break;
if(i==)
{
setcolor(LIGHTRED); /* 对积分底色的画法
*/
setlinestyle(0,0,1);
setfillstyle(1,BLUE);
rectangle(,,,);
floodfill(,,LIGHTRED);
score++; /* 每消去1行 可以得1分 */
setcolor();
itoa(score,str,);
outtextxy(,,str);
if(score!=0&&score%3==0)
l++; /* 每次分到一定位置是 速度进
行提高(目前是3行加1次 可以调整) */
setcolor(); /* 每次消去是进行庆祝模式 */
settextstyle(0,0,4);
outtextxy(,,"COOL");
outtextxy(,,"^_^");
delay();
delay();
delay();
setcolor(BLACK);
settextstyle(0,0,4);
outtextxy(,,"COOL");
outtextxy(,,"^_^");
settextstyle(0,0,1);
if(score%3==0&&score!=0)
{
setcolor();
settextstyle(0,0,2);
outtextxy(,,"CONGRATULATION ON YOU ^_^");
sleep(2);
setcolor(BLACK);
settextstyle(0,0,2);
outtextxy(,,"CONGRATULATION ON YOU ^_^ ");
settextstyle(0,0,1);
}
for(k=1;k<=;k++) /* 对满了行进行消去
*/
{
setcolor(BLACK);
draw_little_block
(k+MAPXOFT,y+MAPYOFT,0,2);
}
for(j=y-1;j>=1;j--) /* 消去1行后 用上面的
累下来(并且调整色彩) */
for(k=1;k<=;k++)
{
board[k-1][j]=board[k-1][j-1];
if(board[k-1][j])
{
setcolor(BLACK);
draw_little_block
(k+MAPXOFT,j+MAPYOFT,0,2);
setcolor(WHITE);
draw_little_block
(k+MAPXOFT,j+1+MAPYOFT,1,color);
}
}
delay();
y++;
}
}
}
int check_block(int x,int y,int style) /* 验证能不能往下1
个位置累方块 */
{
int x1=x+MAPXOFT,y1=y+MAPYOFT;
int x2,y2,i;
for(i=0;i<=6;i+=2)
{
x2=x1+shapes[style].xy[ i];
y2=y1+shapes[style].xy[i+1];
if(x2>=&&x2<&&y2<&&(y2<6||board[x2-][y2-
6]==0))
continue;
else
break;
}
if(i==8)
return 1;
else
return 0;
getch();
}
我这里也是别人那里看来的。希望对你有用
3d稀疏卷积——spconv源码剖析(三)
构建Rulebook
下面看ops.get_indice_pairs,位于:spconv/ops.py
构建Rulebook由ops.get_indice_pairs接口完成
get_indice_pairs函数具体实现:
主要就是完成了一些参数的校验和预处理。首先,对于3d普通稀疏卷积,根据输入shape大小,按钮特效源码kernel size,stride等参数计算出输出输出shape,子流行稀疏卷积就不必计算了,输出shape和输入shape一样大小
准备好参数之后就进入最核心的get_indice_pairs函数。因为spconv通过torch.ops.load_library加载.so文件注册,所以这里通torch.ops.spconv.get_indice_pairs这种方式来调用该函数。
算子注册:在src/spconv/all.cc文件中通过Pytorch提供的OP Register(算子注册的方式)对底层c++ api进行了注册,可以python接口形式调用c++算子
同C++ extension方式一样,OP Register也是Pytorch提供的一种底层扩展算子注册的方式。注册的算子可以通过 torch.xxx或者 tensor.xxx的方式进行调用,该方式同样与pytorch源码解耦,minishell 源码分析增加和修改算子不需要重新编译pytorch源码。用该方式注册一个新的算子,流程非常简单:先编写C++相关的算子实现,然后通过pytorch底层的注册接口(torch::RegisterOperators),将该算子注册即可。
构建Rulebook实际通过python接口get_indice_pairs调用src/spconv/spconv_ops.cc文件种的getIndicePairs函数
代码位于:src/spconv/spconv_ops.cc
分析getIndicePairs直接将重心锁定在GPU逻辑部分,并且子流行3d稀疏卷积和正常3d稀疏卷积分开讨论,优先子流行3d稀疏卷积。
代码中最重要的3个变量分别为:indicePairs,indiceNum和gridOut,其建立过程如下:
indicePairs代表了稀疏卷积输入输出的映射规则,即Input Hash Table 和 Output Hash Table。这里分配理论最大的内存,它的shape为{ 2,kernelVolume,numAct},2表示输入和输出两个方向,xml源码 乱码kernelVolume为卷积核的volume size。例如一个3x3x3的卷积核,其volume size就是(3*3*3)。numAct表示输入有效(active)特征的数量。indiceNum用于保存卷积核每一个位置上的总的计算的次数,indiceNum对应中的count
代码中关于gpu建立rulebook调用create_submconv_indice_pair_cuda函数来完成,下面具体分析下create_submconv_indice_pair_cuda函数
子流线稀疏卷积
子流线稀疏卷积是调用create_submconv_indice_pair_cuda函数来构建rulebook
在create_submconv_indice_pair_cuda大可不必深究以下动态分发机制的运行原理。
直接将重心锁定在核函数:
prepareSubMGridKernel核函数中grid_size和block_size实则都是用的整形变量。其中block_size为tv::cuda::CUDA_NUM_THREADS,在include/tensorview/cuda_utils.h文件中定义,大小为。而grid_size大小通过tv::cuda::getBlocks(numActIn)计算得到,其中numActIn表示有效(active)输入数据的数量。
prepareSubMGridKernel作用:建立输出张量坐标(通过index表示)到输出序号之间的一张哈希表
见:include/spconv/indice.cu.h
这里计算index换了一种模板加递归的写法,看起来比较复杂而已。令:new_indicesIn = indicesIn.data(),可以推导得出index为:
ArrayIndexRowMajor位于include/tensorview/tensorview.h,艺人网站源码其递归调用写法如下:
接着看核函数getSubMIndicePairsKernel3:
位于:include/spconv/indice.cu.h
看:
上述写法类似我们函数中常见的循环的写法,具体可以查看include/tensorview/kernel_utils.h
NumILP按默认值等于1的话,其stride也是gridDim.x*blockDim.x。索引最大值要小于该线程块的线程上限索引blockDim.x * gridDim.x,功能与下面代码类似:
参考: blog.csdn.net/ChuiGeDaQ...
python显示数组多少列
导读:本篇文章首席CTO笔记来给大家介绍有关python显示数组多少列的相关内容,希望对大家有所帮助,一起来看看吧。Python中怎样使用shape计算矩阵的行和列你得先安装numpy库,矩阵(ndarray)的shape属性可以获取矩阵的形状(例如二维数组的行列),获取的结果是一个元组,因此相关代码如下:
import?numpy?as?np
x?=?np.array([[1,2,5],[2,3,5],[3,4,5],[2,3,6]])
#?输出数组的行和列数
print?x.shape?#?(4,?3)
#?只输出行数
print?x.shape[0]?#?4
#?只输出列数
print?x.shape[1]?#?3
Python中怎么获取二维数组中指定列的数据。
解答:
op=open('xx.txt','r')
list=[]
forlineinop:
list.append(line)
这样第一行就是a[0]。
要取出第一行第二个字。
a[0].split('')[1]按空格分隔,函数名应该这个。vlayout源码分析
简介:
Python是一种面向对象、直译式计算机程序设计语言,由荷兰人GuidovanRossum发明于年,年发行第一个公开发行版。它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结在一起。
Python是纯粹的自由软件,源代码和解释器CPython遵循GPL协议。语法简洁清晰,特色之一是强制用空白符作为语句缩进。名字来源于一个喜剧,最初设计Python这种语言的人并没有想到Python会在工业和科研上获得如此广泛的使用。
python中如何表示多维数组在Python中,一个像这样的多维表格可以通过“序列的序列”实现。一个表格是行的序列。每一行又是独立单元格的序列。这类似于我们使用的数学记号,在数学里我们用Ai,j,而在Python里我们使用A[i][j],代表矩阵的第i行第j列。
这看起来非常像“元组的列表”(ListsofTuples)。
“列表的列表”示例:
我们可以使用嵌套的列表推导式(listcomprehension)创建一个表格。下面的例子创建了一个“序列的序列”构成的表格,并为表格的每一个单元格赋值。
table=[[0foriinrange(6)]forjinrange(6)]printtableford1inrange(6):ford2inrange(6):table[d1][d2]=d1+d2+2printtable程序的输出结果如下:
[[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],
[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]],
[[2,3,4,5,6,7],[3,4,5,6,7,8],[4,5,6,7,8,9],
[5,6,7,8,9,],[6,7,8,9,,],[7,8,9,,,]]
这个程序做了两件事:创建了一个6×6的全0表格。然后使用两枚骰子的可能组合的数值填充表格。这并非完成此功能最有效的方式,但我们通过这个简单的例子来演示几项技术。我们仔细看一下程序的前后两部分。
程序的第一部分创建并输出了一个包含6个元素的列表,我们称之为“表格”;表格中的每一个元素都是一个包含6个0元素的列表。它使用列表推导式,对于范围从0到6的每一个j都创建对象。每一个对象都是一个0元素列表,由i变量从0到6遍历产生。初始化完成之后,打印输出二维全0表格。
推导式可以从里向外阅读,就像一个普通表达式一样。内层列表[0foriinrange(6)]创建了一个包含6个0的简单列表。外层列表[[...]forjinrange(6)]创建了这些内层列表的6个深拷贝。
程序的第2个部分对2个骰子的每一个组合进行迭代,填充表格的每一个单元格。这由两层嵌套循环实现,每一个循环迭代一个骰子。外层循环枚举第一个骰子的所有可能值d1。内层循环枚举第二个骰子d2。
更新每一个单元格时需要通过table[d1]选择每一行;这是一个包含6个值的列表。这个列表中选定的单元格通过...[d2]进行选择。我们将掷骰子的值赋给这个单元格,d1+d2+2。
其他示例:
打印出的列表的列表不太容易阅读。下面的循环会以一种更加可读的形式显示表格。
forrowintable:
printrow[2,3,4,5,6,7]
[3,4,5,6,7,8]
[4,5,6,7,8,9]
[5,6,7,8,9,]
[6,7,8,9,,]
[7,8,9,,,]
作为练习,读者可以试着在打印列表内容时,再打印出行和列的表头。提示一下,使用"%2d"%value字符串运算符可以打印出固定长度的数字格式。显示索引值(ExplicitIndexValues)。
我们接下来对骰子表格进行汇总统计,得出累计频率表。我们使用一个包含个元素的列表(下标从0到)表示每一个骰子值的出现频率。观察可知骰子值2在矩阵中只出现了一次,因此我们期望fq[2]的值为1。遍历矩阵中的每一个单元格,得出累计频率表。
fq=*[0]foriinrange(6):forjinrange(6):c=table[i][j]fq[c]+=使用下标i选出表格中的行,用下标j从行中选出一列,得到单元格c。然后用fq统计频率。
这看起来非常的数学和规范。
Python提供了另外一种更简单一些的方式。
使用列表迭代器而非下标,表格是列表的列表,可以采用无下标的for循环遍历列表元素。
fq=*[0]printfqforrowintable:forcinrow:fq[c]+=1printfq[2:
结语:以上就是首席CTO笔记为大家介绍的关于python显示数组多少列的全部内容了,希望对大家有所帮助,如果你还想了解更多这方面的信息,记得收藏关注本站。