激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 用C語言完整實現2048游戲

用C語言完整實現2048游戲

2022-02-28 15:00愿百事可樂 C/C++

2048是一款數字益智游戲,初始數字則是由2+2組成的基數4。在操作方面的不同則表現為一步一格的移動,變成更為爽快的一次到底。相同數字的方況在靠攏、相撞時會相加。系統給予的數字方塊不是2就是4,玩家要想辦法在這小小的

用C語言完整實現2048游戲

前言

游戲規則:游戲開始,在4x4的棋盤上隨機兩個方塊出現數字2,通過方向鍵控制所有方塊向同一個方向移動,兩個相同數字方塊撞在一起之后合并成為他們的和。每次移動,棋盤上還會在一個隨機位置增加一個數字2或者數字4,當最終得到一個“2048”的方塊就算勝利了。

一、游戲思路

1、程序開始時出現菜單,讓玩家選擇開始游戲或者退出游戲。

2、玩家選擇開始游戲后,出現棋盤,通過方向鍵選擇移動的方向。

3、移動后會將所有方塊向該方向移動直至補全空格,同樣數字的方塊合并成它們的和,還會生成一個隨機位置的2或4。

4、當出現“2048”時,游戲勝利;當棋盤滿且無法消除時,游戲失敗。

 

二、游戲框架

1.菜單界面

菜單

void menu()
{
	printf("**************************\n");
	printf("*****按 1 開 始 游 戲*****\n");
	printf("*****按 0 退 出 游 戲*****\n");
	printf("**************************\n");
}

菜單的選擇

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("請選擇:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game2048();

			break;
		case 0:
			printf("退出游戲,客官常來玩呀~)\n");
			break;
		default:
			printf("給你一次重新選擇的機會\n");
			break;
		}
	} while (input);
	return 0;
}

實際效果

用C語言完整實現2048游戲

菜單我覺得還是挺順眼的,就是有點丑,畢竟是初學者就不要要求太高了。

2.游戲主體

1.初始化界面:

生成一個4行4列的數組(此處的行數和列數已在頭文件中用#define宏定義)。

并且打印出來。

void DisplayBoard(int board[ROW][COL],int row, int col)
{
  int i = 0;
  int j = 0;
  for (int j = 0; j < COL; j++)
      printf("+-----");
  printf("+\n");
  for (int i = 0; i < ROW; i++)
  {
      for (int j= 0; j < COL; j++)
      {
          printf("|");
          if (board[i][j]!=0)
              printf("%5d", board[i][j]);

          else
              printf("     ");

      }
      printf("|\n");
      for (int j = 0; j < COL; j++)
      {
          printf("+-----");
      }
      printf("+\n");
  }    
}

效果如下:

用C語言完整實現2048游戲

方嗎?方就對了,方就是個好界面!

2.隨機生成初始數字

游戲的界面我們現在已經有了,接下來要做的就是加入兩個隨機位置的”2"。

void get_num(int board[ROW][COL])
{
	int x, y;
	x = rand() % ROW;
	y = rand() % COL;	
	board[x][y] = 2;//一開始隨機的數為2
	x = rand() % ROW;
	y = rand() % COL;
	while (board[x][y] == 2) 
  {
		x = rand() % ROW;
		y = rand() % COL;
	}
	board[x][y] = 2;
  system("cls"); //清屏,美觀界面
	return;
}

(這里照例還是使用了時間戳獲取隨機數的方法)

用C語言完整實現2048游戲

用C語言完整實現2048游戲

可以看到每一次出現的兩個位置都是隨機的。

3.實現移動

這里我們以向上為例,我們要實現移動,以及判定兩個方塊數字相同就合并成為它們的和,并且當合并后存在空格時繼續向上移動。

簡單來說,就是 移動 → 合并 → 再次移動補空。其他三個方向也是一樣的道理,只需要改變其中的數值便可實現。

void up(int board[ROW][COL])
{
	int i = 0; 
	int j = 0;
	int x = 0;
	int y = 0;
	for (i = 0; i < ROW; i++)
	{
		//移動
		j = 0;
		y = 0;
		while (j < COL-1 && y < COL-1 )
		{
			if (board[j][i] == 0) 
			{
				for (x = j; x < ROW-1; x++)
					board[x][i] = board[x + 1][i];
				board[ROW-1][i] = 0;	
				y++;
			}
			else
				j++; 
		}
		//合并
		for (j = 0; j < COL-1; j++)
			if (board[j][i] == board[j + 1][i] && board[j][i] != 0) 
			{											 
				board[j][i] = board[j][i] * 2; //和
				board[j + 1][i] = 0;		
			}
		//再次移動補空
		j = 0;
		y = 0;
		while (j < COL - 1 && y < COL - 1)
		{
			if (board[j][i] == 0)  
			{
				for (x = j; x < ROW - 1; x++)
					board[x][i] = board[x + 1][i];
				board[ROW - 1][i] = 0;
				y++;
			}
			else
				j++;
		}
	}
}

4.增加新數字

每次移動會在隨機位置出現一個新的數字,可能是2,可能是4。

通過查詢網上資料得知,隨機到2的概率約為 9/10,隨機到4的概率約為 1/10。

void put_num(int board[ROW][COL])
{
	int x = 0;
	int y = 0; 
	int z = 0;	
	x = rand() % ROW;
	y = rand() % COL;
	while (board[x][y] !=0)
	{
		x = rand() % ROW;
		y = rand() % COL;
	}
	z = rand() % 10; 
	if (z<9)	
		board[x][y] = 2;	
	else	
		board[x][y] = 4;	
	return;
}

5.判定勝負

當出現2048時勝利,當格子滿了且無法消除時失敗。

int is_fail(int board[ROW][COL])
{
	int i = 0; 
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == 0)
				return 0;
			if (i > 0)
			{
				if (board[i - 1][j] == board[i][j])
					return 0;
			}
			if (j > 0)
			{
				if (board[i][j - 1] == board[i][j])
					return 0;
			}
		}
	}
	return 1;
}

