编程猫怎么获得金币您好,在编程猫获得金币主要有两种方式:1. 通过学习编程猫的课程获取2. 在编程猫社区发布你的作品,其他用户购买你发布的作品代码希望这个回答能帮助到您~猿
C++方块转换
c语言编辑俄罗斯方块程序中,控制方块旋转的这段程序是什么意思?(第三张图)
为了使变换达到一个循环的作用,其实你拿数模拟一下就看出来了。最后一个数求余就直接变成0,因此还要再加上差值达到目的。直线方块有2种,对应2,3,这个操作保证flag永远在2,3中来回,后面的类似求C语言俄罗斯方块代码
俄罗斯方块C源代码
#include
#include
#include
#include
#defineZL4 //坐标增量,不使游戏窗口靠边
#defineWID36 //游戏窗口的宽度
#defineHEI20 //游戏窗口的高度
inti,j,Ta,Tb,Tc; //Ta,Tb,Tc用于记住和转换方块变量的值
inta[60][60]={0}; //标记游戏屏幕各坐标点:0,1,2分别为空、方块、边框
intb[4]; //标记4个"口"方块:1有,0无,类似开关
intx,y,level,score,speed; //方块中心位置的x,y坐标,游戏等级、得分和游戏速度
intflag,next; //当前要操作的方块类型序号,下一个方块类型序号
voidgtxy(intm,intn); //以下声明要用到的自编函数
voidgflag(); //获得下一方块序号
voidcsh(); //初始化界面
voidstart(); //开始部分
voidprfk(); //打印方块
voidclfk(); //清除方块
voidmkfk(); //制作方块
voidkeyD(); //按键操作
intifmov(); //判断方块能否移动或变体
void clHA(); //清除满行的方块
voidclNEXT(); //清除边框外的NEXT方块
intmain()
{csh();
while(1)
{start();//开始部分
while(1)
{prfk();
Sleep(speed); //延时
clfk();
Tb=x;Tc=flag;//临存当前x坐标和序号,以备撤销操作
keyD();
y++;//方块向下移动
if(ifmov()==0){y--;prfk();dlHA();break;}//不可动放下,删行,跨出循环
}
for(i=y-2;i if(j==0){system("cls");gtxy(10,10);printf("游戏结束!");getch();break;} clNEXT(); //清除框外的NEXT方块 } return0; } voidgtxy(intm,intn)//控制光标移动 {COORDpos;//定义变量 pos.X=m;//横坐标 pos.Y=n;//纵坐标 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } voidcsh()//初始化界面 {gtxy(ZL+WID/2-5,ZL-2);printf("俄罗斯方块");//打印游戏名称 gtxy(ZL+WID+3,ZL+7);printf("*******NEXT:");//打印菜单信息 gtxy(ZL+WID+3,ZL+13);printf("**********"); gtxy(ZL+WID+3,ZL+15);printf("Esc:退出游戏"); gtxy(ZL+WID+3,ZL+17);printf("↑键:变体"); gtxy(ZL+WID+3,ZL+19);printf("空格:暂停游戏"); gtxy(ZL,ZL);printf("╔");gtxy(ZL+WID-2,ZL);printf("╗");//打印框角 gtxy(ZL,ZL+HEI);printf("╚");gtxy(ZL+WID-2,ZL+HEI);printf("╝"); a[ZL][ZL+HEI]=2;a[ZL+WID-2][ZL+HEI]=2;//记住有图案 for(i=2;i for(i=2;i for(i=1;i for(i=1;i CONSOLE_CURSOR_INFOcursor_info={1,0};//以下是隐藏光标的设置 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); level=1;score=0;speed=400; gflag();flag=next;//获得一个当前方块序号 } voidgflag() //获得下一个方块的序号 {srand((unsigned)time(NULL));next=rand()%19+1; } voidstart()//开始部分 {gflag();Ta=flag;flag=next;//保存当前方块序号,将下一方块序号临时操作 x=ZL+WID+6;y=ZL+10;prfk();//给x,y赋值,在框外打印出下一方块 flag=Ta;x=ZL+WID/2;y=ZL-1;//取回当前方块序号,并给x,y赋值 } voidprfk()//打印俄罗斯方块 {for(i=0;i<4;i++){b[i]=1;}//数组b[4]每个元素的值都为1 mkfk();//制作俄罗斯方块 for(i=x-2;i<=x+4;i+=2)//打印方块 {for(j=y-2;j<=y+1;j++){if(a[i][j]==1&&j>ZL){gtxy(i,j);printf("□");}}} gtxy(ZL+WID+3,ZL+1); printf("level:%d",level); //以下打印菜单信息 gtxy(ZL+WID+3,ZL+3); printf("score:%d",score); gtxy(ZL+WID+3,ZL+5); printf("speed:%d",speed); } voidclfk()//清除俄罗斯方块 {for(i=0;i<4;i++){b[i]=0;}//数组b[4]每个元素的值都为0 mkfk();//制作俄罗斯方块 for(i=x-2;i<=x+4;i+=2)//清除方块 {for(j=y-2;j<=y+1;j++){if(a[i][j]==0&&j>ZL){gtxy(i,j);printf("");}}} } voidmkfk()//制作俄罗斯方块 {a[x][y]=b[0];//方块中心位置状态:1-有,0-无 switch(flag)//共6大类,19种小类型 {case1:{a[x][y-1]=b[1];a[x+2][y-1]=b[2];a[x+2][y]=b[3];break;}//田字方块 case2:{a[x-2][y]=b[1];a[x+2][y]=b[2];a[x+4][y]=b[3];break;}//直线方块:---- case3:{a[x][y-1]=b[1];a[x][y-2]=b[2];a[x][y+1]=b[3];break;}//直线方块:| case4:{a[x-2][y]=b[1];a[x+2][y]=b[2];a[x][y+1]=b[3];break;}//T字方块 case5:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x-2][y]=b[3];break;}//T字顺时针转90度 case6:{a[x][y-1]=b[1];a[x-2][y]=b[2];a[x+2][y]=b[3];break;}//T字顺转180度 case7:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x+2][y]=b[3];break;}//T字顺转270度 case8:{a[x][y+1]=b[1];a[x-2][y]=b[2];a[x+2][y+1]=b[3];break;}//Z字方块 case9:{a[x][y-1]=b[1];a[x-2][y]=b[2];a[x-2][y+1]=b[3];break;}//Z字顺转90度 case10:{a[x][y-1]=b[1];a[x-2][y-1]=b[2];a[x+2][y]=b[3];break;}//Z字顺转180度 case11:{a[x][y+1]=b[1];a[x+2][y-1]=b[2];a[x+2][y]=b[3];break;}//Z字顺转270度 case12:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x-2][y-1]=b[3];break;}//7字方块 case13:{a[x-2][y]=b[1];a[x+2][y-1]=b[2];a[x+2][y]=b[3];break;}//7字顺转90度 case14:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x+2][y+1]=b[3];break;}//7字顺转180度 case15:{a[x-2][y]=b[1];a[x-2][y+1]=b[2];a[x+2][y]=b[3];break;}//7字顺转270度 case16:{a[x][y+1]=b[1];a[x][y-1]=b[2];a[x+2][y-1]=b[3];break;}//倒7字方块 case17:{a[x-2][y]=b[1];a[x+2][y+1]=b[2];a[x+2][y]=b[3];break;}//倒7字顺转90度 case18:{a[x][y-1]=b[1];a[x][y+1]=b[2];a[x-2][y+1]=b[3];break;}//倒7字顺转180度 case19:{a[x-2][y]=b[1];a[x-2][y-1]=b[2];a[x+2][y]=b[3];break;}//倒7字顺转270度 } } voidkeyD()//按键操作 {if(kbhit()) {intkey; key=getch(); if(key==224) {key=getch(); if(key==75){x-=2;}//按下左方向键,中心横坐标减2 if(key==77){x+=2;}//按下右方向键,中心横坐标加2 if(key==72)//按下向上方向键,方块变体 {if(flag>=2&&flag<=3){flag++;flag%=2;flag+=2;} if(flag>=4&&flag<=7){flag++;flag%=4;flag+=4;} if(flag>=8&&flag<=11){flag++;flag%=4;flag+=8;} if(flag>=12&&flag<=15){flag++;flag%=4;flag+=12;} if(flag>=16&&flag<=19){flag++;flag%=4;flag+=16;}} } if(key==32)//按空格键,暂停 {prfk();while(1){if(getch()==32){clfk();break;}}} //再按空格键,继续游戏 if(ifmov()==0){x=Tb;flag=Tc;} //如果不可动,撤销上面操作 else{prfk();Sleep(speed);clfk();Tb=x;Tc=flag;} //如果可动,执行操作 } } intifmov()//判断能否移动 {if(a[x][y]!=0){return0;}//方块中心处有图案返回0,不可移动 else{if((flag==1&&(a[x][y-1]==0&&a[x+2][y-1]==0&&a[x+2][y]==0))|| (flag==2&&(a[x-2][y]==0&&a[x+2][y]==0&&a[x+4][y]==0))|| (flag==3&&(a[x][y-1]==0&&a[x][y-2]==0&&a[x][y+1]==0))|| (flag==4&&(a[x-2][y]==0&&a[x+2][y]==0&&a[x][y+1]==0))|| (flag==5&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x-2][y]==0))|| (flag==6&&(a[x][y-1]==0&&a[x-2][y]==0&&a[x+2][y]==0))|| (flag==7&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x+2][y]==0))|| (flag==8&&(a[x][y+1]==0&&a[x-2][y]==0&&a[x+2][y+1]==0))|| (flag==9&&(a[x][y-1]==0&&a[x-2][y]==0&&a[x-2][y+1]==0))|| (flag==10&&(a[x][y-1]==0&&a[x-2][y-1]==0&&a[x+2][y]==0))|| (flag==11&&(a[x][y+1]==0&&a[x+2][y-1]==0&&a[x+2][y]==0))|| (flag==12&&(a[x][y-1]==0&&a[x][y+1]==0&&a[x-2][y-1]==0))|| ( flag==13 && ( a[x-2][y]==0 && a[x+2][y-1]==0 && a[x+2][y]==0 ) ) || ( flag==14 && ( a[x][y-1]==0 && a[x][y+1]==0 && a[x+2][y+1]==0 ) ) || (flag==15 && ( a[x-2][y]==0 && a[x-2][y+1]==0 && a[x+2][y]==0 ) ) || (flag==16 && ( a[x][y+1]==0 && a[x][y-1]==0 && a[x+2][y-1]==0 ) ) || ( flag==17 && ( a[x-2][y]==0 && a[x+2][y+1]==0 && a[x+2][y]==0 ) ) || (flag==18 && ( a[x][y-1]==0 &&a[x][y+1]==0 && a[x-2][y+1]==0 ) ) || (flag==19 && ( a[x-2][y]==0 && a[x-2][y-1]==0 &&a[x+2][y]==0))){return1;} } return0; //其它情况返回0 } voidclNEXT() //清除框外的NEXT方块 {flag=next;x=ZL+WID+6;y=ZL+10;clfk();} void clHA() //清除满行的方块 {intk,Hang=0; //k是某行方块个数,Hang是删除的方块行数 for(j=ZL+HEI-1;j>=ZL+1;j--)//当某行有WID/2-2个方块时,则为满行 {k=0;for(i=ZL+2;i {if(a[i][j]==1)//竖坐标从下往上,横坐标由左至右依次判断是否满行 {k++; //下面将操作删除行 if(k==WID/2-2) { for(k=ZL+2;k {a[k][j]=0;gtxy(k,j);printf("");Sleep(1);} for(k=j-1;k>ZL;k--) {for(i=ZL+2;i {if(a[i][k]==1){a[i][k]=0;gtxy(i,k);printf("");a[i][k+1]=1; gtxy(i,k+1);printf("□");}} } j++;//方块下移后,重新判断删除行是否满行 Hang++;//记录删除方块的行数 } } } } score+=100*Hang; //每删除一行,得100分 if(Hang>0&&(score%500==0||score/500>level-1)) //得分满500速度加快升一级 {speed-=20;level++;if(speed<200)speed+=20; } } 1、用C语言绘制图形界面 EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。 包含库#include 先初始化图形窗口 initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽带,WINDOW_HIGH为窗口的高度。 清空绘图设备 cleardevice(); 设置画笔颜色 setcolor(RED) ; 设置线条风格 setlinestyle(PS_SOLID, NULL, 0); 画矩形 rectangle 还有画线、显示文字等函数,可以参照其帮助文档。 注意:由于我们用的是EasyX图形库,故源文件后缀要为.cpp,但其中内容都是C的语法。 2、存储表示出俄罗斯方块的形状 一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样19种 方块就得有19种相应的代码来描绘。而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。 二、我们很自然的想到可用字模点阵的形式来表示,即设置一个4行4列的数组,元素置1即代表这个位置有小 方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。 1000 1000 1100 0000 这个方法挺靠谱,但我们还可以优化一下:不用4*4的数组,而是用16个bit位来表示这个点阵。这样存储起来比较方便,故我们用unsigned int的低16位来表示方块的点阵。 我们可以用掩码与表示俄罗斯方块的位进行操作,来识别并在屏幕上画出方块。 我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。 但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组rockArray中的值。 我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成unsigned int的变量存储在rockArray中。 这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。 @### @### @@## ####(为使得看起来更醒目,我们用@表示1,用#表示0) 3、让图形动起来 在某位置处用函数DrawRock在屏幕上画出俄罗斯方块,然后再擦除掉(即用背景色在原位置处重绘一次方块),最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。 同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。 那么按下上方向键时,如何让方块翻转呢? 我们在配置文件中就把方块的顺时针翻转形态放在了一起: @### @### @@## #### @@@# @### #### #### @@## #@## #@## #### ##@# @@@# #### #### 我们每按一次上方向键改变一次方块的形状即可。若一直按上键,形状应该是循环地翻滚。 我们想到了循环链表的数据结构可实现这个效果。 可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。 故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。 我们用结构体来作为一个方块在rockArray中的元素 typedef struct ROCK { //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行) unsigned int rockShapeBits ; int nextRockIndex ; //下一个方块,在数组中的下标 } RockType ; 这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。 参考资料:C语言图形界面篇 相关文章 我以后想在游戏公司开发游戏,但是完全不懂编程,可以吗?我觉得可以,有时候一些好的想法是许多做游戏的专业人员所不具备的,大家都只是跟风,看到有什么游戏就借鉴别人的做。程序员好 CreateWindow是创建好空白窗口之后再发送WM_CREATE消息吗?WM_CREATE是最后一个消息之前有这些: 1.先发送 WM_GETMINMAXINFO=$0024: 此消息发送给窗口当它将要改变大小或位置 java编程: 从键盘输入一个整数,如果输入的不是整数,则提示输入有误,请重新输入,直到输入正确为止。importjava.util.Scanner; off-by-one错误大小差一。。就是指某个变量的最大值和最小值可能会和正常值差1,或者循环多执行一次/少执行一次。一般在临界情况时发生。为什么在使用数组的时候会发生错误?索 一个刚办的教育培训机构,怎么可以快速招生?我认为招生主要的两个方向,一个是宣传招生。另一个就是转介绍了。对于我们学校来说,转介绍的来源占比更重,起码占到了60%。 1.服务好家 C语言!7=0,为什么C中的非0数据被定义为“逻辑真”,所以7是“真”;!是“逻辑非”运算符,“逻辑真”的非是“逻辑假”,“逻辑假”在C中规定用0表示。所以!7==0。c语言问题,7%7求余是 如何用matlab输出图形中各点的坐标实现的方法和详细的操作步骤如下:1、第一步,选择菜单栏的“Data Cursor”选项,然后在要查看其坐标值的数据点上点击鼠标的左键,见下图,转到下面 谁给我推荐一些关于学习编程的网站论坛-做为初学者的话,给你推荐一个吧!http://www.bccn.net/中国最大的编程论坛(编程中国)!!希望大家一起加油哦。我学Java和CShap的。。祝你学业 C++编程问题。。。。#includeusingnamespacestd;classMyClass{//这里定义些函数和变量,函数可以是申明,也可以是实现public:MyClass(){ coutC语言写俄罗斯方块旋转算法
问题描述不完整,给你我作业里德旋转函数好了,//...#define LONG_SIZE 15 #define WIDE_SIZE 10//...char img[LONG_SIZE][WIDE_SIZE]; /*定义游戏区方块移动范围*/ int x_[4],y_[4],x,y; /*存放移动方块在游戏区的位置序号和方块的坐标*///...void rotate() /*旋转*/ { int tmx[4],tmy[4]; int tf=1; int i; int k; if((x_[0]==x_[1])&&(x_[2]==x_[3])&&(y_[0]==y_[2])&&(y_[1]==y_[c语言 程序设计 关于方格 黑方格
ASCII码, 在书后面应该有表格的话,查一下就知道了,然后%c是字符输出,我C语言也不是很好219是一个数值,因为字符和数值是可以通用的,所以219代表的字符就是黑方块了,然后就输出了两个黑方块了,不知道你懂了没有,呵呵~ - -我也不是很会。。。用c语言编写俄罗斯方块程序 求详解
publicclassTest{
publicstaticvoidmain(String[]