代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
C
】
openGL版本的俄罗斯方块
作者:
单虎战群狮
/ 发布于
2014/9/20
/
915
呵呵 虽然openGL用来做俄罗斯方块就是高射炮打蚊子,但是对openGL入门还是有一定的帮组,欢迎拍砖
#include <windows.h> #include <stdio.h> #include <time.h> #include <gl/gl.h> #include <gl/glu.h> #include <gl/glut.h> #include "sharp.c" #define matrix_width 4 #define one_width 20 #define total_width 20 #define matrix_height 4 int arr[20][20]; int sharp[4][4]; time_t t; typedef struct curt_position{ int x; int y; int fx; int fy; } curt_pos; void reshape(int w,int h); void displayShow(void); void RotateArr(int p[matrix_width][matrix_width],int w,int h); void dokeyUp(unsigned char c,int x,int y); curt_pos pos; void init() { pos.x=0; pos.y=0; time(&t); printf("%d",sharps); memcpy(sharp,sharps[0],matrix_width*matrix_width*sizeof(int)); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); } void timerToDo(int value); int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA); glutInitWindowSize(400,400); glutInitWindowPosition(100,100); glutCreateWindow("test"); init(); glutReshapeFunc(reshape); glutKeyboardFunc(dokeyUp); glutDisplayFunc(displayShow); glutTimerFunc(100,timerToDo,0); glutMainLoop(); } void displayShow(void) { void drawOne(); void drawPanel(); glClear(GL_COLOR_BUFFER_BIT); drawPanel(); drawOne(); glutSwapBuffers(); } /** * 画上面板上已有的方块 */ void drawPanel() { int i,j; glPushMatrix(); glTranslated(-200,180,0); for(i=0;i<20;i++) { for(j=0;j<20;j++) { if(arr[i][j]==1) glRectd(0,0,one_width-1,one_width-1); glTranslatef(one_width,0,0); } glTranslatef(-400,-one_width,0); } glPopMatrix(); } /** * 画一个图像 */ void drawOne() { int i,j; glPushMatrix(); glTranslated(pos.x*one_width,pos.y*one_width,0); for(i=0;i<matrix_width;i++) { for(j=0;j<matrix_width;j++) { if(sharp[i][j]) glRectd(0,0,one_width-1,one_width-1); glTranslatef(one_width,0,0); } glTranslatef(-matrix_width*one_width,-one_width,0); } glPopMatrix(); } void reshape(int w,int h) { glViewport(0,0,(GLsizei)w,(GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-200,200,-200,200,-200,200); glMatrixMode(GL_MODELVIEW); } /** * 判断是否撞了已有的方块 */ int zhuangPanel() { int i,j,l,k; for(i=0;i<20;i++) { for(j=0;j<20;j++) { if(arr[i][j]==1) { for(l=0;l<matrix_width;l++) { for(k=0;k<matrix_width;k++) { if((sharp[l][k]) &&((10-pos.y+l==i)) &&(pos.x+10+k==j)) { printf("e\n"); return 1; } } } } } } return 0; } /** * 判断是否撞击了下边界 */ int zhuangBian() { int i,j; for (i = 0; i < matrix_width; ++i) { for (j = 0; j < matrix_width; ++j) { if(sharp[i][j]){ if(10-pos.y+i>=20) return 1; } } } return 0; } /** * 判断撞击了左右边界 */ int zhuangLRBian() { int i,j; for (i = 0; i < matrix_width; ++i) { for (j = 0; j < matrix_width; ++j) { if(sharp[i][j]){ if(pos.x+10+j>=20|| pos.x+10+j<0) return 1; } } } return 0; } /** * 定时器,定时下降一格 */ void timerToDo(int value) { int create=0,i,j; void xiaoMan(); if(zhuangBian()||zhuangPanel()) { pos.y=pos.fy; create=1; } if(!create) { pos.fy=pos.y; pos.y-=1; } else { for(i=0;i<matrix_width;i++) { for(j=0;j<matrix_width;j++) { if(sharp[i][j]) { arr[10-pos.y+i][pos.x+10+j]=1; printf("%d,%d\t",10-pos.y+i,pos.x+10+j); } } printf("\n"); } xiaoMan(); time(&t); memcpy(sharp,sharps[t%5],matrix_width*matrix_width*sizeof(int)); pos.x=0; pos.y=10; } glutPostRedisplay(); glutTimerFunc(300,timerToDo,0); } void dokeyUp(unsigned char c,int x,int y) { int tmparr[matrix_width][matrix_width]; if(c=='g') { memcpy(tmparr,sharp,matrix_width*matrix_width*sizeof(int)); RotateArr(sharp,matrix_width,matrix_width); if(zhuangBian()||zhuangLRBian()){ memcpy(sharp,tmparr,matrix_width*matrix_width*sizeof(int)); } } else if(c=='a') { pos.fx=pos.x; pos.x--; if(zhuangLRBian()||zhuangPanel()) pos.x=pos.fx; } else if(c=='d') { pos.fx=pos.x; pos.x++; if(zhuangLRBian()||zhuangPanel()) pos.x=pos.fx; } glutPostRedisplay(); } /** 旋转数组 */ void RotateArr(int p[matrix_width][matrix_width],int w,int h) { int i,j; int **newp=(int **)malloc(sizeof(int *)*h); for (i = 0; i < h; ++i) { *(newp+i)=(int *)malloc(sizeof(int)*w); memcpy(*(newp+i),p[i],w*sizeof(int)); } for (i = 0; i < h; ++i) for (j = 0; j < w; ++j) p[i][j]=newp[j][w-1-i]; for (i = 0; i < h; ++i) free(*(newp+i)); free(newp); } /** * 消除数组的一行,顶部下降的部分以0补全 */ void arrXiao(int arr[total_width][total_width],int index,int size) { memmove(arr[0]+(size*total_width),arr[0],(index*total_width)*sizeof(int)); memset(arr,0,(size*total_width)*sizeof(int)); } /** * 如果有一行满了 就把这一行消失 */ void xiaoMan() { int i,j,index=-1; for (i = 0; i < total_width; ++i) { for (j = 0; j < total_width; ++j) { if(!arr[i][j]) break; } if(j==20){ arrXiao(arr,i,1); } } } sharp.c int sharps[5][4][4]= { { {0,0,1,0}, {0,1,1,1}, {0,0,0,0}, {0,0,0,0} }, { {0,0,0,0}, {0,0,0,0}, {1,1,1,1}, {0,0,0,0} }, { {0,0,0,0}, {0,1,1,0}, {0,1,1,}, {0,0,0,0} }, { {0,1,0,0}, {0,1,0,0}, {0,1,1,0}, {0,0,0,0} }, { {0,0,0,0}, {0,1,1,0}, {0,0,1,1}, {0,0,0,0} } };
试试其它关键字
俄罗斯方块
同语言下
.
获取手机通讯录 iOS去除数字以外的所有字符
.
异步加载音乐等资源
.
交通罚单管理系统
.
freemark实现,简单的替换
.
计算斐波那契数列
.
base64解码 包括解码长度
.
图像显示
.
冒泡排序
.
输入十进制数,输出指定进制
.
链式栈
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
单虎战群狮
贡献的其它代码
(
2
)
.
从16进制字符串生成颜色
.
openGL版本的俄罗斯方块
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3