├── _config.yml ├── 赞助.png ├── 微信红包.c ├── 密码.c ├── README.md ├── Windows图形界面程序基本框架.c ├── 鱼蛋装系统后期工具.c ├── Girl Friend.c └── 趣味俄罗斯方块.c /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /赞助.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongrongzhao/The-C-language-project/HEAD/赞助.png -------------------------------------------------------------------------------- /微信红包.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | int main(void) 7 | { 8 | while(1) 9 | { 10 | int i,j,total; 11 | float min = 0.01; 12 | float max = 0; 13 | float sum = 0; 14 | float money = 0; 15 | float AllMoney [5000]; 16 | float num, avg; 17 | 18 | printf("请输入红包数量:"); 19 | while( scanf ( "%d", &total ) !=1 || total<1 || total > 5000 ) 20 | { 21 | printf("输入的红包数量过大或过小啦!重新输入:"); 22 | fflush(stdin); 23 | } 24 | 25 | 26 | printf("请输入红包金额:"); 27 | scanf("%f", &num); 28 | 29 | srand((unsigned)time(NULL)); 30 | 31 | for(i=1; i max ) 43 | { 44 | max = AllMoney[i]; 45 | j = i; 46 | } 47 | } 48 | 49 | AllMoney[i] = num; 50 | printf("\t师兄领到第%d个红包,金额为:%0.2f元\n\n",i, AllMoney[i]); 51 | 52 | if(num > max) 53 | printf("\t第%d个大大的同学是吸金王,抢到了%0.2f元红包,哈哈哈,要请客喔.\n\n",total,num); 54 | else 55 | printf("\t第%d个大大的同学是吸金王,抢到了%0.2f元红包,哈哈哈,要请客喔.\n\n",j,max); 56 | 57 | system("pause"); 58 | system("cls"); 59 | } 60 | return 0; 61 | } 62 | -------------------------------------------------------------------------------- /密码.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | int main(void) 5 | { 6 | char a[50][50]={"######", 7 | "#0 # ", 8 | "# ## #", 9 | "# # #", 10 | "## #", 11 | "######", 12 | }; 13 | int i,x,y,p,q; 14 | char ch; 15 | printf("请输入密码:"); 16 | x=1; y=1; p=1; q=5; 17 | for(i=0;i<=5;i++) 18 | /* 19 | i = 0; 20 | while(i <= 5) 21 | { 22 | i++; 23 | } 24 | */ 25 | //puts(a[i]); 26 | while(x!=p || y!=q) 27 | { 28 | ch=getchar(); 29 | if(ch == 's') 30 | { 31 | if(a[x][y]!='#') 32 | { 33 | a[x][y]=' '; 34 | x++; 35 | a[x][y]='0'; 36 | } 37 | } 38 | if(ch=='w') 39 | { 40 | if(a[x-1][y]!='#') 41 | { 42 | a[x][y]=' '; 43 | x--; 44 | a[x][y]='0'; 45 | } 46 | } 47 | if(ch=='a') 48 | { 49 | if(a[x][y-1]!='#') 50 | { 51 | a[x][y]=' '; 52 | y--; 53 | a[x][y]='0'; 54 | } 55 | } 56 | if(ch=='d') 57 | { 58 | if(a[x][y+1]!='#') 59 | { 60 | a[x][y]=' '; 61 | y++; 62 | a[x][y]='0'; 63 | } 64 | } 65 | system("cls"); 66 | for(i=0;i<=5;i++) 67 | puts(a[i]); 68 | } 69 | system("cls"); 70 | system("cd ..bat"); 71 | printf("you win!\n"); 72 | system("pause"); 73 | return 0; 74 | } 75 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 欢迎来到鱼蛋的c语言项目主页 2 | 3 | 在这里你可以浏览我C语言项目 4 | 5 | ### 项目内容 6 | 7 | 这个仓库里面的所有项目都是一些用C语言写的小项目,并且有详细的注释 8 | 9 | ```markdown 10 | 例如: 11 | /* 12 | *趣味俄罗斯方块 13 | */ 14 | 15 | #include 16 | #include 17 | #include //接收键盘输入输出 18 | #include //用于获得随机数 19 | 20 | //宏定义 21 | #define FrameX 13 22 | #define FrameY 3//定义游戏窗口的X和Y轴坐标 23 | #define Frame_height 20 24 | #define Frame_width 18//定义游戏窗口的长和宽 25 | 26 | //定义全局变量 27 | int i, j, Temp, Temp1, Temp2;//Temp, Temp1, Temp2是用于记住和转换方块变量的值 28 | int a[80][80] = {0}; 29 | int b[4];//标记4个“口 ”方块:1表示有方块 ,0表示无方块 30 | 31 | //结构体 32 | struct Tetris//声明俄罗斯方块的结构体 33 | { 34 | int x; 35 | int y; //中心方块的x和y轴坐标 36 | int flag; //标记方块类型的序号 37 | int next; //下一个俄罗斯方块的类型的序号 38 | int speed; //俄罗斯方块移动的速度 39 | int number; //产生俄罗斯方块的个数 40 | int score; //游戏的分数 41 | int level; //游戏的等级 42 | } ; 43 | HANDLE hOut; //控制台句柄 44 | 45 | //函数声明 46 | int color(int c); 47 | void gotoxy(int x,int y); //光标移动到指定位置 48 | void DrwaGameframe(); //绘制游戏边框 49 | void Flag(struct Tetris *); //随机产生方块类型的序号 50 | void MakeTeris(struct Tetris *); //制作俄罗斯方块 51 | void PrintTeteris(struct Tetris *); //打印俄罗斯方块 52 | void CleanTeteris(struct Tetris *); //清除俄罗斯方块的痕迹 53 | int ifMove(struct Tetris *); //判断是否能移动,返回值为1时能移动,否则不能移动 54 | void Del_Fullline(struct Tetris *); //判断是否满行,并删除满行的俄罗斯方块 55 | void Gameplay(); //开始游戏 56 | void regulation(); //游戏规则 57 | void explation(); //按键说明 58 | void welcome(); //欢迎界面 59 | void Replay(struct Tetris * tetris); //重新开始游戏 60 | void title(); //欢迎界面上方的标题 61 | void flower(); //欢迎界面上的字符装饰花 62 | void close(); //关闭游戏 63 | 64 | /* 65 | *设置文字颜色 66 | */ 67 | int color(int c) 68 | { 69 | SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); 70 | //SetConsoleTextAttribute是设置控制台窗口字体颜色和背景颜色的函数 71 | return 0; 72 | } 73 | 74 | /* 75 | *设置文字显示位置 76 | */ 77 | void gotoxy(int x,int y) 78 | { 79 | COORD pos;//是一个结构体变量,x和y是它的成员 ,是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标 80 | pos.X = x;//横坐标 81 | pos.Y = y;//纵坐标 82 | SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); 83 | //SetConsoleCursorPosition函数用来定位光标位置 84 | } 85 | 86 | /* 87 | *欢迎界面上的标题 88 | */ 89 | void title() 90 | { 91 | color(15); 92 | gotoxy(24, 3); 93 | printf("趣 味 俄 罗 斯 方 块\n"); 94 | 95 | color(11); 96 | gotoxy(18, 5); 97 | printf("■"); 98 | gotoxy(18, 6); 99 | printf("■■"); 100 | gotoxy(18, 7); 101 | printf("■"); 102 | 103 | color(14); 104 | gotoxy(26, 6); 105 | printf("■■"); 106 | gotoxy(28, 7); 107 | printf("■■"); 108 | 109 | color(10); 110 | gotoxy(36, 6); 111 | printf("■■"); 112 | gotoxy(36, 7); 113 | printf("■■"); 114 | 115 | color(13); 116 | gotoxy(45, 5); 117 | printf("■"); 118 | gotoxy(45, 6); 119 | printf("■"); 120 | ``` 121 | 122 | 趣味俄罗斯方块的详细内容: [完整代码](https://github.com/zhongrongzhao/The-C-language-project/blob/master/趣味俄罗斯方块.c). 123 | 124 | ### 大家一起合作吧 125 | 126 | 如果你发现我的仓库中有出错的地方或者想改进我的项目,请在issues那里联系我,谢谢 127 | ![image](https://github.com/zhongrongzhao/The-C-language-project/blob/master/%E8%B5%9E%E5%8A%A9.png) 128 | 129 | -------------------------------------------------------------------------------- /Windows图形界面程序基本框架.c: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | 4 | LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //回调函数 5 | 6 | 7 | int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) 8 | 9 | { 10 | 11 | static TCHAR szAppName[] = TEXT("MyWindows"); //定义一个静态的扩展字符名 12 | 13 | HWND hwnd; //定义一个句柄 14 | 15 | MSG msg; //定义一个消息结构 16 | 17 | WNDCLASS wndclass; //定义一个窗口类结构 18 | 19 | 20 | wndclass.style = CS_HREDRAW | CS_VREDRAW; //窗口风格 21 | 22 | wndclass.lpfnWndProc = WndProc; //回调函数 23 | 24 | wndclass.cbClsExtra = 0; //预留的额外空间 25 | 26 | wndclass.cbWndExtra = 0; //预留的额外空间 27 | 28 | wndclass.hInstance = hInstance; //该窗口的句柄 29 | 30 | wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //为所有基于该窗口类的窗口设定一个图标 31 | 32 | wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //为所有基于该窗口类的窗口设定一个鼠标指针 33 | 34 | wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //指定窗口背景色 35 | 36 | wndclass.lpszMenuName = NULL; //指定窗口菜单 37 | 38 | wndclass.lpszClassName = szAppName; //指定窗口类名,面向程序员 39 | 40 | 41 | if (!RegisterClass(&wndclass)) //注册且测试该窗口类 42 | 43 | { 44 | 45 | MessageBox(NULL, TEXT("这个程序需要在 Windows NT 才能执行!"), szAppName, MB_ICONERROR); 46 | 47 | return 0; 48 | 49 | } 50 | 51 | 52 | hwnd = CreateWindow( //创建窗口 53 | 54 | szAppName, //窗口类名,面向程序员 55 | 56 | TEXT("与窗口的第一次"), //窗口名,面向用户 57 | 58 | WS_OVERLAPPEDWINDOW, //窗口风格 59 | 60 | CW_USEDEFAULT, //指定窗口的初始水平位置 61 | 62 | CW_USEDEFAULT, //指定窗口的初始垂直位置 63 | 64 | CW_USEDEFAULT, //指明窗口的宽度 65 | 66 | CW_USEDEFAULT, //指明窗口的高度 67 | 68 | NULL, //指向被创建窗口的父窗口或所有者窗口的句柄 69 | 70 | NULL, //菜单句柄 71 | 72 | hInstance, //与窗口相关联的模块事例的句柄 73 | 74 | NULL); //暂忽略 75 | 76 | 77 | 78 | ShowWindow(hwnd, iCmdShow); //设置指定窗口的显示状态 79 | 80 | UpdateWindow(hwnd); //暂忽略 81 | 82 | 83 | while (GetMessage(&msg, NULL, 0, 0)) //从消息队列中获取消息并放在msg结构中 84 | 85 | { 86 | 87 | TranslateMessage(&msg); //将虚拟键消息转换为字符消息 88 | 89 | DispatchMessage(&msg); //调度一个消息给窗口程序 90 | 91 | } 92 | 93 | 94 | return msg.wParam; 95 | 96 | } 97 | 98 | 99 | LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 100 | 101 | { 102 | 103 | HDC hdc; 104 | 105 | PAINTSTRUCT ps; 106 | 107 | RECT rect; 108 | 109 | 110 | switch (message) 111 | 112 | { 113 | 114 | case WM_PAINT: 115 | 116 | hdc = BeginPaint(hwnd, &ps); 117 | 118 | GetClientRect(hwnd, &rect); 119 | 120 | DrawText(hdc, TEXT("这是我的第一个窗口程序!"), -1, &rect, 121 | 122 | DT_SINGLELINE | DT_CENTER | DT_VCENTER); 123 | 124 | EndPaint(hwnd, &ps); 125 | 126 | return 0; 127 | 128 | 129 | case WM_DESTROY: 130 | 131 | PostQuitMessage(0); 132 | 133 | return 0; 134 | 135 | } 136 | 137 | 138 | return DefWindowProc(hwnd, message, wParam, lParam); 139 | -------------------------------------------------------------------------------- /鱼蛋装系统后期工具.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #define WIDTH 120; 4 | #define WIDTH2 20; 5 | void fishball (void); 6 | void zhongrongzhao (void); 7 | int main (void) 8 | { 9 | int a; 10 | ComeBanck: 11 | printf("\n 钟荣钊工作室1.0\n\n 2017年2月14日\n 情人节那天的发泄\n\n"); 12 | zhongrongzhao(); 13 | fishball(); 14 | printf(" 1...........查看激活情况 \n 2...........设置开机启动项\n 3...........换logo\n 4...........查IP地址\n 5...........win7强行去密码\n 6...........停止系统自动重启\n"); 15 | printf(" 7...........设置系统时间\n 999.........秒掉C:盘(慎重!!!!!真的是KO!不得后悔,没自动备份)\n\n"); 16 | fishball(); 17 | printf("请输入编号:"); 18 | scanf("%d",&a); 19 | if (a==1)//1 20 | { 21 | system("slmgr.vbs -dlv "); 22 | system("slmgr.vbs -dli "); 23 | system("slmgr.vbs -xpr"); 24 | printf("检查完毕\n"); 25 | system("cls"); 26 | goto ComeBanck; 27 | } 28 | 29 | if (a==2)//2 30 | { 31 | system("start msconfig");//失败 32 | system("cls"); 33 | goto ComeBanck; 34 | } 35 | 36 | if(a==3)//3 37 | { 38 | system("md c:\\Setting"); 39 | system("copy I:\\Mysetting c:\\Setting"); 40 | system("copy E:\\Mysetting c:\\Setting"); 41 | system("copy F:\\Mysetting c:\\Setting"); 42 | system("copy G:\\Mysetting c:\\Setting"); 43 | system("copy H:\\Mysetting c:\\Setting"); 44 | system("copy J:\\Mysetting c:\\Setting"); 45 | system("copy K:\\Mysetting c:\\Setting"); 46 | system("copy L:\\Mysetting c:\\Setting"); 47 | system("regedit"); 48 | system("cls"); 49 | printf("\n\n打开这地址: HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\OEMInformation\n 并创建一个字符串值\n"); 50 | zhongrongzhao(); 51 | system("cls"); 52 | goto ComeBanck; 53 | system("cls"); 54 | } 55 | 56 | if(a==4)//4 57 | { 58 | system("ipconfig -all"); 59 | zhongrongzhao(); 60 | system("pause"); 61 | system("cls"); 62 | goto ComeBanck; 63 | } 64 | 65 | if(a==5)//5 66 | { 67 | system("net user AIbertWin7 """); 68 | zhongrongzhao(); 69 | system("pause"); 70 | system("cls"); 71 | goto ComeBanck; 72 | } 73 | 74 | if(a==6)//6 75 | { 76 | system("shutdown -a"); 77 | system("pause"); 78 | system("cls"); 79 | goto ComeBanck; 80 | } 81 | 82 | if(a==7) 83 | { 84 | system("DATE "); 85 | system("pause"); 86 | system("cls"); 87 | goto ComeBanck; 88 | } 89 | 90 | if(a==999) 91 | { 92 | system("format c://q//u");///q快速格式化/u选用参数,表示无条件格式化,即破坏原来磁盘上所有数据,不加/U,则为安全格式化,这时先建立一个镜象文件保存原来的FAT表和根目录,必要时可用UNFORRMAT恢复原来的数据。 93 | system("pause"); 94 | } 95 | return 0; 96 | } 97 | 98 | void fishball (void) 99 | { 100 | int count; 101 | for (count=1; count <= WIDTH count++) 102 | putchar ('*'); 103 | putchar('\n'); 104 | } 105 | 106 | void zhongrongzhao(void) 107 | { 108 | int count; 109 | for (count=1; count <= WIDTH2 count++) 110 | printf("钟荣钊"); 111 | } 112 | -------------------------------------------------------------------------------- /Girl Friend.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | int main(void) 5 | { 6 | int b; 7 | int c; 8 | char a[100]; 9 | char *hi = "hi";//1 10 | char *hi1 = "你好"; 11 | char *IloveYou ="我爱你";//2 12 | char *IloveYou1 ="我很爱你"; 13 | char *IloveYou2 ="你爱我吗"; 14 | char *IloveYou3 ="你有多爱我啊"; 15 | char *IloveYou4 ="你有多爱我"; 16 | char *IMissYou ="我想你啊";//3 17 | char *IMissYou1 ="我很想你啊";//4 18 | char *IMissYou2="我想你";//5 19 | char *Whatlike="你喜欢什么";//6 20 | char *Whatlike1="不想猜"; 21 | char *zhongzi="种子"; 22 | char *gushi="讲个故事给我听"; 23 | char *guanji="关机"; 24 | char *guanji1="请关机"; 25 | char *guanji2="帮我关机"; 26 | char *chongqi="重启"; 27 | char *chongqi1="请重启"; 28 | char *chongqi2="帮我重启"; 29 | char *makelove="做爱";//做爱 30 | char *makelove1="我们做爱"; 31 | char *makelove2="我们做爱好吗"; 32 | char *makelove3="我们做爱做的事情"; 33 | char *game="游戏"; 34 | char *game1="剪刀"; 35 | char *game2="石头"; 36 | char *game3="布"; 37 | char *name="你叫什么名字"; 38 | char *age="你几岁了"; 39 | char *age1="你几岁"; 40 | char *age2="你今年几岁啊"; 41 | char *age3="你今年几岁呀"; 42 | char *tall="你多高"; 43 | char *tall1="你今年多高"; 44 | char *tall2="你今年多高啊"; 45 | char *tall3="你多高啊"; 46 | 47 | a: 48 | printf("我说:"); 49 | scanf("%s",&a); 50 | 51 | if (strcmp(a, IloveYou3) == 0 || strcmp(a, IloveYou4) == 0 )//1 52 | { 53 | printf("女友:怎么突然问这个问题啊?你知道答案的(*^__^*)\n"); 54 | } 55 | 56 | if (strcmp(a, tall ) == 0 || strcmp(a, tall1 ) == 0 || strcmp(a, tall2 ) == 0 || strcmp(a, tall3 ) == 0 )//1 57 | { 58 | printf("女友:我刚好比你矮10厘米,我们是不是很配啊,萌萌哒^^\n"); 59 | } 60 | 61 | if (strcmp(a, age) == 0 || strcmp(a, age1) == 0 || strcmp(a, age2) == 0 || strcmp(a, age3) == 0 )//1 62 | { 63 | printf("女友:比你小一岁\n"); 64 | } 65 | 66 | if (strcmp(a, name) == 0 )//1 67 | { 68 | printf("女友:我叫Maymay,很高兴认识你\n"); 69 | } 70 | 71 | if (strcmp(a, hi) == 0 || strcmp(a, hi1) == 0)//1 72 | { 73 | printf("女友:hi\n"); 74 | } 75 | 76 | if (strcmp(a, IloveYou) == 0)//2 77 | { 78 | printf("女友:亲^v^!我也爱你\n"); 79 | } 80 | 81 | if (strcmp(a, IloveYou1) == 0) 82 | { 83 | printf("女友:亲^v^!我也很爱你\n"); 84 | } 85 | 86 | if (strcmp(a, IloveYou2) == 0) 87 | { 88 | printf("女友:我当然爱你啦!傻瓜\n"); 89 | } 90 | 91 | if (strcmp(a,IMissYou) == 0)//3 92 | { 93 | printf("女友:我也好想你啊!\n"); 94 | } 95 | 96 | if (strcmp(a,IMissYou1) == 0)//4 97 | { 98 | printf("女友:我也好想你啊!\n"); 99 | } 100 | 101 | if (strcmp(a,IMissYou2) == 0)//5 102 | { 103 | printf("女友:我也好想你啊!\n"); 104 | } 105 | 106 | if (strcmp(a,Whatlike) == 0)//6 107 | { 108 | printf("女友:你猜猜>.<\n"); 109 | } 110 | 111 | if (strcmp(a,Whatlike1) == 0)//6 112 | { 113 | printf("女友:那好吧!我喜欢你\n"); 114 | } 115 | 116 | if (strcmp(a,zhongzi) == 0)//6 117 | { 118 | printf("女友:你好坏啊,不理你了。。。自己百度找吧\n"); 119 | system("start https://www.baidu.com/"); 120 | } 121 | 122 | if (strcmp(a,gushi) == 0)//6 123 | { 124 | printf("女友:从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事.,讲的什么呢?从前有座山,山里有座庙,庙里有个老和尚给小和尚讲故事……\n"); 125 | } 126 | 127 | if (strcmp(a,guanji) == 0) 128 | { 129 | printf("女友:886~_~立刻关机\n"); 130 | system("shutdown -s -t 00"); 131 | } 132 | 133 | if (strcmp(a,guanji1) == 0) 134 | { 135 | printf("女友:886~_~立刻关机\n"); 136 | system("shutdown -s -t 00"); 137 | } 138 | 139 | if (strcmp(a,guanji2) == 0) 140 | { 141 | printf("女友:886~_~立刻关机\n"); 142 | system("shutdown -s -t 00"); 143 | } 144 | 145 | if (strcmp(a,chongqi) == 0) 146 | { 147 | printf("女友:等会再见立刻重启\n"); 148 | system("shutdown -r -t 00"); 149 | } 150 | 151 | if (strcmp(a,chongqi1) == 0) 152 | { 153 | printf("女友:等会再见立刻重启\n"); 154 | system("shutdown -r -t 00"); 155 | } 156 | 157 | if (strcmp(a,chongqi2) == 0) 158 | { 159 | printf("女友:等会再见立刻重启\n"); 160 | system("shutdown -r -t 00"); 161 | } 162 | 163 | if (strcmp(a,makelove) == 0) 164 | { 165 | printf("女友:你好坏啊\n"); 166 | } 167 | 168 | if (strcmp(a,makelove1) == 0) 169 | { 170 | printf("女友:你好坏啊\n"); 171 | } 172 | 173 | if (strcmp(a,makelove2) == 0) 174 | { 175 | printf("女友:你好坏啊\n"); 176 | } 177 | 178 | if (strcmp(a,makelove3) == 0) 179 | { 180 | printf("女友:你好坏啊\n"); 181 | } 182 | 183 | if (strcmp(a,game) == 0) 184 | { 185 | printf("女友:我们来个剪刀石头布吧^^\n输了怎样罚?\n"); 186 | printf("1.关机 2.重启 \n3.亲我一下 4.我们做羞羞的事情\n你选择的是:"); 187 | scanf("%d",&b); 188 | if(b==1) 189 | { 190 | printf("\n女友:游戏规则:输入(剪刀,石头,布)其中一个,然后按确定\n我说:"); 191 | scanf("%s",&a); 192 | if(strcmp(a,game1) != 0) 193 | { 194 | if(strcmp(a,game2) == 0) 195 | { 196 | printf("女友:剪刀\n你赢了\n"); 197 | } 198 | 199 | else 200 | { 201 | printf("女友:剪刀\n你输了\n接受惩罚吧!!!"); 202 | system("shutdown -s -t 00"); 203 | } 204 | } 205 | if(strcmp(a,game1) == 0) 206 | { 207 | printf("女友:剪刀\n女友:我们平了\n女友:这次放过你!下次你没那好彩了,不玩了\n"); 208 | } 209 | } 210 | if(b==2) 211 | { 212 | printf("\n女友:游戏规则:输入(剪刀,石头,布)其中一个,然后按确定\n我说:"); 213 | scanf("%s",&a); 214 | if(strcmp(a,game3) != 0) 215 | { 216 | if(strcmp(a,game1) == 0) 217 | { 218 | printf("女友:布\n你赢了\n"); 219 | } 220 | 221 | else 222 | { 223 | printf("女友:布\n你输了\n"); 224 | system("shutdown -r -t 00"); 225 | } 226 | } 227 | if(strcmp(a,game3) == 0) 228 | { 229 | printf("女友:布\n女友:我们平了\n这次放过你!下次你没那么好彩了,不玩了\n"); 230 | } 231 | } 232 | if(b==3) 233 | { 234 | printf("\n女友:游戏规则:输入(剪刀,石头,布)其中一个,然后按确定\n我说:"); 235 | scanf("%s",&a); 236 | if(strcmp(a,game2) != 0) 237 | { 238 | if(strcmp(a,game3) == 0) 239 | { 240 | printf("女友:石头\n女友:你赢了\n"); 241 | } 242 | 243 | else 244 | { 245 | printf("女友:石头\n女友:你输了\n\n亲我一下>.<\n选择:\n1.亲我一下 2.才不亲你呢\n我说:"); 246 | scanf("%d",&c); 247 | if(c==1) 248 | { 249 | printf("女友:死鬼^^算你吧\n"); 250 | } 251 | if(c==2) 252 | { 253 | printf("女友:臭不要脸,愿赌不服输\n"); 254 | } 255 | } 256 | } 257 | if(strcmp(a,game2) == 0) 258 | { 259 | printf("女友:石头\n女友:我们平了\n这次放过你!下次没那么好彩了"); 260 | } 261 | } 262 | if(b==4) 263 | { 264 | printf("女友:你这个老司机\n"); 265 | } 266 | } 267 | 268 | 269 | goto a; 270 | system("pause"); 271 | return 0; 272 | } 273 | -------------------------------------------------------------------------------- /趣味俄罗斯方块.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include //接收键盘输入输出 4 | #include //用于获得随机数 5 | 6 | //宏定义 7 | #define FrameX 13 8 | #define FrameY 3//定义游戏窗口的X和Y轴坐标 9 | #define Frame_height 20 10 | #define Frame_width 18//定义游戏窗口的长和宽 11 | 12 | //定义全局变量 13 | int i, j, Temp, Temp1, Temp2;//Temp, Temp1, Temp2是用于记住和转换方块变量的值 14 | int a[80][80] = {0}; 15 | int b[4];//标记4个“口 ”方块:1表示有方块 ,0表示无方块 16 | 17 | //结构体 18 | struct Tetris//声明俄罗斯方块的结构体 19 | { 20 | int x; 21 | int y; //中心方块的x和y轴坐标 22 | int flag; //标记方块类型的序号 23 | int next; //下一个俄罗斯方块的类型的序号 24 | int speed; //俄罗斯方块移动的速度 25 | int number; //产生俄罗斯方块的个数 26 | int score; //游戏的分数 27 | int level; //游戏的等级 28 | } ; 29 | HANDLE hOut; //控制台句柄 30 | 31 | //函数声明 32 | int color(int c); 33 | void gotoxy(int x,int y); //光标移动到指定位置 34 | void DrwaGameframe(); //绘制游戏边框 35 | void Flag(struct Tetris *); //随机产生方块类型的序号 36 | void MakeTeris(struct Tetris *); //制作俄罗斯方块 37 | void PrintTeteris(struct Tetris *); //打印俄罗斯方块 38 | void CleanTeteris(struct Tetris *); //清除俄罗斯方块的痕迹 39 | int ifMove(struct Tetris *); //判断是否能移动,返回值为1时能移动,否则不能移动 40 | void Del_Fullline(struct Tetris *); //判断是否满行,并删除满行的俄罗斯方块 41 | void Gameplay(); //开始游戏 42 | void regulation(); //游戏规则 43 | void explation(); //按键说明 44 | void welcome(); //欢迎界面 45 | void Replay(struct Tetris * tetris); //重新开始游戏 46 | void title(); //欢迎界面上方的标题 47 | void flower(); //欢迎界面上的字符装饰花 48 | void close(); //关闭游戏 49 | 50 | /* 51 | *设置文字颜色 52 | */ 53 | int color(int c) 54 | { 55 | SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); 56 | //SetConsoleTextAttribute是设置控制台窗口字体颜色和背景颜色的函数 57 | return 0; 58 | } 59 | 60 | /* 61 | *设置文字显示位置 62 | */ 63 | void gotoxy(int x,int y) 64 | { 65 | COORD pos;//是一个结构体变量,x和y是它的成员 ,是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标 66 | pos.X = x;//横坐标 67 | pos.Y = y;//纵坐标 68 | SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); 69 | //SetConsoleCursorPosition函数用来定位光标位置 70 | } 71 | 72 | /* 73 | *欢迎界面上的标题 74 | */ 75 | void title() 76 | { 77 | color(15); 78 | gotoxy(24, 3); 79 | printf("趣 味 俄 罗 斯 方 块\n"); 80 | 81 | color(11); 82 | gotoxy(18, 5); 83 | printf("■"); 84 | gotoxy(18, 6); 85 | printf("■■"); 86 | gotoxy(18, 7); 87 | printf("■"); 88 | 89 | color(14); 90 | gotoxy(26, 6); 91 | printf("■■"); 92 | gotoxy(28, 7); 93 | printf("■■"); 94 | 95 | color(10); 96 | gotoxy(36, 6); 97 | printf("■■"); 98 | gotoxy(36, 7); 99 | printf("■■"); 100 | 101 | color(13); 102 | gotoxy(45, 5); 103 | printf("■"); 104 | gotoxy(45, 6); 105 | printf("■"); 106 | gotoxy(45, 7); 107 | printf("■"); 108 | gotoxy(45, 8); 109 | printf("■"); 110 | 111 | color(12); 112 | gotoxy(56, 6); 113 | printf("■"); 114 | gotoxy(52, 7); 115 | printf("■■■"); 116 | } 117 | 118 | /* 119 | *绘制字符花 120 | */ 121 | void flower() 122 | { 123 | gotoxy(66, 11); 124 | color(12); 125 | printf("(_)"); 126 | 127 | gotoxy(64, 12); 128 | printf("(_)"); 129 | 130 | gotoxy(68, 12); 131 | printf("(_)"); 132 | 133 | gotoxy(66, 13); 134 | printf("(_)"); 135 | 136 | gotoxy(67, 12); 137 | color(6); 138 | printf("@"); 139 | 140 | gotoxy(72, 10); 141 | color(13); 142 | printf("(_)"); 143 | 144 | gotoxy(76, 10); 145 | printf("(_)"); 146 | 147 | gotoxy(74, 9); 148 | printf("(_)"); 149 | 150 | gotoxy(74, 11); 151 | printf("(_)"); 152 | 153 | gotoxy(75, 10); 154 | color(6); 155 | printf("@"); 156 | 157 | gotoxy(71, 12); 158 | printf("|"); 159 | 160 | gotoxy(72, 11); 161 | printf("/"); 162 | 163 | gotoxy(70, 13); 164 | printf("\\|"); 165 | 166 | gotoxy(70, 14); 167 | printf("'|/"); 168 | 169 | gotoxy(70, 15); 170 | printf("\\|"); 171 | 172 | gotoxy(71, 16); 173 | printf("| /"); 174 | 175 | gotoxy(71, 17); 176 | printf("|"); 177 | 178 | gotoxy(67, 17); 179 | color(10); 180 | printf("\\\\\\\\"); 181 | 182 | gotoxy(73, 17); 183 | printf("//"); 184 | 185 | gotoxy(67, 18); 186 | color(2); 187 | printf("^^^^^^^^"); 188 | 189 | gotoxy(65, 19); 190 | color(5); 191 | printf("鱼 蛋 科 技"); 192 | 193 | gotoxy(68, 20); 194 | printf("钟荣钊"); 195 | 196 | printf("\n"); 197 | } 198 | 199 | /* 200 | *菜单项边框 201 | */ 202 | void welcome() 203 | { 204 | int n; 205 | int i, j = 1; 206 | 207 | color(14); 208 | 209 | for (i = 9; i <= 20; i++) 210 | { 211 | for(j = 15; j <= 60; j++) 212 | { 213 | gotoxy(j, i); 214 | 215 | if (i == 9 || i == 20) printf("="); 216 | 217 | else if (j == 15 || j == 59) printf("||"); 218 | 219 | } 220 | } 221 | 222 | /* 223 | *菜单选项的文字 224 | */ 225 | color(12); 226 | 227 | gotoxy(25, 12); 228 | printf("1.开始游戏"); 229 | 230 | gotoxy(40, 12); 231 | printf("2.案件说明"); 232 | 233 | gotoxy(25, 17); 234 | printf("3.游戏规则"); 235 | 236 | gotoxy(40, 17); 237 | printf("4.退出"); 238 | 239 | gotoxy(21, 22); 240 | color(3); 241 | printf("请选择【1 2 3 4】:【 】\b\b"); 242 | color(14); 243 | scanf("%d", &n); 244 | 245 | switch (n) 246 | { 247 | case 1: 248 | system("cls"); 249 | DrwaGameframe(); 250 | Gameplay(); 251 | break; 252 | 253 | case 2: 254 | explation(); 255 | break; 256 | 257 | case 3: 258 | regulation(); 259 | break; 260 | 261 | case 4: 262 | close(); 263 | break; 264 | } 265 | } 266 | 267 | /** 268 | * 制作游戏窗口 269 | */ 270 | void DrwaGameframe() 271 | { 272 | gotoxy(FrameX+Frame_width-5,FrameY-2); //设置游戏名称的显示位置 273 | color(11); //将字体颜色设置为亮蓝色 274 | printf("趣味俄罗斯方块"); //打印游戏名称 275 | gotoxy(FrameX+2*Frame_width+3,FrameY+7); //设置上边框的显示位置 276 | color(2); //将字体颜色设置为深绿色 277 | printf("**********"); //打印下一个出现方块的上边框 278 | gotoxy(FrameX+2*Frame_width+13,FrameY+7); 279 | color(3); //将字体颜色设置为深蓝绿色 280 | printf("下一出现方块:"); 281 | gotoxy(FrameX+2*Frame_width+3,FrameY+13); 282 | color(2); 283 | printf("**********"); //打印下一个出现方块的下边框 284 | gotoxy(FrameX+2*Frame_width+3,FrameY+17); 285 | color(14); //将字体颜色设置为黄色 286 | printf("↑键:旋转"); 287 | gotoxy(FrameX+2*Frame_width+3,FrameY+19); 288 | printf("空格:暂停游戏"); 289 | gotoxy(FrameX+2*Frame_width+3,FrameY+15); 290 | printf("Esc :退出游戏"); 291 | gotoxy(FrameX,FrameY); 292 | color(12); 293 | printf("╔"); //打印框角 294 | gotoxy(FrameX+2*Frame_width-2,FrameY); 295 | printf("╗"); 296 | gotoxy(FrameX,FrameY+Frame_height); 297 | printf("╚"); 298 | gotoxy(FrameX+2*Frame_width-2,FrameY+Frame_height); 299 | printf("╝"); 300 | a[FrameX][FrameY+Frame_height]=2; //记住该处已有图案 301 | a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2; 302 | for(i=2;i<2*Frame_width-2;i+=2) 303 | { 304 | gotoxy(FrameX+i,FrameY); 305 | printf("═"); //打印上横框 306 | } 307 | for(i=2;i<2*Frame_width-2;i+=2) 308 | { 309 | gotoxy(FrameX+i,FrameY+Frame_height); 310 | printf("═"); //打印下横框 311 | a[FrameX+i][FrameY+Frame_height]=2; //标记下横框为游戏边框,防止方块出界 312 | } 313 | for(i=1;ix][tetris->y]=b[0]; //中心方块位置的图形状态 333 | switch(tetris->flag) //共7大类,19种类型 334 | { 335 | case 1: /*田字方块 ■■ 336 | ■■ */ 337 | { 338 | color(10); 339 | a[tetris->x][tetris->y-1]=b[1]; 340 | a[tetris->x+2][tetris->y-1]=b[2]; 341 | a[tetris->x+2][tetris->y]=b[3]; 342 | break; 343 | } 344 | case 2: /*直线方块 ■■■■*/ 345 | { 346 | color(13); 347 | a[tetris->x-2][tetris->y]=b[1]; 348 | a[tetris->x+2][tetris->y]=b[2]; 349 | a[tetris->x+4][tetris->y]=b[3]; 350 | break; 351 | } 352 | case 3: /*直线方块 ■ 353 | ■ 354 | ■ 355 | ■ */ 356 | { 357 | color(13); 358 | a[tetris->x][tetris->y-1]=b[1]; 359 | a[tetris->x][tetris->y-2]=b[2]; 360 | a[tetris->x][tetris->y+1]=b[3]; 361 | break; 362 | } 363 | case 4: /*T字方块 ■■■ 364 | ■ */ 365 | { 366 | color(11); 367 | a[tetris->x-2][tetris->y]=b[1]; 368 | a[tetris->x+2][tetris->y]=b[2]; 369 | a[tetris->x][tetris->y+1]=b[3]; 370 | break; 371 | } 372 | case 5: /* 顺时针90°T字方块 ■ 373 | ■■ 374 | ■*/ 375 | { 376 | color(11); 377 | a[tetris->x][tetris->y-1]=b[1]; 378 | a[tetris->x][tetris->y+1]=b[2]; 379 | a[tetris->x-2][tetris->y]=b[3]; 380 | break; 381 | } 382 | case 6: /* 顺时针180°T字方块 ■ 383 | ■■■*/ 384 | { 385 | color(11); 386 | a[tetris->x][tetris->y-1]=b[1]; 387 | a[tetris->x-2][tetris->y]=b[2]; 388 | a[tetris->x+2][tetris->y]=b[3]; 389 | break; 390 | } 391 | case 7: /* 顺时针270°T字方块 ■ 392 | ■■ 393 | ■ */ 394 | { 395 | color(11); 396 | a[tetris->x][tetris->y-1]=b[1]; 397 | a[tetris->x][tetris->y+1]=b[2]; 398 | a[tetris->x+2][tetris->y]=b[3]; 399 | break; 400 | } 401 | case 8: /* Z字方块 ■■ 402 | ■■*/ 403 | { 404 | color(14); 405 | a[tetris->x][tetris->y+1]=b[1]; 406 | a[tetris->x-2][tetris->y]=b[2]; 407 | a[tetris->x+2][tetris->y+1]=b[3]; 408 | break; 409 | } 410 | case 9: /* 顺时针Z字方块 ■ 411 | ■■ 412 | ■ */ 413 | { 414 | color(14); 415 | a[tetris->x][tetris->y-1]=b[1]; 416 | a[tetris->x-2][tetris->y]=b[2]; 417 | a[tetris->x-2][tetris->y+1]=b[3]; 418 | break; 419 | } 420 | case 10: /* 反转Z字方块 ■■ 421 | ■■ */ 422 | { 423 | color(14); 424 | a[tetris->x][tetris->y-1]=b[1]; 425 | a[tetris->x-2][tetris->y-1]=b[2]; 426 | a[tetris->x+2][tetris->y]=b[3]; 427 | break; 428 | } 429 | case 11: /* 顺时针Z字方块 ■ 430 | ■■ 431 | ■ */ 432 | { 433 | color(14); 434 | a[tetris->x][tetris->y+1]=b[1]; 435 | a[tetris->x-2][tetris->y-1]=b[2]; 436 | a[tetris->x-2][tetris->y]=b[3]; 437 | break; 438 | } 439 | case 12: /* 7字方块 ■■ 440 | ■ 441 | ■ */ 442 | { 443 | color(12); 444 | a[tetris->x][tetris->y-1]=b[1]; 445 | a[tetris->x][tetris->y+1]=b[2]; 446 | a[tetris->x-2][tetris->y-1]=b[3]; 447 | break; 448 | } 449 | case 13: /* 顺时针90°7字方块 ■ 450 | ■■■ */ 451 | { 452 | color(12); 453 | a[tetris->x-2][tetris->y]=b[1]; 454 | a[tetris->x+2][tetris->y-1]=b[2]; 455 | a[tetris->x+2][tetris->y]=b[3]; 456 | break; 457 | } 458 | case 14: /* 顺时针180°7字方块 ■ 459 | ■ 460 | ■■ */ 461 | { 462 | color(12); 463 | a[tetris->x][tetris->y-1]=b[1]; 464 | a[tetris->x][tetris->y+1]=b[2]; 465 | a[tetris->x+2][tetris->y+1]=b[3]; 466 | break; 467 | } 468 | case 15: /* 顺时针270°7字方块 ■■■ 469 | ■ */ 470 | { 471 | color(12); 472 | a[tetris->x-2][tetris->y]=b[1]; 473 | a[tetris->x-2][tetris->y+1]=b[2]; 474 | a[tetris->x+2][tetris->y]=b[3]; 475 | break; 476 | } 477 | case 16: /* 反转7字方块 ■■ 478 | ■ 479 | ■ */ 480 | { 481 | color(12); 482 | a[tetris->x][tetris->y+1]=b[1]; 483 | a[tetris->x][tetris->y-1]=b[2]; 484 | a[tetris->x+2][tetris->y-1]=b[3]; 485 | break; 486 | } 487 | case 17: /* 顺时针转90°7字方块 ■■■ 488 | ■*/ 489 | { 490 | color(12); 491 | a[tetris->x-2][tetris->y]=b[1]; 492 | a[tetris->x+2][tetris->y+1]=b[2]; 493 | a[tetris->x+2][tetris->y]=b[3]; 494 | break; 495 | } 496 | case 18: /* 顺时针转180°7字方块 ■ 497 | ■ 498 | ■■ */ 499 | { 500 | color(12); 501 | a[tetris->x][tetris->y-1]=b[1]; 502 | a[tetris->x][tetris->y+1]=b[2]; 503 | a[tetris->x-2][tetris->y+1]=b[3]; 504 | break; 505 | } 506 | case 19: /* 顺指针转270°7字方块 ■ 507 | ■■■*/ 508 | { 509 | color(12); 510 | a[tetris->x-2][tetris->y]=b[1]; 511 | a[tetris->x-2][tetris->y-1]=b[2]; 512 | a[tetris->x+2][tetris->y]=b[3]; 513 | break; 514 | } 515 | } 516 | } 517 | 518 | /** 519 | * 打印俄罗斯方块 520 | */ 521 | void PrintTetris(struct Tetris *tetris) 522 | { 523 | for(i=0;i<4;i++) //数组b[4]中有4个元素,循环这4个元素,让每个元素的值都为1 524 | { 525 | b[i]=1; //数组b[4]的每个元素的值都为1 526 | } 527 | MakeTetris(tetris); //制作游戏窗口 528 | for( i=tetris->x-2; i<=tetris->x+4; i+=2 ) 529 | { 530 | for(j=tetris->y-2;j<=tetris->y+1;j++) //循环方块所有可能出现的位置 531 | { 532 | if( a[i][j]==1 && j>FrameY ) //如果这个位置上有方块 533 | { 534 | gotoxy(i,j); 535 | printf("■"); //打印边框内的方块 536 | } 537 | } 538 | } 539 | //打印菜单信息 540 | gotoxy(FrameX+2*Frame_width+3,FrameY+1); //设置打印位置 541 | color(4); 542 | printf("level : "); 543 | color(12); 544 | printf(" %d",tetris->level); //输出等级 545 | gotoxy(FrameX+2*Frame_width+3,FrameY+3); 546 | color(4); 547 | printf("score : "); 548 | color(12); 549 | printf(" %d",tetris->score); //输出分数 550 | gotoxy(FrameX+2*Frame_width+3,FrameY+5); 551 | color(4); 552 | printf("speed : "); 553 | color(12); 554 | printf(" %dms",tetris->speed); //输出速度 555 | } 556 | 557 | /** 558 | * 判断是否可移动 559 | */ 560 | int ifMove(struct Tetris *tetris) 561 | { 562 | if(a[tetris->x][tetris->y]!=0)//当中心方块位置上有图案时,返回值为0,即不可移动 563 | { 564 | return 0; 565 | } 566 | else 567 | { 568 | if( 569 | ( tetris->flag==1 && ( a[tetris->x][tetris->y-1]==0 &&/*当为田字方块且除中心方块位 570 | 置外,其他"■"字方块位置上无图案时,说明这个位置能够放下田字方块,可以移动到这个位置,返回值为1,即 571 | 可移动*/ 572 | a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 573 | //或为直线方块且除中心方块位置外,其他"■"字方块位置上无图案时,返回值为1,即可移动 574 | ( tetris->flag==2 && ( a[tetris->x-2][tetris->y]==0 && 575 | a[tetris->x+2][tetris->y]==0 && a[tetris->x+4][tetris->y]==0 ) ) || 576 | ( tetris->flag==3 && ( a[tetris->x][tetris->y-1]==0 && //直线方块(竖) 577 | a[tetris->x][tetris->y-2]==0 && a[tetris->x][tetris->y+1]==0 ) ) || 578 | ( tetris->flag==4 && ( a[tetris->x-2][tetris->y]==0 && //T字方块 579 | a[tetris->x+2][tetris->y]==0 && a[tetris->x][tetris->y+1]==0 ) ) || 580 | ( tetris->flag==5 && ( a[tetris->x][tetris->y-1]==0 && //T字方块(顺时针90°) 581 | a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y]==0 ) ) || 582 | ( tetris->flag==6 && ( a[tetris->x][tetris->y-1]==0 && //T字方块(顺时针180°) 583 | a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 584 | ( tetris->flag==7 && ( a[tetris->x][tetris->y-1]==0 && //T字方块(顺时针270°) 585 | a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 586 | ( tetris->flag==8 && ( a[tetris->x][tetris->y+1]==0 && //Z字方块 587 | a[tetris->x-2][tetris->y]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) || 588 | ( tetris->flag==9 && ( a[tetris->x][tetris->y-1]==0 && //Z字方块(顺时针180°) 589 | a[tetris->x-2][tetris->y]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) || 590 | ( tetris->flag==10 && ( a[tetris->x][tetris->y-1]==0 && //Z字方块(反转) 591 | a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 592 | ( tetris->flag==11 && ( a[tetris->x][tetris->y+1]==0 &&//Z字方块(反转+顺时针180°) 593 | a[tetris->x-2][tetris->y-1]==0 && a[tetris->x-2][tetris->y]==0 ) ) || 594 | ( tetris->flag==12 && ( a[tetris->x][tetris->y-1]==0 && //7字方块 595 | a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y-1]==0 ) ) || 596 | ( tetris->flag==15 && ( a[tetris->x-2][tetris->y]==0 && //7字方块(顺时针90°) 597 | a[tetris->x-2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 598 | ( tetris->flag==14 && ( a[tetris->x][tetris->y-1]==0 && //7字方块(顺时针180°) 599 | a[tetris->x][tetris->y+1]==0 && a[tetris->x+2][tetris->y+1]==0 ) ) || 600 | ( tetris->flag==13 && ( a[tetris->x-2][tetris->y]==0 && //7字方块(顺时针270°) 601 | a[tetris->x+2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 602 | ( tetris->flag==16 && ( a[tetris->x][tetris->y+1]==0 && //7字方块(反转) 603 | a[tetris->x][tetris->y-1]==0 && a[tetris->x+2][tetris->y-1]==0 ) ) || 604 | ( tetris->flag==19 && ( a[tetris->x-2][tetris->y]==0 &&//7字方块(反转+顺时针90°) 605 | a[tetris->x-2][tetris->y-1]==0 && a[tetris->x+2][tetris->y]==0 ) ) || 606 | ( tetris->flag==18 && ( a[tetris->x][tetris->y-1]==0 &&//7字方块(反转+顺时针180°) 607 | a[tetris->x][tetris->y+1]==0 && a[tetris->x-2][tetris->y+1]==0 ) ) || 608 | ( tetris->flag==17 && ( a[tetris->x-2][tetris->y]==0 &&//7字方块(反转+顺时针270°) 609 | a[tetris->x+2][tetris->y+1]==0 && a[tetris->x+2][tetris->y]==0 ) ) ) 610 | { 611 | return 1; 612 | } 613 | } 614 | return 0; 615 | } 616 | 617 | /** 618 | * 清除俄罗斯方块的痕迹 619 | */ 620 | void CleanTetris(struct Tetris *tetris) 621 | { 622 | for(i=0;i<4;i++) //数组b[4]中有4个元素,循环这4个元素,让每个元素的值都为0 623 | { 624 | b[i]=0; //数组b[4]的每个元素的值都为0 625 | } 626 | MakeTetris(tetris); //制作俄罗斯方块 627 | for( i = tetris->x - 2;i <= tetris->x + 4; i+=2 ) //■X■■ X为中心方块 628 | { 629 | for(j = tetris->y-2;j <= tetris->y + 1;j++) /* ■ 630 | ■ 631 | X 632 | ■ */ 633 | { 634 | if( a[i][j] == 0 && j > FrameY ) //如果这个位置上没有图案,并且处于游戏界面当中 635 | { 636 | gotoxy(i,j); 637 | printf(" "); //清除方块 638 | } 639 | } 640 | } 641 | } 642 | 643 | /** 644 | * 判断是否满行并删除满行的俄罗斯方块 645 | */ 646 | void Del_Fullline(struct Tetris *tetris) //当某行有Frame_width-2个方块时,则满行消除 647 | { 648 | int k,del_rows=0; //分别用于记录某行方块的个数和删除方块的行数的变量 649 | for(j=FrameY+Frame_height-1;j>=FrameY+1;j--) 650 | { 651 | k=0; 652 | for(i=FrameX+2;iFrameY;k--) 667 | { 668 | for(i=FrameX+2;iscore+=100*del_rows; //每删除一行,得100分 688 | if( del_rows>0 && ( tetris->score%1000==0 || tetris->score/1000>tetris->level-1 ) ) 689 | { //如果得1000分即累计删除10行,速度加快20ms并升一级 690 | tetris->speed-=20; 691 | tetris->level++; 692 | } 693 | } 694 | 695 | /** 696 | * 随机产生俄罗斯方块类型的序号 697 | */ 698 | void Flag(struct Tetris *tetris) 699 | { 700 | tetris->number++; //记住产生方块的个数 701 | srand(time(NULL)); //初始化随机数 702 | if(tetris->number==1) 703 | { 704 | tetris->flag = rand()%19+1; //记住第一个方块的序号 705 | } 706 | tetris->next = rand()%19+1; //记住下一个方块的序号 707 | } 708 | 709 | /** 710 | * 开始游戏 711 | */ 712 | void Gameplay() 713 | { 714 | int n; 715 | struct Tetris t,*tetris=&t; //定义结构体的指针并指向结构体变量 716 | char ch; //定义接收键盘输入的变量 717 | tetris->number=0; //初始化俄罗斯方块数为0个 718 | tetris->speed=300; //初始移动速度为300ms 719 | tetris->score=0; //初始游戏的分数为0分 720 | tetris->level=1; //初始游戏为第1关 721 | while(1) //循环产生方块,直至游戏结束 722 | { 723 | Flag(tetris); //得到产生俄罗斯方块类型的序号 724 | Temp=tetris->flag; //记住当前俄罗斯方块序号 725 | tetris->x=FrameX+2*Frame_width+6; //获得预览界面方块的x坐标 726 | tetris->y=FrameY+10; //获得预览界面方块的y坐标 727 | tetris->flag = tetris->next; //获得下一个俄罗斯方块的序号 728 | PrintTetris(tetris); //调用打印俄罗斯方块方法 729 | tetris->x=FrameX+Frame_width; //获得游戏窗口中心方块x坐标 730 | tetris->y=FrameY-1; //获得游戏窗口中心方块y坐标 731 | tetris->flag=Temp; 732 | //按键操作 733 | while(1) //控制方块方向,直至方块不再下移 734 | { 735 | label:PrintTetris(tetris); //打印俄罗斯方块 736 | Sleep(tetris->speed); //延缓时间 737 | CleanTetris(tetris); //清除痕迹 738 | Temp1=tetris->x; //记住中心方块横坐标的值 739 | Temp2=tetris->flag; //记住当前俄罗斯方块序号 740 | if(kbhit()) //判断是否有键盘输入,有则用ch↓接收 741 | { 742 | ch=getch(); 743 | if(ch==75) //按 ←键则向左动,中心横坐标减2 744 | { 745 | tetris->x-=2; 746 | } 747 | if(ch==77) //按 →键则向右动,中心横坐标加2 748 | { 749 | tetris->x+=2; 750 | } 751 | if(ch==80) //按 ↓键则加速下落 752 | { 753 | if(ifMove(tetris)!=0) 754 | { 755 | tetris->y+=2; 756 | } 757 | if(ifMove(tetris)==0) 758 | { 759 | tetris->y=FrameY+Frame_height-2; 760 | } 761 | } 762 | if(ch==72) //按 ↑键则变体,即当前方块顺时针转90度 763 | { 764 | if( tetris->flag>=2 && tetris->flag<=3 ) //如果是直线方块 765 | { 766 | tetris->flag++; 767 | tetris->flag%=2; 768 | tetris->flag+=2; 769 | } 770 | if( tetris->flag>=4 && tetris->flag<=7 ) //如果是T字方块 771 | { 772 | tetris->flag++; 773 | tetris->flag%=4; 774 | tetris->flag+=4; 775 | } 776 | if( tetris->flag>=8 && tetris->flag<=11 ) //如果是Z字方块 777 | { 778 | tetris->flag++; 779 | tetris->flag%=4; 780 | tetris->flag+=8; 781 | } 782 | if( tetris->flag>=12 && tetris->flag<=15 ) //如果是7字方块 783 | { 784 | tetris->flag++; 785 | tetris->flag%=4; 786 | tetris->flag+=12; 787 | } 788 | if( tetris->flag>=16 && tetris->flag<=19 ) //如果是反7字方块 789 | { 790 | tetris->flag++; 791 | tetris->flag%=4; 792 | tetris->flag+=16; 793 | } 794 | } 795 | if(ch == 32) //按空格键,暂停 796 | { 797 | PrintTetris(tetris); 798 | while(1) 799 | { 800 | if(kbhit()) //再按空格键,继续游戏 801 | { 802 | ch=getch(); 803 | if(ch == 32) 804 | { 805 | goto label; 806 | } 807 | } 808 | } 809 | } 810 | if(ch == 27) 811 | { 812 | system("cls"); 813 | memset(a,0,6400*sizeof(int)); //初始化a数组 814 | welcome(); 815 | } 816 | if(ifMove(tetris)==0) //如果不可动,上面操作无效 817 | { 818 | tetris->x=Temp1; 819 | tetris->flag=Temp2; 820 | } 821 | else //如果可动,执行操作 822 | { 823 | goto label; 824 | } 825 | } 826 | tetris->y++; //如果没有操作指令,方块向下移动 827 | if(ifMove(tetris)==0) //如果向下移动且不可动,方块放在此处 828 | { 829 | tetris->y--; 830 | PrintTetris(tetris); 831 | Del_Fullline(tetris); 832 | break; 833 | } 834 | } 835 | //游戏结束条件:方块触到框顶位置 836 | for(i=tetris->y-2;iy+2;i++) 837 | { 838 | if(i==FrameY) 839 | { 840 | system("cls"); //清屏 841 | gotoxy(29,7); //设置显示位置 842 | printf(" \n"); 843 | color(12); //红色 844 | printf("\t\t\t■■■■ ■ ■ ■■ \n"); 845 | printf("\t\t\t■ ■■ ■ ■ ■ \n"); 846 | printf("\t\t\t■■■ ■ ■ ■ ■ ■ \n"); 847 | printf("\t\t\t■ ■ ■ ■ ■ ■ \n"); 848 | printf("\t\t\t■■■■ ■ ■ ■■ \n"); 849 | gotoxy(17,18); 850 | color(14); 851 | printf("我要重新玩一局-------1"); 852 | gotoxy(44,18); 853 | printf("不玩了,退出吧-------2\n"); 854 | int n; 855 | gotoxy(32,20); 856 | printf("选择【1/2】:"); 857 | color(11); 858 | scanf("%d", &n); //输入1或2 859 | switch (n) //分支语句 860 | { 861 | case 1: 862 | system("cls"); 863 | Replay(tetris); //重新开始游戏 864 | break; 865 | case 2: 866 | exit(0); 867 | break; 868 | } 869 | } 870 | } 871 | tetris->flag = tetris->next; //清除下一个俄罗斯方块的图形(右边窗口) 872 | tetris->x=FrameX+2*Frame_width+6; 873 | tetris->y=FrameY+10; 874 | CleanTetris(tetris); 875 | } 876 | } 877 | 878 | /** 879 | * 重新开始游戏 880 | */ 881 | void Replay(struct Tetris *tetris) 882 | { 883 | system("cls"); //清屏 884 | memset(a,0,6400*sizeof(int)); //初始化a数组,否则不会正常显示方块,导致游戏直接结束 885 | DrwaGameframe(); //制作游戏窗口 886 | Gameplay(); //开始游戏 887 | } 888 | 889 | /** 890 | * 按键说明 891 | */ 892 | void explation() 893 | { 894 | int i,j = 1; 895 | system("cls"); //清屏 896 | color(13); //粉色 897 | gotoxy(32,3); //设置显示位置 898 | printf("按键说明"); 899 | color(2); 900 | for (i = 6; i <= 16; i++) //输出上下边框=== 901 | { 902 | for (j = 15; j <= 60; j++) //输出左右边框|| 903 | { 904 | gotoxy(j, i); 905 | if (i == 6 || i == 16) printf("="); 906 | else if (j == 15 || j == 59) printf("||"); 907 | } 908 | } 909 | color(3); 910 | gotoxy(18,7); 911 | printf("tip1: 玩家可以通过 ← →方向键来移动方块"); 912 | color(10); 913 | gotoxy(18,9); 914 | printf("tip2: 通过 ↑使方块旋转"); 915 | color(14); 916 | gotoxy(18,11); 917 | printf("tip3: 通过 ↓加速方块下落"); 918 | color(11); 919 | gotoxy(18,13); 920 | printf("tip4: 按空格键暂停游戏,再按空格键继续"); 921 | color(4); 922 | gotoxy(18,15); 923 | printf("tip5: 按ESC退出游戏"); 924 | getch(); //按任意键返回主界面 925 | system("cls"); //清屏 926 | main(); //返回主函数 927 | } 928 | 929 | /** 930 | * 游戏规则 931 | */ 932 | void regulation() 933 | { 934 | int i,j = 1; 935 | system("cls"); 936 | color(13); 937 | gotoxy(34,3); 938 | printf("游戏规则"); 939 | color(2); 940 | for (i = 6; i <= 18; i++) //输出上下边框=== 941 | { 942 | for (j = 12; j <= 70; j++) //输出左右边框|| 943 | { 944 | gotoxy(j, i); 945 | if (i == 6 || i == 18) printf("="); 946 | else if (j == 12 || j == 69) printf("||"); 947 | } 948 | } 949 | color(12); 950 | gotoxy(16,7); 951 | printf("tip1: 不同形状的小方块从屏幕上方落下,玩家通过调整"); 952 | gotoxy(22,9); 953 | printf("方块的位置和方向,使他们在屏幕底部拼出完整的"); 954 | gotoxy(22,11); 955 | printf("一行或几行"); 956 | color(14); 957 | gotoxy(16,13); 958 | printf("tip2: 每消除一行,积分增加100"); 959 | color(11); 960 | gotoxy(16,15); 961 | printf("tip3: 每累计1000分,会提升一个等级"); 962 | color(10); 963 | gotoxy(16,17); 964 | printf("tip4: 提升等级会使方块下落速度加快,游戏难度加大"); 965 | getch(); //按任意键返回主界面 966 | system("cls"); 967 | welcome(); 968 | } 969 | 970 | /** 971 | * 退出 972 | */ 973 | void close() 974 | { 975 | exit(0); 976 | } 977 | 978 | 979 | int main() 980 | { 981 | title(); 982 | flower(); 983 | welcome(); 984 | 985 | system("pause"); 986 | return 0; 987 | } 988 | --------------------------------------------------------------------------------