• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 用VC++6.0的控制台实现2048小游戏的程序

用VC++6.0的控制台实现2048小游戏的程序

作者:geek_monkey 字体:[增加 减小] 来源:互联网 时间:2017-05-28

geek_monkey 通过本文主要向大家介绍了vc++控制台程序,vc++6.0无法执行程序,vc++程序设计,vc++程序实例,vc++程序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

首先感谢这位大侠的无私分享,仔细学习这个程序以后收获很多,试着添加一些注释

源程序是从开源中国看到的,原作者是 刘地(sir?)
地址为http://www.oschina.net/code/snippet_593413_46040
geek_monkey于2015年3月5日为拜读该程序,受益匪浅
为了方便自己,以及更多初学者阅读,我试着写了写了注释供参考
我是C语言初学者,如有错误希望指正。轻喷

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
int x[4][4],y[4][4],z=0,o=0;//z表示的是当前矩阵中的非零数字的数量,z为16则说明数字排满了,本局输了
                            //o表示最大数字的值,本例设定的是1024
typedef int row[4];  //row代表具有4个元素的整型数组
row *p=x, *q=y;//P是整型指针数组,有4组,每组有4个元素。p[1]=x[1]=*(x+1)
void show()//显示函数
{
    int i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
        {
            if(p[i][j]==0)
            {
                printf("-     ");//没有放置数字(也就是数字为0时)显示一个小横杠
            }
            else
            {
                printf("%-4d  ",p[i][j]);//显示位宽为4的整数,-表示左对齐
            }
        }
        printf("\n\n");
    }
    printf("\n\n");
}
void over()//将2维数组左右对调
{
    int i,j;
    row *r;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            q[i][3-j]=p[i][j];
        }
    r=p,p=q,q=r;
}
void left()//将2维数组逆时针转动90°
{
    int i,j;
    row *r;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            q[3-j][i]=p[i][j];
        }
    r=p,p=q,q=r;
}
void right()//将2维数组顺时针转动90°
{
    int i,j;
    row *r;
    for(i=0;i<4;i++)
        for(j=0;j<4;j++)
        {
            q[j][3-i]=p[i][j];
        }
    r=p,p=q,q=r;
}
void inc()//此函数的作用是在0数字的位置上随机放置一个2或者4
{
    int i,j,k;
    for(;;)
    {
        k=rand()%16,i=k/4,j=k%4;//这个操作可以保证i,j小于等于4,不会放到二维数组外边
        if(p[i][j]==0)break;//确认p[i][j]是空白的,然后才能放置2或者4
    }
    if(rand()%2) //随机产生2或者4,理论上rand()%2的结果,0,1,几率各占一半
    {
        p[i][j]=4;
    }
    else
    {
        p[i][j]=2;
    }
    z++;
}
void merge(char c)
{
    int i,j,k,t;
    switch(c)//注,这个stitch没有default,也没有给按下右方向键的处理语句。即,按下右方向键,则跳过switch
    {
        case 'H'://检测到按了上方向键
            right();//顺时针转动90度
        break;
        case 'K'://左
            over();//左右对称换
        break;
        case 'P'://下
            left(); //逆90
        break;
    }
    //上边这个switch语句是将矩阵变换,将数字推向上,左或者下的操作转换为推向右的操作。
    //下边这个循环语句的功能是,把每一行的数字都往右边推,数字大小一样则合并。
    for(i=0;i<4;i++)//一行一行地检测
    {
        for(j=k=3;j>=0 && p[i][j]==0;j--);//从第i行的右边开始,向左找非零元素。也就是要让p[i][j]不为0的时候,结束本条for语句
        if(j<0)continue;//经过下边的右推操作,第i行最左边的值也非0,说明此行操作结束,跳出i的for循环,执行i+1行的右推操作
            t=p[i][j],p[i][j]=0,p[i][k]=t;//P[i][j]是P[i][k]左边的一个数。这里的j的值是由上一条语句找出来的,通过t传值保证了这个p[i][k]不为0
            for(j--;j>=0;j--)
            {
                t=p[i][j];
                if(t!=0)//如果p[i][j]不为0,就检测它与右侧的p[i][k]是否为相同
                {
                    p[i][j]=0;
                    if(p[i][k]==t)
                    {
                        z--,p[i][k]+=t;//相同则加倍,同时非0数字的数量减少一个
                        o=(t==512);//t为512代表最大值是1024,此时o==1,游戏以胜利结束
                    }
   

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 用VC++6.0的控制台实现2048小游戏的程序
  • VC++中HTControl控制类使用之CHTDlgBase对话框基类实例

相关文章

  • 2017-05-28C++动态分配和撤销内存以及结构体类型作为函数参数
  • 2017-08-17C和C++的内存操作小贴士(一):const char*的内存释放问题
  • 2017-05-28Linux C 时间函数应用
  • 2017-05-28C++ 数据结构实现两个栈实现一个队列
  • 2017-05-28C语言创建和操作单链表数据结构的实例教程
  • 2017-05-28C++基础入门教程(六):为什么创建类的时候要用new?
  • 2017-05-28C++动态规划之最长公子序列实例
  • 2017-05-28C++实现 单例模式实例详解
  • 2017-05-28总结IOS中nil、Nil、NULL和NSNull区别
  • 2017-05-28深入理解C++中变量的存储类别和属性

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 浅析C和C++函数的相互引用
    • 如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方?
    • 解析C++中的for循环以及基于范围的for语句使用
    • C语言main函数的参数及其返回值详细解析
    • 数据结构之堆详解
    • C++中CSTRINGLIST用法详解
    • C++函数模板与类模板实例解析
    • 基于errno返回值的对应错误码的详细介绍
    • solaris操作系统做c应用程序开发步骤
    • VC定时器的用法实例详解

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有