推箱子源代码

推箱子源代码
推箱子源代码

#include

#include

#include

#include

#include

using std::cout;

using std::endl;

#ifndef SOKOBAN_H_ //防止文件重复包含

#define SOKOBAN_H_

#include

using std::queue;

//每一步的数据类型

struct node

{

int bx, by; //箱子的坐标

int px, py; //人的坐标

};

//推箱子类

class Sokoban

{

private:

enum {L = 15, H = 7};

char GameMap[H][L]; //地图

int Pex, Pey; //人的位置

int Boxx, Boxy; //箱子的位置

int Succeed, Prove; //是否成功到目的地, 是否可玩性

int dx[4], dy[4]; //方向数组

protected:

char Empty;

char People;

char Box;

char Block;

char Target;

int dir; //记录按键方向

node s, e;

public:

Sokoban(); //构建函数

~Sokoban() {} //析构函数,即为inline

//地图初始化函数

void Initial();

//箱子路劲验证函数,参数为箱子坐标(bx,by),人坐标(px,py) void Box_Bfs(int bx, int by, int px, int py);

//人路劲验证函数,人所到的目的地(ex,ey)

bool People_Bfs(int ex, int ey);

//地图刷新函数

void Show();

//按键判断函数

void Button();

//箱子人移动函数

void Move();

//验证越界函数

bool Check(int x, int y);

};

#endif

 Sokoban::Sokoban() //构建函数即对变量初始化

{

dir = -1;

Succeed = Prove = 0;

memset(GameMap, '.', sizeof(GameMap));

Empty = '.';

People = 'P';

Box = '#';

Block = '*';

Target = 'T';

//方向依次为上右下左

dx[0] = -1; dx[1] = 0; dx[2] = 1; dx[3] = 0;

dy[0] = 0; dy[1] = 1; dy[2] = 0; dy[3] = -1;

//随机种子,使程序每次运行时所产生的随机数不同srand(time(0));

}

//地图初始化函数

void Sokoban::Initial()

{

int count = 0, x, y;

//对地图中随机产生25个阻碍物

while(count != 25)

{

x = rand()%H;

y = rand()%L;

if(GameMap[x][y] == Empty)

{

GameMap[x][y] = Block;

count++;

}

}

while(true) //随机产生人开始的位置

{

x = rand()%H;

y = rand()%L;

if(GameMap[x][y] == Empty)

{

GameMap[x][y] = People;

Pex = x;

Pey = y;

break;

}

}

while(true) //随机产生箱子开始的位置

{

x = rand()%H;

y = rand()%L;

//不让箱子在地图的边界处

if(GameMap[x][y] == Empty && x != 0 && y != 0

&& x != H-1 && y != L-1)

{

GameMap[x][y] = Box;

Boxx = x;

Boxy = y;

break;

}

}

while(true) //随机产生目标的位置

{

x = rand()%H;

y = rand()%L;

if(GameMap[x][y] == Empty)

{

GameMap[x][y] = Target;

break;

}

}

//对游戏地图检查是否可将箱子推到目的地,即判断游戏可玩性Sokoban::Box_Bfs(Boxx, Boxy, Pex, Pey);

//如游戏不可玩,即再随机产生地图

if(!Prove)

{

memset(GameMap, '.', sizeof(GameMap)); Sokoban::Initial();

}

else

Sokoban::Show();

}

//箱子路劲验证函数

//用BFS算法对箱子验证是否可到目的地

void Sokoban::Box_Bfs(int bx, int by, int px, int py)

{

queue_Box; //创建箱子队列

//visit对上一步走到下一步的记录,防止箱子走重复路劲

//visit[i][j][z][k]表示箱子从点(i,j)到点(z,k)

//visit[][][][]为0时表示为走过,1时表示已走过

int visit[H][L][H][L];

memset(visit, 0, sizeof(visit)); //visit数组初始化

s.bx = bx; s.by = by; //将起始的箱子、人位置放入队列

s.px = px; s.py = py;

_Box.push(s);

int pe_x, pe_y;

while(!_Box.empty()) //队列为空时跳出

{

s = _Box.front();

_Box.pop();

if(GameMap[s.bx][s.by] == Target) //到达目的地

{

Prove = 1;

break;

}

for(int i = 0; i < 4; i++)

{

e.bx = s.bx + dx[i]; e.by = s.by + dy[i];

switch(i) //人推箱子的位置

{

case 0: pe_x = s.bx + dx[2]; pe_y = s.by + dy[2]; break;

case 1: pe_x = s.bx + dx[3]; pe_y = s.by + dy[3]; break;

case 2: pe_x = s.bx + dx[0]; pe_y = s.by + dy[0]; break;

case 3: pe_x = s.bx + dx[1]; pe_y = s.by + dy[1]; break;

}

//验证箱子和人的位置的合法性

if(!Check(e.bx, e.by) || !Check(pe_x, pe_y)

|| GameMap[e.bx][e.by] == Block || GameMap[pe_x][pe_y] == Block

|| visit[s.bx][s.by][e.bx][e.by] )

continue;

//如人可推箱子即进入队列

if(Sokoban::People_Bfs(pe_x, pe_y))

{

//保存人推箱子后的位置

e.px = pe_x; e.py = pe_y;

_Box.push(e);

visit[s.bx][s.by][e.bx][e.by] = 1; //箱子路劲的标记

}

}

}

}

