给大一新生写的一个小游戏。
缺点:函数名称和功能略微不对应,函数功能写得比较乱,时间记录有误差,可扩展性弱。
【C/C++课程设计代码|C语言实现的2048小游戏】优点:通过几个配置数组,将单位方块移动的函数缩短到30行以内。
#include
#include
#include
#include
#include //坐标常量
const int squareSize = 4;
const int locationX[squareSize] = { 4, 6, 8, 10 };
const int locationY[squareSize] = { 2, 8, 14, 20 };
const int locationTime[2] = { 13, 12};
const int directionS[2][3] = { {1, 4, 1}, {2, -1, -1} };
//左 右 上 下
//0123
const int directionXY[4][2] = { {0,-1}, {0, 1}, {-1, 0}, {1, 0} };
//矩阵内容
int square[squareSize][squareSize];
//时间相关全局变量
int t_hour = 0;
int t_min = 0;
int t_sec = 0;
int t_ms = 0;
//得分相关全局变量
int score = 0;
//步数相关全局变量
int step = 0;
//存活全局变量
int alive = 1;
//函数声明
void gotoxy(int x, int y);
void sleep(int n);
void gotoxy(int x, int y);
void move(int direction);
void play();
int judge(int x, int y, int direction);
void printSquare();
void init();
void randSquare();
void printScore();
//打印当前时间
void printTime()
{
gotoxy(locationTime[0], locationTime[1]);
printf("%02d:%02d:%02d", t_hour, t_min, t_sec);
}//睡眠函数 不是很准确 推荐用系统时间换算
void sleep(int n)
{
Sleep(n);
t_ms += n;
if (t_ms >= 1000)
{
t_ms -= 1000;
t_sec += 1;
}
if (t_sec >= 60)
{
t_sec -= 60;
t_min += 1;
}
if (t_min >= 60)
{
t_sec -= 60;
t_hour += 1;
}
gotoxy(locationTime[0], locationTime[1]);
printTime();
}//光标移动函数
void gotoxy(int x, int y)
{
COORD pos;
pos.X = y;
pos.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}//左 右 上 下
//0123
//游戏单元 移动函数
void move(int direction)
{
//const int directionS[2][3] = { {1, 4, 1}, {2, -1, -1} };
//向左移动i = directionS[0][0];
i != directionS[0][1] ;
i += directionS[0][2];
//向右移动i = directionS[1][0];
i != directionS[1][1] ;
i += directionS[1][2];
//向上移动i = 1;
i != 4 ;
i++
//向下移动i = 2;
i != -1;
i--
int mydirection = direction % 2;
for(int k = 0;
k < 3;
k++)
{
for (int i = directionS[mydirection][0];
i != directionS[mydirection][1];
i += directionS[mydirection][2])
{
for (int j = 0;
j < 4;
j++)
{
if (direction / 2 == 0)
{
//横向移动
if (square[j][i] != 0)
{
judge(j, i, direction);
//getch();
}
}
else
{
//纵向移动
if (square[i][j] != 0)
{
judge(i, j, direction);
//getch();
}
}
}
}
sleep(80);
}
//生成一个新的方块
randSquare();
step += 1;
printScore();
}int judge(int x, int y, int direction)
{
int toX = x + directionXY[direction][0];
int toY = y + directionXY[direction][1];
if (square[toX][toY] == 0 || square[toX][toY] == square[x][y])
{
if(square[toX][toY] != 0)
{
score += square[x][y] * square[x][y];
}
square[toX][toY] += square[x][y];
square[x][y] = 0;
gotoxy(locationX[toX],locationY[toY]);
printf("%4d", square[toX][toY]);
gotoxy(locationX[x],locationY[y]);
printf("%4d", square[x][y]);
return 1;
}
else
{
return 0;
}
}//游戏函数
//左 右 上 下
//0123
void play()
{
char ch;
for (;
alive;
)
{
ch = 'o';
if (kbhit())
{
ch = getch() | 32;
}
switch (ch)
{
case 'w': //向上移动
move(2);
break;
case 's'://向下移动
move(3);
break;
case 'a'://向左移动
move(0);
break;
case 'd'://向右移动
move(1);
break;
default://不进行移动
break;
}
sleep(20);
gotoxy(15, 20);
}
}void printScore()
{
gotoxy(6, 28);
printf("%10d", step);
gotoxy(10, 28);
printf("%10d", score);
}//打印棋盘
void printSquare()
{
printf("┏━━━━━━━━━━━━━━━━━━┓\n");
printf("┃2048 小游戏┃\n");
printf("┗━━━━━━━━━━━━━━━━━━┛\n");
printf("┏━━┳━━┳━━┳━━┓┏━━━━━┓\n");
printf("┃0┃0┃0┃0┃┃步数┃\n");
printf("┣━━╋━━╋━━╋━━┫┣━━━━━┫\n");
printf("┃0┃0┃0┃0┃┃0┃\n");
printf("┣━━╋━━╋━━╋━━┫┣━━━━━┫\n");
printf("┃0┃0┃0┃0┃┃得分┃\n");
printf("┣━━╋━━╋━━╋━━┫┣━━━━━┫\n");
printf("┃0┃0┃0┃0┃┃0┃\n");
printf("┗━━┻━━┻━━┻━━┛┗━━━━━┛\n");
printf("┏━━━━━━━━━━━┓┏━━━━━┓\n");
printf("┃时长:00:00:00┃┃徐络络┃\n");
printf("┗━━━━━━━━━━━┛┗━━━━━┛\n");
}//初始化函数
void init()
{
srand(time(NULL));
printSquare();
//时间相关全局变量
t_hour = 0;
t_min = 0;
t_sec = 0;
t_ms = 0;
//得分相关全局变量
score = 0;
//步数相关全局变量
step = 0;
for (int i = 0;
i < squareSize;
i++)
{
for(int j = 0;
j < squareSize;
j++)
{
square[i][j] = 0;
}
}
//随机生成一个2或者4
randSquare();
}//随机生成一个方块
void randSquare()
{
int x = rand() % 4;
int y = rand() % 4;
int number = rand() % 2 + 1;
int legal = 0;
number *= 2;
if (square[x][y] != 0)
{
for (int i = 0;
i < 4 && !legal;
i++)
{
for (int j = 0;
j < 4 && !legal;
j++)
{
if (square[i][j] == 0)
{
gotoxy(locationX[i], locationY[j]);
printf("%4d", number);
square[i][j] = number;
legal = 1;
}
}
}
}
else
{
gotoxy(locationX[x], locationY[y]);
printf("%4d", number);
square[x][y] = number;
legal = 1;
}
if (legal == 0)
{
alive = 0;
}
gotoxy(15, 20);
}int main()
{
//先初始化
init();
//开始游戏
play();
//游戏结束 光标移动至游戏界面最下方
gotoxy(15, 20);
//暂停
printf("游戏结束!");
getch();
return 0;
}
推荐阅读
- C/C++|孪生素数——C语言实现
- 常用的七大排序算法
- COMP2401 simulator
- C/C++程序员进阶课堂|纯新网络编程教学
- 学习态度|为什么C++比C语言麻烦这么多,程序员笑了(这些点你知道吗())
- MIPS simulator 项目
- STM32实验讲解|STM32控制舵机讲解,从入门到放弃。
- C/C++|std::is_trivially_destructible
- 蓝桥杯学习|部分和(dfs)