鱼C论坛

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

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

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

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

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

x
  1. #include <cstdio>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5. #include <vector>
  6. #include <conio.h>
  7. #include <windows.h>
  8. #include<iostream>

  9. using namespace std;

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

  11. bool allprint=true;

  12. int&at(int* pn,int x,int y=-1,bool rev=false){
  13.     return rev?(~y?pn[x*4+y]:pn[x]):(~y?pn[y*4+x]:pn[x]);
  14. }
  15. bool canMove(int* pn,int direction){
  16.     for(int i=0,sum=0;i<4;i++){
  17.         for(int j=0;j<4;j++){
  18.             if(!at(pn,i,j,direction==0))return true;
  19.             if(j&&at(pn,i,j,direction==0)==at(pn,i,j-1,direction==0))return true;
  20.         }
  21.     }
  22.     return false;
  23. }
  24. void gotoxy(int x,int y){
  25.     COORD c; c.X=x;c.Y=y;
  26.     SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE),c);
  27. }
  28. void random_insert(int* pn){
  29.     int dataCount=0;
  30.     for(int i=0;i<16;i++)
  31.         if(pn[i])
  32.             dataCount++;
  33.     if(dataCount==16)
  34.         return;
  35.     int index=rand()%(16-dataCount);
  36.     int iScan=0;
  37.     while(pn[iScan]||index--)iScan++;
  38.     pn[iScan]=(rand()%10)?2:4;
  39. }

  40. int cur_direction(int* pn,int direct,bool visual=false,int* callcount=NULL,int* squareCount=NULL,bool noinsert=false){
  41.     int _score=0,sum=0,square=0,flag=1;
  42.     bool isReverse=direct%2==0;
  43.     for(int iLine=0;iLine<4;iLine++){
  44.         vector<int> line;
  45.         for(int i=(isReverse?0:3);i!=(isReverse?4:-1);i+=(isReverse?1:-1)){
  46.                 if(at(pn,iLine,i,direct>1))line.push_back(at(pn,iLine,i,direct>1));
  47.                 flag=1;
  48.                 while(flag){
  49.                     flag=0;
  50.                     for(int k=1;k<line.size();k++)
  51.                         if(line[k-1]==line[k]){
  52.                             line[--k]*=2;
  53.                             _score+=line[k];
  54.                             if(Max_number<line[k])Max_number=line[k];
  55.                             line.erase(line.begin()+k+1);
  56.                             flag++;
  57.                         }
  58.                     sum+=flag;
  59.                 }
  60.         }
  61.         if(!visual)
  62.             for(int i=(isReverse?0:3);i!=(isReverse?4:-1);i+=(isReverse?1:-1)){
  63.                 if(line.empty())at(pn,iLine,i,direct>1)=0;
  64.                 else{
  65.                     at(pn,iLine,i,direct>1)=line[0];
  66.                     line.erase(line.begin());
  67.                 }
  68.             }
  69.         for(int i=1;i<line.size();i++)
  70.             if(line[i-1]*2==line[i]||line[i-1]==2*line[i])
  71.                 square+=line[i]-line[i-1];
  72.     }
  73.     if(callcount)(*callcount)=sum;
  74.     if(squareCount)(*squareCount)=abs(square);
  75.     if((!visual)&&(!noinsert))random_insert(pn);
  76.     return _score;
  77. }
  78. bool isConinue(int *pn=table){
  79.     int dataCount=0;
  80.     for(int i=0;i<16;i++)if(at(pn,i,-1,false))dataCount++;
  81.     return dataCount<16||cur_direction(table,0,true)||cur_direction(table,2,true);
  82. }
  83. void print(){
  84.     if(!allprint)return;
  85.     gotoxy(0,0);
  86.     printf("2048-GameTable designed by X.P.Y\nScore:%d         \n\n\n",Score); //x=1
  87.     for(int i=0;i<16;i++){
  88.         gotoxy((i%4+1)*5+1,(i/4+1)*2+1);
  89.         printf("%d     ",table[i]);
  90.     }
  91.     gotoxy(0,11);
  92. }
  93. int ai_calculate(){
  94.     bool canv=canMove(table,0),canh=canMove(table,1);
  95.     if(!(canv&&canh))return canv?2:0;
  96.     int sum[4]={0},score[4]={0},square[4]={0},ai_table[16][16];
  97.     int tmp_sum,tmp_square,index=0,maxScore=-1,curScore=0;
  98.     for(int i=0;i<4;i++){
  99.         for(int k=0;k<4;k++){
  100.             memcpy(ai_table[i*k],table,sizeof(int)*16);
  101.             score[i]=cur_direction(ai_table[i*k],i,false,sum+i,square+i);
  102.             score[i]+=0.8*cur_direction(ai_table[i*k],k,false,&tmp_sum,&tmp_square,true);
  103.             sum[i]+=0.8*tmp_sum;
  104.             square[i]+=0.8*tmp_square;
  105.             for(int j=0;j<4;j++){
  106.                 score[i]+=0.4*cur_direction(ai_table[i*k],j,true,&tmp_sum,&tmp_square,true);
  107.                 sum[i]+=0.4*tmp_sum;
  108.                 square[i]+=0.4*tmp_square;
  109.             }
  110.             curScore=2*score[i]+sum[i];
  111.             if(maxScore<curScore){maxScore=curScore;index=i;}
  112.         }
  113.     }
  114.     return index;
  115. }
  116. void initialize(int n=3){
  117.     memset(table,0,16*sizeof(int));
  118.     Score=Max_number=0;
  119.     while(n--)random_insert(table);
  120. }
  121. void gameJudge(){
  122.     initialize();
  123.     while(isConinue()){
  124.         print();
  125.         switch(getch()){
  126.         case 87:case 119:case 72:Score+=cur_direction(table,0);break;
  127.         case 83:case 115:case 80:Score+=cur_direction(table,1);break;
  128.         case 65:case 97  :case 75:Score+=cur_direction(table,2);break;
  129.         case 68:case 100:case 77:Score+=cur_direction(table,3);break;
  130.         }
  131.     }
  132. }
  133. void ai_judge(int nloop=1){
  134.     while(nloop--){
  135.         initialize();
  136.         while(isConinue()){
  137.             Score+=cur_direction(table,ai_calculate());
  138.             print();
  139.         }
  140.         if(allprint)printf("Max Number:%d\n",Max_number);
  141.     }
  142. }
  143. int main(){
  144.     srand(time(0));
  145.     gameJudge();
  146.     return 0;
  147. }
复制代码
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, 2024-4-18 15:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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