//人路劲验证函数

//用BFS算法对人验证是否可推箱子

bool Sokoban::People_Bfs(int ex, int ey)

{

queue_People;

node t, end;

//visit数组对人的路劲进行标记,0为未走过,1为走过

int visit[H][L];

//visit数组初始化为0

memset(visit, 0, sizeof(visit));

t.px = s.px; t.py = s.py; //人初始位置进入队列

_People.push(t);

visit[t.px][t.py] = 1;

while(!_People.empty()) //对立为空时跳出

{

t = _People.front();

_People.pop();

if(t.px == ex && t.py == ey) //人可到达(ex,ey)该点

return 1;

for(int i = 0; i < 4; i++)

{

end.px = t.px + dx[i]; end.py = t.py + dy[i];

//检查人的位置合法性

if(!Check(end.px, end.py) || GameMap[end.px][end.py] == Block || GameMap[end.px][end.py] == Box || visit[end.px][end.py])

continue;

//进入队列

_People.push(end);

visit[end.px][end.py] = 1; //记录

}

}

return 0;

}

//地图刷新函数

void Sokoban::Show()

{

int i, j;

while(true)

{

//每半秒刷新一次地图

clock_t s = clock();

while(clock() - s < CLOCKS_PER_SEC/2)

;

//先判断按键在移动

Sokoban::Button();

Sokoban::Move();

system("cls");

for(i = 0; i < H; i++)

{

for(j = 0; j < L; j++)

cout << GameMap[i][j];

cout << endl;

}

cout << endl;

cout << "\n**********************************" << endl; cout << "* 小小C++语言推箱子游戏*" << endl; cout << "* 游戏规则: *" << endl;

cout << "* P: 人#: 箱子*" << endl;

cout << "* *: 障碍物T: 目的地*" << endl; cout << "**********************************" << endl;

cout << "* 每次游戏地图不一样*" << endl;

cout << "* 人将箱子推到目的地即过关*" << endl;

cout << "*所给地图,一定可过关,请慎重移箱子*" << endl;

cout << "* 箱子无路可走时,机器不会提示*" << endl;

cout << "**********************************" << endl;

//箱子成功到达目的地

if(Succeed)

{

cout << "\n ^_^ >_<" << endl;

cout << "恭喜过关成功! 再来一盘吧" << endl;

getchar();

break;

}

}

}

//按键判断函数

void Sokoban::Button()

{

int key;

if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 {

while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主key = getch(); //将按键从控制台中取出并保存到key中

switch(key)

{

//上

case 72: dir = 0;

break;

//右

case 77: dir = 1;

break;

//下

case 80: dir = 2;

break;

//左

case 75: dir = 3;

break;

}

}

}

//人推箱子移动函数

void Sokoban::Move()

{

int x, y;

//有按键时

if(dir != -1)

{

//人所推向的位置坐标

x = Pex + dx[dir]; y = Pey + dy[dir];

//人所推位置为空,即走向该位置

if(Check(x, y) && GameMap[x][y] == '.')

{

GameMap[Pex][Pey] = '.'; //人的位置改变

GameMap[x][y] = 'P';

Pex = x; Pey = y;

dir = -1; //按键记录为无即-1

}

else //人所推位置为箱子,即将箱子推向该方向的前面这点if(Check(x, y) && GameMap[x][y] == '#'

&& Check(x+dx[dir], y+dy[dir])

&& GameMap[ x+dx[dir] ][ y+dy[dir] ] == '.')

{

GameMap[Boxx][Boxy] = '.'; //箱子的位置改变

GameMap[x+dx[dir] ][ y+dy[dir] ] = '#';

Boxx = x + dx[dir]; Boxy = y + dy[dir];

GameMap[Pex][Pey] = '.'; //人的位置改变

GameMap[x][y] = 'P';

Pex = x; Pey = y;

dir = -1;

}

else //将箱子推向该方向的前面这点为目的地

if(Check(x, y) && GameMap[x][y] == '#'

&& Check(x+dx[dir], y+dy[dir])

&& GameMap[ x+dx[dir] ][ y+dy[dir] ] == 'T') {

GameMap[Boxx][Boxy] = '.'; //箱子的位置改变

GameMap[x+dx[dir] ][ y+dy[dir] ] = '#';

Boxx = x + dx[dir]; Boxy = y + dy[dir];

GameMap[Pex][Pey] = '.'; //人的位置改变

GameMap[x][y] = 'P';

Pex = x; Pey = y;

dir = -1;

Succeed = 1; //记录成功到达目的地

}

}

}

//判断越界情况

