俄罗斯方块
来源:互联网 发布:网络入门书籍 编辑:程序博客网 时间:2024/05/16 18:05
Centos6.5
C语言
需要用到VT100控制码编程
实现基本的功能,旋转,移动,满行消除等功能。
/************************************************************************* > File Name: 9.c > Author: Yangkun > Mail: yangkungetit@163.com > Created Time: Mon 02 Oct 2017 08:32:10 AM PDT ************************************************************************/#include<string.h>#include<stdio.h>#include<signal.h>#include<stdlib.h>#include<unistd.h>#include<sys/time.h>#include"/home/yangkun/keyboard/keyboard/keyboard.h"#define H 20#define W 10#define BC 0#define FC 5int background_arr[H][W] = {};int cur;int next;typedef struct mode{ int s[5][5];}mode;struct pos{ int x; int y;};struct pos t = {.x=5,.y=0};void element(int x,int y,char c){ x++; y++; x*=2; printf("\033[%d;%dH\033[3%dm\033[4%dm[]",y,x,c,c); printf("\033[?25l\033[0m"); fflush(stdout);}void background(){ int i,j; for(i=0;i<H;i++) { for(j=0;j<W;j++) { if(background_arr[i][j] == 0) element(j,i,BC); else element(j,i,FC); } }}mode mode_arr[7]={ { 0,0,0,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,1,0,0 }, { 0,0,0,0,0, 0,1,1,0,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0 }, { 0,0,0,0,0, 0,0,1,1,0, 0,1,1,0,0, 0,0,0,0,0, 0,0,0,0,0 }, { 0,0,0,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,1,1,0,0, 0,0,0,0,0 }, { 0,0,0,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,1,1,0, 0,0,0,0,0 }, { 0,0,0,0,0, 0,0,1,0,0, 0,1,1,1,0, 0,0,0,0,0, 0,0,0,0,0 }, { 0,0,0,0,0, 0,0,1,0,0, 0,0,1,0,0, 0,0,1,1,0, 0,0,0,0,0 },};void draw(int x,int y,mode m,char c){ int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(m.s[i][j]==1) { element(x+j,y+i,c); } } }}int move(int x,int y,mode p){ int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(p.s[i][j]==0) continue; if(x+j>=W) return 0; if(y+i>=H) return 0; if(x+j<0) return 0; if(background_arr[y+i][x+j]!=0) return 0; } } return 1;}void setbackground(struct pos* t){ int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(mode_arr[cur].s[i][j] != 0) { background_arr[t->y+i][t->x+j] = 1; } } }}void nextpitc(){ int i,j; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(mode_arr[next].s[i][j]==0) { element(W+j+2,2+i,BC); } else { element(W+j+2,2+i,FC); } } }}void fullline(){ int i; for(i=0;i<W;i++) { if(background_arr[1][i]!=0) { printf("Game Over!!!\n"); recover_keyboard(); exit(0); } }}void clean_line(){ int i,j; int k; for(i=0;i<H;i++) { k=0; for(j=0;j<W;j++) { if(background_arr[i][j] != 0) k++; } if(k==W) { int t; for(t=i;t>0;t--) { memcpy(background_arr[t],background_arr[t-1],sizeof(background_arr[t])); } memset(background_arr[0],0x00,sizeof(background_arr[0])); } } fullline();}void count_time( struct pos* t ){ draw(t->x,t->y,mode_arr[cur],BC); if(move(t->x,t->y+1,mode_arr[cur])) { t->y++; draw(t->x,t->y,mode_arr[cur],FC); } else { setbackground(t); clean_line(); background(); cur=next; next=rand()%7; nextpitc(); t->y=0; t->x=0; }}void handler(int x){ count_time(&t);}mode turn_90(mode m){ int i,j; mode tmp; for(i=0;i<5;i++) { for(j=0;j<5;j++) { tmp.s[i][j]=m.s[4-j][i]; } } return tmp;}void tetirs(struct pos* t){ int c; c=get_key(); if(is_up(c)) { draw(t->x,t->y,mode_arr[cur],BC); mode_arr[cur] = turn_90(mode_arr[cur]); if(move(t->x,t->y,mode_arr[cur])==0) { mode_arr[cur] = turn_90(mode_arr[cur]); mode_arr[cur] = turn_90(mode_arr[cur]); mode_arr[cur] = turn_90(mode_arr[cur]); } } else if(is_down(c)) { draw(t->x,t->y,mode_arr[cur],BC); if(move(t->x,t->y+1,mode_arr[cur])) { t->y++; draw(t->x,t->y,mode_arr[cur],FC); } } else if(is_left(c)) { draw(t->x,t->y,mode_arr[cur],BC); if(move(t->x-1,t->y,mode_arr[cur])) { t->x--; draw(t->x,t->y,mode_arr[cur],FC); } } else if(is_right(c)) { draw(t->x,t->y,mode_arr[cur],BC); if(move(t->x+1,t->y,mode_arr[cur])) { t->x++; draw(t->x,t->y,mode_arr[cur],FC); } }}int main(void){ background(); struct itimerval it; it.it_value.tv_sec = 0; it.it_value.tv_usec = 1; it.it_interval.tv_sec = 0; it.it_interval.tv_usec =300000; srand(time(NULL)); next=rand()%7; cur=rand()%7; signal(SIGALRM, handler); setitimer(ITIMER_REAL,&it,NULL); init_keyboard(); while( 1 ) { tetirs(&t); clean_line(); } recover_keyboard();}
keyboard.c
#include <stdio.h>#include <unistd.h>#include <termios.h>#include <fcntl.h>struct termios tcsave;int flsave;#define UP 0x415b1b#define DOWN 0x425b1b#define LEFT 0x445b1b#define RIGHT 0x435b1b#define ENTER 0xa#define ESC 0x1b#define SPACE 0x20int init_keyboard(void){ int ret; struct termios tc; ret = tcgetattr(0, &tcsave); if(ret < 0) return -1; tc = tcsave; tc.c_lflag &= ~(ECHO|ICANON); ret = tcsetattr(0, TCSANOW, &tc); if(ret < 0) return -1; flsave = fcntl(0, F_GETFL); fcntl(0, F_SETFL, flsave|O_NONBLOCK); return 0;}void recover_keyboard(void){ tcsetattr(0, TCSANOW, &tcsave); fcntl(0, F_SETFL, flsave);}int get_key(void){ unsigned char buf[3]; int ret, i, key, r; ret = read(0, buf, sizeof(buf)); if(ret < 0) return -1; //* if(ret == 1 || ret == 2){ r = read(0, &buf[ret], sizeof(buf)-ret); if(r > 0) return -1; r = read(0, &buf[ret], sizeof(buf)-ret); if(r > 0) return -1; r = read(0, &buf[ret], sizeof(buf)-ret); if(r > 0) return -1; r = read(0, &buf[ret], sizeof(buf)-ret); if(r > 0) return -1; } //*/ //printf("ret = %d r = %d key=[%d]\n", ret, buf[0]); key = 0; for(i=0; i<ret; i++){ key += (buf[i]<<(i*8)); } return key;}int is_up(int key){ return key == UP;}int is_down(int key){ return key == DOWN;}int is_left(int key){ return key == LEFT;}int is_right(int key){ return key == RIGHT;}int is_enter(int key) { return key == ENTER;}int is_esc(int key){ return key == ESC;}int is_space(int key){ return key == SPACE;}#if 0int main(void){ int key, ret; ret = init_keyboard(); if(ret < 0) return -1; while(1){ key = get_key(); if(key < 0) continue; //printf("key = %x\n", key); if(is_left(key)) printf("left\n"); if(is_right(key)) printf("right\n"); if(is_up(key)) printf("up\n"); if(is_down(key)) printf("down\n"); if(is_enter(key)) printf("enter\n"); if(is_space(key)) printf("space\n"); if(is_esc(key)){ printf("esc\n"); break; } //if(key == 'q') // break; } recover_keyboard(); return 0;}#endif
keyboard.h
#ifndef KEYBOARD_H#define KEYBOARD_Hint init_keyboard(void);void recover_keyboard(void);int get_key(void);int is_up(int key);int is_down(int key);int is_left(int key);int is_right(int key);int is_enter(int key); int is_esc(int key);int is_space(int key);#endif
阅读全文
0 0
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块!
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- 俄罗斯方块
- UR5机械臂--ROS系统通信建立与实时控制
- Servlet(路径、特性)
- POJ 2079 求最大三角形面积
- C语言和C++的区别(函数重载)
- 《HBase权威指南》读书笔记 第八章:架构:读取数据、region生命周期、ZK数据结构
- 俄罗斯方块
- Spring学习笔记
- NIT_145_UVA_7324
- STL-queue容器
- Python爬虫每日学习 2017/10/2
- 多线程:共享数据
- rtmp 时间戳与音视频同步
- grep
- C#控制台程序实现鼠标左右手习惯切换