急求C语言编译的小游戏(如扫雷),附带源代码和注释。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急求C语言编译的小游戏(如扫雷),附带源代码和注释。相关的知识,希望对你有一定的参考价值。
急求C语言编译的小游戏.EXE(如扫雷),附带源代码和注释.TXT。TXT文件最好不超过10KB。
采纳最佳答案后追加200分,多谢了!
已经编译运行确认了:
#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#define LEFTPRESS 0xff01
#define LEFTCLICK 0xff10
#define LEFTDRAG 0xff19
#define MOUSEMOVE 0xff08
struct
int num;/*格子当前处于什么状态,1有雷,0已经显示过数字或者空白格子*/
int roundnum;/*统计格子周围有多少雷*/
int flag;/*右键按下显示红旗的标志,0没有红旗标志,1有红旗标志*/
Mine[10][10];
int gameAGAIN=0;/*是否重来的变量*/
int gamePLAY=0;/*是否是第一次玩游戏的标志*/
int mineNUM;/*统计处理过的格子数*/
char randmineNUM[3];/*显示数字的字符串*/
int Keystate;
int MouseExist;
int MouseButton;
int MouseX;
int MouseY;
void Init(void);/*图形驱动*/
void MouseOn(void);/*鼠标光标显示*/
void MouseOff(void);/*鼠标光标隐藏*/
void MouseSetXY(int,int);/*设置当前位置*/
int LeftPress(void);/*左键按下*/
int RightPress(void);/*鼠标右键按下*/
void MouseGetXY(void);/*得到当前位置*/
void Control(void);/*游戏开始,重新,关闭*/
void GameBegain(void);/*游戏开始画面*/
void DrawSmile(void);/*画笑脸*/
void DrawRedflag(int,int);/*显示红旗*/
void DrawEmpty(int,int,int,int);/*两种空格子的显示*/
void GameOver(void);/*游戏结束*/
void GameWin(void);/*显示胜利*/
int MineStatistics(int,int);/*统计每个格子周围的雷数*/
int ShowWhite(int,int);/*显示无雷区的空白部分*/
void GamePlay(void);/*游戏过程*/
void Close(void);/*图形关闭*/
void main(void)
Init();
Control();
Close();
void Init(void)/*图形开始*/
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
void Close(void)/*图形关闭*/
closegraph();
void MouseOn(void)/*鼠标光标显示*/
_AX=0x01;
geninterrupt(0x33);
void MouseOff(void)/*鼠标光标隐藏*/
_AX=0x02;
geninterrupt(0x33);
void MouseSetXY(int x,int y)/*设置当前位置*/
_CX=x;
_DX=y;
_AX=0x04;
geninterrupt(0x33);
int LeftPress(void)/*鼠标左键按下*/
_AX=0x03;
geninterrupt(0x33);
return(_BX&1);
int RightPress(void)/*鼠标右键按下*/
_AX=0x03;
geninterrupt(0x33);
return(_BX&2);
void MouseGetXY(void)/*得到当前位置*/
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX;
MouseY=_DX;
void Control(void)/*游戏开始,重新,关闭*/
int gameFLAG=1;/*游戏失败后判断是否重新开始的标志*/
while(1)
if(gameFLAG)/*游戏失败后没判断出重新开始或者退出游戏的话就继续判断*/
GameBegain(); /*游戏初始画面*/
GamePlay();/*具体游戏*/
if(gameAGAIN==1)/*游戏中重新开始*/
gameAGAIN=0;
continue;
MouseOn();
gameFLAG=0;
if(LeftPress())/*判断是否重新开始*/
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)
gameFLAG=1;
continue;
if(kbhit())/*判断是否按键退出*/
break;
MouseOff();
void DrawSmile(void)/*画笑脸*/
setfillstyle(SOLID_FILL,YELLOW);
fillellipse(290,75,10,10);
setcolor(YELLOW);
setfillstyle(SOLID_FILL,BLACK);/*眼睛*/
fillellipse(285,75,2,2);
fillellipse(295,75,2,2);
setcolor(BLACK);/*嘴巴*/
bar(287,80,293,81);
void DrawRedflag(int i,int j)/*显示红旗*/
setcolor(7);
setfillstyle(SOLID_FILL,RED);
bar(198+j*20,95+i*20,198+j*20+5,95+i*20+5);
setcolor(BLACK);
line(198+j*20,95+i*20,198+j*20,95+i*20+10);
void DrawEmpty(int i,int j,int mode,int color)/*两种空格子的显示*/
setcolor(color);
setfillstyle(SOLID_FILL,color);
if(mode==0)/*没有单击过的大格子*/
bar(200+j*20-8,100+i*20-8,200+j*20+8,100+i*20+8);
else
if(mode==1)/*单击过后显示空白的小格子*/
bar(200+j*20-7,100+i*20-7,200+j*20+7,100+i*20+7);
void GameBegain(void)/*游戏开始画面*/
int i,j;
cleardevice();
if(gamePLAY!=1)
MouseSetXY(290,70); /*鼠标一开始的位置,并作为它的初始坐标*/
MouseX=290;
MouseY=70;
gamePLAY=1;/*下次按重新开始的话鼠标不重新初始化*/
mineNUM=0;
setfillstyle(SOLID_FILL,7);
bar(190,60,390,290);
for(i=0;i<10;i++)/*画格子*/
for(j=0;j<10;j++)
DrawEmpty(i,j,0,8);
setcolor(7);
DrawSmile();/*画脸*/
randomize();__page_break__
for(i=0;i<10;i++)/*100个格子随机赋值有没有地雷*/
for(j=0;j<10;j++)
Mine[i][j].num=random(8);/*如果随机数的结果是1表示这个格子有地雷*/
if(Mine[i][j].num==1)
mineNUM++;/*现有雷数加1*/
else
Mine[i][j].num=2;
Mine[i][j].flag=0;/*表示没红旗标志*/
sprintf(randmineNUM,"%d",mineNUM); /*显示这次总共有多少雷数*/
setcolor(1);
settextstyle(0,0,2);
outtextxy(210,70,randmineNUM);
mineNUM=100-mineNUM;/*变量取空白格数量*/
MouseOn();
void GameOver(void)/*游戏结束画面*/
int i,j;
setcolor(0);
for(i=0;i<10;i++)
for(j=0;j<10;j++)
if(Mine[i][j].num==1)/*显示所有的地雷*/
DrawEmpty(i,j,0,RED);
setfillstyle(SOLID_FILL,BLACK);
fillellipse(200+j*20,100+i*20,7,7);
void GameWin(void)/*显示胜利*/
setcolor(11);
settextstyle(0,0,2);
outtextxy(230,30,"YOU WIN!");
int MineStatistics(int i,int j)/*统计每个格子周围的雷数*/
int nNUM=0;
if(i==0&&j==0)/*左上角格子的统计*/
if(Mine[0][1].num==1)
nNUM++;
if(Mine[1][0].num==1)
nNUM++;
if(Mine[1][1].num==1)
nNUM++;
else
if(i==0&&j==9)/*右上角格子的统计*/
if(Mine[0][8].num==1)
nNUM++;
if(Mine[1][9].num==1)
nNUM++;
if(Mine[1][8].num==1)
nNUM++;
else
if(i==9&&j==0)/*左下角格子的统计*/
if(Mine[8][0].num==1)
nNUM++;
if(Mine[9][1].num==1)
nNUM++;
if(Mine[8][1].num==1)
nNUM++;
else
if(i==9&&j==9)/*右下角格子的统计*/
if(Mine[9][8].num==1)
nNUM++;
if(Mine[8][9].num==1)
nNUM++;
if(Mine[8][8].num==1)
nNUM++;
else if(j==0)/*左边第一列格子的统计*/
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
else if(j==9)/*右边第一列格子的统计*/
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
else if(i==0)/*第一行格子的统计*/
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
else if(i==9)/*最后一行格子的统计*/
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
else/*普通格子的统计*/
if(Mine[i-1][j].num==1)
nNUM++;
if(Mine[i-1][j+1].num==1)
nNUM++;
if(Mine[i][j+1].num==1)
nNUM++;
if(Mine[i+1][j+1].num==1)
nNUM++;
if(Mine[i+1][j].num==1)
nNUM++;
if(Mine[i+1][j-1].num==1)
nNUM++;
if(Mine[i][j-1].num==1)
nNUM++;
if(Mine[i-1][j-1].num==1)
nNUM++;
__page_break__
return(nNUM);/*把格子周围一共有多少雷数的统计结果返回*/
int ShowWhite(int i,int j)/*显示无雷区的空白部分*/
if(Mine[i][j].flag==1||Mine[i][j].num==0)/*如果有红旗或该格处理过就不对该格进行任何判断*/
return;
mineNUM--;/*显示过数字或者空格的格子就表示多处理了一个格子,当所有格子都处理过了表示胜利*/
if(Mine[i][j].roundnum==0&&Mine[i][j].num!=1)/*显示空格*/
DrawEmpty(i,j,1,7);
Mine[i][j].num=0;
else
if(Mine[i][j].roundnum!=0)/*输出雷数*/
DrawEmpty(i,j,0,8);
sprintf(randmineNUM,"%d",Mine[i][j].roundnum);
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
Mine[i][j].num=0;/*已经输出雷数的格子用0表示已经用过这个格子*/
return ;
/*8个方向递归显示所有的空白格子*/
if(i!=0&&Mine[i-1][j].num!=1)
ShowWhite(i-1,j);
if(i!=0&&j!=9&&Mine[i-1][j+1].num!=1)
ShowWhite(i-1,j+1);
if(j!=9&&Mine[i][j+1].num!=1)
ShowWhite(i,j+1);
if(j!=9&&i!=9&&Mine[i+1][j+1].num!=1)
ShowWhite(i+1,j+1);
if(i!=9&&Mine[i+1][j].num!=1)
ShowWhite(i+1,j);
if(i!=9&&j!=0&&Mine[i+1][j-1].num!=1)
ShowWhite(i+1,j-1);
if(j!=0&&Mine[i][j-1].num!=1)
ShowWhite(i,j-1);
if(i!=0&&j!=0&&Mine[i-1][j-1].num!=1)
ShowWhite(i-1,j-1);
void GamePlay(void)/*游戏过程*/
int i,j,Num;/*Num用来接收统计函数返回一个格子周围有多少地雷*/
for(i=0;i<10;i++)
for(j=0;j<10;j++)
Mine[i][j].roundnum=MineStatistics(i,j);/*统计每个格子周围有多少地雷*/
while(!kbhit())
if(LeftPress())/*鼠标左键盘按下*/
MouseGetXY();
if(MouseX>280&&MouseX<300&&MouseY>65&&MouseY<85)/*重新来*/
MouseOff();
gameAGAIN=1;
break;
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/
j=(MouseX-190)/20;/*x坐标*/
i=(MouseY-90)/20;/*y坐标*/
if(Mine[i][j].flag==1)/*如果格子有红旗则左键无效*/
continue;
if(Mine[i][j].num!=0)/*如果格子没有处理过*/
if(Mine[i][j].num==1)/*鼠标按下的格子是地雷*/
MouseOff();
GameOver();/*游戏失败*/
break;
else/*鼠标按下的格子不是地雷*/
MouseOff();
Num=MineStatistics(i,j);
if(Num==0)/*周围没地雷就用递归算法来显示空白格子*/
ShowWhite(i,j);
else/*按下格子周围有地雷*/
sprintf(randmineNUM,"%d",Num);/*输出当前格子周围的雷数*/
setcolor(RED);
outtextxy(195+j*20,95+i*20,randmineNUM);
mineNUM--;
MouseOn();
Mine[i][j].num=0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/
if(mineNUM<1)/*胜利了*/
GameWin();
break;
if(RightPress())/*鼠标右键键盘按下*/
MouseGetXY();
if(MouseX>190&&MouseX<390&&MouseY>90&&MouseY<290)/*当前鼠标位置在格子范围内*/
j=(MouseX-190)/20;/*x坐标*/
i=(MouseY-90)/20;/*y坐标*/
MouseOff();
if(Mine[i][j].flag==0&&Mine[i][j].num!=0)/*本来没红旗现在显示红旗*/
DrawRedflag(i,j);
Mine[i][j].flag=1;
else
if(Mine[i][j].flag==1)/*有红旗标志再按右键就红旗消失*/
DrawEmpty(i,j,0,8);
Mine[i][j].flag=0;
MouseOn();
sleep(1);
参考技术A 在不同机子上编译时需修改init()函数中TC路径
#include "graphics.h"
#include "stdlib.h"
#include "math.h"
#include "bios.h"
#define pi 3.14
#define r 10
#define right 8292
#define left 7777
#define esc 283
#define pause 14624
struct ball
int x,y;
int oldx,oldy;
int derection;/*球的方向采用角度制,范围是0-360度*/
ball;
struct platform
int x,y;
unsigned key;
int oldx,oldy;
platform;
int score=0;/*得分*/
int speed=1;/*速度*/
unsigned key;
void init();
void base();
void scoreview();
void play();
double change(int x);
void gameover();
void close();
void main()
init();
base();
scoreview();
play();
getch();
close();
void init()/*初始化图形模式*/
int gm=DETECT,gd;
initgraph(&gm,&gd,"G:\\tc\\bgi");/*根据不同的TC进行路径修改*/
void close()/*关闭图形模式*/
closegraph();
void base()/*画边框,球以及板并且对球和板的各参数初始化*/
int i;
setbkcolor(GREEN);
setcolor(8);
setfillstyle(4,LIGHTGRAY);
rectangle(149,149,501,351);
rectangle(140,140,510,360);
floodfill(141,141,8);
setfillstyle(9,BLUE);
platform.x=300;
platform.y=343;
bar(platform.x,platform.y,platform.x+40,platform.y+5);
randomize();
ball.x=random(330)+160;
ball.y=160;
ball.derection=random(30)+280;
setfillstyle(1,YELLOW);
setcolor(YELLOW);
fillellipse(ball.x,ball.y,r,r);
void scoreview()/*显示当前的得分数*/
char sco[20];
setcolor(WHITE);
setfillstyle(1,YELLOW);
bar(300,50,440,80);
sprintf(sco,"score:%d",score);
setcolor(RED);
settextstyle(0,0,2);
outtextxy(310,60,sco);
void play()
int i=5;
settextstyle(0,0,2);
setcolor(11);
outtextxy(50,400,"'A'for left 'D'for right");/*提示各个控制键*/
outtextxy(50,450,"'space'for pause 'ESC' for quit");
setcolor(RED);
setfillstyle(1,GREEN);
while(!kbhit())/*开始之前提示按任意键进入游戏,且提示不停闪烁*/
outtextxy(100,100,"press any key to begin!");
delay(400);
bar(100,100,500,120);
delay(400);
while(1)
while(!kbhit())
ball.oldx=ball.x;
ball.oldy=ball.y;/*记录下当前球的位置*/
/*根据球的方向来利用角度的正切值来改变球的坐标*/
if(ball.derection>0&&ball.derection<90) ball.x+=10;ball.y+= (-10*tan(change(ball.derection)));
if(ball.derection>90&&ball.derection<180) ball.x+=-10;ball.y+=(10*tan(change(ball.derection)));
if(ball.derection>180&&ball.derection<270) ball.x+=-10;ball.y+=(10*tan(change(ball.derection)));
if(ball.derection>270&&ball.derection<360) ball.x+=10;ball.y+=(-10*tan(change(ball.derection)));
if(ball.y+r>=platform.y)/*如果球到底有两种情况*/
if(ball.x+r-platform.x<0||ball.x-r-platform.x>40) /*球不在板上*/
ball.y=platform.y-r+7;
setfillstyle(1,GREEN);
setcolor(GREEN);
fillellipse(ball.oldx,ball.oldy,r,r);
/*球在游戏结束处闪烁五次*/
while(i)
setfillstyle(1,YELLOW);
setcolor(YELLOW);
fillellipse(ball.x,ball.y,r,r);
delay(300);
setfillstyle(1,GREEN);
setcolor(GREEN);
fillellipse(ball.x,ball.y,r,r);
delay(300);
i--;
gameover();/*游戏结束*/
else ball.y=platform.y-r;
ball.derection=360-ball.derection;/*球在板上的话得一分,且速度加一但不能超过5*/
score++;
speed++;
if(speed>5) speed=5;
scoreview();/*刷新得分*/
/*如果球撞墙或板后修正坐标并改变方向*/
if(ball.y-r<150)
ball.y=150+r;
ball.derection=360-ball.derection;
if(ball.x-r<150)
ball.x=150+r;
if(ball.derection>180&&ball.derection<270) ball.derection=540-ball.derection;
if(ball.derection>90&&ball.derection<180) ball.derection=180-ball.derection;
if(ball.x+r>500)
ball.x=500-r;
if(ball.derection>270&&ball.derection<360) ball.derection=540-ball.derection;
if(ball.derection>0&&ball.derection<90) ball.derection=180-ball.derection;
setfillstyle(1,GREEN);
setcolor(GREEN);
fillellipse(ball.oldx,ball.oldy,r,r);/*在先前位置用底色抹掉球*/
setfillstyle(1,YELLOW);
setcolor(YELLOW);
fillellipse(ball.x,ball.y,r,r);/*在新位置显示球*/
delay(150+(5-speed)*50);
/*对底板的控制*/
key=bioskey(0);
platform.oldx=platform.x;
platform.oldy=platform.y;/*记录下底板先前位置*/
/*通过方向键改变底板的坐标*/
if(key==right) platform.x+=15;
if(key==left) platform.x-=15;
if(key==esc) gameover();
/*如果暂停则闪烁提示按任意键(除暂停键)继续*/
if(key==pause)
while(!kbhit())
setcolor(RED);
outtextxy(10,20,"paused! press any key to continue.");
delay(400);
setfillstyle(1,GREEN);
bar(10,20,600,40);
delay(400);
;
if(platform.x<150) platform.x=150;
if(platform.x>460) platform.x=460;/*对底板坐标修正*/
setfillstyle(1,GREEN);
bar(platform.oldx,platform.y,platform.oldx+40,platform.y+5);/*在先前位置抹掉底板*/
setfillstyle(9,BLUE);
bar(platform.x,platform.y,platform.x+40,platform.y+5);/*在新位置显示底板*/
void gameover()/*游戏结束,显示最终得分*/
char buffer[50];
cleardevice();
sprintf(buffer,"your final score is:%d",score);
setcolor(BLUE);
settextstyle(0,0,3);
outtextxy(100,300,buffer);
setcolor(RED);
settextstyle(0,0,5);
outtextxy(0,150,"thanks for play!");
getch();
exit(0);
double change(int x)/*将角度转化为弧度*/
double radians;
return(x*pi/180);
参考技术B
小游戏2048:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<windows.h>
int jsk( ); //计算空格数
void rsgm( ); //重置游戏
void inkey( ); //按键输入
void left( ); //向左移动
void right( ); //向右移动
void up( ); //向上移动
void down( ); //向下移动
void show( ); //输出界面
void adnum( ); //添加随机数
void yes( ); //游戏是否结束(1是0否)
void gtxy(int x, int y); //控制光标位置的函数
int a[4][4]; //存储16个格子中的数字
int score = 0; //每局得分
int best = 0; //最高得分
int ifnum; //是否需要添加数字(1是0否)
int over; //游戏结束标志(1是0否)
int i,j,k;
int main( )
rsgm( ); //重置游戏
inkey( ); //按键输入
return 0;
void setColor(unsigned short ForeColor = 7, unsigned short BackGroundColor = 0)
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);
//用于控制字符颜色的函数
void rsgm( ) //重置游戏
score = 0; ifnum = 1; over = 0; srand((unsigned)time(0)); //启动随机数发生器
int n = rand( ) % 16; //随机函数产生0-15的数字
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
if (n == 0) int k = rand( ) % 3; if (k == 0 || k == 1) a[i][j] = 2;
else a[i][j] = 4; n--;
else a[i][j] = 0; n--;
adnum( );
system("cls");
CONSOLE_CURSOR_INFO cursor_info=1,0; //以下两行是隐藏光标的设置
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
setColor(14, 0); //设置字体淡黄色,背景为黑色
printf("\\n\\n\\t\\t 2048小游戏"); setColor(7, 0); //恢复白字黑底
printf("\\n\\t┌──────┬──────┬──────┬──────┐");
printf("\\n\\t│ │ │ │ │");
printf("\\n\\t├──────┼──────┼──────┼──────┤");
printf("\\n\\t│ │ │ │ │");
printf("\\n\\t├──────┼──────┼──────┼──────┤");
printf("\\n\\t│ │ │ │ │");
printf("\\n\\t├──────┼──────┼──────┼──────┤");
printf("\\n\\t│ │ │ │ │");
printf("\\n\\t└──────┴──────┴──────┴──────┘");
show( );
void show( ) //输出界面
for(i=0;i<4;i++)
for(j=0;j<4;j++)
gtxy(7*j+9,2*i+4); //gtxy(7*j+9, 2*i+4)是光标到指定位置输出数字
if(a[i][j]==0)printf(" "); setColor(7, 0); printf("│");
else if(a[i][j]<10) if (a[i][j] == 2) setColor(14, 0);
else if (a[i][j] == 4) setColor(13, 0);
else if (a[i][j] == 8) setColor(12, 0);
printf(" %d ", a[i][j]); setColor(7, 0); printf("│");
else if (a[i][j] < 100)if (a[i][j] == 16) setColor(12, 0);
else if (a[i][j] == 32) setColor(10, 0);
else if (a[i][j] == 64) setColor(2, 0);
printf(" %d ", a[i][j]); setColor(7, 0); printf("│");
else if (a[i][j] < 1000) if (a[i][j] == 128) setColor(9, 0);
else if (a[i][j] == 256) setColor(1, 0);
else if (a[i][j] == 512) setColor(13, 0);
printf(" %d ", a[i][j]); setColor(7, 0); printf("│");
else if (a[i][j] < 10000) if (a[i][j] == 1024) setColor(5, 0);
else setColor(15, 0);
printf(" %d ", a[i][j]); setColor(7, 0); printf("│");
if (jsk( ) == 0)
yes( ); if (over) gtxy(9,12); setColor(10, 0);
printf("\\n\\n 游戏结束!是否继续? [ Y/N ]:");
void inkey( ) //按键输入
int key;
while (1)
key = getch( );
if (over) if (key == 89|| key == 121) rsgm( ); continue;
else if (key == 78|| key == 110) return;
else continue;
ifnum = 0;
if(key==224)key=getch( );
switch (key)
case 75: left( ); break;
case 77: right( ); break;
case 72: up( ); break;
case 80: down( );break;
if (score > best) best = score;
if (ifnum) adnum( ); show( );
int jsk( ) //计算空格数
int n = 0;
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++) if ( a[i][j] == 0) n++;
return n;
void left( ) //向左移动
for (i = 0; i < 4; i++)
for (j = 1, k = 0; j < 4; j++)
if (a[i][j] > 0)
if ( a[i][k] == a[i][j])
a[i][k] *= 2; k++;
score = score + 2 * a[i][j];
a[i][j] = 0; ifnum = 1;
else if ( a[i][k] == 0) a[i][k] = a[i][j]; a[i][j] = 0; ifnum = 1;
else a[i][k + 1] = a[i][j]; if ((k + 1) != j) a[i][j] = 0; ifnum = 1;
k++;
void right( ) //向右移动
for (i = 0; i < 4; i++)
for (j = 2, k = 3; j >= 0; j--)
if (a[i][j] > 0)
if (a[i][k] == a[i][j])
a[i][k] *= 2; k--; score = score + 2 * a[i][j]; a[i][j] = 0; ifnum = 1;
else if ( a[i][k] == 0) a[i][k] = a[i][j]; a[i][j] = 0; ifnum = 1;
else a[i][k - 1] = a[i][j]; if ((k - 1) != j) a[i][j] = 0; ifnum = 1; k--;
void up( ) //向上移动
for (i = 0; i < 4; i++)
for (j = 1, k = 0; j < 4; j++)
if (a[j][i] > 0)
if ( a[k][i] == a[j][i]) a[k][i] *= 2; k++;score = score + 2 * a[j][i];
a[j][i] = 0; ifnum = 1;
else if ( a[k][i] == 0) a[k][i] = a[j][i]; a[j][i] = 0; ifnum = 1;
else a[k + 1][i] = a[j][i]; if ((k + 1) != j) a[j][i] = 0; ifnum = 1;
k++;
void down( ) //向下移动
for (i = 0; i < 4; i++)
for (j = 2, k = 3; j >= 0; j--)
if (a[j][i] > 0)
if (a[k][i] == a[j][i])
a[k][i] *= 2; k--;score = score + 2 * a[j][i]; a[j][i] = 0; ifnum = 1;
else if (a[k][i] == 0) a[k][i] = a[j][i]; a[j][i] = 0; ifnum = 1;
else a[k - 1][i] = a[j][i];
if ((k - 1) != j) a[j][i] = 0; ifnum = 1; k--;
void adnum( ) //添加随机数
srand(time(0)); int n = rand( ) % jsk( );
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
if (a[i][j] == 0) if (n != 0) n--;
else int k = rand() % 3;
if (k == 0 || k == 1) a[i][j] = 2; return;
else a[i][j] = 4; return;
void yes( ) //游戏是否结束
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++)
if (a[i][j] == a[i][j + 1] || a[j][i] == a[j + 1][i]) over = 0; return;
over = 1;
void gtxy(int x, int y) //控制光标位置的函数
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
c语言(小游戏)移动的任意物体的实现 附带原码和注释 可以直接实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<windows.h>//
#include<conio.h>//监听键盘的输入
int direct = '0';
void gotoxy(int x, int y)//辅助函数系统自带 可以改变光标位置
{
COORD pos = { x,y };
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);//这个一定要定义到全局里面 这一串函数可以直接引用 不用管怎么来的
}
struct circle//定义一个球
{
int x;
int y;
}circle;
void move()
{
while (1)
{
if (_kbhit)
{
fflush(stdin);
direct = _getch();
gotoxy(circle.x, circle.y);
printf(" ");
switch (direct)
{
case 'w':
circle.y--;//这个是选择语句之后执行的内容
break;
case 'a':
circle.x -= 2;
break;
case 's':
circle.y++;
break;
case 'd':
circle.x += 2;
break;
}
gotoxy(circle.x, circle.y);
printf("o");//这里是定义你想要移动物体的形状可以随意修改
gotoxy(80, 0);
}
}
}
int main()
{
printf("欢迎进入游戏的世界 w为向上运动 a为左 d为右 s为下运动");
move();
return 0;
}
以上是关于急求C语言编译的小游戏(如扫雷),附带源代码和注释。的主要内容,如果未能解决你的问题,请参考以下文章