int is_win(int board[ROW][COL])
{	
	int i = 0;
	int j = 0;
	int num = 0;
	for (i = 0; i < ROW; i++)
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] > num)
				num = board[i][j];
		}
	if (num >= 2048)
		return 1;
	else
		return 0;
}

6.游戲函數

將上述代碼結合起來

void game2048()
{
	int board[ROW][COL] = { {0} };
	int control = 0;
	DisplayBoard(board); 
	init_num(board);
	system("cls"); //清屏,美觀界面
	DisplayBoard(board);
	while ((control = _getch()) != 0x1b)
	{ 
		switch (control)
		{
		case 0xe0:
			switch (control = getch())
			{
			    case 72: 
				    up(board);
				    break;
			    case 80: 
			    	down(board);
			    	break;
			    case 75: 
			    	left(board);
				    break;
		    	case 77:  
		    		right(board);
				    break;
		    	default:
			    	break;
			}
			
		system("cls");
		DisplayBoard(board);
		if (is_win(board) == 1)
		{
			printf("恭喜你贏了!");		    
		}
		if (is_fail(board) == 1)
		{
			printf("哈哈哈哈哈哈哈好菜\n");
		}
		}
	}	
}

 

三、游戲運行

已知目前游戲存在bug,當格子滿了的時候假定一個方向可以消除,另一個方向不可以消除,按了那個不可以消除的方向的話,就會無法操作了,鑒于本人目前初學者并未能夠想到很好的解決方法。若有大佬有好的方法也可指點一下。

我太菜了玩了好久都玩不到2048,最高只有512,1024還是舍友打出來的。

用C語言完整實現2048游戲

更新:修復了bug

先判斷數組是否相同再選擇是否添加新的隨機位置的數字。

在此感謝各位幫助我測試的朋友,無論成功與否,當然特別感謝提供了這張圖片的朋友。

用C語言完整實現2048游戲

 

四、所有代碼

game2048.h

#pragma once

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#include<conio.h>

#define ROW 4
#define COL 4
const int copy[ROW][COL];

//初始化并打印游戲界面
void DisplayBoard(int board[ROW][COL]);
//開局隨機生成兩個2
void init_num(int board[ROW][COL]);
//在移動后隨機放置數字2或4
void put_num(int board[ROW][COL]);
//移動
void up(int board[ROW][COL]);
void down(int board[ROW][COL]);
void left(int board[ROW][COL]);
void right(int board[ROW][COL]);
//判定勝負
int is_win(int board[ROW][COL]);
int is_fail(int board[ROW][COL]);

game2048.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game2048.h"

void DisplayBoard(int board[ROW][COL])
{
  int i = 0;
  int j = 0;
  printf("tip:*方向鍵控制方塊移動*ESC鍵返回菜單*\n");
  for (int j = 0; j < COL; j++)
      printf("+-----");
  printf("+\n");
  for (int i = 0; i < ROW; i++)
  {
      for (int j= 0; j < COL; j++)
      {
          printf("|");
          if (board[i][j]!=0)
              printf("%5d", board[i][j]);

          else
              printf("     ");
      }
      printf("|\n");
      for (int j = 0; j < COL; j++)
      {
          printf("+-----");
      }
      printf("+\n");
  }    
}

void init_num(int board[ROW][COL])
{
	int x, y;
	x = rand() % ROW;
	y = rand() % COL;	
	board[x][y] = 2;//隨機在一個位置生成2
	x = rand() % ROW;
	y = rand() % COL;
	while (board[x][y] == 2) 
  {
		x = rand() % ROW;
		y = rand() % COL;
	}
	board[x][y] = 2; 
	return;
}

