国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看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
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 成人av电影在线观看 | 欧美一区日韩一区 | 久久天天 | 在线一区观看 | 国产乱码一区二区三区在线观看 | 久草电影网 | 欧美亚洲综合久久 | 欧美中文字幕一区二区三区亚洲 | 成年人免费在线观看网站 | 亚洲国产中文字幕 | 中文字幕日韩欧美 | 国产欧美一区二区精品性色 | 在线观看的av | 欧美性猛片 | 免费av观看 | 国产精品视频一二三区 | 国产精品毛片一区二区三区 | 久久久精彩 | 欧美成人精品 | 亚洲成人自拍 | 这里有精品视频 | 久久久久99精品国产片 | 最近最新mv字幕免费观看 | 欧美日韩在线一区二区三区 | 国内精品久久久久久中文字幕 | 在线视频一区二区三区 | 在线成人免费电影 | 美日韩av| 亚洲成人一级片 | 北条麻妃一区二区三区中文字幕 | 亚洲影视一区 | 色偷偷噜噜噜亚洲男人的天堂 | 亚洲综合精品 | 午夜资源 | 中外毛片| 欧美视频二区 | 亚洲精品成人天堂一二三 | 欧美精品xx | 欧美综合在线观看 | 国产99一区二区 | 伊人网视频|