基于easyx的c语言小游戏,C++基于EasyX图形库实现2048小游戏

C++ 和 EasyX 图形库,实现2048小游戏,供大家参考,具体内容如下

4453bd7928bcc8e772a0779d6022b9a3.png

MainGame2048.cpp

/** Name: Game2048CoreClass*/

#include

#include

#include

#include

#include

#include

#include"Game2048.h"

#define BLOCK_SIZE 60

#define SIZE_COL 10

#define SIZE_ROW 10

using namespace std;

void DisplayMap(Game2048& mygame);

int GetMove();

int main(int argc, char * argv[])

{

HWND hwnd=initgraph(SIZE_COL*BLOCK_SIZE, SIZE_ROW*BLOCK_SIZE);

setbkmode(TRANSPARENT);

setbkcolor(RGB(180,180,180));

settextcolor(RGB(0,180,80));

cleardevice();

while (1)

{

Game2048 mygame(SIZE_ROW, SIZE_COL);

while (1)

{

DisplayMap(mygame);

int mov = GetMove();

cout << mov << endl;

if (!mygame.Run(mov))

break;

}

if (MessageBox(hwnd, "游戏结束,是否重玩?", "Tips", MB_YESNO) == IDNO)

break;

}

return 0;

}

int GetMove()

{

char move = '\0';

move = getch();

if (move == 'w' || move == '8' || move == 'W')

return MOV_UP;

if (move == 's' || move == '5' || move == 'S')

return MOV_DOWN;

if (move == 'a' || move == '4' || move == 'A')

return MOV_LEFT;

if (move == 'd' || move == '6' || move == 'D')

return MOV_RIGHT;

if (move == '*')

return MOV_NULL;

return 0;

}

void DisplayMap(Game2048& mygame)