void put_num(int board[ROW][COL])
{
	int x = 0;
	int y = 0; 
	int z = 0;	
	x = rand() % ROW;
	y = rand() % COL;
	while (board[x][y] !=0)
	{
		x = rand() % ROW;
		y = rand() % COL;
	}
	z = rand() % 10;
	if (z<9)	
		board[x][y] = 2;	
	else	
		board[x][y] = 4;	
	return;
}
				
void up(int board[ROW][COL])
{
	int i = 0; 
	int j = 0;
	int x = 0;
	int y = 0;
	for (i = 0; i < ROW; i++)
	{
		//移動
		j = 0;
		y = 0;
		while (j < COL-1 && y < COL-1 )
		{
			if (board[j][i] == 0) 
			{
				for (x = j; x < ROW-1; x++)
					board[x][i] = board[x + 1][i];
				board[ROW-1][i] = 0;	
				y++;
			}
			else
				j++; 
		}
		//合并
		for (j = 0; j < COL-1; j++)
			if (board[j][i] == board[j + 1][i] && board[j][i] != 0) 
			{											 
				board[j][i] = board[j][i] * 2;
				board[j + 1][i] = 0;		
			}
		//再次移動補空
		j = 0;
		y = 0;
		while (j < COL - 1 && y < COL - 1)
		{
			if (board[j][i] == 0)
			{
				for (x = j; x < ROW - 1; x++)
					board[x][i] = board[x + 1][i];
				board[ROW - 1][i] = 0;
				y++;
			}
			else
				j++;
		}
	}
	if (contrast(board) == 0)
		put_num(board);
	else
		return;
}

void down(int board[ROW][COL])
{
	int i = 0;
	int j = 0;
	int x = 0;
	int y = 0;
	for (i = 0; i < ROW; i++)
	{
		j = COL-1;
		y = 0;
		while (j > 0 && y < COL-1)
		{
			if (board[j][i] == 0)
			{
				for (x = j; x > 0; x--)
					board[x][i] = board[x - 1][i];
				board[0][i] = 0;
				y++;
			}
			else 
				j--;
		}
		for (j = COL-1; j > 0; j--)
			if (board[j][i] == board[j - 1][i] && board[j][i] != 0)
			{
				board[j][i] = board[j][i] * 2;
				board[j - 1][i] = 0;			
			}
		j = COL - 1;
		y = 0;
		while (j > 0 && y < COL - 1)
		{
			if (board[j][i] == 0)
			{
				for (x = j; x > 0; x--)
					board[x][i] = board[x - 1][i];
				board[0][i] = 0;
				y++;
			}
			else
				j--;
		}
	}
	if (contrast(board) == 0)
		put_num(board);
	else
		return;
}
			
void left(int board[ROW][COL])
{
	int i = 0;
	int j = 0;
	int x = 0;
	int y = 0;
	for (i = 0; i < ROW; i++)
	{
		j = 0; 
		y = 0;
		while (j < 3 && y < 3 )
		{
			if (board[i][j] == 0)
			{
				for (x = j; x < ROW-1; x++)
					board[i][x] = board[i][x + 1];
				board[i][COL-1] = 0;
				y++;
			}
			else
				j++;
		}
		for (j = 0; j < 3; j++)
			if (board[i][j] == board[i][j + 1] && board[i][j] != 0)
			{
				board[i][j] = board[i][j] * 2;
				board[i][j + 1] = 0;
			}
		j = 0; 
		y = 0;
		while (j < 3 && y < 3)
		{
			if (board[i][j] == 0)
			{
				for (x = j; x < ROW - 1; x++)
					board[i][x] = board[i][x + 1];
				board[i][COL - 1] = 0;
				y++;
			}
			else
				j++;
		}
	}
	if (contrast(board) == 0)
		put_num(board);
	else
		return;
}

void right(int board[ROW][COL])
{
	int i = 0;
	int j = 0;
	int x = 0;
	int y = 0;
	for (i = 0; i < 4; i++)
	{
		j = COL-1;
		y = 0;
		while (j>0 && y < COL-1)
		{
			if (board[i][j] == 0)
			{
				for (x = j; x > 0; x--)
					board[i][x] = board[i][x - 1];
				board[i][0] = 0;
				y++;
			}
			else j--;
		}
		for (j = 3; j > 0; j--)
			if (board[i][j] == board[i][j - 1] && board[i][j] != 0)
			{
				board[i][j] = board[i][j] * 2;
				board[i][j - 1] = 0;
			}
		j = COL - 1;
		y = 0;
		while (j > 0 && y < COL - 1)
		{
			if (board[i][j] == 0)
			{
				for (x = j; x > 0; x--)
					board[i][x] = board[i][x - 1];
				board[i][0] = 0;
				y++;
			}
			else j--;
		}
	}
	if (contrast(board) == 0)
		put_num(board);
	else
		return;
}

