鱼C论坛

 找回密码
 立即注册
查看: 4458|回复: 4

[技术交流] 分享一个基于Qt编写的2048小游戏

[复制链接]
发表于 2016-8-26 09:52:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <cstdio>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <vector>
#include <conio.h>
#include <windows.h>
#include<iostream>

using namespace std;

int table[16]={0},Score=0,Max_number=0;

bool allprint=true;

int&at(int* pn,int x,int y=-1,bool rev=false){
    return rev?(~y?pn[x*4+y]:pn[x]):(~y?pn[y*4+x]:pn[x]);
}
bool canMove(int* pn,int direction){
    for(int i=0,sum=0;i<4;i++){
        for(int j=0;j<4;j++){
            if(!at(pn,i,j,direction==0))return true;
            if(j&&at(pn,i,j,direction==0)==at(pn,i,j-1,direction==0))return true;
        }
    }
    return false;
}
void gotoxy(int x,int y){
    COORD c; c.X=x;c.Y=y;
    SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void random_insert(int* pn){
    int dataCount=0;
    for(int i=0;i<16;i++)
        if(pn[i])
            dataCount++;
    if(dataCount==16)
        return;
    int index=rand()%(16-dataCount);
    int iScan=0;
    while(pn[iScan]||index--)iScan++;
    pn[iScan]=(rand()%10)?2:4;
}

int cur_direction(int* pn,int direct,bool visual=false,int* callcount=NULL,int* squareCount=NULL,bool noinsert=false){
    int _score=0,sum=0,square=0,flag=1;
    bool isReverse=direct%2==0;
    for(int iLine=0;iLine<4;iLine++){
        vector<int> line;
        for(int i=(isReverse?0:3);i!=(isReverse?4:-1);i+=(isReverse?1:-1)){
                if(at(pn,iLine,i,direct>1))line.push_back(at(pn,iLine,i,direct>1));
                flag=1;
                while(flag){
                    flag=0;
                    for(int k=1;k<line.size();k++)
                        if(line[k-1]==line[k]){
                            line[--k]*=2;
                            _score+=line[k];
                            if(Max_number<line[k])Max_number=line[k];
                            line.erase(line.begin()+k+1);
                            flag++;
                        }
                    sum+=flag;
                }
        }
        if(!visual)
            for(int i=(isReverse?0:3);i!=(isReverse?4:-1);i+=(isReverse?1:-1)){
                if(line.empty())at(pn,iLine,i,direct>1)=0;
                else{
                    at(pn,iLine,i,direct>1)=line[0];
                    line.erase(line.begin());
                }
            }
        for(int i=1;i<line.size();i++)
            if(line[i-1]*2==line[i]||line[i-1]==2*line[i])
                square+=line[i]-line[i-1];
    }
    if(callcount)(*callcount)=sum;
    if(squareCount)(*squareCount)=abs(square);
    if((!visual)&&(!noinsert))random_insert(pn);
    return _score;
}
bool isConinue(int *pn=table){
    int dataCount=0;
    for(int i=0;i<16;i++)if(at(pn,i,-1,false))dataCount++;
    return dataCount<16||cur_direction(table,0,true)||cur_direction(table,2,true);
}
void print(){
    if(!allprint)return;
    gotoxy(0,0);
    printf("2048-GameTable designed by X.P.Y\nScore:%d         \n\n\n",Score); //x=1
    for(int i=0;i<16;i++){
        gotoxy((i%4+1)*5+1,(i/4+1)*2+1);
        printf("%d     ",table[i]);
    }
    gotoxy(0,11);
}
int ai_calculate(){
    bool canv=canMove(table,0),canh=canMove(table,1);
    if(!(canv&&canh))return canv?2:0;
    int sum[4]={0},score[4]={0},square[4]={0},ai_table[16][16];
    int tmp_sum,tmp_square,index=0,maxScore=-1,curScore=0;
    for(int i=0;i<4;i++){
        for(int k=0;k<4;k++){
            memcpy(ai_table[i*k],table,sizeof(int)*16);
            score[i]=cur_direction(ai_table[i*k],i,false,sum+i,square+i);
            score[i]+=0.8*cur_direction(ai_table[i*k],k,false,&tmp_sum,&tmp_square,true);
            sum[i]+=0.8*tmp_sum;
            square[i]+=0.8*tmp_square;
            for(int j=0;j<4;j++){
                score[i]+=0.4*cur_direction(ai_table[i*k],j,true,&tmp_sum,&tmp_square,true);
                sum[i]+=0.4*tmp_sum;
                square[i]+=0.4*tmp_square;
            }
            curScore=2*score[i]+sum[i];
            if(maxScore<curScore){maxScore=curScore;index=i;}
        }
    }
    return index;
}
void initialize(int n=3){
    memset(table,0,16*sizeof(int));
    Score=Max_number=0;
    while(n--)random_insert(table);
}
void gameJudge(){
    initialize();
    while(isConinue()){
        print();
        switch(getch()){
        case 87:case 119:case 72:Score+=cur_direction(table,0);break;
        case 83:case 115:case 80:Score+=cur_direction(table,1);break;
        case 65:case 97  :case 75:Score+=cur_direction(table,2);break;
        case 68:case 100:case 77:Score+=cur_direction(table,3);break;
        }
    }
}
void ai_judge(int nloop=1){
    while(nloop--){
        initialize();
        while(isConinue()){
            Score+=cur_direction(table,ai_calculate());
            print();
        }
        if(allprint)printf("Max Number:%d\n",Max_number);
    }
}
int main(){
    srand(time(0));
    gameJudge();
    return 0;
}
1.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-26 10:47:32 | 显示全部楼层
谢谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-26 10:52:22 | 显示全部楼层

独乐不如众乐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-26 10:56:48 | 显示全部楼层

嘿嘿
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-26 10:59:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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