俄罗斯方块(C语言源代码)
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
//游戏窗口
#define FrameX 4 //游戏窗口左上角的X轴坐标
#define FrameY 4 //游戏窗口左上角的Y轴坐标
#define Frame_height 20 //游戏窗口的高度
#define Frame_width 18 //游戏窗口的宽度
//定义全局变量
int i, j, temp, temp1, temp2; //temp,temp1,temp2用于记住和转换方块变量的值
int a[80][80] = { 0 }; //标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案
int b[4]; //标记4个"口"方块:1表示有方块,0表示无方块
//声明俄罗斯方块的结构体
struct Tetris
{
int x; //中心方块的x轴坐标int y; //中心方块的y轴坐标int flag; //标记方块类型的序号int next; //下一个俄罗斯方块类型的序号int speed; //俄罗斯方块移动的速度int count; //产生俄罗斯方块的个数int score; //游戏的分数int level; //游戏的等级
};
//函数原型声明
//光标移到指定位置
void gotoxy(HANDLE hOut, int x, int y);
//制作游戏窗口
void make_frame();
//随机产生方块类型的序号
void get_flag(struct Tetris*);
//制作俄罗斯方块
void make_tetris(struct Tetris*);
//打印俄罗斯方块
void print_tetris(HANDLE hOut, struct Tetris*);
//清除俄罗斯方块的痕迹
void clear_tetris(HANDLE hOut, struct Tetris*);
//判断是否能移动,返回值为1,能移动,否则,不动
int if_moveable(struct Tetris*);
//判断是否满行,并删除满行的俄罗斯方块
void del_full(HANDLE hOut, struct Tetris*);
//开始游戏
void start_game();
void main()
{
//制作游戏窗口make_frame();//开始游戏start_game();
}
/光标移到指定位置********************************************************/
void gotoxy(HANDLE hOut, int x, int y)
{
COORD pos;pos.X = x; //横坐标pos.Y = y; //纵坐标SetConsoleCursorPosition(hOut, pos);
}
/制作游戏窗口************************************************************/
void make_frame()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量gotoxy(hOut, FrameX + Frame_width - 5, FrameY - 2); //打印游戏名称printf("俄罗斯方块");gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 7); //打印选择菜单printf("**********下一个方块:");gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 13);printf("**********");gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 17);printf("↑键:变体");gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 19);printf("空格:暂停游戏");gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 15);printf("Esc :退出游戏");gotoxy(hOut, FrameX, FrameY); //打印框角并记住该处已有图案printf("╔");gotoxy(hOut, FrameX + 2 * Frame_width - 2, FrameY);printf("╗");gotoxy(hOut, FrameX, FrameY + Frame_height);printf("╚");gotoxy(hOut, FrameX + 2 * Frame_width - 2, FrameY + Frame_height);printf("╝");a[FrameX][FrameY + Frame_height] = 2;a[FrameX + 2 * Frame_width - 2][FrameY + Frame_height] = 2;for (i = 2; i < 2 * Frame_width - 2; i += 2){gotoxy(hOut, FrameX + i, FrameY);printf("═"); //打印上横框}for (i = 2; i < 2 * Frame_width - 2; i += 2){gotoxy(hOut, FrameX + i, FrameY + Frame_height);printf("═"); //打印下横框a[FrameX + i][FrameY + Frame_height] = 2; //记住下横框有图案}for (i = 1; i < Frame_height; i++){gotoxy(hOut, FrameX, FrameY + i);printf("║"); //打印左竖框a[FrameX][FrameY + i] = 2; //记住左竖框有图案}for (i = 1; i < Frame_height; i++){gotoxy(hOut, FrameX + 2 * Frame_width - 2, FrameY + i);printf("║"); //打印右竖框a[FrameX + 2 * Frame_width - 2][FrameY + i] = 2; //记住右竖框有图案}
}
/制作俄罗斯方块**************************************************************/
void make_tetris(struct Tetris* tetris)
{
a[tetris->x][tetris->y] = b[0]; //中心方块位置的图形状态:1-有,0-无switch (tetris->flag) //共6大类,19种类型{case 1: //田字方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x + 2][tetris->y - 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 2: //直线方块:----{a[tetris->x - 2][tetris->y] = b[1];a[tetris->x + 2][tetris->y] = b[2];a[tetris->x + 4][tetris->y] = b[3];break;}case 3: //直线方块: |{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x][tetris->y - 2] = b[2];a[tetris->x][tetris->y + 1] = b[3];break;}case 4: //T字方块{a[tetris->x - 2][tetris->y] = b[1];a[tetris->x + 2][tetris->y] = b[2];a[tetris->x][tetris->y + 1] = b[3];break;}case 5: //T字顺时针转90度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x][tetris->y + 1] = b[2];a[tetris->x - 2][tetris->y] = b[3];break;}case 6: //T字顺时针转180度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x - 2][tetris->y] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 7: //T字顺时针转270度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x][tetris->y + 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 8: //Z字方块{a[tetris->x][tetris->y + 1] = b[1];a[tetris->x - 2][tetris->y] = b[2];a[tetris->x + 2][tetris->y + 1] = b[3];break;}case 9: //Z字顺时针转90度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x - 2][tetris->y] = b[2];a[tetris->x - 2][tetris->y + 1] = b[3];break;}case 10: //Z字顺时针转180度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x - 2][tetris->y - 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 11: //Z字顺时针转270度方块{a[tetris->x][tetris->y + 1] = b[1];a[tetris->x + 2][tetris->y - 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 12: //7字方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x][tetris->y + 1] = b[2];a[tetris->x - 2][tetris->y - 1] = b[3];break;}case 13: //7字顺时针转90度方块{a[tetris->x - 2][tetris->y] = b[1];a[tetris->x - 2][tetris->y + 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 14: //7字顺时针转180度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x][tetris->y + 1] = b[2];a[tetris->x + 2][tetris->y + 1] = b[3];break;}case 15: //7字顺时针转270度方块{a[tetris->x - 2][tetris->y] = b[1];a[tetris->x + 2][tetris->y - 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 16: //倒7字方块{a[tetris->x][tetris->y + 1] = b[1];a[tetris->x][tetris->y - 1] = b[2];a[tetris->x + 2][tetris->y - 1] = b[3];break;}case 17: //倒7字顺指针转90度方块{a[tetris->x - 2][tetris->y] = b[1];a[tetris->x - 2][tetris->y - 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}case 18: //倒7字顺时针转180度方块{a[tetris->x][tetris->y - 1] = b[1];a[tetris->x][tetris->y + 1] = b[2];a[tetris->x - 2][tetris->y + 1] = b[3];break;}case 19: //倒7字顺时针转270度方块{a[tetris->x - 2][tetris->y] = b[1];a[tetris->x + 2][tetris->y + 1] = b[2];a[tetris->x + 2][tetris->y] = b[3];break;}}
}
//判断是否可动*******************************************************************/
int if_moveable(struct Tetris* tetris)
{
if (a[tetris->x][tetris->y] != 0)//当中心方块位置上有图案时,返回值为0,即不可移动{return 0;}else{if ( //当为田字方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动(tetris->flag == 1 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x + 2][tetris->y - 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||//或为直线方块且除中心方块位置外,其他"口"字方块位置上无图案时,返回值为1,即可移动(tetris->flag == 2 && (a[tetris->x - 2][tetris->y] == 0 &&a[tetris->x + 2][tetris->y] == 0 && a[tetris->x + 4][tetris->y] == 0)) ||(tetris->flag == 3 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x][tetris->y - 2] == 0 && a[tetris->x][tetris->y + 1] == 0)) ||(tetris->flag == 4 && (a[tetris->x - 2][tetris->y] == 0 &&a[tetris->x + 2][tetris->y] == 0 && a[tetris->x][tetris->y + 1] == 0)) ||(tetris->flag == 5 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x][tetris->y + 1] == 0 && a[tetris->x - 2][tetris->y] == 0)) ||(tetris->flag == 6 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x - 2][tetris->y] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 7 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x][tetris->y + 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 8 && (a[tetris->x][tetris->y + 1] == 0 &&a[tetris->x - 2][tetris->y] == 0 && a[tetris->x + 2][tetris->y + 1] == 0)) ||(tetris->flag == 9 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x - 2][tetris->y] == 0 && a[tetris->x - 2][tetris->y + 1] == 0)) ||(tetris->flag == 10 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x - 2][tetris->y - 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 11 && (a[tetris->x][tetris->y + 1] == 0 &&a[tetris->x + 2][tetris->y - 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 12 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x][tetris->y + 1] == 0 && a[tetris->x - 2][tetris->y - 1] == 0)) ||(tetris->flag == 13 && (a[tetris->x - 2][tetris->y] == 0 &&a[tetris->x - 2][tetris->y + 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 14 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x][tetris->y + 1] == 0 && a[tetris->x + 2][tetris->y + 1] == 0)) ||(tetris->flag == 15 && (a[tetris->x - 2][tetris->y] == 0 &&a[tetris->x + 2][tetris->y - 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 16 && (a[tetris->x][tetris->y + 1] == 0 &&a[tetris->x][tetris->y - 1] == 0 && a[tetris->x + 2][tetris->y - 1] == 0)) ||(tetris->flag == 17 && (a[tetris->x - 2][tetris->y] == 0 &&a[tetris->x - 2][tetris->y - 1] == 0 && a[tetris->x + 2][tetris->y] == 0)) ||(tetris->flag == 18 && (a[tetris->x][tetris->y - 1] == 0 &&a[tetris->x][tetris->y + 1] == 0 && a[tetris->x - 2][tetris->y + 1] == 0)) ||(tetris->flag == 19 && (a[tetris->x - 2][tetris->y] == 0 &&a[tetris->x + 2][tetris->y + 1] == 0 && a[tetris->x + 2][tetris->y] == 0))){return 1;}}return 0;
}
/随机产生俄罗斯方块类型的序号****************************************************/
void get_flag(struct Tetris* tetris)
{
tetris->count++; //记住产生方块的个数srand((unsigned)time(NULL)); //初始化随机数if (tetris->count == 1){tetris->flag = rand() % 19 + 1; //记住第一个方块的序号}tetris->next = rand() % 19 + 1; //记住下一个方块的序号
}
/打印俄罗斯方块****************************************************************/
void print_tetris(HANDLE hOut, struct Tetris* tetris)
{
for (i = 0; i < 4; i++){b[i] = 1; //数组b[4]的每个元素的值都为1}make_tetris(tetris); //制作俄罗斯方块for (i = tetris->x - 2; i <= tetris->x + 4; i += 2){for (j = tetris->y - 2; j <= tetris->y + 1; j++){if (a[i][j] == 1 && j > FrameY){gotoxy(hOut, i, j);printf("□"); //打印边框内的方块}}}//打印菜单信息gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 1);printf("level : %d", tetris->level);gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 3);printf("score : %d", tetris->score);gotoxy(hOut, FrameX + 2 * Frame_width + 3, FrameY + 5);printf("speed : %dms", tetris->speed);
}
/清除俄罗斯方块的痕迹**********************************************************/
void clear_tetris(HANDLE hOut, struct Tetris* tetris)
{
for (i = 0; i < 4; i++){b[i] = 0; //数组b[4]的每个元素的值都为0}make_tetris(tetris); //制作俄罗斯方块for (i = tetris->x - 2; i <= tetris->x + 4; i += 2){for (j = tetris->y - 2; j <= tetris->y + 1; j++){if (a[i][j] == 0 && j > FrameY){gotoxy(hOut, i, j);printf(" "); //清除方块}}}
}
/判断是否满行并删除满行的俄罗斯方块**********************************************/
void del_full(HANDLE hOut, struct Tetris* tetris)
{ //当某行有Frame_width-2个方块时,则满行
int k, del_count = 0; //分别用于记录某行方块的个数和删除方块的行数的变量for (j = FrameY + Frame_height - 1; j >= FrameY + 1; j--){k = 0;for (i = FrameX + 2; i < FrameX + 2 * Frame_width - 2; i += 2){if (a[i][j] == 1) //竖坐标依次从下往上,横坐标依次由左至右判断是否满行{k++; //记录此行方块的个数if (k == Frame_width - 2){for (k = FrameX + 2; k < FrameX + 2 * Frame_width - 2; k += 2){ //删除满行的方块a[k][j] = 0;gotoxy(hOut, k, j);printf(" ");Sleep(1);}for (k = j - 1; k > FrameY; k--){ //如果删除行以上的位置有方块,则先清除,再将方块下移一个位置for (i = FrameX + 2; i < FrameX + 2 * Frame_width - 2; i += 2){if (a[i][k] == 1){a[i][k] = 0;gotoxy(hOut, i, k);printf(" ");a[i][k + 1] = 1;gotoxy(hOut, i, k + 1);printf("□");}}}j++; //方块下移后,重新判断删除行是否满行del_count++; //记录删除方块的行数}}}}tetris->score += 100 * del_count; //每删除一行,得100分if (del_count > 0 && (tetris->score % 1000 == 0 || tetris->score / 1000 > tetris->level - 1)){ //如果得1000分即累计删除10行,速度加快20ms并升一级tetris->speed -= 20;tetris->level++;}
}
/开始游戏************************************************************************/
void start_game()
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量struct Tetris t, * tetris = &t; //定义结构体的指针并指向结构体变量unsigned char ch; //定义接收键盘输入的变量tetris->count = 0; //初始化俄罗斯方块数为0个tetris->speed = 300; //初始移动速度为300mstetris->score = 0; //初始游戏的分数为0分tetris->level = 1; //初始游戏为第1关while (1){//循环产生方块,直至游戏结束get_flag(tetris); //得到产生俄罗斯方块类型的序号temp = tetris->flag; //记住当前俄罗斯方块序号//打印下一个俄罗斯方块的图形(右边窗口)tetris->x = FrameX + 2 * Frame_width + 6;tetris->y = FrameY + 10;tetris->flag = tetris->next;print_tetris(hOut, tetris);tetris->x = FrameX + Frame_width; //初始中心方块x坐标tetris->y = FrameY - 1; //初始中心方块y坐标tetris->flag = temp; //取出当前的俄罗斯方块序号while (1){//控制方块方向,直至方块不再下移label:print_tetris(hOut, tetris);//打印俄罗斯方块Sleep(tetris->speed); //延缓时间clear_tetris(hOut, tetris); //清除痕迹temp1 = tetris->x; //记住中心方块横坐标的值temp2 = tetris->flag; //记住当前俄罗斯方块序号if (kbhit()){ //判断是否有键盘输入,有则用ch↓接收ch = getch();if (ch == 75) //按←键则向左动,中心横坐标减2{tetris->x -= 2;}if (ch == 77) //按→键则向右动,中心横坐标加2{tetris->x += 2;}if (ch == 72) //按↑键则变体即当前方块顺时针转90度{if (tetris->flag >= 2 && tetris->flag <= 3){tetris->flag++;tetris->flag %= 2;tetris->flag += 2;}if (tetris->flag >= 4 && tetris->flag <= 7){tetris->flag++;tetris->flag %= 4;tetris->flag += 4;}if (tetris->flag >= 8 && tetris->flag <= 11){tetris->flag++;tetris->flag %= 4;tetris->flag += 8;}if (tetris->flag >= 12 && tetris->flag <= 15){tetris->flag++;tetris->flag %= 4;tetris->flag += 12;}if (tetris->flag >= 16 && tetris->flag <= 19){tetris->flag++;tetris->flag %= 4;tetris->flag += 16;}}if (ch == 32) //按空格键,暂停{print_tetris(hOut, tetris);while (1){if (kbhit()) //再按空格键,继续游戏{ch = getch();if (ch == 32){goto label;}}}}if (if_moveable(tetris) == 0) //如果不可动,上面操作无效{tetris->x = temp1;tetris->flag = temp2;}else //如果可动,执行操作{goto label;}}tetris->y++; //如果没有操作指令,方块向下移动if (if_moveable(tetris) == 0) //如果向下移动且不可动,方块放在此处{tetris->y--;print_tetris(hOut, tetris);del_full(hOut, tetris);break;}}for (i = tetris->y - 2; i < tetris->y + 2; i++){//游戏结束条件:方块触到框顶位置if (i == FrameY){j = 0; //如果游戏结束,j=0}}if (j == 0){system("cls");getch();break;}//清除下一个俄罗斯方块的图形(右边窗口)tetris->flag = tetris->next;tetris->x = FrameX + 2 * Frame_width + 6;tetris->y = FrameY + 10;clear_tetris(hOut, tetris);}
}
//QAQ翻箱倒柜从自己的有道云笔记找出来了,好久没有发笔记了,得发一点证明自己还在学。
俄罗斯方块(C语言源代码)相关推荐
- c语言代码 txt下载,俄罗斯方块C语言源代码txt.DOC
俄罗斯方块C语言源代码txt /*名称: 俄罗斯方块 源程 For Turbo C 2.0软件编写:中国 北京 幻想空间软件创作群Illusion Space Software Design Grou ...
- 随机森林c语言编程,一种基于随机森林的C语言源代码静态评分方法与流程
本发明涉及评分领域及机器学习领域,它特别涉及一种基于随机森林的c语言源代码静态评分的构建方法. 背景技术: c语言源代码静态评分是指对根据一定的题目描述做出解答的c语言源代码进行评分.目前,主要流行的 ...
- MATLAB里面的filter和filtfilt的C语言源代码
MATLAB里面的filter和filtfilt的C语言源代码 嗯,算法非常简单,就是网上搜不到C代码实现.filter是个很万能的数字滤波器函数,只要有滤波器的差分方程系数,IIR呀FIR呀都能通过 ...
- 计算星期c语言编码,[转载]计算任何一天是星期几的C语言源代码.
[转载]计算任何一天是星期几的C语言源代码. #include int main() { int day,mn,yr,i,days=0,s,k; int mont[13]={0,31,28,31,30 ...
- c语言手游常用代码,c语言源代码【操作流程】
很多小伙伴都遇到过c语言源代码的困惑吧,一些朋友看过网上零散的c语言源代码的处理方法,并没有完完全全明白c语言源代码是如何解决的,今天小编准备了简单的解决办法,只需要按照1:编写C源代码for_lea ...
- ras的c语言源代码文档,µMore(µITRON操作系统)--功能概况
µMore™ (µITRON操作系统) 概览 μMore是一种专门为下一代移动设备设计的实时操作系统,与μITRON4.0标准应用概要兼容.μMore具有轻松节电功能,并附带了爱可信的AVE-TCP网 ...
- 俄罗斯方块-C语言-详注版
代码地址如下: http://www.demodashi.com/demo/14818.html 俄罗斯方块-C语言-详注版 概述 本文详述了C语言版俄罗斯方块游戏的原理以及实现方法,对游戏代码进行了 ...
- 中国象棋源码c语言,中国象棋C语言源代码.doc
中国象棋C语言源代码 *chess.c*/ #include "dos.h" #include "stdio.h" /**/ #define RED 7 #de ...
- 二元函数求最小值 c语言,遗传算法C语言源代码(一元函数和二元函数)
<遗传算法C语言源代码(一元函数和二元函数)>由会员分享,可在线阅读,更多相关<遗传算法C语言源代码(一元函数和二元函数)(15页珍藏版)>请在人人文库网上搜索. 1.C语言遗 ...
- Easystructure教程_C语言源代码自动生成流程图
目录 Easystructure教程_C语言源代码自动生成流程图 1. 简介 2. 下载 3. 安装 4. 使用 5. 其他软件推荐 5.1 Mermaid 5.2 Code2flow ** Easy ...
最新文章
- Android项目框架综合实例
- 在Ubuntu上安装mongoDB
- 刷题总结——树的同构(bzoj4337 树上hash)
- 嵌入式Linux系统编程学习之五gcc/g++编译器
- chrome浏览器fitler中的XHR作用是什么
- [LeetCode] Missing Ranges 缺失区间
- R 语言基本操作(基本信息的查看、与本地文件系统交互、编译器版本升级)
- android qq输入法表情,QQ输入法如何输入表情
- segue 分析小结
- Google原生输入法LatinIME词库构建流程分析(一)
- win7怎么把计算机删除文件,win7不小心删除文件如何恢复_win7删除文件的四种恢复技巧...
- matlab 四维等值面图,一个4列数组怎样画出三维等值面图
- sprintf,snprintf的用法(可以作为linux中itoa函数的补充)
- 从《我不是潘金莲》谈程序员的核心竞争力
- java 代码书写规范_代码书写规范和命名规范
- WVGA与HVGA、QVGA详细解答
- OpenCV—Python PyLibTiff_psd 图像基本操作以及图像格式转换
- python输出结果_python输出结果
- bd09坐标转wgs84 JS版本 精准度高
- Java项目:在线博客问答系统(java+Springboot+jsp+maven+mysql)
热门文章
- linux机顶盒线刷教程,网络机顶盒刷机教程和详细方法,实现软件任意安装,电视免费看...
- 智慧水利大屏可视化决策系统
- java jpg转换成pdf格式_Java pdf和jpg互转案例
- 如何把pdf转成jpg格式?
- 学生管理系统(JAVA后台简约版)
- 大学生个人网页设计 HTML个人网页制作 web个人网站模板 简单静态HTML个人网页作品
- 未找到uniwebview_unity内嵌浏览器——UniWebView插件
- 数学画图软件_关于数学建模(或科研绘图)的画图学习建议
- CSDN账号找回密码的解决方法(原手机号不能使用)
- PADS Layout 滴泪、敷铜和删除