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 ...
随机推荐
- sencha touch mvc
controller: Ext.define('MyApp2.controller.MyController1', { extend: 'Ext.app.Controller', config: { ...
- npm常用命令解析
npm是什么 NPM的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安装的包. npm ...
- location.hash && location.href
hash:设置或获取 href 属性中在井号“#”后面的分段. href:设置或获取整个URL为字符串. 通过下面的测试你会发现区别,将代码放到你的HTML中,然后用浏览器打开,测试步骤: 点击“超链 ...
- 日志分析-Web
http://my.oschina.net/chenguang/blog/376267 http://my.oschina.net/chenguang/blog/371275 http://my.os ...
- [水题]Codeforces337A Puzzles
题目链接 题意:要在m个数里面选n个数, 要求这n个数的差值要最小 题意在hint里很清晰了 这道题从题意到题目本身都没有什么trick 写这道题完全是为了用一下#include <numeri ...
- easyui源码翻译1.32--Tree(树)
前言 使用$.fn.tree.defaults重写默认值对象.下载该插件翻译源码 树控件在web页面中一个将分层数据以树形结构进行显示.它提供用户展开.折叠.拖拽.编辑和异步加载等功能. 源码 /** ...
- NGUI所见即所得之UIAtlasMaker , UIAtlas (2)
本文的重点就是要将NGUI把多张图片打成一个图集(Atlas)的原理和过程研究下,学习下Unity提供的api和NGUI写的功能以及设计思想. (原文链接) 其它链接:NGUI所见即所得之UIRoot ...
- Cppcheck 用法(上篇)
http://blog.csdn.net/u011012932/article/details/52778149
- springmvc工作流程
Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...
- Oracle Developer Form中Block的重新查询
Form中某些按钮可能调用了Package对表中某些字段进行更新,但是数据库中字段的修改不会马上反映到form的界面上,所以要进行重新查询,但是用户可能使用了查询窗口进行查询之后然后再点击按钮动作,如 ...