下午在刷题过程中,忽然想写2048了,以弥补以前写的那个千多行的,所以简单思考了一下准备采取的数据结构就开始了,本以为一个小时能搞定,结果后面改bug还是多花了些时间。因为在医院,所以声音不敢太大,如果看,建议耳机+声音最大,可以考虑倍速。个人感觉用C写这些东西的意义在于,你去掉了一些花里胡哨的东西,而真的用你的逻辑思考出了这个东西怎么写,并写出来了。乱花渐欲迷人眼,难的是坚守本心!明白学一个东西的意义,有时候比学习它更重要!嗯就这样。下面贴上代码和录制的视频链接。

//2019年3月16日 17:29:07
//2048
//1、地图数据结构 2、合并和移动? 3、判断胜负
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<string.h>
#define N 5//地图大小
#define M 13//table表的长度
#define WINFLAG 11 char map[N][N];//地图
int table[M];//查表使用 void Init();
void Run();
void Print();
int Win();
void Lose();
int IsLose();
int Up(int *isChange);
int Down(int *isChange);
int Left(int *isChange);
int Right(int *isChange);
void Generator(int dir); void gotoxy(int x, int y); //将光标调整到(x,y)的位置 //光标隐藏
void HideCursor() ; //隐藏光标显示 int main(void)
{
srand((unsigned)time(NULL));
HideCursor();
Init();
Run();
return ;
} void Generator(int dir)
{
//按下右,就按列扫,从左往右随机选一个数生成
//按下上,就按行扫,从下网上随机选一个数生成
// int begin;
// int end;
// int mul;//增量
// for(int i = begin;i != end;i += mul)
// for(int i = 0;i < N;++i)
// for(j = N-1;j >= 0;--j)
int flag = ;
int i1 = -,i2 = -;
if(dir == || dir == )
{
int begin,end,mul;
dir == ?begin = ,end = N,mul = :begin = N-,end = -,mul = -;
for(int i = ;i < N;++i)
for(int j = begin;j != end;j += mul)
{
//保证选一个数,然后其他的随机
if(map[i][j] == )//选到了一个数
{
if(flag == )//之前没选到过
{
i1 = i;
i2 = j;
flag = ;
}
else
{
if(rand()% < )
{
i1 = i;
i2 = j;
}
}
}
}
}
else if(dir == || dir == )
{
int begin,end,mul;
dir == ?begin = ,end = N,mul = :begin = N-,end = -,mul = -;
for(int j = begin;j != end;j += mul)
for(int i = ;i < N;++i)
{
//保证选一个数,然后其他的随机
if(map[i][j] == )//选到了一个数
{
if(flag == )//之前没选到过
{
i1 = i;
i2 = j;
flag = ;
}
else
{
if(rand()% < )
{
i1 = i;
i2 = j;
}
}
}
}
}
if(i1 == i2 && i2 == -)
return;
map[i1][i2] = ;
} int Up(int *isChange)
{
//往上,所以是从上往下扫描
//一列一列的算 for(int j = ;j < N;++j)
{
int k = ;
for(int i = ;i < N;++i)
{
if(map[i][j] != )//当前处理的这一位是有数字的
{
//只要是非0,且没有合并,则相加
//这里保证map[i][j]是有数字的
if(map[i][j] == map[k][j])
{
//与那个数字进行交互。合并操作
map[k][j] += ;
map[i][j] = ;
if(map[k][j] == )
return ;
*isChange = ;
}
else if(map[k][j] == )//我们是说k是第一个非零的,但初始的时候我们为了好运算,是没做判断的
{
//把当前位置上的数移过去 特判的移动操作
map[k][j] = map[i][j];
map[i][j] = ;
*isChange = ;
}
else if(k+ != i)//移动操作
{
map[k+][j] = map[i][j];//2 0 0 4 2 4 0 0
map[i][j] = ;//4 2 0 0
++k;
*isChange = ;
} else//没有合并,且不是特判的
++k;
}
}
}
return ;
}
int Down(int *isChange)
{
for(int j = ;j < N;++j)
{
int k = N-;
for(int i = N-;i >= ;--i)
{
if(map[i][j] != )//当前处理的这一位是有数字的
{
//只要是非0,且没有合并,则相加
//这里保证map[i][j]是有数字的
if(map[i][j] == map[k][j])
{
//与那个数字进行交互。合并操作
map[k][j] += ;
map[i][j] = ;
if(map[k][j] == )
return ;
*isChange = ;
}
else if(map[k][j] == )//我们是说k是第一个非零的,但初始的时候我们为了好运算,是没做判断的
{
//把当前位置上的数移过去 特判的移动操作
map[k][j] = map[i][j];
map[i][j] = ;
*isChange = ;
}
else if(k- != i)//移动操作
{
map[k-][j] = map[i][j];//2 0 0 4 2 4 0 0
map[i][j] = ;//4 2 0 0
--k;
*isChange = ;
}
else//没有合并,且不是特判的
--k;
}
}
}
return ;
}
int Left(int *isChange)
{
//合并?什么情况下合并?什么情况下移动?
//一行一行处理
//从左往右处理
//这个有数字,我们才需要处理,没数字不用管 2 0 4 8 2 4 0 8 2 4 8 0
for(int i = ;i < N;++i)
{
int k = ;
for(int j = ;j < N;++j)
{
if(map[i][j] != )//当前处理的这一位是有数字的
{
//这里保证map[i][j]是有数字的
if(map[i][j] == map[i][k])
{
//与那个数字进行交互。合并操作
map[i][k] += ;
map[i][j] = ;
if(map[i][k] == )
return ;
*isChange = ;
}
else if(map[i][k] == )//我们是说k是第一个非零的,但初始的时候我们为了好运算,是没做判断的
{
//把当前位置上的数移过去 特判的移动操作
map[i][k] = map[i][j];
map[i][j] = ;
*isChange = ;
}
else if(k+ != j)//移动操作
{
map[i][k+] = map[i][j];//2 0 0 4 2 4 0 0
map[i][j] = ;//4 2 0 0
++k;
*isChange = ;
}
else
++k;
}
}
}
return ;
}
int Right(int *isChange)
{
//从右至左
for(int i = ;i < N;++i)
{
int k = N-;
for(int j = N-;j >= ;--j)
{
if(map[i][j] != )//当前处理的这一位是有数字的
{
//这里保证map[i][j]是有数字的
if(map[i][j] == map[i][k])
{
//与那个数字进行交互。合并操作
map[i][k] += ;
map[i][j] = ;
if(map[i][k] == )
return ;
*isChange = ;
}
else if(map[i][k] == )//我们是说k是第一个非零的,但初始的时候我们为了好运算,是没做判断的
{
map[i][k] = map[i][j];
map[i][j] = ;
*isChange = ;
}
else if(k- != j)//移动操作
{
map[i][k-] = map[i][j];
map[i][j] = ;
--k;
*isChange = ;
}
else
--k;
}
}
}
return ;
} void Init()
{
int n = ;//随机地图的数目
//先求table
table[] = ;
for(int i = ;i < M;++i)
table[i] = table[i-]<<;//等同于*2
// for(int i = 0;i < M;++i)
// printf("%5d",table[i]);
//及时测试,验证正确性,免得日后找bug麻烦 //随机地图 随机生成3个2?
memset(map,,sizeof(map));
for(int i = ;i < n;++i)
{
int i1 = rand()%N;
int i2 = rand()%N;
//随机一组下标,让地图那个位置变成1
map[i1][i2] = ; //这个1代表2的一次,最终展现的是2
}
}
void Run()
{
int isChange = ;//检测是否发生了变化
int flag = ;
while()
{
Print();
isChange = ;
switch(getch())
{
case 'w':flag = Up(&isChange);break;
case 's':flag = Down(&isChange);break;
case 'a':flag = Left(&isChange);break;
case 'd':flag = Right(&isChange);break;
}
if(flag != && isChange)
Generator(flag);
if(flag == )
{
Win();
break;
}
else if(IsLose())
{
Print();
Lose();
break;
}
}
}
void Print()
{
gotoxy(,);
for(int i = ;i < N;++i)
{
for(int j = ;j < N;++j)
if(map[i][j] != )
printf("%3d ",table[map[i][j]]);
else
printf(" ");
putchar('\n');
}
}
int Win()
{
printf("You are winner!\n");
}
void Lose()
{
printf("You are loser!\n");
}
int IsLose()
{
//判断是否还具备可操作空间
for(int i = ;i < N;++i)
for(int j = ;j < N-;++j)
{
if(map[i][j] == map[i][j+])
return ;
else if(map[i][j]*map[i][j+] == )
return ;
}
for(int j = ;j < N;++j)
for(int i = ;i < N-;++i)
{
if(map[i][j] == map[i+][j])
return ;
else if(map[i][j]*map[i+][j] == )
return ;
}
Print();
return ;
}
//光标跳转
void gotoxy(int x, int y) //将光标调整到(x,y)的位置
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
} //光标隐藏
void HideCursor() //隐藏光标显示
{
CONSOLE_CURSOR_INFO cursor_info = { , };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

哔哩哔哩配套视频链接:https://www.bilibili.com/video/av46465862/

用C挑战无准备写2048的更多相关文章

  1. 用python实现一个无界面的2048

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5519453.html 以前游戏2048火的时候,正好用其他的语言编写了一个,现在学习python,正好想起来,便决定 ...

  2. js280行代码写2048

    2048 原作者就是用Js写的,一直想尝试.但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...

  3. 一起来写2048(160行python代码)

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  4. 一起写2048(160行python代码)

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家.而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  5. 【实战Java高并发程序设计6】挑战无锁算法:无锁的Vector实现

    [实战Java高并发程序设计 1]Java中的指针:Unsafe类 [实战Java高并发程序设计 2]无锁的对象引用:AtomicReference [实战Java高并发程序设计 3]带有时间戳的对象 ...

  6. python写2048小游戏

    #!/usr/bin/env python # coding=utf-8 #******************************************************** # > ...

  7. 初学者cocos2dx 写2048 为了和大家一起分享

    第一个是在头文件 部分的代码是学习不变  大多数写自己. class HelloWorld : public cocos2d::CCLayer { public: virtual bool init( ...

  8. R语言写2048游戏

    2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束. 编程时并未查看原作者代码,不喜勿喷. 程序结构如 ...

  9. js写2048游戏代码

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

随机推荐

  1. onInterceptTouchEvent与onTouchEvent默认返回值

    其中Layout里的onInterceptTouchEvent默认返回值是false,这样touch事件会传递到View控件,Layout里的onTouch默认返回值是false, View里的onT ...

  2. Pig脚本 .pig

    pig脚本就是一个文件,保存了多条pig命令,通常后缀是.pig(不强制).       多行注释:/**/     单行注释:--       下面是一个名字是test.pig的脚本的例子: /* ...

  3. centos7安装magento随记 这就是个坑,果断放弃

    在centos7通过yum安装PHP7,首先在终端运行:rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm提示错误:er ...

  4. MYSQL数据类型 表基本操作 表记录增删改 单表查询

    一.数据类型 常用的数据类型如下: 整数:int,bit 小数:decimal 字符串:varchar,char 日期时间: date, time, datetime 枚举类型(enum) 特别说明的 ...

  5. 一、vue:如何新建一个vue项目

    比较好用的一个脚手架:https://a1029563229.gitbooks.io/vue/content/cooking-cli.html 创建一个vue项目的流程: 1.安装node,版本号必须 ...

  6. B2B 电商业务之 Quote

    商品在网店页面上一般会向买家显示价格.对于B2B, 同一商品对不同的买家可能会展示不同的价格.即使如此,买家仍然可以和卖家再协商价格,最终以不同于网店中显示的价格成交.这个协商价格过程就叫Quote, ...

  7. Script" References MACLEAN‘s post Speed ​​up the index creation.

    alter session set workarea_size_policy=MANUAL; alter session set db_file_multiblock_read_count=512; ...

  8. 名词解释:Linux内存管理之RSS和VSZ

    Linux内存管理中不管是top命令还是pmap命令,都会有RSS和VSZ这两个名词,这里解释一下: RSS( Resident Set Size )常驻内存集合大小,表示相应进程在RAM中占用了多少 ...

  9. [翻译] MotionBlur

    MotionBlur https://github.com/fastred/MotionBlur MotionBlur allows you to add motion blur effect to ...

  10. 【数据结构】循环队列 C语言实现

    "Queue.h" #include "Queue.h" #include <stdio.h> #include <stdlib.h> ...