{

BeginBatchDraw();

cleardevice();

char temp[20] = { 0 };

system("cls");

cout << mygame.GetScore() << " " << mygame.GetStep() << " " << mygame.GetUsedTime()<

for (int i = 0; i

{

for (int j = 0; j

{

cout.width(4);

cout << mygame.MapAt(i,j);

if (mygame.MapAt(i, j) == 0)

{

setfillcolor(RGB(220,220,220));

solidcircle(j*BLOCK_SIZE + BLOCK_SIZE / 2, i*BLOCK_SIZE + BLOCK_SIZE / 2, BLOCK_SIZE / 2);

}

else

{

int size=mygame.MapAt(i, j);

sprintf(temp, "%d\0",size );

size /= 2;

setfillcolor(RGB(200, 255-size*20, 0+size*20));

solidcircle(j*BLOCK_SIZE + BLOCK_SIZE / 2, i*BLOCK_SIZE + BLOCK_SIZE / 2, BLOCK_SIZE / 2);

outtextxy(j*BLOCK_SIZE, i*BLOCK_SIZE,temp);

}

}

printf("\n");

}

cout << "-------" << endl;

sprintf(temp,"Score : %d\0",mygame.GetScore());

outtextxy(0, 1*BLOCK_SIZE/3, temp);

sprintf(temp, "Step : %d\0", mygame.GetStep());

outtextxy(0, 2 * BLOCK_SIZE / 3, temp);

sprintf(temp, "Time : %d\0", mygame.GetUsedTime());

outtextxy(0, 3 * BLOCK_SIZE / 3, temp);

sprintf(temp, "MAX : %d\0", mygame.GetMaxNum());

outtextxy(0, 4 * BLOCK_SIZE / 3, temp);

EndBatchDraw();

}

Game2048.h

#ifndef _GAME2048_H_

#define _GAME2048_H_

/*For example:

Game2048 mygame(10,10);

int main(int argc, char * argv[])

{

while (1)

{

DisplayMap();

int mov = GetMove();

cout << mov << endl;

if (!mygame.Run(mov))

break;

}

system("pause");

return 0;

}

*/

#include

#include

typedef int MoveDirect;

#define MOV_NULL 0

#define MOV_UP 8

#define MOV_DOWN 5

#define MOV_LEFT 4

#define MOV_RIGHT 6

class Game2048

{

public:

Game2048(int line=5,int col=5);

~Game2048();

bool Run(MoveDirect mov);

int GetCols();

int GetLines();

int MapAt(int rindex, int cindex);//return >=0 is true,-1 is bad index,0 mean space,other mean number.

int GetStep();

int GetScore();

int GetUsedTime();

int GetMaxNum();

void clear();

private:

void CreateNew();

void MoveAndResult(MoveDirect mov);

bool IsDead();

//运行图和运行时环境

int * Map;

int lines;

int cols;

int step;

int core;

long runtime;

int usetime;

int maxnum;

};

#endif // _GAME2048_H_

Game2048.cpp

#include"Game2048.h"

Game2048::Game2048(int line,int col)

{

this->lines = line;

this->cols = col;

this->step=0;

this->core=0;

this->runtime=0;

this->usetime=0;

this->maxnum=2;

this->Map=(int *)malloc(sizeof(int)*(this->lines)*(this->cols));

runtime = time(NULL); //记录开始时间,用于算总时长

srand((unsigned)time(NULL));

for (int i = 0; ilines; i++)

{

for (int j = 0; jcols; j++)

{

Map[i*this->cols+j] = 0;

}

}

CreateNew();

}

Game2048::~Game2048()

{

free(this->Map);

}

void Game2048::clear()

{

this->step = 0;

this->core = 0;

this->runtime = 0;

this->usetime = 0;

this->maxnum = 2;

runtime = time(NULL); //记录开始时间,用于算总时长

srand((unsigned)time(NULL));

for (int i = 0; ilines; i++)

{

for (int j = 0; jcols; j++)

{

Map[i*this->cols + j] = 0;

}

}

CreateNew();

}

bool Game2048::Run(MoveDirect mov)

{

CreateNew();

MoveAndResult(mov);

if (step > (lines*cols * 2))

if (IsDead() == 1)

return false;

usetime = time(NULL) - runtime;

return true;

}

int Game2048::GetCols()

{

return this->cols;

}

int Game2048::GetLines()

{

return this->lines;

}

int Game2048::MapAt(int rindex, int cindex)

{

if (rindex<0||cindex<0||rindex >= this->lines || cindex >= this->cols)

return -1;

return Map[rindex*this->cols+cindex];

}

int Game2048::GetStep()

{

return this->step;

}

int Game2048::GetScore()

{

return this->core;

}

int Game2048::GetUsedTime()

{

return this->usetime;

}

int Game2048::GetMaxNum()

{

return this->maxnum;

}

void Game2048::CreateNew()

{

int hasfull = 1;

for (int i = 0; i

{

for (int j = 0; j

{

if (Map[i*this->cols+j] == 0)

hasfull = 0; //判断是否满了,不满才创建

}

}

if (hasfull == 1)

return;

int si, sj;

si = rand() % lines;

sj = rand() % cols;

while (Map[si*this->cols+sj] != 0)

{

si = rand() % lines;

sj = rand() % cols;

}

Map[si*this->cols+sj] = 2;

}

bool Game2048::IsDead()

{

for (int i = 0; i

{

for (int j = 0; j

{

if (Map[i*this->lines + j] == 0)

return false; //如果存在空的格则肯定不结束

int up, down, right, left;

up = i - 1;

down = i + 1;

right = j + 1;

left = j - 1; //四个方向进行判定

while (up >= 0 && Map[up*this->lines + j] == 0)

up--;

if (Map[up*this->lines + j] == Map[i*this->lines + j] && up != -1) //只要一个方向可以合并则不结束

return false;

while (downlines + j] == 0)

down--;

if (Map[down*this->lines + j] == Map[i*this->lines + j] && down != lines)

return false;

while (rightlines + right] == 0)

right++;

if (Map[i*this->lines + right] == Map[i*this->lines + j] && right != cols)

return false;

while (left >= 0 && Map[i*this->lines + left] == 0)

left--;

if (Map[i*this->lines + left] == Map[i*this->lines + j] && left != -1)

return false;

}

}

return true; //排除所有情况不结束,肯定结束了

}

void Game2048::MoveAndResult(MoveDirect mov)

{

if (mov == MOV_NULL)

return;

step++; //步数增加

int ffind, nfind;

if (mov == MOV_UP)

{

for (int i = 0; i

{

ffind = -1;

nfind = -1;

for (int j = 0; j

{

int k = j;

while (kcols+i] == 0)

k++;

if (k != lines)

ffind = k;

k++;

while (klines + i] == 0)

k++;

if (k != lines)

nfind = k; //获取第一个不为零和下一个不为零

if (ffind != -1 && nfind != -1)

{

if (ffind != nfind)

{

if (Map[ffind*this->lines + i] == Map[nfind*this->lines + i]) //两个获取相等则叠加

{

Map[ffind*this->lines + i] *= 2;

if (Map[ffind*this->lines + i]>maxnum)

maxnum = Map[ffind*this->lines + i];

Map[nfind*this->lines + i] = 0;

core++; //分数增加

}

}

}

}

int count = 0;

for (int j = 0; j

{

if (Map[j*this->lines + i] != 0)

{

int temp = Map[j*this->lines + i];

Map[j*this->lines + i] = 0;

Map[count*this->lines + i] = temp;

count++;

}

}

}

}

else if (mov == MOV_DOWN)

{

for (int i = 0; i

{

ffind = -1;

nfind = -1;

for (int j = lines; j >= 0; j--)

{

int k = j;

while (k >= 0 && Map[k*this->cols+i] == 0)

k--;

if (k != -1)

ffind = k;

k--;

while (k >= 0 && Map[k*this->cols+i] == 0)

k--;

if (k != -1)

nfind = k;

if (ffind != -1 && nfind != -1)

{

if (ffind != nfind)

{

if (Map[ffind*this->cols+i] == Map[nfind*this->cols+i])

{

Map[ffind*this->cols+i] *= 2;

if (Map[ffind*this->cols+i]>maxnum)

maxnum = Map[ffind*this->cols+i];

Map[nfind*this->cols+i] = 0;

core++;

}

}

}

}

int count = lines - 1;

for (int j = lines - 1; j >= 0; j--)

{

if (Map[j*this->cols+i] != 0)

{

int temp = Map[j*this->cols+i];

Map[j*this->cols+i] = 0;

Map[count*this->cols+i] = temp;

count--;

}

}

}

}

else if (mov == MOV_LEFT)

{

for (int i = 0; i

{

ffind = -1;

nfind = -1;

for (int j = 0; j

{

int k = j;

while (kcols+k] == 0)

k++;

if (k != cols)

ffind = k;

k++;

while (kcols+k] == 0)

k++;

if (k != cols)

nfind = k;

if (ffind != -1 && nfind != -1)

{

if (ffind != nfind)

{

if (Map[i*this->cols+ffind] == Map[i*this->cols+nfind])

{

Map[i*this->cols+ffind] *= 2;

if (Map[i*this->cols+ffind]>maxnum)

maxnum = Map[i*this->cols+ffind];

Map[i*this->cols+nfind] = 0;

core++;

}

}

}

}

int count = 0;

for (int j = 0; j

{

if (Map[i*this->cols+j] != 0)

{

int temp = Map[i*this->cols+j];

Map[i*this->cols+j] = 0;

Map[i*this->cols+count] = temp;

count++;

}

}

}

}

else if (mov == MOV_RIGHT)

{

for (int i = 0; i

{

ffind = -1;

nfind = -1;

for (int j = cols; j >= 0; j--)

{

int k = j;

while (k >= 0 && Map[i*this->cols+k] == 0)

k--;

if (k != -1)

ffind = k;

k--;

while (k >= 0 && Map[i*this->cols+k] == 0)

k--;

if (k != -1)

nfind = k;

if (ffind != -1 && nfind != -1)

{

if (ffind != nfind)

{

if (Map[i*this->cols+ffind] == Map[i*this->cols+nfind])

{

Map[i*this->cols+ffind] *= 2;

if (Map[i*this->cols+ffind]>maxnum)

maxnum = Map[i*this->cols+ffind];

Map[i*this->cols+nfind] = 0;

core++;

}

}

}

}

int count = cols - 1;

for (int j = cols - 1; j >= 0; j--)

{

if (Map[i*this->cols+j] != 0)

{

int temp = Map[i*this->cols+j];

Map[i*this->cols+j] = 0;

Map[i*this->cols+count] = temp;

count--;

}

}

}

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是井字棋小游戏的C代码,基于EASYX图形库: ```c #include <graphics.h> #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define ROW 3 // 定义行数 #define COL 3 // 定义列数 #define SIZE 100 // 定义格子大小 // 定义棋子类型 typedef enum {NONE, PLAYER1, PLAYER2} ChessType; // 定义棋盘 ChessType board[ROW][COL]; // 定义当前玩家 ChessType currentPlayer = PLAYER1; // 判断是否结束游戏 int isGameOver(); // 绘制棋盘 void drawBoard(); // 根据鼠标位置获取棋子位置 void getChessPos(int *x, int *y); // 绘制棋子 void drawChess(int x, int y, ChessType type); // 判断胜利方 ChessType getWinner(); int main() { initgraph(300, 300); // 初始化窗口大小 setbkcolor(WHITE); // 设置背景颜色为白色 cleardevice(); // 清屏 // 初始化棋盘 int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = NONE; } } // 绘制棋盘 drawBoard(); // 游戏循环 while (!isGameOver()) { int x, y; getChessPos(&x, &y); if (board[x][y] == NONE) { board[x][y] = currentPlayer; drawChess(x, y, currentPlayer); currentPlayer = (currentPlayer == PLAYER1) ? PLAYER2 : PLAYER1; } } // 游戏结束,输出胜利方 ChessType winner = getWinner(); if (winner == PLAYER1) { outtextxy(100, 150, "Player1 wins!"); } else if (winner == PLAYER2) { outtextxy(100, 150, "Player2 wins!"); } else { outtextxy(100, 150, "Game over!"); } getch(); // 等待任意键结束 closegraph(); // 关闭图形窗口 return 0; } int isGameOver() { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == NONE) { return 0; } } } return 1; } void drawBoard() { setlinecolor(BLACK); // 设置线条颜色为黑色 int i, j; for (i = 1; i < ROW; i++) { line(0, i * SIZE, COL * SIZE, i * SIZE); } for (j = 1; j < COL; j++) { line(j * SIZE, 0, j * SIZE, ROW * SIZE); } } void getChessPos(int *x, int *y) { int mx = mousex(); // 获取鼠标横坐标 int my = mousey(); // 获取鼠标纵坐标 *x = mx / SIZE; // 计算格子横坐标 *y = my / SIZE; // 计算格子纵坐标 } void drawChess(int x, int y, ChessType type) { int cx = x * SIZE + SIZE / 2; // 计算棋子横坐标 int cy = y * SIZE + SIZE / 2; // 计算棋子纵坐标 if (type == PLAYER1) { setfillcolor(RED); // 设置颜色为红色 fillellipse(cx, cy, SIZE / 2 - 5, SIZE / 2 - 5); // 绘制棋子 } else if (type == PLAYER2) { setfillcolor(BLUE); // 设置颜色为蓝色 fillellipse(cx, cy, SIZE / 2 - 5, SIZE / 2 - 5); // 绘制棋子 } } ChessType getWinner() { int i, j; // 判断行是否相同 for (i = 0; i < ROW; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2]) { return board[i][0]; } } // 判断列是否相同 for (j = 0; j < COL; j++) { if (board[0][j] == board[1][j] && board[1][j] == board[2][j]) { return board[0][j]; } } // 判断对角线是否相同 if (board[0][0] == board[1][1] && board[1][1] == board[2][2]) { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0]) { return board[0][2]; } return NONE; } ``` 其中,需要将EASYX图形库的头文件和库文件导入项目中。此外,还需要安装对应的编译器,比如Dev-C++或Visual Studio等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值