Discuz! Board

 找回密码
 立即注册
查看: 376|回复: 1

23.3.25

[复制链接]

15

主题

19

帖子

4118

积分

论坛元老

Rank: 8Rank: 8

积分
4118

墨海马 Lv:15
发表于 2023-3-25 18:07:39 | 显示全部楼层 |阅读模式
[C] 纯文本查看 复制代码
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<bits/stdc++.h>
using namespace std;

void loadImage();
void releaseImage();
void addRandomNum(int n);
bool move(int direction);
void draw();

#define DEVIDE 15
#define GRID_WIDTH 106

//图片
#define NUM_BLOCK 18
PIMAGE blockImgs[NUM_BLOCK], backgroundImg;

key_msg keyMsg;
int board[4][4];			//格子
//int emptyBlock = 16;	//空格子数
char ch;

//数据文件
const char* recordFile = "game2048.txt";
//图片文件位置
PIMAGE pimgs[5];
const char* imgFiles[5] = {
	"resource\\image\\background.png",
	"resource\\image\\gamelogo.png",
	"resource\\image\\scorebg.png",
	"resource\\image\\restart.png",
	"resource\\image\\gameOver.png"
};

//音乐
MUSIC mergeMusic;
MUSIC startMusic;
const char* mergeMusicFile = "resource\\music\\merge.mp3";
const char* startMusicFile = "resource\\music\\start.mp3";

int topScore, score, maxNum;//最高分 ,当前分,最大合成数 


void getRand()
{
	int x,y;
	while(1)
	{
		x=rand()%4;
		y=rand()%4;
		if(board[x][y]==0)
		{
			break;
		}
	}
	board[x][y]=1;
}

void loadImage()//图片载入 
{
	char imgName[40];
	//数字图片 初始化 
	for (int i = 1, num = 2; i < NUM_BLOCK; i++, num *= 2) 
	{
		blockImgs[i] = newimage();//声明 
		sprintf(imgName, "resource\\image\\block_%d.png", num);//字符串赋值 
		getimage(blockImgs[i], imgName);//图片对象赋值 
	}
	//底图 初始化 
	for (int i = 0; i < 5; i++) 
	{
		pimgs[i] = newimage();
		getimage(pimgs[i], imgFiles[i]);
	}
	
}


void score_cnt()//分数计算
{
}


void start()//初始化 
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
//	setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
	
	initgraph(500+40, 500+178+20);//图形初始化 
	setbkcolor(WHITE);
	srand(time(0));//随机数初始化 
	loadImage();//图片载入 
	
	setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
	setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
	//音乐载入 
	mergeMusic.OpenFile(mergeMusicFile);
	startMusic.OpenFile(startMusicFile);
	
	startMusic.Play(0);
} 


void draw()//图形绘制 
{
	putimage_withalpha(NULL, pimgs[0], 20, 178);//绘制带透明通道的图像 
	//绘制背景	
	putimage_withalpha(NULL, pimgs[1], 34, 30);	//图标
	putimage_withalpha(NULL, pimgs[2], 260, 10);			//游戏分数背景
	putimage_withalpha(NULL, pimgs[3], 20, 110);			//重新开始安妮

	//游戏分数
	setcolor(DARKGRAY);
	setfont(30, 0, "黑体");
	xyprintf(370, 24, "%8d", topScore);		
	xyprintf(370, 72, "%8d", score);
	int temp = pow(2,maxNum);
	xyprintf(370, 120, "%8d", temp);
	
	

	//绘制数字图 
	for (int i = 0; i < 4; i++) 
	for (int j = 0; j < 4; j++) 
	{
		int x = (j + 1) * DEVIDE + j * GRID_WIDTH+20;
		int y =  (i + 1) * DEVIDE + i * GRID_WIDTH+178;

		if (board[i][j] != 0)
			putimage_withalpha(NULL, blockImgs[board[i][j]], x, y);	
	}
}

void restart()//重新开始 
{
	score=0;
	for(int i=3;i>=0;i--)
    for(int j=3;j>=0;j--)
    {
    	board[i][j]=0;
	}
}

bool judgeUpSlide()
{
	for(int i=0;i<=3;i++)
	{
		for(int j=0;j<=3;j++)
		{
			if(board[i][j]==0)
			{
				return true;
			}
			else if(i>0&&board[i][j]==board[i-1][j])
			{
				return true;
			}
		}
	}
	return false;
}

void upSlide()
{
	for(int i=3;i>=0;i--)
	{
		for(int j=0;j<=3;j++)
		{
			if(i>0&&board[i-1][j]==0&&board[i][j]!=0)
			{
				board[i-1][j]=board[i][j];
				board[i][j]=0;
			}
			else if(i>0&&board[i][j]==board[i-1][j]&&board[i][j]!=0)
			{
				board[i-1][j]=board[i][j]+1;
				board[i][j]=0;
			}
		}
	}
}

bool judgeLeftSlide()
{
	for(int i=0;i<=3;i++)
	{
		for(int j=0;j<=3;j++)
		{
			if(board[i][j]==0)
			{
				return true;
			}
			else if(board[i][j]==board[i][j+1])
			{
				return true;
			}
		}
	}
	return false;
}