bool Sokoban::Check(int x, int y)

{

if(x < 0 || x >= H || y < 0 || y >= L)

return 0;

else

return 1;

}

#include

//#include "Sokoban.h"

using namespace std;

int main()

{

Sokoban s;

s.Initial();

return 0;

}

c语言推箱子代码

#include #include void map1(); void map2(); void map3(); void show(); void move(); void main(int argc,char*argv[]) { time_t a,b; time(&a); system("color 1E"); loop1: { system("cls");//刷屏 printf("\n\n\n\n\n\n\t\t\t\t欢迎进入推箱子游戏\n\n\t\t\t\t 请按a b c选择游戏\n\n\t\t\t\t 按 d 键结束"); int t=getch(); if(t=='d') { printf("\n\t\t\t "); } else { if(t=='a') { map1(); goto loop1; } if(t=='b') { map2(); goto loop1; } if(t=='c') { map3(); goto loop1; } else { printf("\n\n\t\t\t\t 请重新输入:"); goto loop1; } }

time(&b); printf("\n\n\n\n\t\t\t\t 游戏总共用时%.3d秒\n\t\t\t ",b-a); getch();//等待读取回车符以结束程序 } void map1() { time_t p,q,o; time(&p); int i=4,j=4,m=6,n=2,t=1,k=3; system("cls");//刷屏 system("color 2E"); int x=1,y=7; char z,a[9][9]= { /*为背景设置初始资料*/ {'#','#','#','#','#','#','#','#','#'}, {'#','#','#', 3, 0 , 0 , 0 , 1 ,'#'}, {'#','#', 0 , 0 , 0 ,'#', 0 ,'#','#'}, {'#', 0 , 0 ,'#', 0 , 0 , 5 , 0 ,'#'}, {'#', 0 , 5 , 5 , 3 , 0 , 0 , 0 ,'#'}, {'#','#', 0 ,'#', 0 , 0 ,'#','#','#'}, {'#','#', 3 , 0 , 0 , 0 ,'#','#','#'}, {'#','#','#','#','#','#','#','#','#'}, {'#','#','#','#','#','#','#','#','#'} }; show(a);//调用输出函数 loop://语句标号 move(a,&x,&y,i,j,m,n,t,k,&z); if(a[i][j]=='!'&&a[m][n]=='!'&&a[t][k]=='!') { system("cls");//刷屏 show(a); printf("\t\t\t\t YOU ARE WIN!\n"); time(&q); printf("\t\t\t\t\t 用时%.3d秒\n",q-p); printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t"); getch(); } else { time(&o); if(z=='d') { return;

推箱子java代码

