#include
#include
#include
#include
main( )
{char a[102][102],b[102][102],c[102][102],w;
int i,j; /*循环变量*/
int x,y,z[999]; /*雷的位置*/
int t,s; /*标记*/
int m,n,lei; /*计数*/
int u,v; /*输入*/
int hang,lie,ge,mo; /*自定义变量*/
srand((int)time(NULL)); /*启动随机数发生器*/
leb1: /*选择模式*/
printf("\n 请选择模式:\n 1.标准 2.自定义\n");
scanf("%d",&mo);
if(mo==2) /*若选择自定义模式,要输入三个参数*/
{do
{t=0; printf("请输入\n行数 列数 雷的个数\n");
scanf("%d%d%d",&hang,&lie,&ge);
if(hang100){printf("行数太多\n");t=1;}
if(lie100){printf("列数太多\n");t=1;}
if(ge=(hang*lie)){printf("雷太多了\n");t=1;}
}while(t==1);
}
else{hang=10,lie=10,ge=10;} /*否则就是选择了标准模式(默认参数)*/
for(i=1;i=1;j=j-1)
{s=0;
if(a[i-1][j-1]==0)s=1; if(a[i-1][j 1]==0)s=1;
if(a[i-1][j]==0)s=1; if(a[i 1][j-1]==0)s=1;
if(a[i 1][j 1]==0)s=1; if(a[i 1][j]==0)s=1;
if(a[i][j-1]==0)s=1; if(a[i][j 1]==0)s=1;
if(s==1)a[i][j]=b[i][j];
}
}
for(i=hang;i>=1;i=i-1)
{for(j=1;j=1;i=i-1)
{for(j=lie;j>=1;j=j-1)
{s=0;
if(a[i-1][j-1]==0)s=1; if(a[i-1][j 1]==0)s=1;
if(a[i-1][j]==0)s=1; if(a[i 1][j-1]==0)s=1;
if(a[i 1][j 1]==0)s=1;if(a[i 1][j]==0)s=1;
if(a[i][j-1]==0)s=1; if(a[i][j 1]==0)s=1;
if(s==1)a[i][j]=b[i][j];
}
}for(i=1;i<=hang;i=i 1) /*检测0区*/
{for(j=1;j<=lie;j=j 1)
{if(a[i][j]==0)
{if(a[i-1][j-1]== ||a[i-1][j-1]==@||a[i-1][j-1]==?)t=1;
if(a[i-1][j 1]== ||a[i-1][j 1]==@||a[i-1][j 1]==?)t=1;
if(a[i 1][j-1]== ||a[i 1][j-1]==@||a[i 1][j-1]==?)t=1;
if(a[i 1][j 1]== ||a[i 1][j 1]==@||a[i 1][j 1]==?)t=1;
if(a[i 1][j]== ||a[i 1][j]==@||a[i 1][j]==?)t=1;
if(a[i][j 1]== ||a[i][j 1]==@||a[i][j 1]==?)t=1;
if(a[i][j-1]== ||a[i][j-1]==@||a[i][j-1]==?)t=1;
if(a[i-1][j]== ||a[i-1][j]==@||a[i-1][j]==?)t=1;
}
}
}
if(t==1)goto leb3;
}n=0; /*检查结束*/
for(i=1;i<=hang;i=i 1)
{for(j=1;j<=lie;j=j 1)
{if(a[i][j]!= &&a[i][j]!=@&&a[i][j]!=?)n=n 1;}
}
}
while(a[u][v]!=#&&n!=(hang*lie-ge));for(i=1;i<=ge;i=i 1) /*游戏结束*/
{x=z[i]/lie 1; y=z[i]%lie 1; a[x][y]=#; }
printf(" ");
for(i=1;i<=lie;i=i 1)
{w=(i-1)/10 48; printf("%c",w);
w=(i-1) 48; printf("%c ",w);
}
printf("\n |");
for(i=1;i<=lie;i=i 1){printf("---|");}
printf("\n");
for(i=1;i<=hang;i=i 1)
{w=(i-1)/10 48; printf("%c",w);
w=(i-1) 48; printf("%c |",w);
for(j=1;j<=lie;j=j 1)
{if(a[i][j]==0)printf(" |");
else printf(" %c |",a[i][j]);
}
if(i==2)printf(" 剩余雷个数");
if(i==3)printf(" %d",lei); printf("\n |");
for(j=1;j<=lie;j=j 1) {printf("---|");}
printf("\n");
}
if(n==(hang*lie-ge)) printf("你成功了!\n");
else printf(" 游戏结束!\n");
printf(" 重玩请输入1\n");
t=0;
scanf("%d",&t);
if(t==1)goto leb1;
}
/*注:在DEV c 上运行通过。行号和列号都从0开始,比如要确定第0行第9列不是“雷”,就在0和9中间加入一个字母,可以输入【0a9】三个字符再按回车键。3行7列不是雷,则输入【3a7】回车;第8行第5列是雷,就输入【8#5】回车,9行0列是雷则输入【9#0】并回车*/
小游戏代码C语言编程
#include
#include
#include /////////////////////////////////////////////
// 定义常量、枚举量、结构体、全局变量
/////////////////////////////////////////////#define WIDTH 10 // 游戏区宽度
#define HEIGHT 22 // 游戏区高度
#define SIZE 20 // 每个游戏区单位的实际像素// 定义操作类型
enum CMD
{CMD_ROTATE, // 方块旋转CMD_LEFT, CMD_RIGHT, CMD_DOWN, // 方块左、右、下移动CMD_SINK, // 方块沉底CMD_QUIT // 退出游戏
};// 定义绘制方块的方法
enum DRAW
{SHOW, // 显示方块HIDE, // 隐藏方块FIX // 固定方块
};// 定义七种俄罗斯方块
struct BLOCK
{WORD dir[4]; // 方块的四个旋转状态COLORREF color; // 方块的颜色
} g_Blocks[7] = { {0x0F00, 0x4444, 0x0F00, 0x4444, RED}, // I{0x0660, 0x0660, 0x0660, 0x0660, BLUE}, // 口{0x4460, 0x02E0, 0x0622, 0x0740, MAGENTA}, // L{0x2260, 0x0E20, 0x0644, 0x0470, YELLOW}, // 反L{0x0C60, 0x2640, 0x0C60, 0x2640, CYAN}, // Z{0x0360, 0x4620, 0x0360, 0x4620, GREEN}, // 反Z{0x4E00, 0x4C40, 0x0E40, 0x4640, BROWN}}; // T// 定义当前方块、下一个方块的信息
struct BLOCKINFO
{byte id; // 方块 IDchar x, y; // 方块在游戏区中的坐标byte dir:2; // 方向
} g_CurBlock, g_NextBlock;// 定义游戏区
BYTE g_World[WIDTH][HEIGHT] = {0};/////////////////////////////////////////////
// 函数声明
/////////////////////////////////////////////void Init(); // 初始化游戏
void Quit(); // 退出游戏
void NewGame(); // 开始新游戏
void GameOver(); // 结束游戏
CMD GetCmd(); // 获取控制命令
void DispatchCmd(CMD _cmd); // 分发控制命令
void NewBlock(); // 生成新的方块
bool CheckBlock(BLOCKINFO _block); // 检测指定方块是否可以放下
void DrawBlock(BLOCKINFO _block, DRAW _draw = SHOW); // 画方块
void OnRotate(); // 旋转方块
void OnLeft(); // 左移方块
void OnRight(); // 右移方块
void OnDown(); // 下移方块
void OnSink(); // 沉底方块/////////////////////////////////////////////
// 函数定义
/////////////////////////////////////////////// 主函数
void main()
{Init();CMD c;while(true){c = GetCmd();DispatchCmd(c);// 按退出时,显示对话框咨询用户是否退出if (c == CMD_QUIT){HWND wnd = GetHWnd();if (MessageBox(wnd, _T("您要退出游戏吗?"), _T("提醒"), MB_OKCANCEL | MB_ICONQUESTION) == IDOK)Quit();}}
}// 初始化游戏
void Init()
{initgraph(640, 480);srand((unsigned)time(NULL));// 显示操作说明setfont(14, 0, _T("宋体"));outtextxy(20, 330, _T("操作说明"));outtextxy(20, 350, _T("上:旋转"));outtextxy(20, 370, _T("左:左移"));outtextxy(20, 390, _T("右:右移"));outtextxy(20, 410, _T("下:下移"));outtextxy(20, 430, _T("空格:沉底"));outtextxy(20, 450, _T("ESC:退出"));// 设置坐标原点setorigin(220, 20);// 绘制游戏区边界rectangle(-1, -1, WIDTH * SIZE, HEIGHT * SIZE);rectangle((WIDTH 1) * SIZE - 1, -1, (WIDTH 5) * SIZE, 4 * SIZE);// 开始新游戏NewGame();
}// 退出游戏
void Quit()
{closegraph();exit(0);
}// 开始新游戏
void NewGame()
{// 清空游戏区setfillstyle(BLACK);bar(0, 0, WIDTH * SIZE - 1, HEIGHT * SIZE - 1);ZeroMemory(g_World, WIDTH * HEIGHT);// 生成下一个方块g_NextBlock.id = rand() % 7;g_NextBlock.dir = rand() % 4;g_NextBlock.x = WIDTH 1;g_NextBlock.y = HEIGHT - 1;// 获取新方块NewBlock();
}// 结束游戏
void GameOver()
{HWND wnd = GetHWnd();if (MessageBox(wnd, _T("游戏结束。n您想重新来一局吗?"), _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)NewGame();elseQuit();
}// 获取控制命令
DWORD m_oldtime;
CMD GetCmd()
{// 获取控制值while(true){// 如果超时,自动下落一格DWORD newtime = GetTickCount();if (newtime - m_oldtime >= 500){m_oldtime = newtime;return CMD_DOWN;}// 如果有按键,返回按键对应的功能if (kbhit()){switch(getch()){case w:case W: return CMD_ROTATE;case a:case A: return CMD_LEFT;case d:case D: return CMD_RIGHT;case s:case S: return CMD_DOWN;case 27: return CMD_QUIT;case : return CMD_SINK;case 0:case 0xE0:switch(getch()){case 72: return CMD_ROTATE;case 75: return CMD_LEFT;case 77: return CMD_RIGHT;case 80: return CMD_DOWN;}}}// 延时 (降低 CPU 占用率)Sleep(20);}
}// 分发控制命令
void DispatchCmd(CMD _cmd)
{switch(_cmd){case CMD_ROTATE: OnRotate(); break;case CMD_LEFT: OnLeft(); break;case CMD_RIGHT: OnRight(); break;case CMD_DOWN: OnDown(); break;case CMD_SINK: OnSink(); break;case CMD_QUIT: break;}
}// 生成新的方块
void NewBlock()
{g_CurBlock.id = g_NextBlock.id, g_NextBlock.id = rand() % 7;g_CurBlock.dir = g_NextBlock.dir, g_NextBlock.dir = rand() % 4;g_CurBlock.x = (WIDTH - 4) / 2;g_CurBlock.y = HEIGHT 2;// 下移新方块直到有局部显示WORD c = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];while((c & 0xF) == 0){g_CurBlock.y--;c >>= 4;}// 绘制新方块DrawBlock(g_CurBlock);// 绘制下一个方块setfillstyle(BLACK);bar((WIDTH 1) * SIZE, 0, (WIDTH 5) * SIZE - 1, 4 * SIZE - 1);DrawBlock(g_NextBlock);// 设置计时器,用于判断自动下落m_oldtime = GetTickCount();
}// 画方块
void DrawBlock(BLOCKINFO _block, DRAW _draw)
{WORD b = g_Blocks[_block.id].dir[_block.dir];int x, y;int color = BLACK;switch(_draw){case SHOW: color = g_Blocks[_block.id].color; break;case HIDE: color = BLACK; break;case FIX: color = g_Blocks[_block.id].color / 3; break;}setfillstyle(color);for(int i=0; i<16; i ){if (b & 0x8000){x = _block.x i % 4;y = _block.y - i / 4;if (y < HEIGHT){if (_draw != HIDE)bar3d(x * SIZE 2, (HEIGHT - y - 1) * SIZE 2, (x 1) * SIZE - 4, (HEIGHT - y) * SIZE - 4, 3, true);elsebar(x * SIZE, (HEIGHT - y - 1) * SIZE, (x 1) * SIZE - 1, (HEIGHT - y) * SIZE - 1);}}b <<= 1;}
}// 检测指定方块是否可以放下
bool CheckBlock(BLOCKINFO _block)
{WORD b = g_Blocks[_block.id].dir[_block.dir];int x, y;for(int i=0; i= WIDTH) || (y < 0))return false;if ((y < HEIGHT) && (g_World[x][y]))return false;}b <<= 1;}return true;
}// 旋转方块
void OnRotate()
{// 获取可以旋转的 x 偏移量int dx;BLOCKINFO tmp = g_CurBlock;tmp.dir ; if (CheckBlock(tmp)) { dx = 0; goto rotate; }tmp.x = g_CurBlock.x - 1; if (CheckBlock(tmp)) { dx = -1; goto rotate; }tmp.x = g_CurBlock.x 1; if (CheckBlock(tmp)) { dx = 1; goto rotate; }tmp.x = g_CurBlock.x - 2; if (CheckBlock(tmp)) { dx = -2; goto rotate; }tmp.x = g_CurBlock.x 2; if (CheckBlock(tmp)) { dx = 2; goto rotate; }return;rotate:// 旋转DrawBlock(g_CurBlock, HIDE);g_CurBlock.dir ;g_CurBlock.x = dx;DrawBlock(g_CurBlock);
}// 左移方块
void OnLeft()
{BLOCKINFO tmp = g_CurBlock;tmp.x--;if (CheckBlock(tmp)){DrawBlock(g_CurBlock, HIDE);g_CurBlock.x--;DrawBlock(g_CurBlock);}
}// 右移方块
void OnRight()
{BLOCKINFO tmp = g_CurBlock;tmp.x ;if (CheckBlock(tmp)){DrawBlock(g_CurBlock, HIDE);g_CurBlock.x ;DrawBlock(g_CurBlock);}
}// 下移方块
void OnDown()
{BLOCKINFO tmp = g_CurBlock;tmp.y--;if (CheckBlock(tmp)){DrawBlock(g_CurBlock, HIDE);g_CurBlock.y--;DrawBlock(g_CurBlock);}elseOnSink(); // 不可下移时,执行“沉底方块”操作
}// 沉底方块
void OnSink()
{int i, x, y;// 连续下移方块DrawBlock(g_CurBlock, HIDE);BLOCKINFO tmp = g_CurBlock;tmp.y--;while (CheckBlock(tmp)){g_CurBlock.y--;tmp.y--;}DrawBlock(g_CurBlock, FIX);// 固定方块在游戏区WORD b = g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];for(i = 0; i = HEIGHT){ // 如果方块的固定位置超出高度,结束游戏GameOver();return;}elseg_World[g_CurBlock.x i % 4][g_CurBlock.y - i / 4] = 1;}b = max(g_CurBlock.y - 3, 0); y--){i = 0;for(x = 0; x < WIDTH; x )if (g_World[x][y] == 1)i ;if (i == WIDTH){bRow = true;row[g_CurBlock.y - y] = 1;setfillstyle(WHITE, DIAGCROSS2_FILL);bar(0, (HEIGHT - y - 1) * SIZE SIZE / 2 - 2, WIDTH * SIZE - 1, (HEIGHT - y - 1) * SIZE SIZE / 2 2);}}if (bRow){// 延时 200 毫秒Sleep(200);// 擦掉刚才标记的行IMAGE img;for(i = 0; i < 4; i ){if (row[i]){for(y = g_CurBlock.y - i 1; y < HEIGHT; y )for(x = 0; x < WIDTH; x ){g_World[x][y - 1] = g_World[x][y];g_World[x][y] = 0;}getimage(&img, 0, 0, WIDTH * SIZE, (HEIGHT - (g_CurBlock.y - i 1)) * SIZE);putimage(0, SIZE, &img);}}}// 产生新方块NewBlock();
}
小游戏代码C语言DEV
#include
#include
#include
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
int i,key;
int score=0;
int gamespeed=32000;
struct Food /*食物的结构体*/
{
int x; /*食物的横坐标*/
int y; /*食物的纵坐标*/
int yes; /*食物是否出现的变量*/
}food;
struct Snack /*蛇的结构体*/
{
int x[N];
int y[N];
int node; /*蛇的节数*/
int direction; /*蛇的方向*/
int life; /*蛇的生命,0活着,1死亡*/
}snake;
void Init(void); /*图形驱动*/
void Close(void); /*关闭游戏函数*/
void DrawK(void); /*画图函数*/
void GameOver(void);/*输出失败函数*/
void GamePlay(); /*游戏控制函数 主要程序*/
void PrScore(void); /*分数输出函数*/
DELAY(char ch)/*调节游戏速度*/
{
if(ch==3)
{
delay(gamespeed); /*delay是延迟函数*/
}
else if(ch==2)
{
delay(gamespeed);
}
}
Menu()/*游戏开始菜单*/
{
char ch;
printf("Please choose the gamespeed:n");
printf("1-Fast 2-Normal 3-Slown");
printf("nPlease Press The numbers..n");
do
{ch=getch();}
while(ch!=1&&ch!=2&&ch!=3);
clrscr();
return(ch);
}
/*主函数*/
void main(void)
{
int ch;
ch=Menu();
Init();
DrawK();
GamePlay(ch);
Close();
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:tc");
cleardevice();
}
void DrawK(void)
{
setcolor(11);
setlinestyle(SOLID_LINE,0,THICK_WIDTH);
for(i=50;i0;i--) /*贪吃蛇的移动算法*/
{
snake.x[i]=snake.x[i-1];
snake.y[i]=snake.y[i-1]; /*贪吃蛇的身体移动算法*/
}
switch(snake.direction) /*贪吃蛇的头部移动算法,以此来控制移动*/
{
case 1:snake.x[0] =10;break;
case 2:snake.x[0]-=10;break;
case 3:snake.y[0]-=10;break;
case 4:snake.y[0] =10;break;
}
for(i=3;i { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver(); snake.life=1; break; } } /*下面是判断是否撞到墙壁*/ if(snake.x[0]595||snake.y[0]455) { GameOver(); snake.life=1; } if(snake.life==1) /*如果死亡就退出循环*/ break; if(snake.x[0]==food.x&&snake.y[0]==food.y) /*判断蛇是否吃到食物*/ { setcolor(0); rectangle(food.x,food.y,food.x 10,food.y-10); /*吃的食物后用黑色将食物擦去*/ snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*现把增加的一节放到看不到的地方去*/ snake.node ; food.yes=1; score =10; PrScore(); } setcolor(4); /*每次移动后将后面的身体擦去*/ for(i=0;i rectangle(snake.x[i],snake.y[i],snake.x[i] 10,snake.y[i]-10); delay(gamespeed); DELAY(ch); setcolor(0); rectangle(snake.x[snake.node-1],snake.y[snake.node-1],snake.x[snake.node-1] 10,snake.y[snake.node-1]-10); } if(snake.life==1) break; key=bioskey(0); /*接受按键*/ if(key==ESC) break; else if(key==UP&&snake.direction!=4)/*判断是否改变方向*/ snake.direction=3; else if(key==RIGHT&&snake.direction!=2) snake.direction=1; else if(key==LEFT&&snake.direction!=1) snake.direction=2; else if(key==DOWN&&snake.direction!=3) snake.direction=4; } } void GameOver(void) { cleardevice(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAME OVER"); getch(); } void PrScore(void) { char str[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,"scord:%d",score); outtextxy(55,20,str); } void Close(void) { getch(); closegraph(); }