2048 小游戏 主要是针对逻辑思维的一个训练.
主要学习方面:1.随机数产生的概率.2.行与列在进行移动的时候几种情况.3.MessageBox的使用
#include
#include
#include
#include
using namespace std;
int board[4][4] = {0};//二维数组
int if_need_rand;//是否生成随机数
int if_game_over;//游戏结束
void showGame() {//打印边框
system("cls");//刷新屏幕
printf("┏━━━┳━━━┳━━━┳━━━┓\n");
for (int i = 0; i < 4; i++) {
printf("┃");
for (int j = 0; j < 4;j++) {
if (board[i][j]==0) {
printf(" ┃");
}
else {
printf("%3d┃",board[i][j]);
}
}
if (i<3) {
printf("\n┣━━━╋━━━╋━━━╋━━━┫\n");
}
else {
printf("\n┗━━━┻━━━┻━━━┻━━━┛\n");
}
}
}
//设计随机数
void addRand() {
//随机数种子
srand((unsigned)time(NULL));
int i, j;//行列
while (1) {
i = rand() % 4;
j = rand() % 4;
if (board[i][j]==0) {
//三目运算符,几率时2分之一
board[i][j] = (rand() % 3 ? 2 : 4);
break;
}
else {
continue;
}
}
}
//初始化
void initGame() {
if_need_rand = 1;
if_game_over = 0;
int i, j;
i = rand() % 4;
j = rand() % 4;
board[i][j] = 2;
//将数组内值,赋值为0;重新初始化
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; j++) {
board[i][j] = 0;
}
}
addRand();
showGame();
}
//方向分为上下左右
//左移
void moveleft() {
for (int i = 0; i < 4;i++) {
for (int j = 1, k = 0; j < 4;++j) {
//先找到K项后面第一个不为0的项
if (board[i][j]!=0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[i][k]==board[i][j]) {
board[i][k++] <<= 1;//k++先赋值给k而后k++到下一个位置,进行判断
board[i][j] = 0;
if_need_rand = 1;
}else
//k项是0
if (board[i][k]==0) {
board[i][k] = board[i][j];
board[i][j] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[i][++k] = board[i][j];
if (j!=k) {
board[i][j] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//右移
void moveRinght() {
for (int i = 0; i < 4; i++) {
for (int j = 2, k = 3; j >= 0; j--) {
//先找到K项后面第一个不为0的项
if (board[i][j] != 0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[i][k] == board[i][j]) {
board[i][k--] <<= 1;
board[i][j] = 0;
if_need_rand = 1;
}
else
//k项是0
if (board[i][k] == 0) {
board[i][k] = board[i][j];
board[i][j] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[i][--k] = board[i][j];
if (j != k) {
board[i][j] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//上移
void moveup() {
for (int i = 0; i < 4; i++) {
for (int j = 1, k = 0; j < 4; ++j) {
//先找到K项后面第一个不为0的项
if (board[j][i] != 0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[k][i] == board[j][i]) {
board[k++][i] <<= 1;
board[j][i] = 0;
if_need_rand = 1;
}
else
//k项是0
if (board[k][i] == 0) {
board[k][i] = board[j][i];
board[j][i] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[++k][i] = board[j][i];
if (j != k) {
board[j][i] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//下移
void moveDown() {
for (int i = 0; i < 4; i++) {
for (int j = 2, k = 3; j >=0; --j) {
//先找到K项后面第一个不为0的项
if (board[j][i] != 0) {
//分为三个情况.相等,k项是0,不等
//相等
if (board[k][i] == board[j][i]) {
board[k--][i] <<= 1;
board[j][i] = 0;
if_need_rand = 1;
}
else
//k项是0
if (board[k][i] == 0) {
board[k][i] = board[j][i];
board[j][i] = 0;
if_need_rand = 1;
}
//k项与j项不等,有两种情况,j项就在k项后边,
//所以不能将j项赋值为0
else {
board[--k][i] = board[j][i];
if (j != k) {
board[j][i] = 0;
if_need_rand = 1;
}
}
}
}
}
}
//查看有没有空着的格子
int getNull() {
int n = 0;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
if (board[i][j] == 0) {
n++;
}
}
}
return n;
}
//比较相邻的两个数,是否相等
void gameOver() {
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 3; ++j) {
if (board[i][j] == board[i][j + 1] || board[j][i] == board[j + 1][i]) {
if_game_over = 0;
return;
}
}
}
if_game_over = 1;
}
//执行函数
void startGame() {
on:
initGame();
while (1) {
if_need_rand = 0;//首先将随机值设为0.
switch (_getch())
{
case 'a':
case 'A':
case 75:
moveleft();
break;
case 'd':
case 'D':
case 77:
moveRinght();
break;
case 'w':
case 'W':
case 72:
moveup();
break;
case 's':
case 'S':
case 80:
moveDown();
default:
break;
}
if (if_need_rand) {
addRand();
showGame();
}
//游戏判断
if (getNull()==0) {
gameOver();
if (if_game_over) {
if (MessageBox(NULL,L"是否重来一局!",L"游戏结束",MB_YESNO)==IDYES) {
goto on;
}
else {
return;
}
}
}
}
}
int main() {
startGame();
return 0;
}
C语言小游戏: 2048.c
概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...
简单的C语言猜数字小游戏
猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include
【源码项目+解析】C语言/C++开发,打造一个小项目扫雷小游戏!
一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才200行左右,不过考虑到这是我精简过后的,浓缩才是精华嘛,我就发出来大家一起学习啦,看到程序跑起来能玩,感觉还是蛮有成就感的 ...
JavaScript小游戏--2048(PC端)
1.初始化棋局 $(document).ready(function() { prepare_for_mobile(); //适配移动端 new_game(); }); 2.开始新游戏 functio ...
【C语言程序设计】小游戏之俄罗斯方块(一)!适合初学者上手、练手!
俄罗斯方块的核心玩法非常简单,所以制作起来并不是很复杂,我准备先用2篇文字的篇幅详细讲解一下俄罗斯方块的制作方法. 今天咱们算是第一篇,主要讲解俄罗斯方块中如何定义方块,以及如何实现方块的移动.旋转. ...
【C语言程序设计】小游戏之俄罗斯方块(二)!适合初学者上手、练手!
第二篇,主要实现俄罗斯方块中的主体部分,包括容器的数据结构以及容器的相关操作,特别是大方块和容器之间的交互逻辑,包括碰撞检测,消除检测等等. 1. 容器的表示 大方块的实现涉及到位运算,而容器同样如此 ...
python项目实战-小游戏1
项目规则: 1.玩家和敌人分别从现有的角色中选择3个角色 2.随机生成目前的血量,和攻击量 3.游戏规则:当玩家向敌人发起攻击,敌人当前的血量=之前的血量-玩家的血量,同理 4.3局两胜 5.自定义玩 ...
Java_太阳系_行星模型_小游戏练习_详细注释
//实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...
用C++、Qt实现的小游戏2048
窗口布局与游戏截图: 实现思路: 1.使用二维数组模拟整个游戏网格,并将二维数组中每个数的大小用作游戏中每个网格中的数据. 2.将对游戏的数据及数据的操作(即玩家的操作对游戏数据的影响)作为一个类,游 ...
随机推荐
SQL基础--同义词
同义词的概念: 同义词是Oracle对象的别名,使用同义词访问相同的对象 可以为表.视图.存储过程.函数或另一同义词等对象创建同义词 方便访问其它用户的对象,隐藏了对象的身份 缩短对象名字的长度 同义 ...
ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习
一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留 ...
[IT新应用]存储入门-文件级存储及块级别存储的选择
http://www.techrepublic.com/blog/the-enterprise-cloud/block-level-storage-vs-file-level-storage-a-co ...
利用javascript调用摄像头,可以配合socket开发监控系统