import java.util.*; import java.io.*; public class Main{ int r;//地图行数 int c;//地图列数 int begx, begy;//箱子开始坐标 int endx, endy;//目标坐标 int begsx, begsy;//人开始坐标 char map[][];//地图 int[] dx ={-1, 1, 0, 0};//人和箱子都有四个方向可移动 int[] dy ={0, 0, 1, -1}; char[] P ={'N', 'S', 'E', 'W'};//表示箱子向某个方向移动 char[] M ={'n', 's', 'e', 'w'};//表示人向某个方向移动 Node f=new Node(0,0,0,0,""); Node g=new Node(0,0,0,0,""); node1 F=new node1(0,0,""); node1 G=new node1(0,0,""); int mark[][];//标志数组,表示地图上某一位置mark[i][j]是否访问过。 public Main(char[][] map,int r,int c,int begx,int begy,int endx,int endy,int begsx,int begsy){ this.map=map; this.r=r; this.c=c; this.begx=begx; this.begy=begy; this.endx=endx; this.endy=endy; this.begsx=begsx; this.begsy=begsy; mark=new int[r][c]; } public boolean ok(int x,int y) { if (x >= 0 && x < r && y >= 0 && y < c) return true; return false; } public boolean SToB(int bx,int by,int ex, int ey) {//人到箱子BFS int[][] Mark1= new int[r][c]; //标志数组,表示地图上某一位置Mark1[i][j]是否访问过。 Queue P = new LinkedList();

推箱子游戏报告书

推箱子游戏设计报告书 一、项目背景 本实训要求对“推箱子游戏”进行分析、设计。 本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。同时,本实训中了解图形界面设计基本技术。 通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。 二、设计目的 本课程的课程设计实际是重在提升学生对程序的理解力和游戏界面的设计能力,进行的一次全面的综合训练,其目的在于加深动手能力以及对游戏设计思想的理解,掌握运用VB 开发应用程序的基本方法及基本技巧。 三、游戏介绍 本游戏设计了关卡设计器对有难度进行设计,同时用方向键↑↓←→控制小人的移动,空格重新开始,回车选择下一关,page up 上一关,page down 下一关,Esc 退回。小人移动来推箱子使箱子到达指定位置,如果箱子全部到达指定位置就表示过关 3.1界面设计 3.1.1界面设计原则: 1用户帮助 2向导 3快捷键 4鼠标与键盘对应 5布局合理化 6显示信息一致性 7界面一致性 8美观与协调性 9合理性 10规范性 11易用性 12一般交互 13数据输入 本游戏是一个简单游戏所以只涉及一些简单的界面设计原则.

3.2用户界面 又称人机界面,实现用户与计算机之间的通信,以控制计算机或进行用户与计算机之间的数据传送的系统部件。 GUI:即图形用户界面,一种可视化的用户界面,它使用图形界面代替正文界面。 本系统坚持图形用户界面(GUI)设计原则,界面直观、对用户透明。用户接触软件后对界面上对应的功能一目了然、不需要多少培训就可以方便地使用本应用系统。

基于VC++的推箱子游戏设计与实现

本科毕业设计(论文) 基于VC++的推箱子游戏设计与实现 学院自动化学院 专业电子信息科学与技术 年级班别2008级(2)班 学号3108001166 学生姓名吕文财 指导教师 ________张学习 ___ __ 2012年6月

基于 VC++ 的推箱子游戏的设计与实现 吕文财 自动化学院

摘要 近年来随着科技的飞速发展, Visual C++语言的应用正在不断深入。Visual C++语言是当今国际上非常流行的计算机高级编程语言之一,它是面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。它更以自动编译功能和高级除错功能著称。因此,广泛受到编程人员青睐。不仅适合作为系统描述语言,也用来编写系统软件,还可以用来编写应用软件和设计游戏等。 本论文着重分析用Microsoft Visual C++语言实现一个较为简单的推箱子游戏,旨在介绍推箱子游戏的实现方法,并逐步介绍Microsoft Visual C++6.0图形编程的方法和技巧。本设计通过主界面对话框类、关口选择对话框类、帮助对话框类三大类以及键盘操作模块、游戏规则模块、地图文件读取模块、背景音乐播放模块、地图绘制模块,共五大模块构成。实现了任意关数选择、难度依次加大、游戏步数记录、背景音乐播放、游戏帮助、胜负判断等多个功能,采用图形函数的使用实现了一个完整的推箱子游戏界面,界面清晰可见。 关键词:推箱子,c++语言,模块,图形编程

JAVA推箱子游戏

淮海工学院计算机工程学院 课程设计报告 设计名称:面向对象课程设计 选题名称:推箱子的设计与实现 系(院):计算机工程学院 设计时间:2014.3.10~2014.4.12 设计地点:软件实验室、教室

(3)功能模块 本程序包括四个功能模块:class mainFrame,class mainpanel,class Sound,class Readmap, 既主面板类,绘图的面板,播放背景音乐,用输入流读取地图文件。class mainpanel 主要是实现地图的初始化以及每一关地图的重载,class Sound主要是播放背景音乐。Adpressed的功能是响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。 表1 成员变量表 成员变量变量类型名称 开始状态Boolean Start 窗口高度int fHeight 窗口宽度int fWidth 计时器Timer timer 延时int delay 开始时间Date starttime 步数int steps 地图容器MapPanel mapPanel 玩法介绍String instruction 开始状态Boolean Start 表2方法表 方法名功能备注 Puzzle() 创建游戏窗口和设置图标 backaction() 后台操作getmap() 返回地图的方法 StartGame() 开始游戏控制,更新开始菜单 endgame() 结束游戏控制弹出结束窗口 getmap()/ 返回地图的方法调用类spite() menuShowClik() 在游戏中显示完整图片调用类class ShowImage actionPerformed() 动作演示 menuExit() 退出游戏 flush() 清空缓存 游戏过程设计 游戏中过程中,最为主要地方在于对地图矩阵,以及主角状态信息(包括位置、行走状态等)的维护,主角每行走一步,就更新一次地图信息和主角状态信息。另外一个比较重要的地方是游戏状态的保存方面。在该游戏中,使用栈结构保存主角每次行走的

使用C语言编写简单小游戏

纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘on line》.它是e 时代常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式 .作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦 ,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1,总是从Hello,world开始学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!".让我们来看看这个最简单的C程序: #incolude <> /*把输入输出函数的头文件包含进来*/ int main() { printf("Hello, world!");/*在屏幕上输出字符串"Hello,world!"*/ return 0;/*退出main函数,并返回0*/ } 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过 .2,每执行这个程序一次都能看见上次运行留下的字符.3,我们还希望屏幕输出一个笑脸来欢迎我们. 让我们来改进一下这个程序吧! 1,在return语句的前面加一句:getch ();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf("%c", 2)来输出一个笑脸. 现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧! 2,心动的开始,一个运动中的笑脸大家小时侯喜欢看动画片吗?哈哈,我猜你们都喜欢吧!下面就让我们来做一个小动画吧.在屏幕上显示一个运动的小笑脸,而且当它到达屏幕的边缘时会自动弹回来.先在程序定义一个在屏幕中运动的点的结构: struct move_point { int x, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/ }; 运动的原理是,先擦去物体先前的轨迹,让物体按其速度移动一段距离,再画出该物体.让我们看到以下代码: gotoxy, ;/*把光标移到指定的坐标*/ printf(" ");/*输出一个空格,把先前的字符擦去*/ 然后我们让物体按其速度运动: += ;/*水平方向按x轴的速度运动*/ += ;/*垂直方向按y轴的速度运动*/ 运动后还要判断物体是否出界,如果出了界,就令物体反弹,即让它下一刻的速度等于现在的速度的相反数.最后打印出这个笑脸: gotoxy, ; printf("%c\b", 2); /*输出ASCII码值为2的"笑脸"字符*/ 怎么样?是不是很有趣呢?不过这个笑脸一直是自己运动,能不能让我们来控制它运动呢?答案是肯定的,让我们继续往下学吧! 3,交互的实现——让我们来控制笑脸运动 这个程序的主要功能是接受按键,如果接收的是方向键,就让笑脸顺着方向移动,如果接收的是ESC键就退出程序,其他按键则忽略处理.接受按键我们用以下两条语句: while (bioskey(1) == 0);/*等待按键*/ key = bioskey(0);/*把接收的按键的键盘码赋给变量key*/ 然后用switch语句来判断按键以及执行相关操作,如下: switch (key) /*对变量key的值进行判断*/ { case UP: /*如果按的是向上键*/ … break; /*让物体向上运动,并退出switch*/

推箱子源代码

#include #include #include #include #include using std::cout; using std::endl; #ifndef SOKOBAN_H_ //防止文件重复包含 #define SOKOBAN_H_ #include using std::queue; //每一步的数据类型 struct node { int bx, by; //箱子的坐标 int px, py; //人的坐标 }; //推箱子类 class Sokoban { private: enum {L = 15, H = 7}; char GameMap[H][L]; //地图 int Pex, Pey; //人的位置 int Boxx, Boxy; //箱子的位置 int Succeed, Prove; //是否成功到目的地, 是否可玩性 int dx[4], dy[4]; //方向数组 protected: char Empty; char People; char Box; char Block; char Target; int dir; //记录按键方向 node s, e; public: Sokoban(); //构建函数 ~Sokoban() {} //析构函数,即为inline //地图初始化函数 void Initial(); //箱子路劲验证函数,参数为箱子坐标(bx,by),人坐标(px,py) void Box_Bfs(int bx, int by, int px, int py); //人路劲验证函数,人所到的目的地(ex,ey)

C语言推箱子小游戏程序

推箱子程序: #include #include #include #define U 1 #define D 2 #define L 3 #define R 4 //按键状态,U:上;D:下;L:左R:右 #define ofx 10 #define ofy 9 //x,y方向偏移量 typedef struct MAP //地图 { int wall[50][2]; //墙 int box[9][2]; //箱子 int des[9][2]; //终点 int overlap[9][2];//箱子与终点的重叠位置 int all,now; //总箱子个数,到位箱子个数 int x,y; //起点 }MAP,*map; //全局变量// int player[2]; //玩家位置 int nextp[2],nextb[2]; //玩家下一步位置,箱子下一步位置 MAP Pass[5]; //关卡数组 map Group,p; //关卡数组指针,当前关卡指针 int level; //关卡等级 int status; //玩家状态 int boxc[9][2],overlapc[9][2]; //箱子状态栈,重叠箱子状态栈 int nowbox; //当前到位箱子个数 int regame; //是否重玩 //声明全部函数// void Pos(int x,int y); //设置光标位置 void welcometogame(); //开始界面 void initgame(); //初始化游戏 void startgame(); //开始游戏 void copybox(int copy[9][2],int b[9][2]); //复制箱子信息 void loadmap(); //加载地图 void printfoverlap(int b[9][2]); //打印重叠箱子位置 void move(); //玩家移动 void trans(int p[2],int q[2]); //状态传递 void inputmap(int a[][2]); //输入地图数据 void gamecircle(); //控制游戏 int main() { system("mode con cols=80 lines=30"); //控制台宽度80,高度30

C语言编写小程序

教你如何使用C语言编写简单小游戏 编辑:匿名发布时间:2011年9月6日留言(0) 纯真童趣的《泡泡堂》,还有武林情仇,笑傲江湖的《剑侠情缘on line》.它是e时代常谈的话题,是交互式娱乐的主力军,是一种高层次的综合艺术,更是一个民族的文化,世界观的全新传播方式.作为游戏玩家的我们,是不是想设计一个属于自己的游戏呢? 爱玩是人的天性,而C语言是我们计算机专业都要学习的一门基础学科.一般来说,是比较枯燥的.那么,我们能不能通过编一些小游戏来提高它的趣味性呢?这样学习程序设计,就不会是一件艰苦,枯燥的事,它变得象电脑游戏一样充满好奇,富有乐趣. 1,总是从Hello,world开始学习编程的第一个程序,一般就是打印一个亲切的词语——"Hell o,world!".让我们来看看这个最简单的C程序: #incolude/*把输入输出函数的头文件包含进来*/ int main() { printf("Hello, world!");/*在屏幕上输出字符串"Hello,world!"*/ return0;/*退出main函数,并返回0*/ } 下面我们发现几个值得改进的地方,1,程序的运行结果一闪而过.2,每执行这个程序一次都能看见上次运行留下的字符.3,我们还希望屏幕输出一个笑脸来欢迎我们.让我们来改进一下这个程序吧! 1,在return语句的前面加一句:getch();,表示按任意键结束.2,在printf语句前用clrscr函数清屏,要使用这个函数和getch函数,需要在程序开头再包含头文件conio.h.3,ASCII码也有许多非常好玩的字符,比如ASCII码值为2的就是一个笑脸,我们可以用printf("%c",2)来输出一个笑脸.现在我们把Hello,world程序改成一个更好看的Hello,world了.下面让我们开始做游戏吧!

用java实现推箱子(sokoban)游戏

推箱子游戏 一、功能描述: 可以通过面板上的按钮或是键盘上的pageup,pagedown键选择上下关 可以通过面板上按钮或是键盘上的Backspace键后退,一直后退自己想要的位置,知道游戏开始时的位置。 可以通过面板上的按钮或是键盘上的字母r重新开始当前关卡游戏。 可以在复选框内选择想要玩的关卡。 二、界面及运行截图

三、源代码(三部分) 1、地图类 package box; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader;//读取字符文件类FileReader import java.io.IOException; public class map { int[][] map=new int[20][20]; int manX,manY;

public map(int level){ String filepath="mapc/"+level+".txt"; File file = new File(filepath); FileReader fr = null;//利用FileReader流来读取一个文件中的数据 BufferedReader br = null;//字符读到缓存里 try { fr = new FileReader(file); br = new BufferedReader(fr); for (int i = 0; i < 15; i++){ String line = br.readLine();//以行为单位,一次读一行利用BufferedReader 的readLine,读取分行文本 byte[] point = line.getBytes();//将字符串转换为字节数组 for (int j = 0; j < 15; j++) { map[i][j] = point[j] - 48;// 根据ASCall码表要减掉30H(十进制的48) if (map[i][j] == 5 || map[i][j] == 6 || map[i][j] == 7|| map[i][j] == 8){ manX = i; manY = j; } } } } catch (FileNotFoundException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch (IOException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch(NullPointerException e){ e.printStackTrace();//深层次的输出异常调用的流程 } finally { if (br == null){ try{ br.close(); } catch (IOException e){ e.printStackTrace(); } br = null; } if (fr == null){ try {

推箱子--Java课程设计

《面向对象程序设计》 课程设计报告 题目:经典推箱子趣味游戏设计与实现 院(系):信息科学与工程学院 专业班级:计算机科学与技术1201班 学生姓名:程伟 学号:20121183011 指导教师:吴奕 20 14 年 12 月 29 日至20 15 年 1 月 9 日 华中科技大学武昌分校制

面向对象程序设计课程设计任务书

目录 1需求与总体设计 (1) 1.1需求分析 (1) 1.2总体设计 (2) 2详细设计 (4) 2.1 mainFrame类 (4) 2.2 mainpanel类 (5) 2.3S o u n d类 (7) 2.4 Readmap类 (7) 3 编码实现 (9) 3.1游戏源码 (9) 4系统测试 (42) 总结 (45)

1需求与总体设计 1.1需求分析 1.1.1功能结构图 推箱子游戏的功能结构图如图1.1所示。 在系统中,编写4个Java类:mainFrame,mainpanel,Sound,Readmap;分别对应初始化游戏界面,游戏操作,背景音乐,绘制地图。 图1.1

1.1.2 UML类图 推箱子系统除了上述4个Java类外,还需要Java系统提供的一些重要的类。这些类之间的UML图如图1.2所示。 图1.2 1.2总体设计 1.2.1 mainFrame类 mainFrame类负责创建系统的主窗口。mainFrame类有多种重要类型的对象,这些对象构成了游戏界面的简明与美观,并且通过监听实现方法赋予了这些组件的相应功能。MainFrame类通过调用Readmap类来实现将地图绘制在游戏主界面,通过调用Sound 类来实现对背景音乐的管理,实现音乐开关以及选择上一曲下一曲的操作。 设计中包括了所有你所能直观见到的图形界面,窗体的大小,下拉菜单中的功能菜单,使得玩家能够很直观的见到所有游戏中的功能.界面中有菜单, 包括:"选项""设置音乐""帮助"。按钮包括:"重来""悔一步""第一关""上一关""下一关""最终关""选关""音乐"等。 1.2.2 mainpanel类 Mainpanel类中集成了小人与箱子的移动规则,并且还包含了对键盘操作移动的响应方法。在本游戏系统中,给人的视觉感受应该是能感受都动作的变化,逼真的人物动作会使系统更有效.通过控制人物,箱子,空地,障碍物在数组中的位置的改变来控制移动

推箱子游戏代码

#include #include #include #include #include #include typedef struct winer { int x,y; struct winer *p; }winer; char status [20][20]; char far *printScreen=(char far* )0xB8000000; void putoutChar(int y,int x,char ch,char fc,char bc); void printWall(int x, int y); void printBox(int x, int y); void printBoxDes(int x, int y); void printDestination(int x, int y); void printDestination1(int x,int y,winer **win,winer **pw); void printMan(int x, int y); void init(); winer *initStep1(); winer *initStep2(); winer *initStep3(); winer *initStep4(); void moveBoxSpacetoSpace(int x ,int y, char a); void moveBoxDestoSpace(int x ,int y, char a) ; void moveBoxSpacetoDes(int x, int y, char a); void moveBoxDestoDes(int x, int y, char a); int judge(int x, int y); void move(int x, int y, char a); void reset(int i); void putoutChar(int y,int x,char ch,char fc,char bc) { printScreen[(x*160)+(y<<1)+0]=ch; printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; } void printWall(int x,int y) { putoutChar(y-1,x-1,219,GREEN,BLACK); status[x][y]='w'; } void printBox(int x,int y) { putoutChar(y-1,x-1,10,WHITE,BLACK); status[x][y]='b'; } void printDestination1(int x,int y,winer **win,winer **pw) {

java推箱子游戏源代码(含推箱子的判断)

第一个Java文件: package xiaoA; import java.awt.Color; import java.awt.HeadlessException; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; public class GameFrame extends JFrame { JPanel zhuobu = new JPanel(); //工人 JLabel worker = null; //箱子 JLabel box = null; //目的地 JLabel goal = null; JLabel[] walls = null; public static final int SPEED = 12; //设置图片大小 int imgSize = 48; public void setImgSize(int imgSize){ this.imgSize = imgSize; } public GameFrame(String title) throws HeadlessException { super(title); //构造方法中调用本类的其它方法 this.initContentPane(); this.addKeyListener(new KeyListener() { //键盘按下事件 public void keyPressed(KeyEvent e) { //[2.5] 使工人可以移动 int xSpeed = 0, ySpeed = 0; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT :

c语言推箱子代码

#i n c l u d e<> #include <> void map1(); void map2(); void map3(); void show(); void move(); void main(int argc,char*argv[]) { time_t a,b; time(&a); system("color 1E"); loop1: { system("cls");d秒\n\t\t\t ",b-a); getch();d秒\n",q-p); printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t"); getch();

} else { time(&o); if(z=='d') { return; } if(o-p>30) { loop1: system("cls");d秒\n",q-p); printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t"); getch(); } else { time(&o);

{ return; } if(o-p>30) { loop1: system("cls");d秒\n",q-p); printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t"); getch(); } else { time(&o); if(z=='d') { return; }

{ loop1: system("cls"); if(*t=='d'){}//遇到d返回 if(*t==75)//左键 { if(c[*x][*y-1]=='#'||c[*x][*y-1]==5&&c[*x][*y-2]==5 ||c[*x][*y-1]==5&&c[*x][*y-2]=='!'){}//遇到墙或推两个箱子else { if(c[*x][*y-1]=='!')//把箱子推出目的地 { if(c[*x][*y-2]!=0){} else { c[*x][*y]=0; *y-=1; c[*x][*y]=1;

一个C语言编写的推箱子游戏源代码 (1)

/* 一个C语言编写的推箱子游戏源代码*/ /* 本游戏是字符模式的,请不要在中文dos下运行。本游戏在TURBO C下调试通过*/ 程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。#include #include #include #include #include #include /* 定义二维数组ghouse来记录屏幕上各点的状态, 其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。*/ char ghouse[20][20]; /* 以下函数为直接写屏函数,很酷的函数哦!是我朋友告诉我的。*/ 定义全局变量 char far *screen=(char far* )0xb8000000; 用于在屏幕上输出字符。彩色显示器的字符缓冲区首地址为0xB8000000,每一个字符占2个字节(第一个字节为ASCII值,第二个字节为颜色值),字符模式下屏幕宽80像素,高25像素,一屏可以写80*25个字符。 void putchxy(int y,int x,char ch,char fc,char bc) Putchxy()函数在屏幕上的指定位置输出指定的字符。其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc 表示背景色。 { screen[(x*160)+(y<<1)+0]=ch; /*屏幕输出字符*/ screen[(x*160)+(y<<1)+1]=(bc*16)+fc; /*指定字符颜色fc,背景色bc*/ } /* 定义判断是否胜利的数据结构*/ typedef struct winer { int x,y; struct winer *p; }winer; 定义结构体struct winer用于判断每一关是否已完成。其中x用于存放目的地的横坐标,y用于存放目的地的纵坐标。如果所有表示目的地坐标对应的状态都为“i”,即箱子在目的地,则表示已经过关,可以进入下一关。该结构体的初始化在每一关的初始化时进行。 /* 箱子位置的数据结构*/ typedef struct boxs { int x,y; struct boxs *next; }boxs; /* 在特定的坐标上画墙壁并用数组记录状态的函数*/ void printwall(int x,int y) printwall()用于画墙传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。 { /*以黑色为背景画绿色墙,用小方块表示*/ putchxy(y-1,x-1,219,GREEN,BLACK);

java推箱子游戏源代码

第一个Java文件: import java.awt.Color; import java.awt.HeadlessException; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class GameFrame extends JFrame { JPanel zhuobu = new JPanel(); //工人 JLabel worker = null; //箱子 JLabel box = null; //目的地 JLabel goal = null; JLabel[] walls = null; //设置图片大小 int imgSize = 48; public void setImgSize(int imgSize){ this.imgSize = imgSize; } public GameFrame(String title) throws HeadlessException { super(title); //构造方法中调用本类的其它方法 this.initContentPane(); } /** * 设置内容面板 */ void initContentPane() { zhuobu.setBackground(Color.red); zhuobu.setLayout(null); //调用父类的属性和方法 super.setContentPane(zhuobu);

推箱子总结完整(附有源代码)

推箱子复习总结 推箱子基本概括思路: /* 定义二维数组ghouse来记录屏幕上各点的状态, 其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。*/ 1.人物设置:即在特定的坐标将人画出。 (1)1个,在ghouse数组中特定的坐标点用printman函数画出小人:如 /* 在特定的坐标上画人的函数*/ void printman(int x,int y) { gotoxy(y,x); _AL=02;_CX=01;_AH=0xa; geninterrupt(0x10); } printman(2+4,4+10);/* 在特定的坐标上画人*/ 2.箱子设置:在特定的坐标点画出箱子,并写下'b' 箱子:3个, 在ghouse数组中特定的三个坐标设置三个箱子并由printbox函数给箱子写下'b':如 /* 在特定的坐标上画箱子并用数组记录状态的函数*/ void printbox(int x,int y) { putchxy(y-1,x-1,10,WHITE,BLACK); /*设置箱子,样式10,前景色白色,背景色黑色*/ ghouse[x][y]='b'; } printbox(3+4,6+10); /*在特定的坐标点写下箱子*/ printbox(3+4,7+10); printbox(4+4,7+10); 3.墙壁设置:在ghouse数组中画出墙壁,并写下'w' 在ghouse数组中画出墙壁,并用printwall函数写下'w':如 (通过for循环实现) /* 在特定的坐标上画墙壁并用数组记录状态的函数*/ void printwall(int x,int y) { putchxy(y-1,x-1,219,MAGENTA,BLACK); /*x,y,219 样式参数,MAGENTA前景色,BLACK 背景色(x,y初始值为1,所以减1)*/ ghouse[x][y]='w'; } for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/ printwall(x+4,y+10); for(y=5,x=2;x<=5;x++) printwall(x+4,y+10); for(y=9,x=2;x<=5;x++)

基于java的推箱子游戏解析

基于JAVA的推箱子游戏 前言 在这个充满竞争的社会里,随着生活节奏的不断加快,人们的生活水平越来越繁忙,因此,越来越多人感到无比的烦躁与巨大的压力,这些压力也带给人们诸多烦恼。所以如何解除现代人的生活压力,释放心中苦闷已经成为现代人的共同心愿。而本次的这个基于JAVA的推箱子小游戏正是使用JAVA语言并且结合于EditPlus编译器,为大家开发了一款适合的、休闲娱乐的游戏,在娱乐的同时也给忙碌的上班族们开拓了另一个思考问题的空间。 基于JAVA的推箱子小游戏主要分为初始化模块,画图模块,移动小人模块,移动箱子模块以及功能控制模块。玩家是通过控制小人的移动来推动箱子,需要避过障碍物与死角才能将其推放到指定位置从而达到过关的目的。每关的难易程度各异,不仅适合人们休闲娱乐,还有助于开发智力,提高人们思考问题能力与想象能力,改善思考方式,拓展思维。 关键词:JAVA;解压;推箱子;休闲娱乐

Abstract In this competitive society, along with the accelerating pace of life, people's living standard more and busier, therefore, more and more people feel very upset and enormous pressure, the pressure also gives people a lot of trouble. So how to relieve the pressure of modern life, release the pain has become the common aspiration of the people. But this time based on the JAVA Push Box Game is the use of JAVA language and the combination of EditPlus compiler; we developed a suitable, recreational game, in the entertainment but also for busy office workers to develop another thinking space. Based on the JAVA Push Box Game consists of initialization module, drawing module, mobile SIM module, mobile box module and control module. Game player is controlled through a small mobile drive box, need to avoid obstacles and dead angle can be pushed into the specified location so as to achieve the purpose of clearance. Each level of difficulty degree is different, not only for recreation, also contribute to the development of intelligence, improve people's thinking ability and imagination ability, improve the way of thinking, the development of thinking. Key Words:JAVA; Relieve pressure; Push box; Recreation and entertainment

相关文档
最新文档