C语言 2048小游戏
生活随笔
收集整理的這篇文章主要介紹了
C语言 2048小游戏
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C語言之前寫的2048小游戲,全是函數(shù)、數(shù)組
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h> //全局變量 數(shù)組 int a[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; int main() { //定義變量 //矩陣相關(guān)的變量 int i,j;//為產(chǎn)生隨機數(shù)而使用的橫縱坐標 int x,y;//橫縱坐標 //分數(shù)類變量 int new_score=0;int total_score=0;//交互過程變量int key; //定義函數(shù) //輸出矩陣函數(shù) void print_matrix(); //生成隨機數(shù)2或4函數(shù)int rand_number2or4();//生成隨機坐標函數(shù)int coordinate_x();//初始化兩個坐標為2函數(shù)void begin();//讀取鍵盤操作 int keyboard();//上void up(); //下void down();//左void left();//右 void right();//貼邊void magin();//鍵盤操作后隨機產(chǎn)生一個數(shù) void new_number();//主體//準備工作 srand((int)time(NULL));//產(chǎn)生隨機數(shù)的種子 //初始化 begin();//初始化兩個坐標為2 print_matrix();//輸出矩陣//用戶交互過程(每個循環(huán)讀取一次鍵盤,用方向鍵操作) for(;;){key=keyboard();if(key==1)//上 {up();new_number();print_matrix(); }if(key==2)//下 {down();new_number();print_matrix(); }if(key==3)//左 {left();new_number();print_matrix(); }if(key==4)//右 {right();new_number();print_matrix();}}//輸出矩陣print_matrix(); }//函數(shù)//目的:輸出矩陣 //輸入:無//輸出:4*4矩陣 //返回值:無返回值 void print_matrix(){int i,j;//i表示行坐標,j表示列坐標,取值分別為0,1,2,3 for(i=0;i<=3;i++){for(j=0;j<=3;j++) {printf("%d\t",a[i][j]);}printf("\n\n");}} //目的:產(chǎn)生1~100的隨機數(shù)//輸入:無//輸出:100以內(nèi)的隨機數(shù)//返回值:100以內(nèi)的隨機數(shù) int rand_number100(){int num;//num表示0~100的隨機數(shù) num=rand()%100; // printf("隨機數(shù)是%d\n",num);return num;}//目的:產(chǎn)生隨機數(shù)2或4,概率比例為2:4=10:1 //輸入:無//輸出:隨機數(shù)2或4//返回值:隨機數(shù)2或4 int rand_number2or4(){int rand_number100();//聲明函數(shù)int remainder=0;//remainder表示余數(shù) int num1;//num1的范圍是2,4 remainder=rand_number100()%10; if(remainder==0)//若num是10的倍數(shù)則num1是4,否則是2{num1=4;}else num1=2; // printf("隨機數(shù)2或4為%d\n\n",num1);return num1;} //目的:產(chǎn)生隨機數(shù)(0,1,2,3)概率比例為 1:1:1:1 //輸入:無//輸出:隨機數(shù)(0,1,2,3)//返回值:隨機數(shù)(0,1,2,3)int coordinate_x(){int rand_number100();//聲明函數(shù)int num_x;//num_x的范圍是2,4num_x=rand_number100()%4; // printf("隨機數(shù)坐標為%d\n\n",num_x);return num_x;}//目的:初始化兩個坐標為2 //輸入:無//輸出:初始化成功 //返回值:無void begin(){int x1,y1,x2,y2; for(;;)//生成兩個不相同的隨機坐標 {x1=coordinate_x();//隨機橫坐標y1=coordinate_x();//隨機縱坐標x2=coordinate_x();//隨機橫坐標y2=coordinate_x();//隨機縱坐標if(x1!=x2&&y1!=y2){break;}}a[x1][y1]=2; a[x2][y2]=2;printf("坐標初始化成功:(%d,%d),(%d,%d)\n\n",x1+1,y1+1,x2+1,y2+1);} //目的:讀取方向鍵 //輸入:方向鍵 //輸出:讀出的方向鍵 //返回值:上1,下2,左3,右4int keyboard(){int key;// 上1,下2,左3,右4int ch1=0;int ch2=0;if (ch1=getch()){ ch2=getch();//第一次調(diào)用getch(),返回值224switch (ch2)//第二次調(diào)用getch(){case 72: printf("你的操作 : ↑ \n");key=1;break; case 80: printf("你的操作 : ↓ \n");key=2;break; case 75: printf("你的操作 : ← \n");key=3;break;case 77: printf("你的操作 : → \n");key=4;break; default: printf("按鍵錯誤 \n");break;break;}} // printf("key=%d\n",key);return key; }//目的:向上運算 //輸入:無,只在key=1的條件下調(diào)用 //輸出:無//返回值:無void up(){int i,j;//橫縱坐標,0,1,2,3 int t;//t表示增量void magin();//找出每一列值相同的元素并相加 for(j=0;j<=3;j++)//j表示相同縱坐標 { // printf("\nj=%d\n",j);for(i=0;i<=3;i++)//一豎列第i個元素 0,1,2,3 { // printf("i=%d\n",i);for(t=1;t==1||(t==2&&a[i+t-1][j]==0&&t<=3-i)||(t==3&&a[t-1][j]==0&&a[t-2][j]==0&&t<=3-i);t++){ // printf("t=%d\n",t);if(a[i][j]==a[i+t][j]&&a[i][j]!=0){ // printf("找到相同元素\n");//即使是0也沒有關(guān)系 a[i][j]=2*a[i][j];a[i+t][j]=0;t++;i=i+t-1;continue;//直接跳入下一次循環(huán)(t++) }if(t>3-i)break;}}}magin();} //目的:向下運算 //輸入:無,只在key=1的條件下調(diào)用 //輸出:無//返回值:無void down(){int i,j;int temp1,temp2;void up(); //聲明up函數(shù) //上下調(diào)換數(shù)組(先上下?lián)Q,再調(diào)用up函數(shù),再上下?lián)Q) for(j=0;j<=3;j++) {temp1=a[0][j];temp2=a[1][j];a[0][j]=a[3][j];a[1][j]=a[2][j];a[3][j]=temp1;a[2][j]=temp2;}up();//調(diào)用up函數(shù)//上下調(diào)換數(shù)組 for(j=0;j<=3;j++) {temp1=a[0][j];temp2=a[1][j];a[0][j]=a[3][j];a[1][j]=a[2][j];a[3][j]=temp1;a[2][j]=temp2;}}//目的:向左運算 (先轉(zhuǎn)置,再調(diào)用up函數(shù),再轉(zhuǎn)置) //輸入:無,只在key=2的條件下調(diào)用 //輸出:無//返回值:無void left(){int i,j;int temp1,temp2,temp3,temp4,temp5,temp6;void up(); //聲明up函數(shù) //轉(zhuǎn)置數(shù)組(先轉(zhuǎn)置,再調(diào)用up函數(shù),再轉(zhuǎn)置) temp1=a[1][0];temp2=a[2][0];temp3=a[3][0];temp4=a[2][1];temp5=a[3][1];temp6=a[3][2];a[1][0]=a[0][1];a[2][0]=a[0][2];a[3][0]=a[0][3];a[2][1]=a[1][2];a[3][1]=a[1][3];a[3][2]=a[2][3];a[0][1]=temp1;a[0][2]=temp2;a[0][3]=temp3;a[1][2]=temp4;a[1][3]=temp5;a[2][3]=temp6;up();//調(diào)用up函數(shù)//轉(zhuǎn)置數(shù)組 temp1=a[1][0];temp2=a[2][0];temp3=a[3][0];temp4=a[2][1];temp5=a[3][1];temp6=a[3][2];a[1][0]=a[0][1];a[2][0]=a[0][2];a[3][0]=a[0][3];a[2][1]=a[1][2];a[3][1]=a[1][3];a[3][2]=a[2][3];a[0][1]=temp1;a[0][2]=temp2;a[0][3]=temp3;a[1][2]=temp4;a[1][3]=temp5;a[2][3]=temp6; } //目的:向右運算 (先上下調(diào)換,在轉(zhuǎn)置,再調(diào)用up函數(shù),再轉(zhuǎn)置,在上下調(diào)換) //輸入:無,只在key=4的條件下調(diào)用 //輸出:無//返回值:無void right(){int i,j;int temp1,temp2;void up(); //聲明up函數(shù) //左右調(diào)換數(shù)組 for(i=0;i<=3;i++) {temp1=a[i][0];temp2=a[i][1];a[i][0]=a[i][3];a[i][1]=a[i][2];a[i][3]=temp1;a[i][2]=temp2;}//left函數(shù)left();//左右調(diào)換數(shù)組 for(i=0;i<=3;i++) {temp1=a[i][0];temp2=a[i][1];a[i][0]=a[i][3];a[i][1]=a[i][2];a[i][3]=temp1;a[i][2]=temp2;}}//目的:向上貼邊 //輸入:無,只在向上求和完畢后調(diào)用 //輸出:無//返回值:無void magin(){int i,j,t;int temp;for(j=0;j<=3;j++){for(i=0;i<=3;i++){if(a[i][j]==0){for(t=1;t<=3-i;t++){if(a[i+t][j]!=0)//則a[i+t][j]和a[i][j]互換 {temp=a[i+t][j];a[i+t][j]=a[i][j];a[i][j]=temp;break;}}}}} } //目的:鍵盤操作后隨機產(chǎn)生一個數(shù)(僅在每次操作后調(diào)用,產(chǎn)生的數(shù)不能覆蓋非0數(shù)) //輸入:無//輸出:無//返回值:無void new_number(){int x1,y1,number; int coordinate_x();int rand_number2or4();for(;;)//生成兩個不相同的隨機坐標 {x1=coordinate_x();//隨機橫坐標y1=coordinate_x();//隨機縱坐標if(a[x1][y1]==0){break;}}number=rand_number2or4();a[x1][y1]=number; printf("隨機產(chǎn)生:a[%d][%d]=%d\n",x1+1,y1+1,number);}總結(jié)
以上是生活随笔為你收集整理的C语言 2048小游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 67. 二进制求和(C
- 下一篇: C语言 扫雷小游戏