当前位置: 首页 > 编程笔记 >

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

郤望
2023-03-14
本文向大家介绍用VC++6.0的控制台实现2048小游戏的程序,包括了用VC++6.0的控制台实现2048小游戏的程序的使用技巧和注意事项,需要的朋友参考一下

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

源程序是从开源中国看到的,原作者是 刘地(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,游戏以胜利结束

                    }

                    else

                    {

                        k--,p[i][k]=t;//不停则将p[i][j]的值赋给p[i][k],即数据右移动一位

                    }

                }

            }

    }

    switch(c)

    {

        case 'H'://按下,上方向键,矩阵逆时针旋转90°。这个操作与之前那个switch正好相反

            left();

        break;

        case 'K'://左右再次对调

            over();

        break;

        case 'P':

            right();

        break;

    }

    inc();

}

int main()

{

    char a,b;

    srand(time(NULL));

    inc();

    inc();//放置两个初始值

    show();

    while(z<16 && !o)//游戏结束条件,z==16或者o==1

    {

        a=getch();

        if(a==-32)//方向键的第一个字节为-32.char是无符的,这里为什么是-32还没弄明白

        {

            b=getch();

            if(b==72||b==75||b==77||b==80)

            {

                merge(b);

                show();

            }

        }

    }

    if(o)

    {

        printf("congratulations!");

    }

    else

    {

        printf("sorry, you failed!");

    }

    getch();

    return 0;

}

/*

特殊按键是两个字节,第一个字节是表示按的是特殊键的(普通键就一个字节),第 二个字节就是按键的ASCII码,

当按下“普通键”时,它的低8位数存放该字符的ASCII码。

对于特殊键,低8位为0。特殊键包括箭头键、功能键等。高8位字节存放该键的扫描码

#define KEY_LEFT 75   K   左

#define KEY_RIGHT 77  M   右

#define KEY_UP 72     H   上

#define KEY_DOWN 80   P   下

*/

以上就是本文分享的内容了,希望对大家学习VC++能有所帮助。

 类似资料:
  • 本文向大家介绍linux控制台下实现2048小游戏,包括了linux控制台下实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下 废话少说,直接奉上代码: main.c 2048.h 2048.c 以上就是本文分享的全部代码了,希望对大家学习Linux控制台能够有所帮助。

  • 本文向大家介绍C语言控制台版2048小游戏,包括了C语言控制台版2048小游戏的使用技巧和注意事项,需要的朋友参考一下 效果不好,见谅,没事就写了一个!!! 附上另外一个小伙伴的代码 以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 本文向大家介绍用VC++6.0实现石头剪刀布游戏的程序,包括了用VC++6.0实现石头剪刀布游戏的程序的使用技巧和注意事项,需要的朋友参考一下 源程序是从网上看到的, geek_monkey于2015年3月3日修改了bug(输入字符非石头剪刀布都算是玩家赢) 编译环境为VC++6.0 增加“上帝模式”和数据统计,纯属娱乐。 我是C语言初学者,轻喷 以上就是使用vc++实现的石头剪刀布程序的全部代码

  • 本文向大家介绍Java控制台实现猜拳游戏小游戏,包括了Java控制台实现猜拳游戏小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Java猜拳游戏的具体代码,供大家参考,具体内容如下 先来看一下效果图:  首先我们创建一个Person类,这个类有name和score两个属性,有play这个方法,源代码如下: 接下来是主程序入口: 源代码下载:Java猜拳游戏 以上就是本文的全部内

  • 本文向大家介绍python实现2048小游戏,包括了python实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下 2048的python实现。修改自某网友的代码,解决了原网友版本的两个小bug: 1. 原版游戏每次只消除一次,而不是递归消除。如 [2 ,2 ,2 ,2] 左移动的话应该是 [4, 4, 0, 0] , 而不是[8 , 0 , 0 ,0] 2. 对游戏结束的侦测有bug,已

  • 本文向大家介绍使用graphics.py实现2048小游戏,包括了使用graphics.py实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下 1、过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大。正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN一位朋友封装的model.py(2048逻辑部分