文档章节

经典游戏的C++实现--2048

b
 batcoder
发布于 2015/07/14 10:12
字数 1350
阅读 206
收藏 4

main.cpp

 

#include "function.h"

using namespace std;

int main(int argc, char *argv[])
{
  SetWindows();
  if ( !WelCome() ) {exit(0);};//Show the welcome information
  system("cls");
  int value[5][5]={0};//store each value of the table
 
  //Draw the table
  FrameWork(pianx,piany);
  //Random create a value
  srand(time(0));
  value[rand()%4+1][rand()%4+1]=(rand()%2+1)*2;
  DrawTable(value,pianx,piany);
 
//The body of the program
  bool keypress=0;
  char whichkey;
  int score=0;
 
  loop:
     
  //case the input
      if (keyleft) {whichkey='l';keypress=1;}
      else if (keyright) {whichkey='r';keypress=1;}
      else if (keyup) {whichkey='u';keypress=1;}
      else if (keydown) {whichkey='d';keypress=1;}
      else {keypress=0;}
  //end case
 
      if (keypress)
      {
      //change the value
          Change(value,whichkey,score);
      //refresh the number display
          ClearTable(pianx,piany);
          DrawTable(value,pianx,piany); 
      //show score
          Position(pianx+2,piany-2);
          setcolor(31);
          cout<<"Your Score:"<<score;
      }
      system("pause>nul");
     
  goto loop;
}

 

=================================================

 

 

function.h

 

#ifndef FUNCTION_H
#define FUNCTION_H
#include <windows.h>
#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define pianx 14
#define piany 8
#define Choice cout <<"⊙";
#define keydown GetAsyncKeyState(VK_DOWN)
#define keyup GetAsyncKeyState(VK_UP)
#define keyleft GetAsyncKeyState(VK_LEFT)
#define keyright GetAsyncKeyState(VK_RIGHT)
#define keyenter GetAsyncKeyState(VK_SHIFT)
#define length 60
#define width 30

void SetWindows();
bool WelCome();
void Position(int,int);
void DrawTable(int pos[5][5],int,int);
void FrameWork(int,int);
void ClearTable(int,int);
void Change(int pos[5][5],char,int&);
void lose(int);
void setcolor(int);
int relatedcolor(int);
bool check(int pos[5][5]);

#endif

=================================

 

function.cpp

 

 

#include "function.h"

using namespace std;

void SetWindows()
{
    system("mode con cols=60 lines=30");
    system("color 1f");
    system("title 2048    Powered By Liwenhua");
}

void setcolor(int color)
{
    HANDLE hc=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hc,0|color);
}

int relatedcolor(int number)
{
    switch (number)
    {
        case 2:
            return 127;
        case 4:
            return 143;
        case 8:
            return 239;
        case 16:
            return 175;
        case 32:
            return 174;
        case 64:
            return 191;
        case 128:
            return 159;
        case 256:
            return 223;
        case 512:
            return 222;
        case 1024:
            return 207;
        case 2048:
            return 206;
        default:
            return 12;
    }   
}   

