程序小新编写2048求指错。
来源:互联网 发布:ubuntu 镜像源 编辑:程序博客网 时间:2024/05/19 02:25
话不多说,直接上代码
#include<stdio.h>#include<windows.h>#include<time.h>#include<conio.h>//涉及到_getch()函数#define N 4#define Test 0//值等于0时不显示int main(){ /************************************** *窗口大小改为合适大小(这里因为还没学指针所以有些不懂) * * * ***************************************/ HANDLE hOut; //标准输出输入句柄 COORD size = { 30, 18 }; //窗口大小 SMALL_RECT rc = { 0, 0, 30 - 1, 18 - 1 }; CONSOLE_CURSOR_INFO cursor = { 1, FALSE }; //光标信息,用于隐藏光标 hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleWindowInfo(hOut, TRUE, &rc); SetConsoleScreenBufferSize(hOut, size); SetConsoleCursorInfo(hOut, &cursor); /************************************** *使窗口大小不可改变(看不懂+1) * * * ***************************************/ HWND hWnd = GetConsoleWindow(); //获得cmd窗口句柄 RECT Rc; GetWindowRect(hWnd, &Rc); //获得cmd窗口对应矩形 //改变cmd窗口风格 SetWindowLongPtr(hWnd, GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX); //因为风格涉及到边框改变,必须调用SetWindowPos,否则无效果 SetWindowPos(hWnd, NULL, Rc.left, Rc.top, Rc.right - Rc.left, Rc.bottom - Rc.top, NULL); int n[N][N] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; int past[N][N] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0 }; int i, j, m, num; int x = 0; int p = 10; int c = 0; DWORD start; int a = 0, b = 1, score = 0; //printf("游戏控制: 得分:\n小键盘8、↑向上 %d\n小键盘4、←向左\n小键盘6、→向右\n小键盘2、↓向下\n", score); while (1) { /************************************** *判断是否进行了移动 * *移动b大于0,没有移动b等于0 * ***************************************/ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (n[i][j] != past[i][j])b++; } } /************************************** *取随机数使某个不等于0的值变为2或者4 * * * ***************************************/ int nn[N][N] = { 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; x = 0; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (n[i][j] == 0) { x++; nn[i][j] = x; } } } if (b != 0)//没移动则不生成随机数 { start = GetTickCount(); srand(start); if ((rand()/* + m*/) % 100 < p)num = 4; else num = 2; x = rand() % x; x++; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (nn[i][j] == x) { n[i][j] = num; i = j = N; } } } } b = 0;//确保下次使用时b为0 /************************************** *判断是否可以继续移动 * * * ***************************************/ a = 0; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (n[i][j] == 0)a++; if (i != 3) { if (n[i][j] == n[i + 1][j]) a++; } if (j != 3) { if (n[i][j] == n[i][j + 1]) a++; } } } /************************************** *显示游戏界面 * * * ***************************************/ printf("游戏控制: 得分:\n小键盘8、↑向上 %d\n小键盘4、←向左\n小键盘6、→向右\n小键盘2、↓向下\n", score); for (i = 0; i < N; i++) { for (j = 0; j < N;j++) { if (n[i][j] != Test) printf("%d\t", n[i][j]); else printf(".\t"); } printf("\n\n"); } if (a == 0) { printf("Good Game!"); system("pause"); return 0; }//a=0代表不能移动 /************************************** *捕捉上次运行结果 * * * ***************************************/ for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { past[i][j] = n[i][j]; } } /************************************** *检测玩家按键 * * * ***************************************/ char key; int direction; printf("请输入移动的方向:"); switch (key = _getch()) { case -32: switch (key = _getch()) { case 72://UP printf("向上移动\n"); direction = 8; break; case 80://DOWN printf("向下移动\n"); direction = 2; break; case 75://LEFT printf("向左移动\n"); direction = 4; break; case 77://RIGHT printf("向右移动\n"); direction = 6; break; default: printf("\n键入无效,请重新键入!"); } break; } /************************************** *执行按键对应的程序 * * * ***************************************/ if (direction == 8) { //补位 for (j = 0; j < N; j++) { for (i = N - 1; i > -1; i--) { if (n[i][j] == 0) { for (m = 0; m < N - i - 1; m++) { n[i + m][j] = n[i + m + 1][j]; } n[N - 1][j] = 0; } } } // for (j = 0; j < N; j++) { for (i = 0; i < N; i++) { if (n[i][j] == n[i + 1][j]) { n[i][j] += n[i + 1][j]; n[i + 1][j] = 0; score += n[i][j]; } } } // for (j = 0; j < N; j++) { for (i = N - 1; i > -1; i--) { if (n[i][j] == 0) { for (m = 0; m < N - i - 1; m++) { n[i + m][j] = n[i + m + 1][j]; } n[N - 1][j] = 0; } } } } if (direction == 2) { //补位 for (j = 0; j < N; j++) { for (i = 0; i < N; i++) { if (n[i][j] == 0) { for (m = 0;m < i;m++) { n[i - m][j] = n[i - m - 1][j]; } n[0][j] = 0; } } } //合并 for (j = 0; j < N; j++) { for (i = N - 1; i > 0; i--) { if (n[i][j] == n[i - 1][j]) { n[i][j] += n[i - 1][j]; n[i-1][j] = 0; score += n[i][j]; } } } //补位 for (j = 0; j < N; j++) { for (i = 0; i < N; i++) { if (n[i][j] == 0) { for (m = 0; m < i; m++) { n[i - m][j] = n[i - m - 1][j]; } n[0][j] = 0; } } } } if (direction == 4) { //补齐 for (i = 0; i < N; i++) { for (j = N - 1; j > -1; j--) { if (n[i][j] == 0) { for (m = 0; m < N - j - 1; m++) { n[i][j + m] = n[i][j + m + 1]; } n[i][N - 1] = 0; } } } //合并相邻的两个相同项 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (n[i][j] == n[i][j + 1]) { n[i][j] += n[i][j + 1]; n[i][j + 1] = 0; score += n[i][j]; } } } //再次补齐 for (i = 0; i < N; i++) { for (j = N - 1; j > -1; j--) { if (n[i][j] == 0) { for (m = 0; m < N - j - 1; m++) { n[i][j + m] = n[i][m + j + 1]; } n[i][N - 1] = 0; } } } } if (direction == 6) { // for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (n[i][j] == 0) { for (m = 0; m < j; m++) { n[i][j - m] = n[i][j - m - 1]; } n[i][0] = 0; } } } // for (i = 0; i < N; i++) { for (j = N - 1; j > 0; j--) { if (n[i][j] == n[i][j - 1]) { n[i][j] += n[i][j - 1]; n[i][j - 1] = 0; score += n[i][j]; } } } // for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (n[i][j] == 0) { for (m = 0; m < j; m++) { n[i][j - m] = n[i][j - m - 1]; } n[i][0] = 0; } } } } //system("pause"); } printf("游戏结束!"); system("pause"); return 0;}
这里就大概说说运算把,就是执行按键程序的那一块,思路就是把2048中的0位全部补齐,然后判断相邻的两个数有没有一样的,如果有,相加并且把后面的命成0,相当于把“2,2,2,2“向左靠变为“4,0,4,0”,然后再次把零去掉,达到运算的目的。
取随机数使某个不等于0的值变为2或者4的那一部分我先定义nn[][]全为0,然后让2048中0在nn中变号为1、2、3……(假设m个0)然后以毫秒为种子取随机数获得100以内的任意数,和m以内的数,然后判断m是不是大于p(省成2概率),大于p生成2,反之生成4,取得的另一个数反过来看在nn的哪个位置,并且使对应的n中的位置变为2或者4。
然后就是判断是不是能继续移动,假定有:
a b c
d e f
g h i
则只需要判断前两行的下一行对应的数是否相等(例如判断a的值是否等于d)和前两列的下一列对应的数是否相等(例如a和b)。
emmmmmmmmm大概就这样把,有疑问问题欢迎评论!
阅读全文
0 0
- 程序小新编写2048求指错。
- 求指错,请高手指点,感谢
- 写了个小程序,报错,求解决
- 求闰年小程序
- 求最大公约数小程序
- 求阶乘小程序
- 小沈阳写程序。。。
- 小程序写倒计时
- 用C#写的数值概率算法求定积分的小程序
- 写了一个判断水仙花数的小程序,本人新手,勿喷!求指点!
- 求写这样一个程序
- 小程序求梯形面积
- python求平均值小程序
- 我想写一个小程序
- perl写的小程序
- 今天写的小程序
- 自己写的小程序
- 写小程序的工具
- git指令学习速记
- 九九乘法表
- POJ 虫子的生活 解题报告 (种类并查集)
- PHPStrom编辑快捷键
- 萌新解--Java网络编程之UDP
- 程序小新编写2048求指错。
- 编码那些事
- userAgent
- java 行为模式 迭代器模式
- JAVA学习笔记19——MyBatis框架第二章
- 深入理解display属性
- 运维生涯(三)
- Dubbo常用标签
- 路由——route(2)