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 ...
随机推荐
- 设置html滚动条(陶庭飞问题)
var height = document.body.scrollHeight; parent.document.all("rightFrame").style.height = ...
- noj [1475] Bachelor (找1的个数)
http://ac.nbutoj.com/Problem/view.xhtml?id=1475 [1475] Bachelor 时间限制: 1000 ms 内存限制: 65535 K 问题描述 炎热的 ...
- 安卓接入ShareSDK问题
平台图标错乱原因 导出的jar包 包括了 style.class R$attr.class MainActivity.class R$color.class R$drawable.class R$s ...
- Log4j配置全说明
转载:http://zhangjunhd.blog.51cto.com/113473/21014/ 1.Log4j简介 Log4j是Apache的一个开源项目,它允许开发者以任意间隔输出日志信息.Lo ...
- Mysql的列索引和多列索引(联合索引)
转自:http://blog.chinaunix.net/uid-29305839-id-4257512.html 创建一个多列索引:CREATE TABLE test ( id ...
- Maven内置变量
1.Maven内置变量说明: ${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputDire ...
- eCos驱动分析 之 ISR是如何与硬件中断联系起来的?
http://keendawn.blog.163.com/blog/static/8888074320116205833478/
- ANDROID_MARS学习笔记_S01原始版_002_实现计算乘积及menu应用
一.代码 1.xml(1)activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk ...
- 关于checkbox的checked属性和change事件
jquery中的attr和prop有什么区别? To retrieve and change DOM properties such as the checked, selected, or disa ...
- Yii CDbCriteria
Yii的Active Recorder包装了很多. 特别是把SQL中 把where,order,limit,IN/not IN,like等常用短句都包含进CDbCriteria这个类中去,这样整个代码 ...