bool WelCome()
{
    system("cls");
    Position(23,10);
    cout <<"WELCOME TO 2048";
    //启动面板
    int startposx = 20 , startposy = 16;
    bool state=1;
    Position(1,startposy+4);
    cout <<"Tips:\n\n  Press Shift To Confirm Your Choice...";
    Position(1,startposy);
    cout << setw(26) <<" "<<"Start"<< endl;
    cout << setw(26)<<" "<<"Exit";
    //Show the choice button;
    Position(startposx,startposy);Choice;
   
    choiceprocess:
        if (keydown) {Position(startposx-1,startposy);cout<<"  ";Position(startposx,startposy+1);Choice;state=0;};
        if (keyup  ) {Position(startposx-1,startposy+1);cout<<"  ";Position(startposx,startposy);Choice;state=1;};
        if (keyenter) return state;
    goto choiceprocess;

void lose(int score)
{
    Position(16,24);
    cout <<"You Lost! And Your Score Is "<<score;
    cout <<"\n\nPress Shift To Exit...";
    system("pause>nul");
    loop:
        if (keyenter) {exit(0);}
    goto loop;
}     

void Position(int x, int y)
{
    COORD pos = { x - 1, y - 1 };
    HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(Out, pos);
}

void DrawTable(int pos[5][5],int x,int y)
{
    for (int i=1 ; i<=4 ; i++)
        for (int j=1 ; j<=4 ; j++)
            if (!(pos[i][j]==0))
            {
                setcolor(relatedcolor(pos[i][j]));
                Position(x+(i-1)*8+2,y+j*3-1);
                if (pos[i][j]<100)
                {cout <<left<<"  "<<setw(4)<<pos[i][j];}
                else if (pos[i][j]<10000)
                {cout <<left<<" "<<setw(5)<<pos[i][j];}
                Position(x+(i-1)*8+2,y+j*3);
                cout <<left<<setw(6)<<" ";
            }      
}   

void ClearTable(int x,int y)
{
    for (int i=1 ; i<=4 ; i++)
        for (int j=1 ; j<=4 ; j++)
        {
                Position(x+(i-1)*8+2,y+j*3-1);
                setcolor(31);
                cout <<setw(6)<<" ";
                Position(x+(i-1)*8+2,y+j*3);
                cout <<setw(6)<<" ";
        }
}   

void FrameWork(int x,int y)
{
    for (int i=1;i<=y;i++) cout <<endl;
    for (int i=1;i<=5;i++)
    {
        for (int k=1;k<=x-1;k++) {cout<<" ";}
        if (i==1)
        {
            cout<<"╔═══╦═══╦═══╦═══╗\n";
            for (int a=1;a<=2;a++) {
            for (int k=1;k<=x-1;k++) {cout<<" ";}
            for (int j=1;j<=5;j++) cout <<left<<setw(8)<<"║";
            cout <<endl; }
        }   
        if (i>=2&&i<=4)
        {
            cout<<"╠═══╬═══╬═══╬═══╣\n";
            for (int a=1;a<=2;a++) {
            for (int k=1;k<=x-1;k++) {cout<<" ";}
            for (int j=1;j<=5;j++) cout <<left<<setw(8)<<"║";
            cout <<endl;}
        }   
        if (i==5)
        {
            cout<<"╚═══╩═══╩═══╩═══╝";
        } 
    }    
}   


void Change(int pos[5][5],char dir,int& score)
{
    bool ischange=0;
    switch (dir)
    {
        case 'u':
        //让可以加的数字相加
            for (int i=1;i<=4;i++)
                for (int j=2;j<=4;j++)
                    for (int k=j-1;k>=1;k--)
                    {
                        if (pos[i][k]==pos[i][j]) {score+=2*pos[i][k];pos[i][k]*=2;pos[i][j]=0;ischange=1;break;}
                        if (pos[i][k]!=0) break;
                    } 
        //对齐,将全部数字移动到最上层;  
            for (int i=1;i<=4;i++)
                for (int j=1;j<=3;j++)
                    if (pos[i][j]==0)
                    {
                        for (int k=j+1;k<=4;k++)
                        {
                            if (pos[i][k]!=0) ischange=1;
                            pos[i][j]=pos[i][k];
                            pos[i][k]=0;
                            if (pos[i][j]!=0) break;
                        }
                    }               
        //产生新的数字
        if (ischange)
        {
            for (;;)
            {
                int randnum=rand()%4+1;
                if (pos[randnum][4]==0) {pos[randnum][4]=((rand()%2)+1)*2;break;}
            }
        } else {if (check(pos)) lose(score);}             
            break;
           
        case 'd':
           
            for (int i=1;i<=4;i++)
                for (int j=3;j>=1;j--)
                    for (int k=j+1;k<=4;k++)
                    {
                        if (pos[i][k]==pos[i][j]) {score+=2*pos[i][k];pos[i][k]*=2;pos[i][j]=0;ischange=1;break;}
                        if (pos[i][k]!=0) break;
                    }   
 
            for (int i=1;i<=4;i++)
                for (int j=4;j>=2;j--)
                    if (pos[i][j]==0) {
                    for (int k=j-1;k>=1;k--)
                    {
                        if (pos[i][k]!=0) ischange=1;
                        pos[i][j]=pos[i][k];
                        pos[i][k]=0;
                        if (pos[i][j]!=0) break;
                    }   }
         if (ischange)
         { 
            for (;;)
            {
                int randnum=rand()%4+1;
                if (pos[randnum][1]==0) {pos[randnum][1]=((rand()%2)+1)*2;break;}
            }
        } else {if (check(pos)) lose(score);}
            break;
           
        case 'l':
           
            for (int i=1;i<=4;i++)
                for (int j=2;j<=4;j++)
                    for (int k=j-1;k>=1;k--)
                    {
                        if (pos[k][i]==pos[j][i]) {score+=2*pos[k][i];pos[k][i]*=2;pos[j][i]=0;ischange=1;break;}
                        if (pos[k][i]!=0) break;
                    }
           
            for (int i=1;i<=4;i++)
                for (int j=1;j<=3;j++)
                    if (pos[j][i]==0) {
                    for (int k=j+1;k<=4;k++)
                    {
                        if (pos[i][k]!=0) ischange=1;
                        pos[j][i]=pos[k][i];
                        pos[k][i]=0;
                        if (pos[j][i]!=0) break;
                    }    }
           
         if (ischange)
         {
            for (;;)
            {
                int randnum=rand()%4+1;
                if (pos[4][randnum]==0) {pos[4][randnum]=((rand()%2)+1)*2;break;}
            }
         } else {if (check(pos)) lose(score);}
            break;
           
        case 'r':
            for (int i=1;i<=4;i++)
                for (int j=3;j>=1;j--)
                    for (int k=j+1;k<=4;k++)
                    {
                        if (pos[k][i]==pos[j][i]) {score+=2*pos[k][i];pos[k][i]*=2;pos[j][i]=0;ischange=1;break;}
                        if (pos[k][i]!=0) break;
                    }   
            for (int i=1;i<=4;i++)
                for (int j=4;j>=2;j--)
                    if (pos[j][i]==0) {
                    for (int k=j-1;k>=1;k--)
                    {
                        if (pos[i][k]!=0) ischange=1;
                        pos[j][i]=pos[k][i];
                        pos[k][i]=0;
                        if (pos[j][i]!=0) break;
                    }    }
           
         if (ischange)
         {
            for (;;)
            {
                int randnum=rand()%4+1;
                if (pos[1][randnum]==0) {pos[1][randnum]=((rand()%2)+1)*2;break;}
            }
        } else {if (check(pos)) lose(score);}
            break;
    }   
}   

bool check(int pos[5][5])
{
    for (int i=1;i<=4;i++)
        for (int j=1;j<=4;j++)
        {
            if (pos[i][j]==0) return 0;
            if (j<=3)
            {
                if ((pos[j][i]==pos[j+1][i])||(pos[i][j]==pos[i][j+1])) return 0;
            }
        }
     return 1;  
}   

======================

© 著作权归作者所有

b
粉丝 0
博文 1
码字总数 1350
作品 0
长沙
私信 提问
使用 C++/Qt 开发的 2048 游戏(源码下载)

这是一个基于 C++/Qt 开发的 2048 游戏。游戏逻辑采用 C++ 编写,界面基于 Qt 5.2.1 开发。整个界面都是用代码生成,没有用到任何 Qt Creator 的 UI 设计工具。 代码和 UI 通过观察者模式进行...

oschina
2015/05/27
182
0
C语言编程基础新手学习经典练习题和答案详解入门必备

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
2018/05/13
0
0
【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: happylifemxy@qq.com 大家别叫我楼主可以吗- -.请叫我...

长平狐
2012/11/12
177
0
【Visual C++】游戏开发笔记之一——API函数、DirectX的关键系统

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。 http://blog.csdn.net/zhmxy555/article/details/7318264 作者:毛星云 邮箱: happylifemxy@qq.com 大家别叫我楼主可以吗- -.请叫我...

长平狐
2012/11/12
119
0
在 Linux 中怎么运行 MS-DOS 游戏和程序

你是否想过尝试一些经典的 MS-DOS 游戏和像 Turbo C++ 这样的废弃的 C++ 编译器?这篇教程将会介绍如何使用 DOSBox 在 Linux 环境下运行 MS-DOS 的游戏和程序。DOSBox 是一个 x86 平台的 DO...

作者: Sk
2018/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

官方来源的 Duo Mobile App 解决了我的 Network Difficulties 问题

https://help.duo.com/s/article/2094?language=en_US 我利用百度搜索下载了一个 Duo Mobile App (由于 Google Play)在大陆不可用。 在扫描旧手机上的 Duo Mobile App 的二维码时, 显示出错...

圣洁之子
18分钟前
3
0
Zabbix监控Mysql容器(Docker容器)主从是否存活

1、在Zabbix Web端创建模板 2、为该模板创建监控项 3、创建触发器 4、在zabbix-agent端操作 在/etc/zabbix/zabbix_agentd.d新建customize.confw文件 内容如下 UserParameter=mysql.replicat...

abowu
19分钟前
2
0
基于 RocketMQ 的同城双活架构在美菜网的挑战与实践

本文整理自李样兵在北京站 RocketMQ meetup分享美菜网使用 RocketMQ 过程中的一些心得和经验,偏重于实践。 嘉宾李样兵,现就职于美菜网基础服务平台组,负责 MQ ,配置中心和任务调度等基础...

大涛学长
25分钟前
5
0
设计模式之:外观模式和桥接模式

作者:DevYK 链接:https://juejin.im/post/5d7e01f4f265da03b5747aac 外观模式 介绍 外观模式 (Facade) 在开发过程中的运用评率非常高,尤其是在现阶段,各种第三方 SDK “充斥” 在我们周边...

Java架构Monster
26分钟前
2
0
人证合一核验设备

人脸身份验证机,人证合一设备1:N如我们现在在车站或一些重要的场所如步行街、城中村等人流密集的场所应用的人脸识别布控系统,其特点是动态和非配合。所谓的动态也就是识别的不是照 片,不是...

非思丸智能
28分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部