int is_fail(int board[ROW][COL])
{
	int i = 0; 
	int j = 0;
	for (i = 0; i < ROW; i++)
	{
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] == 0)
				return 0;
			if (i > 0)
			{
				if (board[i - 1][j] == board[i][j])
					return 0;
			}
			if (j > 0)
			{
				if (board[i][j - 1] == board[i][j])
					return 0;
			}
		}
	}
	return 1;
}

int is_win(int board[ROW][COL])
{	
	int i = 0;
	int j = 0;
	int num = 0;
	for (i = 0; i < ROW; i++)
		for (j = 0; j < COL; j++)
		{
			if (board[i][j] > num)
				num = board[i][j];
		}
	if (num >= 2048)
		return 1;
	else
		return 0;
}

void copyboard(int board[ROW][COL],int copy[ROW][COL])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < ROW; i++)
		for (j = 0; j < COL; j++)
			copy[i][j] = board[i][j];
}

int contrast(int board[ROW][COL])
{
	int i = 0;
	int j = 0;
	for (i = 0; i < 4; i++)
		for (j = 0; j < 4; j++)
			if (copy[i][j] != board[i][j])
				return 0;
	return 1;
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "game2048.h"

void menu()
{
	printf("**************************\n");
	printf("*****按 1 開 始 游 戲*****\n");
	printf("*****按 0 退 出 游 戲*****\n");
	printf("**************************\n");
}

void game2048()
{
	int board[ROW][COL] = { {0} };
	int control = 0;
	DisplayBoard(board); 
	init_num(board);
	system("cls"); //清屏,美觀界面
	DisplayBoard(board);
	while ((control = _getch()) != 0x1b)
	{ 
		switch (control)
		{
		case 0xe0:
			switch (control = getch())
			{
			    case 72: 
					copyboard(board, copy);
				    up(board);
				    break;
			    case 80: 
					copyboard(board, copy);
			    	down(board);
			    	break;
			    case 75: 
					copyboard(board, copy);
			    	left(board);
				    break;
		    	case 77:  
					copyboard(board, copy);
		    		right(board);
				    break;
		    	default:
			    	break;
			}
			
		system("cls");
		DisplayBoard(board);
		if (is_win(board) == 1)
		{
			printf("恭喜你贏了!\n");
		}
		if (is_fail(board) == 1)
		{
			printf("哈哈哈哈哈哈哈好菜\n");
		}
		}
	}	
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));	
	do
	{	menu();
	    printf("請選擇:");
	    scanf("%d", &input);
		switch (input)
		{
		    case 1:
			    game2048();

			    break;
		    case 0:
		    	printf("退出游戲,客官常來玩呀~)\n");
		    	break;
		    default:
			    printf("給你一次重新選擇的機會\n");
		    	break;
		}
	} while (input);
	return 0;
}

 

總結

感謝各位幫我測試的朋友們!

很久以前看過一部小說,主人公的第一個C語言程序就是實現一個2048的小游戲。

我不是生活中的主人公,但是我還是想要努力到能夠讓自己不再留下遺憾,努力到配得上自己喜歡的人。

三天時間,2048,愿不忘初心。

到此這篇關于用C語言完整實現2048游戲的文章就介紹到這了,更多相關C語言 2048游戲內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/wqnhbskl/article/details/121226979

延伸 · 閱讀

精彩推薦
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
主站蜘蛛池模板: 国产精品免费一区二区三区在线观看 | 黄色小视频在线免费看 | 久久精品视频日本 | 成人免费在线视频播放 | 爱福利视频网 | 亚洲第一黄色网 | 亚洲婷婷日日综合婷婷噜噜噜 | 久久久99精品视频 | 久久久久久久99 | 久久成人国产精品 | 999精品久久久 | 一级毛片特黄 | 精品成人在线观看 | 四虎久草| 久久人人爽人人爽人人片av高请 | 精品亚洲福利一区二区 | 国产小视频在线 | 国产亚洲小视频 | 999久久久精品| 蜜桃久久一区二区三区 | 成人三区四区 | 31freehdxxxx欧美 | 7777欧美| 欧美中文字幕一区二区三区亚洲 | 欧美视频一区二区三区 | 久久精精品 | 欧美日韩夜夜 | 免费黄色成人 | 中文字幕在线观看网址 | 你下面好大好硬好想要 | 久久精品视频4 | 在线播放av片| 精品国产看高清国产毛片 | 亚洲精品在线观看免费 | 欧美亚洲国产成人 | 国产成人av免费观看 | xp123精品视频 | 久久精品观看 | 久久网站免费 | 国产青草网 | 欧美一级黄色网 |