c语言小游戏怎么随机设置障碍,c语言----<项目>_小游戏<2048>

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语言小游戏&colon; 2048&period;c

概要:2048.c是一个C语言编写的2048游戏,本文将详细分析它的源码和实现.C语言是一种经典实用的编程语言,本身也不复杂,但是学会C语言和能够编写实用的程序还是有一道鸿沟的.本文试图通过一个例子展 ...

简单的C语言猜数字小游戏

猜数字小游戏可谓是C语言最为基础的一个知识点了,我们可以在此基础上进行延伸,实现随机数的猜测,然后是加入再来一局的模式,等等.这里是抛砖引玉,希望你能做出你的经典之作. #include

【源码项目&plus;解析】C语言&sol;C&plus;&plus;开发,打造一个小项目扫雷小游戏!

一直说写个几百行的小项目,于是我写了一个控制台的扫雷,没有想到精简完了代码才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&lowbar;太阳系&lowbar;行星模型&lowbar;小游戏练习&lowbar;详细注释

//实现MyFrame--实现绘制窗口,和实现重写 重画窗口线程类 package cn.xiaocangtian.Test; import java.awt.Frame; import java.a ...

用C&plus;&plus;、Qt实现的小游戏2048

窗口布局与游戏截图: 实现思路: 1.使用二维数组模拟整个游戏网格,并将二维数组中每个数的大小用作游戏中每个网格中的数据. 2.将对游戏的数据及数据的操作(即玩家的操作对游戏数据的影响)作为一个类,游 ...

随机推荐

SQL基础--同义词

同义词的概念: 同义词是Oracle对象的别名,使用同义词访问相同的对象 可以为表.视图.存储过程.函数或另一同义词等对象创建同义词 方便访问其它用户的对象,隐藏了对象的身份 缩短对象名字的长度 同义 ...

ASP&period;Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留 ...

&lbrack;IT新应用&rsqb;存储入门-文件级存储及块级别存储的选择

http://www.techrepublic.com/blog/the-enterprise-cloud/block-level-storage-vs-file-level-storage-a-co ...

利用javascript调用摄像头,可以配合socket开发监控系统

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值