void leftSlide()
{
	for(int i=3;i>=0;i--)
	{
		for(int j=0;j<=3;j++)
		{
			if(board[i][j+1]==0&&board[i][j]!=0)
			{
				board[i][j+1]=board[i][j];
				board[i][j]=0;
			}
			else if(board[i][j]==board[i][j+1]&&board[i][j]!=0)
			{
				board[i][j+1]=board[i][j];
				board[i][j]=0;
			}
		}
	}
}

bool judgeDownSlide()
{
	for(int i=0;i<=3;i++)
	{
		for(int j=0;j<=3;j++)
		{
			if(board[i][j]==0)
			{
				return true;
			}
			else if(board[i][j]==board[i+1][j])
			{
				return true;
			}
		}
	}
	return false;
}

void downSlide()
{
	for(int i=3;i>=0;i--)
	{
		for(int j=0;j<=3;j++)
		{
			if(board[i+1][j]==0&&board[i][j]!=0)
			{
				board[i+1][j]=board[i][j];
				board[i][j]=0;
			}
			else if(board[i][j]==board[i+1][j]&&board[i][j]!=0)
			{
				board[i+1][j]=board[i][j]+1;
				board[i][j]=0;
			}
		}
	}
}

bool judgeRightSlide()
{
	for(int i=0;i<=3;i++)
	{
		for(int j=0;j<=3;j++)
		{
			if(board[i][j]==0)
			{
				return true;
			}
			else if(i>0&&board[i][j]==board[i][j-1])
			{
				return true;
			}
		}
	}
	return false;
}

void rightSlide()
{
	for(int i=3;i>=0;i--)
	{
		for(int j=0;j<=3;j++)
		{
			if(i>0&&board[i][j-1]==0&&board[i][j]!=0)
			{
				board[i][j-1]=board[i][j];
				board[i][j]=0;
			}
			else if(i>0&&board[i][j]==board[i][j-1]&&board[i][j]!=0)
			{
				board[i][j-1]=board[i][j]+1;
				board[i][j]=0;
			}
		}
	}
}
void update()//数据更新 
{
	switch(keyMsg.key)
	{
		case 'W':
			if(judgeUpSlide())	upSlide();
			break;
		/*case 'A':
			if(judgeLeftSlide())	leftSlide();
			break;
		case 'S':
			if(judgeDownSlide())	downSlide();
			break;
		case 'D':
			if(judgeRightSlide())	rightSlide();
			break;
		case 'Q':
			restart();
			break;*/
		default:break;
	}
}


void loadRecord()
{
	FILE* fp = fopen(recordFile, "r");

	fscanf(fp, "topScore:%d score:%d maxNum:%d",&topScore, &score, &maxNum);
	
	for (int i = 0; i < 4; i++) 
	for (int j = 0; j < 4; j++) 
	{
		fscanf(fp, "%d", &board[i][j]);
	}
	fclose(fp);
}

void gameSave()
{
	//数据写入
	FILE* fp = fopen(recordFile, "w");
	if (fp == NULL)
		return;
	fprintf(fp, "topScore:%d\nscore:%d\nmaxNum:%d\n",
		topScore,score,maxNum);

	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++)
			fprintf(fp, "%d ", board[i][j]);
		fprintf(fp, "\n");
	}
	fclose(fp);
}


int main()
{
	loadRecord();	
a:	start();//初始化 
	getRand();//产生随机数字 
	draw();//图形绘制 
	
	
	while(1)//!judgeOver())
	{
		while(kbmsg()) 
		{
			keyMsg = getkey();
			if ((keyMsg.msg == key_msg_down)&&((keyMsg.key=='A')||(keyMsg.key=='S')||
			(keyMsg.key=='W')||(keyMsg.key=='D')||(keyMsg.key=='Q')))
			{
				mergeMusic.Play(0);
				update();
				getRand();
				score_cnt();
				cleardevice();
				draw();
				gameSave();
			}
		}
		delay_fps(60);
	}
	
	//gameSave();
	xyprintf(200,300,"GAME OVER");
	getch();
	restart();
	goto a;
	return 0;
}

回复

使用道具 举报

661

主题

847

帖子

243万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2435564

烈空座 Lv:100
发表于 2023-3-25 23:22:05 | 显示全部楼层
更改下getrand函数,该函数的while循环在读取存档时,若存档的board数组无空位,会死循环导致白屏
[C++] 纯文本查看 复制代码
void getRand()
{
    int x,y;
    int flag=0;//标记 
    for(int i=0;i<4;i++)
    for(int j=0;j<4;j++)
	{
    	if(board[i][j]==0)//查验是否还有空位 
    	{
    		flag=1;//如果有空,则标志位置位 
    		break;
		}
	}
    while(flag)//确保有空位后进循环 ,如果没空位会死循环 
    {
        x=rand()%4;
        y=rand()%4;
        if(board[x][y]==0)
        {
            break;
        }
    }
    board[x][y]=1;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-5-30 12:14 , Processed in 0.064635 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

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