赞
踩
俄罗斯方块- 源码文件 - 点击下载
说明:本程序使用DEV即可编译
效果截图:
1024.c
- #include <stdio.h>
- #include <windows.h>
- #include <time.h>
- #include "order_b_1.h"
- #include "help_fun_1.h"
- #include "order_fun_1.h"
- #include "order_fun_2.h"
- /*#########################分隔线#########################*/
- //head(),程序初始函数
- void head(){
- console();//控制窗口
- srand((unsigned)time(NULL ));// 设置随机种子
- f_all_bianliang();//全局变量初始化
- f_shuzhu_m();//m数组初始化
- f_data();//初始化data
- set_cursor(0);//隐藏光标
- f_beijing();//窗口背景初始化
- copyright();//版权说明
- d_jieshao();//游戏介绍
- printf("按任意键继续.....\n");
- command(2);
- command(1);
- d_ditu();//显示地图
- d_shuoming();//游戏操作说明
- }
- /*#########################分隔线#########################*/
- //body(),程序主体
- void body(){
- c_weizhi();//新方块位置生成
- d_fankuai(mx,my);//显示方块
- r_m_data();//将地图记录进data
- while(G){
- if(kbhit()){//判断是否有键按下
- switch(getch()){//获取用户按下的按键
- case 0xE0:switch(getch()){//分析按键
- case 72:t_yidong(1);break;
- case 80:t_yidong(2);break;
- case 75:t_yidong(3);break;
- case 77:t_yidong(4);break;
- default:break;
- }
- break;
- case 32:command(2);break;
- default:break;
- }
- }
- }
- }
- /*#########################分隔线#########################*/
- //food(),程序末尾
- void food(){
- set_color(0,15);
- command(1);
- printf("游戏结束!\n");
- printf("游戏得分:%d\n",F);
- printf("重新开始:1 结束:0\n");
- }
- /*#########################分隔线#########################*/
- //程序运行函数
- void run(){
- do{
- head();//程序初始函数
- body();//程序主体
- food();//程序末尾
- }
- while(input_int(0,1));
- }
- /*#########################分隔线#########################*/
- void main(){
- run();
- }
help_fun_1.h
- //基础函数头文件
-
- /*
- 0 = 黑色 8 = 灰色
- 1 = 蓝色 9 = 淡蓝色
- 2 = 绿色 10 = 淡绿色
- 3 = 浅绿色 11 = 淡浅绿色
- 4 = 红色 12 = 淡红色
- 5 = 紫色 13 = 淡紫色
- 6 = 黄色 14 = 淡黄色
- 7 = 白色 15 = 亮白色
- */
- //设置字符前景色和底色,ForeColor:字色,BackColor:背景色,基本颜色0-7,8-15是亮度加强的基本色
- void set_color(int ForeColor,int BackColor){
- HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
- SetConsoleTextAttribute(hConsole,BackColor*16+ForeColor) ;
- }
- //设置光标,flg=1:显示光标 flg=0:隐藏光标
- void set_cursor(int flg){
- HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
- CONSOLE_CURSOR_INFO cursor_info={100,flg};
- SetConsoleCursorInfo(hOut,&cursor_info);
- }
- //设置字符显示位置
- void set_cocate(int x,int y)
- {
- x*=2;//增加
- HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
- COORD loc={x,y};
- SetConsoleCursorPosition(hOut,loc);
- }
- //执行系统命令
- void command(int a){
- /*
- 1 = 清屏
- 2 = 暂停
- */
- switch(a){
- case 1:system("cls");break;
- case 2:system("pause>command.txt");break;
- default:break;
- }
- }
- //整形数据输入
- int input_int(int i,int j){
- int a=-100,k=0;
- printf("请输入 %d~%d 的数值,并按回车确定;\n",i,j);
- while(a>j||a<i){
- if(k!=0){
- printf("输入错误,请重新输入 %d~%d 的数值,并按回车确定;\n",i,j);
- }
- scanf("%d",&a);
- k++;
- }
- return a;
- }
- //版权说明
- void copyright(){
- set_cocate(0,0);
- set_color(12,15);
- printf("########################################\n");
- printf("#Created At:20170909 #\n");
- printf("#Algorithm Gossip:tetris #\n");
- printf("#Developer:wunanhui #\n");
- printf("#Referenced By:http://www.wunanhui.wang#\n");
- printf("########################################\n");
- }
- //控制窗口
- void console(){
- HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
- CONSOLE_SCREEN_BUFFER_INFO bInfo;
- GetConsoleScreenBufferInfo(hOut, &bInfo );
- SetConsoleTitle("1024"); // 设置窗口的标题
- COORD size = {30, 30};//设置窗口大小
- SetConsoleScreenBufferSize(hOut,size);
- //SMALL_RECT rc = {0,0,63,31};
- //SetConsoleWindowInfo(hOut,true,&rc);
- }
order_b_1.h
- /*#########################分隔线#########################*/
- //常量定义区
- //#define MAX_X 8
- #define DT 4//地图大小
-
- /*#########################分隔线#########################*/
- //全局变量定义区
- int m[DT][DT];//地图数组
- int mx,my;//新方块坐标
- int fi,fj;//for循环专用变量
- int G;//游戏生命
- int F;//游戏得分
-
- /*#########################分隔线#########################*/
- //结构体定义区
- /*
- typedef struct node{
- int x;
- int y;
- struct node *next;
- }slink;
- */
order_fun_1.h
- /*
- 函数命名规则说明 动作_实体
- 1.初始化 = f_
- 2.显示 = d_
- 3.设置 = s_
- 4.运行 = t_
- 5.生产 = c_
- 6.记录 = r_
- */
- /*#########################分隔线#########################*/
- //f_all_bianliang(),全局变量初始化
- void f_all_bianliang(){
- fi=fj=mx=my=F=0;
- G=1;
- }
- /*#########################分隔线#########################*/
- //f_shuzhu(),m数组初始化
- void f_shuzhu_m(){
- for(fi=0;fi<DT;++fi){
- for(fj=0;fj<DT;++fj){
- m[fi][fj]=0;
- }
- }
- }
- /*#########################分隔线#########################*/
- //f_beijing(),窗口背景初始化
- void f_beijing(){
- int fanwei_x=80;
- int fanwei_y=25;
- set_color(0,15);
- for(fi=0;fi<fanwei_x;++fi){
- for(fj=0;fj<fanwei_y;++fj){
- set_cocate(fi,fj);
- printf(" ");
- }
- }
- }
- /*#########################分隔线#########################*/
- // r_m_data(),将地图记录进data
- void r_m_data(){
- if(1){
- FILE *fp;
- int i,j;
- fp=fopen("data.txt","a");
- for(fi=0;fi<DT;fi++){
- fprintf(fp,"|");
- for(fj=0;fj<DT;fj++){
- fprintf(fp,"%4d|",m[fi][fj]);
- }
- fprintf(fp,"\n");
- }
- fprintf(fp,"\n");
- fclose(fp);
- }
- }
- /*#########################分隔线#########################*/
- //f_data(),初始化data
- void f_data(){
- FILE *fp;
- fp=fopen("data.txt","w");
- fclose(fp);
- }
- /*#########################分隔线#########################*/
- //d_shuoming(),游戏操作说明
- void d_shuoming(){
- set_color(0,15);
- set_cocate(0,19);
- printf("↑:上移 ↓:下移 ←:左移 →:右移 空格:暂停");
- }
- /*#########################分隔线#########################*/
- //d_jieshao(),游戏介绍
- void d_jieshao(){
- set_color(0,15);
- printf("1024是一款简单有趣的休闲益智游戏,有点像是求合体。\n");
- printf("滑动屏幕,移动数字,相同的数就可以叠加翻倍,直到方框被数字填满,看你能得多少高分。\n");
- }
order_fun_2.h
- /*
- 函数命名规则说明 动作_实体
- 1.初始化 = f_
- 2.显示 = d_
- 3.设置 = s_
- 4.运行 = t_
- 5.生产 = c_
- 6.记录 = r_
- */
- /*#########################分隔线#########################*/
- //d_ditu(),显示地图
- void d_ditu(){
- int fanwei=18;
- set_color(15,0);
- for(fi=0;fi<fanwei;++fi){
- for(fj=0;fj<fanwei;++fj){
- if(fi==0||fj==0||fi==fanwei-1||fj==fanwei-1){
- set_cocate(fi,fj);
- printf(" ");
- }
- }
- }
- }
- /*#########################分隔线#########################*/
- //d_fengshu(),显示分数
- void d_fengshu(){
- set_color(12,15);
- set_cocate(0,18);
- printf("游戏得分:%d",F+=m[mx][my]);
- }
- /*#########################分隔线#########################*/
- //c_weizhi(),新方块位置生成
- void c_weizhi(){
- int max=0,kailv;
- if(t_siwang()){G=0;return;}
- mx=rand()%DT;
- my=rand()%DT;
- while(m[mx][my]){
- mx=rand()%DT;
- my=rand()%DT;
- }
- for(fi=0;fi<DT;++fi){
- for(fj=0;fj<DT-1;++fj){
- if(max<m[fi][fj]){
- max=m[fi][fj];
- }
- }
- }
- m[mx][my]=2;
- if(max>=4&&rand()%100==0){m[mx][my]=4;}
- if(max>=8&&rand()%200==0){m[mx][my]=8;}
- if(max>=16&&rand()%300==0){m[mx][my]=16;}
- if(max>=32&&rand()%400==0){m[mx][my]=32;}
- d_fengshu();//显示分数
- }
- /*#########################分隔线#########################*/
- //d_xinfankuai(),显示方块
- void d_fankuai(int x,int y){
- switch(m[x][y]){
- case 0 :set_color(15,15);break;
- case 2 :set_color(15,1);break;
- case 4 :set_color(15,2);break;
- case 8 :set_color(15,3);break;
- case 16 :set_color(15,4);break;
- case 32 :set_color(15,5);break;
- case 64 :set_color(15,6);break;
- case 128 :set_color(15,9);break;
- case 256 :set_color(15,10);break;
- case 512 :set_color(15,11);break;
- case 1024 :set_color(15,12);break;
- case 2048 :set_color(15,13);break;
- case 4096 :set_color(15,14);break;
- case 8192 :set_color(15,8);break;
- default:break;
- }
- for(fi=x*4+1;fi<x*4+5;++fi){
- for(fj=y*4+1;fj<y*4+5;++fj){
- set_cocate(fi,fj);
- printf(" ");
- }
- }
- set_cocate(x*4+1,y*4+2);
- switch(m[x][y]){
- case 2 :printf("%4d",m[x][y]);break;
- case 4 :printf("%4d",m[x][y]);break;
- case 8 :printf("%4d",m[x][y]);break;
- case 16 :printf("%4d",m[x][y]);break;
- case 32 :printf("%4d",m[x][y]);break;
- case 64 :printf("%4d",m[x][y]);break;
- case 128 :printf("%5d",m[x][y]);break;
- case 256 :printf("%5d",m[x][y]);break;
- case 512 :printf("%5d",m[x][y]);break;
- case 1024 :printf("%6d",m[x][y]);break;
- case 2048 :printf("%6d",m[x][y]);break;
- case 4096 :printf("%6d",m[x][y]);break;
- case 8192 :printf("%6d",m[x][y]);break;
- default:break;
- }
- }
- /*#########################分隔线#########################*/
- //t_yidong(),移动方块
- void t_yidong(int a){
- int b=1;
- switch(a){
- case 1 :
- while(b){
- b=0;
- for(fi=0;fi<DT;++fi){
- for(fj=0;fj<DT-1;++fj){
- if(m[fi][fj]==0&&m[fi][fj+1]!=0){
- m[fi][fj]=m[fi][fj+1];
- m[fi][fj+1]=0;
- b=1;
- }
- }
- }
- }
- for(fi=0;fi<DT;++fi){
- for(fj=0;fj<DT-1;++fj){
- if(m[fi][fj]==m[fi][fj+1]&&m[fi][fj]!=0){
- m[fi][fj]*=2;
- m[fi][fj+1]=0;
- break;
- }
- }
- }
- b=1;
- while(b){
- b=0;
- for(fi=0;fi<DT;++fi){
- for(fj=0;fj<DT-1;++fj){
- if(m[fi][fj]==0&&m[fi][fj+1]!=0){
- m[fi][fj]=m[fi][fj+1];
- m[fi][fj+1]=0;
- b=1;
- }
- }
- }
- }
- break;
- case 2 :
- while(b){
- b=0;
- for(fi=0;fi<DT;++fi){
- for(fj=DT-1;fj>0;--fj){
- if(m[fi][fj]==0&&m[fi][fj-1]!=0){
- m[fi][fj]=m[fi][fj-1];
- m[fi][fj-1]=0;
- b=1;
- }
- }
- }
- }
- for(fi=0;fi<DT;++fi){
- for(fj=DT-1;fj>0;--fj){
- if(m[fi][fj]==m[fi][fj-1]&&m[fi][fj]!=0){
- m[fi][fj]*=2;
- m[fi][fj-1]=0;
- break;
- }
- }
- }
- b=1;
- while(b){
- b=0;
- for(fi=0;fi<DT;++fi){
- for(fj=DT-1;fj>0;--fj){
- if(m[fi][fj]==0&&m[fi][fj-1]!=0){
- m[fi][fj]=m[fi][fj-1];
- m[fi][fj-1]=0;
- b=1;
- }
- }
- }
- }
- break;
- case 3 :
- while(b){
- b=0;
- for(fj=0;fj<DT;++fj){
- for(fi=0;fi<DT-1;++fi){
- if(m[fi][fj]==0&&m[fi+1][fj]!=0){
- m[fi][fj]=m[fi+1][fj];
- m[fi+1][fj]=0;
- b=1;
- }
- }
- }
- }
- for(fj=0;fj<DT;++fj){
- for(fi=0;fi<DT-1;++fi){
- if(m[fi][fj]==m[fi+1][fj]&&m[fi][fj]!=0){
- m[fi][fj]*=2;
- m[fi+1][fj]=0;
- break;
- }
- }
- }
- b=1;
- while(b){
- b=0;
- for(fj=0;fj<DT;++fj){
- for(fi=0;fi<DT-1;++fi){
- if(m[fi][fj]==0&&m[fi+1][fj]!=0){
- m[fi][fj]=m[fi+1][fj];
- m[fi+1][fj]=0;
- b=1;
- }
- }
- }
- }
- break;
- case 4 :
- while(b){
- b=0;
- for(fj=0;fj<DT;++fj){
- for(fi=DT-1;fi>0;--fi){
- if(m[fi][fj]==0&&m[fi-1][fj]!=0){
- m[fi][fj]=m[fi-1][fj];
- m[fi-1][fj]=0;
- b=1;
- }
- }
- }
- }
- for(fj=0;fj<DT;++fj){
- for(fi=DT-1;fi>0;--fi){
- if(m[fi][fj]==m[fi-1][fj]&&m[fi][fj]!=0){
- m[fi][fj]*=2;
- m[fi-1][fj]=0;
- break;
- }
- }
- }
- b=1;
- while(b){
- b=0;
- for(fj=0;fj<DT;++fj){
- for(fi=DT-1;fi>0;--fi){
- if(m[fi][fj]==0&&m[fi-1][fj]!=0){
- m[fi][fj]=m[fi-1][fj];
- m[fi-1][fj]=0;
- b=1;
- }
- }
- }
- }
- break;
- default:break;
- }
- r_m_data();//将地图记录进data
- int i,j;
- for(i=0;i<DT;++i){
- for(j=0;j<DT;++j){
- d_fankuai(i,j);//显示方块
- }
- }
- c_weizhi();//新方块位置生成
- d_fankuai(mx,my);//显示方块
- }
- /*#########################分隔线#########################*/
- //t_siwang(),死亡检测
- int t_siwang(){
- for(fi=0;fi<DT;++fi){
- for(fj=0;fj<DT;++fj){
- if(m[fi][fj]==0){
- return 0;
- }
- }
- }
- return 1;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。