這個2048很簡單,用的都是一些簡單的語法和演算法,很容易理解學會,下面我們開始吧
void MENU ();//選單
void START ();//開始界面
void TABLE ();//構建4*4棋盤
void KEEP ();//保存當前棋盤
void AGAIN ();//游戲結束后的界面
void GET ();//上下左右移動的函式
int CHECK ();//檢查棋盤是否發生變動
int RANDOM1 ();//亂數1
int RANDOM2 ();//亂數2
int OVER ();//判斷是否死棋
首先列出了所有需要的函式,下面我們開始介紹其中主要的函式,
(1)MNUE 它的作用就是輸出一個選單,并判斷是否開始游戲,
void MENU ()//先用字符誰出一個選單
{
printf("\t\t\t╔═══════════════════════════╗\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ 歡迎來到2048 ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ┏━━┓ ┏━━┓ ║\n");
printf("\t\t\t║ 開始:┃ 1┃ 退出:┃ 2┃ ║\n");
printf("\t\t\t║ ┗━━┛ ┗━━┛ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t╚═══════════════════════════╝\n");
switch(getch()){ //判斷是否開始游戲
case '1':
system("cls");
START();
break;
case '2':
exit(0);
break;
}
}
(2)TABLE 它的作用就是輸出當前棋盤和棋盤中保存的數字,
void TABLE ()//輸出棋盤和棋盤中的數,
{
for(h=0;h<4;h++)//四重回圈輸出棋盤的四行
{
if(h==0)printf("\t\t\t┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");
else printf("\t\t\t┣━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━┫\n");
printf("\t\t\t┃ ┃ ┃ ┃ ┃\n");
for(l = 0 ; l < 4 ; l ++)//如果方格中是0,則方格中不放數字
{
if( a[h][l] == 0)
{
if(l==0)printf("\t\t\t┃ ");//如果是棋盤第一列,前面加三個\t
else printf("┃ ");
}
else //如果不是零,就把數字輸出到方格中
{
if(l==0){
printf ("\t\t\t┃");//如果是棋盤第一列,前面加三個\t
printf("%5d ", a[h][l]);
}
else{
printf ("┃");
printf("%5d ", a[h][l]);
}
}
}
printf("┃\n");//最后給棋盤封個口
printf("\t\t\t┃ ┃ ┃ ┃ ┃\n");
}
printf("\t\t\t┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛\n");//棋盤的四行都輸出完了,把棋盤的底封上
}
(3)START 這個是開始游戲的函式,也是一個回圈控制系統,跳出回圈的條件就是游戲結束,
void START ()
{
int point=1; //配合CHECK檢查棋盤是否變化,也就是操作完棋盤動沒動
int bz =0, fs=0;//分別保存步數和得分
while(1)
{
while(1)
{
if(point==1)
{
h=RANDOM2();
l=RANDOM2();
if(a[h][l]==0){
a[h][l]=RANDOM1();//如果上一步操作完棋盤動了,找一個棋盤上沒數的方格放入2或4
bz++; //步數加1
break;
}
}
else{
break; //如果上一步操作完棋盤沒動,不放入新的數字
}
}
TABLE(); //放完新數重新列印棋盤
KEEP(); //保存當前棋盤用于比較操作完棋盤動沒動
printf("\t\t\t 步數:%d 得分:%d",bz,fs);
GET(&fs); //這是正經的操作函式,由wsad控制上下左右
point=CHECK(); //檢查棋盤是否變化
if(OVER()==0){ //檢查游戲是否結束,棋盤是否還可以操作
printf("\n\t\t\t 游戲結束");
break;
}
system("cls"); //清屏,以便列印下一次操作完的棋盤
}
}
(4)GET 它的作用就是在鍵盤get字符,判斷是上下左右,然后對棋盤進行操作,整體思想就是先把所有數字移動到棋盤的一側,然后讓相鄰且相同的兩個方格相加,最后再此移動到一側,移動到一側的想法很簡單用三層回圈即可實作,下面用向上移動舉例,以便理解
for(l = 0 ; l < 4 ; l ++){ //向上移是每一列的數字相鄰相同相加,所以外層回圈是 l
for(t = 0 ; t < 4 ; t ++){//做四次移動,因為每次移動只能動一步
for(h = 3 ; h > 0 ; h --){//從最底下開始移動,只要上面的方格是0,就向上移動一個
if(a[h-1][l] == 0){
a[h-1][l] = a[h][l];
a[h][l] = 0;
}
}
}
}
for(l = 0 ; l < 4 ; l ++){
for(t = 0 ; t < 4 ; t ++){
for(h = 3 ; h > 0 ; h --){
if(a[h-1][l] == a[h][l]){
a[h-1][l] += a[h][l];//也是同樣的回圈,只不過這次是相鄰相同相加
a[h][l] = 0;
*fs = *fs+ a[h][l];//記錄得分
}
}
}
}
for(l = 0 ; l < 4 ; l++){ //同樣的移動操作
for(t = 0 ; t < 4 ; t ++){
for(h = 3 ; h > 0 ; h --){
if(a[h-1][l] == 0){
a[h-1][l] = a[h][l];
a[h][l] = 0;
}
}
}
}
向其他方向移動的原理相同,就不過多介紹,
其他的函式都很簡單,也都很好理解,下面直接上源代碼吧
#include<stdio.h>
#include<stdlib.h>
#include <conio.h> /*使用getch()函式*/
#include <time.h>
#include <windows.h>
void MENU ();//選單
void START ();//開始界面
void TABLE ();//構建4*4棋盤
void KEEP ();//保存當前棋盤
void AGAIN ();//游戲結束后的界面
void GET ();//上下左右移動的函式
int CHECK ();//檢查棋盤是否發生變動
int RANDOM1 ();//亂數1
int RANDOM2 ();//亂數2
int OVER ();//判斷是否死棋
int h,l,a[4][4]={0},A[4][4];//創建兩個全域二位陣列用來保存當前和上一步棋盤
int main ()
{
/*┏┗━┳┣┻╋┫┓┛┃┻╔═╚══╝═╗║*/
system ("color F0");//F 表示背景顏色,0表示前景顏色
MENU ();
system ("pause");//暫停,按任意鍵繼續
AGAIN ();
}
void START ()
{
int point=1; //配合CHECK檢查棋盤是否變化,也就是操作完棋盤動沒動
int bz =0, fs=0;//分別保存步數和得分
while(1)
{
while(1)
{
if(point==1)
{
h=RANDOM2();
l=RANDOM2();
if(a[h][l]==0){
a[h][l]=RANDOM1();//如果上一步操作完棋盤動了,找一個棋盤上沒數的方格放入2或4
bz++; //步數加1
break;
}
}
else{
break; //如果上一步操作完棋盤沒動,不放入新的數字
}
}
TABLE(); //放完新數重新列印棋盤
KEEP(); //保存當前棋盤用于比較操作完棋盤動沒動
printf("\t\t\t 步數:%d 得分:%d",bz,fs);
GET(&fs); //這是正經的操作函式,由wsad控制上下左右
point=CHECK(); //檢查棋盤是否變化
if(OVER()==0){ //檢查游戲是否結束,棋盤是否還可以操作
printf("\n\t\t\t 游戲結束");
break;
}
system("cls"); //清屏,以便列印下一次操作完的棋盤
}
}
void MENU ()//先用字符誰出一個選單
{
printf("\t\t\t╔═══════════════════════════╗\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ 歡迎來到2048 ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ┏━━┓ ┏━━┓ ║\n");
printf("\t\t\t║ 開始:┃ 1┃ 退出:┃ 2┃ ║\n");
printf("\t\t\t║ ┗━━┛ ┗━━┛ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t╚═══════════════════════════╝\n");
switch(getch()){ //判斷是否開始游戲
case '1':
system("cls");
START();
break;
case '2':
exit(0);//退出程式
break;
}
}
void TABLE ()//輸出棋盤和棋盤中的數,
{
for(h=0;h<4;h++)//四重回圈輸出棋盤的四行
{
if(h==0)printf("\t\t\t┏━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");
else printf("\t\t\t┣━━━━━━╋━━━━━━╋━━━━━━╋━━━━━━┫\n");
printf("\t\t\t┃ ┃ ┃ ┃ ┃\n");
for(l = 0 ; l < 4 ; l ++)//如果方格中是0,則方格中不放數字
{
if( a[h][l] == 0)
{
if(l==0)printf("\t\t\t┃ ");//如果是棋盤第一列,前面加三個\t
else printf("┃ ");
}
else //如果不是零,就把數字輸出到方格中
{
if(l==0){
printf ("\t\t\t┃");//如果是棋盤第一列,前面加三個\t
printf("%5d ", a[h][l]);
}
else{
printf ("┃");
printf("%5d ", a[h][l]);
}
}
}
printf("┃\n");//最后給棋盤封個口
printf("\t\t\t┃ ┃ ┃ ┃ ┃\n");
}
printf("\t\t\t┗━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┛\n");//棋盤的四行都輸出完了,把棋盤的底封上
}
void AGAIN ()
{
system("cls");
printf("\t\t\t╔═══════════════════════════╗\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ 游戲結束啦 ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ┏━━┓ ┏━━┓ ║\n");
printf("\t\t\t║ 重來:┃ 1┃ 退出:┃ 2┃ ║\n");
printf("\t\t\t║ ┗━━┛ ┗━━┛ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t║ ║\n");
printf("\t\t\t╚═══════════════════════════╝\n");
switch(getch()){
case '1':
system("cls");//清屏
START();
break;
case '2':
exit(0);
break;
}
}
void KEEP ()
{
for(h = 0 ; h < 4;h++){
for(l=0 ; l<4;l++){
A[h][l]=a[h][l];//保存當前棋盤
}
}
}
int CHECK ()
{
for(h = 0 ; h < 4 ; h ++){
for(l = 0 ; l<4 ; l ++){
if(A[h][l]!=a[h][l])//檢查棋盤是否發生變化
return 1;
}
}
return 0;
}
int OVER () //判斷是否游戲結束
{
int h , l , t , over=0;
for(h = 0 ; h < 4 ; h ++){
for(l = 0 ; l<4 ; l ++){
if(a[h][l]==0)
return 1;//如果有0,則沒結束
}
}
for(l = 0 ; l < 4 ; l ++){
for(t = 0 ; t < 4 ; t ++){
for(h = 3 ; h > 0 ; h --){
if(a[h-1][l] == a[h][l]){
return 1;//如果同一列有相鄰數字相同,則沒結束
}
}
}
}
for(h = 0; h < 4; h ++){
for(t = 0; t < 4; t ++){
for(l = 3; l > 0; l --){
if(a[h][l-1] == a[h][l]){
return 1;//如果同一行有相鄰數字相同,則沒結束
}
}
}
}
return 0;
}
int RANDOM1 ()
{
int x;
srand (time(NULL));//初始化亂數生成器
x=((unsigned)rand()%2);//生成亂數
x= x == 0 ? 2 : 4;//判斷是奇是偶
return x;
}
int RANDOM2 ()
{
int x;
x=((unsigned)rand()%4);
return x;
}
void GET (int*fs)
{
int h , l , t ;
char ch;
ch=getch();
switch(ch){
case 'w':
case 'W':
for(l = 0 ; l < 4 ; l ++){ //向上移是每一列的數字相鄰相同相加,所以外層回圈是 l
for(t = 0 ; t < 4 ; t ++){//做四次移動,因為每次移動只能動一步
for(h = 3 ; h > 0 ; h --){ //從最底下開始移動,只要上面的方格是0,就向上移動一個
if(a[h-1][l] == 0){
a[h-1][l] = a[h][l];
a[h][l] = 0;
}
}
}
}
for(l = 0 ; l < 4 ; l ++){
for(t = 0 ; t < 4 ; t ++){
for(h = 3 ; h > 0 ; h --){
if(a[h-1][l] == a[h][l]){
a[h-1][l] += a[h][l];//也是同樣的回圈,只不過這次是相鄰相同相加
a[h][l] = 0;
*fs = *fs+ a[h][l];//記錄得分
}
}
}
}
for(l = 0 ; l < 4 ; l++){ //同樣的移動操作
for(t = 0 ; t < 4 ; t ++){
for(h = 3 ; h > 0 ; h --){
if(a[h-1][l] == 0){
a[h-1][l] = a[h][l];
a[h][l] = 0;
}
}
}
}
break;
case 's':
case 'S':
for(l = 0; l < 4; l ++){
for(t = 0; t < 4; t ++){
for(h = 0; h < 3; h ++){
if(a[h+1][l] == 0){
a[h+1][l] = a[h][l];
a[h][l] = 0;
}
}
}
}
for(l = 0; l < 4; l ++){
for(h = 3; h > 0; h --){
if(a[h][l] == a[h-1][l]){
a[h][l] += a[h-1][l];
a[h-1][l] = 0;
*fs = *fs+ a[h][l];
}
}
}
for(l = 0; l < 4; l ++){
for(t = 0; t < 4; t ++){
for(h = 0; h < 3; h ++){
if(a[h+1][l] == 0){
a[h+1][l] = a[h][l];
a[h][l] = 0;
}
}
}
}
break;
case 'a':
case 'A':
for(h = 0; h < 4; h ++){
for(t = 0; t < 4; t ++){
for(l = 3; l > 0; l --){
if(a[h][l-1] == 0){
a[h][l-1] = a[h][l];
a[h][l] = 0;
}
}
}
}
for(h = 0; h < 4; h ++){
for(l = 0; l < 3; l ++){
if(a[h][l] == a[h][l+1]){
a[h][l] += a[h][l+1];
a[h][l+1] = 0;
*fs = *fs+ a[h][l];
}
}
}
for(h = 0; h < 4; h ++){
for(t = 0; t < 4; t ++){
for(l = 3; l > 0; l --){
if(a[h][l-1] == 0){
a[h][l-1] = a[h][l];
a[h][l] = 0;
}
}
}
}
break;
case 'd':
case 'D':
for(h = 0; h < 4; h ++){
for(t = 0; t < 4; t ++){
for(l = 0; l < 3; l ++){
if(a[h][l+1] == 0){
a[h][l+1] = a[h][l];
a[h][l] = 0;
}
}
}
}
for(h = 0; h < 4; h ++){
for(l = 3; l > 0; l --){
if(a[h][l] == a[h][l-1]){
a[h][l] += a[h][l-1];
a[h][l-1] = 0;
*fs = *fs+ a[h][l];
}
}
}
for(h = 0; h < 4; h ++){
for(t = 0; t < 4; t ++){
for(l = 0; l < 3; l ++){
if(a[h][l+1] == 0){
a[h][l+1] = a[h][l];
a[h][l] = 0;
}
}
}
}
break;
default:
break;
}
}
學費了嗎,點個贊吧

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/392262.html
標籤:其他
上一篇:Unity如何制作3D人物殘影——實作黑客帝國的躲子彈鏡頭
下一篇:Python的猜平均數一半游戲
