设为首页 收藏本站
云服务器等爆品抢先购,低至4.2元/月
查看: 573|回复: 0

[经验分享] Windows下使用C语言实现2048

[复制链接]

尚未签到

发表于 2017-6-28 18:53:35 | 显示全部楼层 |阅读模式
  这是我之前写的一个小游戏,在windows下的Dev-C++中用C语言来实现的,通过不断的清屏,打印,清屏,打印来实现动态效果,不过功能不完善,有几个缺陷的地方。
  实现效果(使用 w a s d 四个键来控制上下左右的移动) :
DSC0000.gif

  源代码(如果在Dev-C++中编译运行的时候报错,请将注释符号   //    换为  /**/ 来进行注释):



#include <stdio.h>
#include <stdlib.h>     // for rand() and srand() and exit()
#include <time.h>       // for time()
#include <conio.h>      // for getch()
#include <windows.h>    // for system()

void init(void);      // 初始化数组跟赋值第一个随机二维数组元素
void draw(void);      // 绘制4 * 4方格图
void play(void);      // 控制移动方向
void to_up(void);     // 向上移动
void to_down(void);  // 像下移动
void to_left(void);   // 向左移动
void to_right(void);  // 向右移动
void add_number(void);  // 加新的数
int a[4][4];
int empty;
int
main(void) {   
printf("****************************\n");
printf("            2048            \n\n");
printf("Control by:\n"
" w/s/a/d or W/S/A/D\n");
printf("press q or Q quit game!\n");
printf("****************************\n");
printf("Press any key to continue . . .\n");
getch();
system("cls");
init();
draw();
while(1)
play();

return 0;
}
void                 
init(void) {
int i, j;
for(i = 0; i < 4; ++i)
for(j = 0; j < 4; ++j)
a[j] = 0;
srand(time(0));
i = rand() % 4;
j = rand() % 4;        
a[j] = 2;
empty = 15;
}
void              
draw(void) {
int i, j;
for(i = 0; i < 4; ++i) {          // 一个方格由三根竖线组成
for(j = 0; j < 4; ++j)     // 第一排竖线 每个竖线之间占5个格
printf("|    ");
printf("|\n");
for(j = 0; j < 4; ++j) {   // 第二排竖线与数字
if(a[j] == 0)
printf("|    ");
else
printf("|%4d", a[j]);
}
printf("|\n");
for(j = 0; j < 4; ++j)     // 第三排竖线加底线
printf("|____");
printf("|\n");
}
}
void
play(void) {
int ch;
ch = getch();
switch(ch) {
case 'w':    // 向上移动
case 'W':
to_up();
system("cls");
add_number();
draw();
break;
case 's':    // 向下移动
case 'S':
to_down();
system("cls");
add_number();
draw();
break;
case 'a':    // 向左移动
case 'A':
to_left();
system("cls");
add_number();
draw();
break;
case 'd':     // 向右移动
case 'D':
to_right();
system("cls");
add_number();
draw();
break;
case 'q':   // 退出游戏
case 'Q':
exit(0);
break;
default:
printf("\nwrong type!!!\n\n");
printf("please type :\n");
printf("w/s/a/d or W/S/A/D\n");
break;
}
}
void
to_up(void) {
int x, y, i;
for(y = 0; y < 4; ++y) {     // 从上向下合并相同的方块
for(x = 0; x < 4; ++x) {
if(a[x][y] == 0)
;
else {
for(i = x + 1; i < 4; ++i) {
if(a[y] == 0)
;
else if(a[x][y] == a[y]) {
a[x][y] += a[y];
a[y] = 0;
++empty;
x = i;
break;
}
else {
//x = i - 1;
break;
}
}
}
}
}
for(y = 0; y < 4; ++y)    // 向上移动箱子
for(x = 0; x < 4; ++x) {
if(a[x][y] == 0)
;
else {
for(i = x; (i > 0) && (a[i - 1][y] == 0); --i) {
a[i - 1][y] = a[y];
a[y] = 0;
}
}
}
}
void
to_down(void) {
int x, y, i;
for(y = 0; y < 4; ++y)  // 向下合并相同的方格
for(x = 3; x >= 0; --x) {
if(a[x][y] == 0)
;
else {
for(i = x - 1; i >= 0; --i) {
if(a[y] == 0)
;
else if(a[x][y] == a[y]) {
a[x][y] += a[y];
a[y] = 0;
++empty;
x = i;
break;
}
else
break;
}
}
}
for(y = 0; y < 4; ++y)  // 向下移动方格
for(x = 3; x >= 0; --x) {
if(a[x][y] == 0)
;
else {
for(i = x; (i < 3) && (a[i + 1][y] == 0); ++i) {
a[i + 1][y] = a[y];
a[y] = 0;
}
}
}        
}
void
to_left(void) {
int x, y, i;
for(x = 0; x < 4; ++x)   // 向左合并相同的方格
for(y = 0; y < 4; ++y) {
if(a[x][y] == 0)
;
else {
for(i = y + 1; i < 4; ++i) {
if(a[x] == 0)
;
else if(a[x][y] == a[x]) {
a[x][y] += a[x];
a[x] = 0;
++empty;
y = i;
break;
}
else
break;
}
}
}
for(x = 0; x < 4; ++x)  // 向左移动方格
for(y = 0; y < 4; ++y) {
if(a[x][y] == 0)
;
else {
for(i = y; (i > 0) && (a[x][i - 1] == 0); --i) {
a[x][i - 1] = a[x];
a[x] = 0;
}
}
}
}
void
to_right(void) {
int x, y, i;
for(x = 0; x < 4; ++x)  // 向右合并相同的方格
for(y = 3; y >= 0; --y) {
if(a[x][y] == 0)
;
else {
for(i = y - 1; i >= 0; --i) {
if(a[x] == 0)
;
else if(a[x][y] == a[x]) {
a[x][y] += a[x];
a[x] = 0;
++empty;
y = i;
break;
}
else
break;
}
}
}
for(x = 0; x < 4; ++x)   // 向右移动方格
for(y = 3; y >= 0; --y) {
if(a[x][y] == 0)
;
else {
for(i = y; (i < 3) && (a[x][i + 1] == 0); ++i) {
a[x][i + 1] = a[x];
a[x] = 0;
}
}
}
}
void
add_number(void) {
int temp, number;
int x, y;
if(empty > 0) {     // 找出空格
srand(time(0));
do {
x = rand() % 4;
y = rand() % 4;
} while(a[x][y] != 0);
number = rand();
temp = number % 2;
if(temp == 1) {  // 判断是生成数字2,还是数字4
a[x][y] = 2;
--empty;
}
if(temp == 0) {
a[x][y] = 4;
--empty;
}
}
}

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-389079-1-1.html 上篇帖子: 转:Windows下用sftp自动下载文件 下篇帖子: windows下使用docker安装tensorflow
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表