c语言 字符版 简易2048
花了两个多小时,用最蠢的方法写的……最简陋版……
还不确定这么写逻辑对不对……
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std; int map[5][5]; int score; int move(int& a, int& b, int& c, int& d) //move nonzero digit to front
{
int vis_num = 0; //the number of visited digit, most is 4
int zero_num = 0; //the number of zero digit
while (1) {
if (a != 0) {
if (++vis_num >= 4) return zero_num;
break;
}
++zero_num;
a = b;
b = c;
c = d;
d = 0;
if (++vis_num >= 4) return zero_num;
}
while (1) {
if (b != 0) {
if (++vis_num >= 4) return zero_num;
break;
}
++zero_num;
b = c;
c = d;
d = 0;
if (++vis_num >= 4) return zero_num;
}
while (1) {
if (c != 0) {
++vis_num;
if (vis_num >= 4) return zero_num;
break;
}
++zero_num;
c = d;
d = 0;
if (++vis_num >= 4) return zero_num;
}
if (d == 0)
++zero_num;
return zero_num;
} void change(int& a, int& b, int& c, int& d)
{
int zero_num = move(a, b, c, d);
if (zero_num == 4 || zero_num == 3) return ;
if (zero_num == 2) {
if (a == b) {
score += a * 10;
a <<= 1;
b = 0;
}
return ;
}
if (zero_num == 1) {
if (a == b) {
score += a * 10;
a <<= 1;
b = c;
c = 0;
} else if (c == b) {
score += c * 10;
b <<= 1;
c = 0;
}
return ;
}
if (a == b) {
if (c == d) {
score += c * 10;
score += a * 10;
a <<= 1;
b = c << 1;
c = d = 0;
} else {
score += a * 10;
a <<= 1;
b = c;
c = d;
d = 0;
}
} else if (b == c){
score += b * 10;
b <<= 1;
c = d;
d = 0;
} else if (c == d) {
score += c * 10;
c <<= 1;
d = 0;
}
} int rand_2_or_4()
{
if (rand() & 1) return 2;
return 4;
} void rand_pos()
{
int x, y;
do {
x = rand() % 4;
y = rand() % 4;
} while (map[x][y]);
map[x][y] = rand_2_or_4();
} void print()
{
int i, j;
for (i = 0; i < 4; ++i) {
for (j = 0; j < 4; ++j) {
if (map[i][j] == 0) printf(" □ ");
else printf("%4d ", map[i][j]);
}
printf("\n");
}
printf("score:%d\n", score);
} bool is_full()
{
int i, j;
for (i = 0; i < 4; ++i)
for (j = 0; j < 4; ++j)
if (map[i][j] == 0) return false;
return true;
} bool is_over_row(int a, int b, int c, int d)
{
if (a != b && b != c && c != d) return true;
return false;
} bool is_over()
{
if (!is_full()) return false;
int i;
for (i = 0; i < 4; ++i) {
if (!is_over_row(map[i][0], map[i][1], map[i][2], map[i][3]))
return false;
}
for (i = 0; i < 4; ++i) {
if (!is_over_row(map[0][i], map[1][i], map[2][i], map[3][i]))
return false;
}
return true;
} int main()
{
// int a,b,c,d;
// while(scanf("%d%d%d%d", &a, &b, &c, &d) != EOF){
// change(a,b,c,d);
// printf("%d %d %d %d\n", a, b, c, d);
// }
srand(unsigned(time(NULL)));
rand_pos();
rand_pos();
print();
while (!is_over()) {
char dir = getch();
int i;
if (dir == 'w') {
for (i = 0; i < 4; ++i) {
change(map[0][i], map[1][i], map[2][i], map[3][i]);
}
} else if (dir == 's') {
for (i = 0; i < 4; ++i)
change(map[3][i], map[2][i], map[1][i], map[0][i]);
} else if (dir == 'a') {
for (i = 0; i < 4; ++i)
change(map[i][0], map[i][1], map[i][2], map[i][3]);
} else if (dir == 'd') {
for (i = 0; i < 4; ++i)
change(map[i][3], map[i][2], map[i][1], map[i][0]);
} else continue;
if (!is_full()) rand_pos();
system("cls");
print();
}
printf("Lose!");
return 0;
}
后来发现我的写法有问题,因为如果不移动的话,就不会产生新的数字,而我的逻辑是只要有空位就有新的数字。之前没有认真观察过,懒得改了(其实是没想到什么好的方法……
c语言 字符版 简易2048的更多相关文章
- C#版简易RSS阅读器
C#版简易RSS阅读器.由VB版修改完成,感谢aowind的技术支持! 源代码: using System; using System.Drawing; using System.Collection ...
- C语言字符串匹配函数
C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...
- C语言字符知识狭区
C语言字符在用户接口软件编程上经常用到,但是有一些狭区会让编程出现一些小BUG,现在总结与此. 1.'\\' 代表的是字符\,而'\'是不能代表字符\的.通常\后面都要跟上数字或者其他字母来表示一个特 ...
- C语言 字符数组与字符指针比较
C语言 字符数组与字符指针比较 #include<stdio.h> /* 字符数组会在定以后预先分配内存空间字符串是常量所以会直接把字符串拷贝到数组中, 因为数组地址不同,所以不相等· 字 ...
- C语言-字符类型
C语言-字符类型 char不仅是一种整数,也是一种特殊的类型:字符(character). 常用单引号表示字符的字面量,如'a', '1'. 单引号''也是一个字符,printf和scanf里用的%c ...
- C语言字符数组超细讲解
看到标题,有不少朋友会想:字符数组不也是数组吗?为什么要单独拿出来讲哩?莫非它是朵奇葩? 哈哈,确实,一起来认识一下这朵数组界的奇葩吧! 一.字符数组的定义.引用.初始化 大家好!我是字符数组,看我的 ...
- UnifyRemoteManager-多国语言绿色版v1.3-20200315,统一远程连接自动登录软件,欢迎测试
UnifyRemoteManager-多国语言绿色版v1.3-20200315,统一远程连接自动登录软件,欢迎测试 下载参考: 百度网盘:https://pan.baidu.com/s/15g-oXT ...
- Vnc自动登录器-多国语言绿色版
推荐:介绍一个VNC连接工具:iis7服务器管理工具.IIs7服务器管理工具可以批量连接并管理VNC服务器.作为服务器集成管理器,它最优秀的功能就是批量管理windows与linux系统服务器.vps ...
- C语言实现简易2048小游戏
一直很喜欢玩这个小游戏,简单的游戏中包含运气与思考与策略,喜欢这种简约又不失内涵的游戏风格.于是萌生了用C语言实现一下的想法. 具体代码是模仿这个:https://www.cnblogs.com/ju ...
随机推荐
- 由12306出错想到的div垂直居中的问题
今天想看看元旦回家还有没有余票,偷偷的打开了12306,开始查询回家的车票,结果发现,竟然查询不出来,再查直接出错了 看到这个很郁闷,很纠结,但是突然想到了最近一直想实现div垂直居中,赶紧试了一下1 ...
- linux sed 批量替换多个文件中的字符
格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 -rl 路径` linux sed 批量替换多个文件中的字符串 sed -i "s/oldst ...
- struts2 查 找总结
0:38 2013/5/25 查 找 * * |-_-查找全部 Action层的home方法中的查找方法创建时不需要带个查找对象的参数 service层不用组织条件 dao层一条查询所有的hql语句S ...
- POJ3613 Cow Relays [矩阵乘法 floyd类似]
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7335 Accepted: 2878 Descri ...
- SHELL学习笔记----IF条件判断,判断条件
SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外. if list then do something here ...
- 分别取商和余数:divmod(a, b)
使用函数:divmod(a, b)可以实现分别取商和余数的操作: >>> divmod(123,3) (41, 0) >>> divmod(200,6) (33, ...
- ****Objective-C 中的方法的调用
oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或者方法调用. oc中方法的调用有两种: 第一种: [类名或对象名 方法名]; [ClassOrInstance method]; [C ...
- [JAVA]HDU 4919 Exclusive or
题意很简单, 就是给个n, 算下面这个式子的值. $\sum\limits_{i=1}^{n-1} i \otimes (n-i)$ 重点是n的范围:2≤n<10500 比赛的时候 OEIS一下 ...
- IBInspectable的使用
IBInspectable的使用 创建一个分类 定义属性 把此分类的头文件引入到pch里面 此时查看属性面板 就有了可以供我们勾选的选项 在.m中实现一下set和get方法
- 弱安全协议探测工具-sslciphercheck
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为 网络通信提供安全及数据完整性的一种安全协议.TLS ...