#include
#include
#include
#include
int
i,j=1;
int
scores[6];
void
main()
{
char
control='0';
int
rand1,guess,score;
printf("开始游戏吗
(yn)");
control=getchar();
while(control!='y'&&control!='y'&&control!='n'&&control!='n')//屏蔽其他按键
{
printf("无效字符!开始游戏吗
(yn)");
fflush(stdin);
control=getchar();
printf("%c",control);
}
while((control=='y')||(control=='y'))
{
system("cls");
srand((unsigned)time(null));
rand1=rand()%10+1;
//printf("%d",rand1);
for(i=0;i<20;i++)
{
printf("请输入你猜的数:");
scanf("%d",&guess);
if(guess>rand1)printf("大啦!n");
else
if(guess
:猜对了an");//响铃a
break;
}
i++;
}
i+=1;
if(i==1)
{
score=100;
scores[0]++;
}
else
if(i>=2&&i<=3)
{
score=90;
scores[1]++;
}
else
if(i>=4&&i<=6)
{
score=80;
scores[2]++;
}
else
if(i>=7&&i<=10)
{
score=70;
scores[3]++;
}
else
if(i>=11&&i<=15)
{
score=60;
scores[4]++;
}
else
{
score=0;
scores[5]++;
}
printf("第%d次得分是:%dn",j,score);
scores[7]+=score;
j++;
printf("是否继续(yn)n");
fflush(stdin);//请输入缓冲区
control=getchar();
while(control!='y'&&control!='y'&&control!='n'&&control!='n')
{
printf("无效字符!只能按y或y,n或n是否继续(yn)n");
fflush(stdin);
control=getchar();
printf("%c",control);
}
}
system("cls");//清屏
printf("+++++++++++++++-----------------以下是得分情况:---------------n");
for(i=0;i<5;i++)
{
printf("+++++++++++++++------------------得%d分%d次:------------------n",10(10-i),scores[i]);
}
printf("+++++++++++++++------------------得%d分%d次:------------------n",
0,scores[5]);
}
请问用C语言如何写一个2048游戏?
为了实现鼠标控制飞机飞行,当鼠标一移动,获取鼠标X的坐标,在消息处理函数中加入下列代码:
x = LOWORD(lParam);
如果鼠标的X坐标大于窗口临界值,则X等于临界值,若鼠标的X坐标小于0,则将鼠标X设定为0,加入下列代码:
if(x
730)
x = 730;
else
if(x
0)
x = 0;
同理,获取鼠标的Y坐标,加入如下代码:
y = HIWORD(lParam);
if(y
480)
y = 480;
else if(y
0)
y = 0;
判断飞机的移动方向,使飞机的移动方向与鼠标的移动方向一致,即飞机跟随着鼠标的移动而移动,并进行贴图,加入代码如下:
if(nowX
x)
{
nowX += 20;
if(nowX
x)
nowX = x;
}
else
{
nowX -=20;
if(nowX
x)
nowX = x;
}
if(nowY
y)
{
nowY += 20;
if(nowY
y)
nowY = y;
}
else
{
nowY -= 20;
if(nowY
y)
nowY = y;
}
SelectObject(bufdc,plane);
BitBlt(mdc,nowX,nowY,70,70,bufdc,0,70,SRCAND);
BitBlt(mdc,nowX,nowY,70,70,bufdc,0,0,SRCPAINT);
322计算机角色动画
为了实现游戏画面的透明效果,加载游戏的石头位图(”Stonebmp”)
Stone=(HBITMAP)LoadImage(NULL,"Stonebmp",IMAGE_BITMAP,100,200,LR_LOADFROMFILE);
其次前景位图的屏蔽图部分与背景图作”AND”运算,加入下列代码:
SelectObject(bufdc,Stone);
BitBlt(mdc,Sx,Sy,100,100,bufdc,0,100,SRCAND);
将”AND”运算的结果与前景图作”OR”运算,加入下列代码:
BitBlt(mdc,Sx,Sy,100,100,bufdc,0,0,SRCPAINT);
为了实现游戏石头下落效果,定义一个速度VY,并计算Y轴坐标,并不停的往下贴,加入如下代码:
vy=15;
Sy += vy;
为了实现多个石头下落效果,定义石头坐标Sx1,Sx2,Sx3,Sy1,Sy2,Sy3,分别表示四个石头下落的坐标值,通过如上代码所示加载、实现透明并掉落。
323星际迷航背景动画
为了实现背景动画的滚动效果,设定一个间隔时间tPre以及宽度W代码实现如下
BitBlt(hdc,0,0,800,600,mdc,0,0,SRCCOPY);
tPre = GetTickCount();
w +=10;
if(w=600)
w = 0;
其中tPre获取时间,的随着时间Y坐标不断增加10,如果当整个(大小为800600)600的话,则将重新滚动一遍。
4、物理现象
为了实现整个游戏的碰撞效果的物理现象,首先加载游戏的石头位图
baozha0=(HBITMAP)LoadImage(NULL,"baozha0bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
baozha1=(HBITMAP)LoadImage(NULL,"baozha1bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
baozha2=(HBITMAP)LoadImage(NULL,"baozha2bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
baozha3=(HBITMAP)LoadImage(NULL,"baozha3bmp",IMAGE_BITMAP,316,632,LR_LOADFROMFILE);
对于碰撞效果,采取临界值碰撞来实现,Sx1和Sy1为石头1的坐标,X和Y为鼠标的坐标,当飞机的坐标和石头的坐标达到临界值的时候,产生碰撞,相关代码如下:
SelectObject(bufdc,baozha0);
{
if(((Sx1x))((Sy1y)))
{
BitBlt(mdc,Sx1-50,Sy1-70,316,316,bufdc,0,316,SRCAND);
BitBlt(mdc,Sx1-50,Sy1-70,316,316,bufdc,0,0,SRCPAINT);
DeleteDC(bufdc);
}}
5、实验结果及分析
本实验实现了游戏画面绘制贴图、游戏输入消息处理、游戏动画技巧、游戏物理现象设计原理。优点:初步实现了游戏画面绘制贴图、游戏输入消息处理、游戏动画技巧、游戏物理现象设计基本功能。缺点:因时间及数据结构算法没有学好所以未实现子弹与石头碰撞效果,爆炸效果不逼真,贴图效果不好。
6、结论
这个程序的架构仍显笨拙,有很多不如意的地方,但是实现了游戏画面绘制贴图、游戏输入消息处理、游戏动画技巧、游戏物理现象设计原理。虽然整个游戏不能像红白机一样内容丰富,但是以后会把它设计得简洁、优雅,以至于可以把它做成一个像《雷电》一样精彩的飞行射击游戏。
用C语言编写小游戏
编写一个2048游戏需要掌握C语言的基本知识和理解游戏的规则。以下是一个简化版的2048游戏的C语言实现:
cCopy code#include <stdioh>#include <stdlibh>#include <timeh>#include <conioh>#define SIZE 4int matrix[SIZE][SIZE];void init_matrix() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) {
matrix[i][j] = 0;
}
}
}void add_random_tile() { int empty_tiles[SIZE SIZE][2]; int empty_count = 0; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (matrix[i][j] == 0) {
empty_tiles[empty_count][0] = i;
empty_tiles[empty_count][1] = j;
empty_count++;
}
}
} if (empty_count == 0) { return;
} int index = rand() % empty_count; int value = (rand() % 2 + 1) 2;
matrix[empty_tiles[index][0]][empty_tiles[index][1]] = value;
}void print_matrix() { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%5d", matrix[i][j]);
} printf("n");
}
}int move(int dx, int dy) { int moved = 0; if (dx != 0) { for (int y = 0; y < SIZE; y++) { int last_non_empty = dx > 0 SIZE - 1 : 0; for (int x = dx > 0 SIZE - 1 : 0; x >= 0 && x < SIZE; x -= dx) { if (matrix[y][x] == 0) { continue;
} if (matrix[y][last_non_empty] == 0) {
matrix[y][last_non_empty] = matrix[y][x];
matrix[y][x] = 0;
moved = 1;
} else if (matrix[y][last_non_empty] == matrix[y][x]) {
matrix[y][last_non_empty] = 2;
matrix[y][x] = 0;
last_non_empty -= dx;
moved = 1;
} else if (last_non_empty - dx != x) {
matrix[y][last_non_empty - dx] = matrix[y][x];
matrix[y][x] = 0;
last_non_empty -= dx;
moved = 1;
} else {
last_non_empty -= dx;
}
}
}
} else { for (int x = 0; x < SIZE; x++) { int last_non_empty = dy > 0 SIZE - 1 : 0; for (int y = dy > 0 SIZE - 1 : 0; y >= 0 && y < SIZE; y -= dy) { if (matrix[y][x] == 0) { continue;
} if (matrix[last_non_empty][x] == 0) {
matrix[last_non_empty][x] = matrix[y][x];
matrix[y][x
如何用C语言制作游戏?
#include <stdioh>
#include <stdlibh>
#include <timeh>
#define N 4/随机抽N个数/
#define NUM 10/NUM次猜数的机会/
void detect(char s[])
{
int i,j,num;
int a,b;
char ch[N];
for(num=0;num<NUM;num++)
{
a=b=0;
printf(" 第%d次机会:",num+1);
for(i=0;i<N;i++)
{
ch[i]=getchar();
if(ch[i]>='0'&&ch[i]<='9')
{
for(j=0;j<i;j++)
if(ch[i]==ch[j]) break;
if(j<i) i--;
else
{
putchar(ch[i]);
for(j=0;j<N;j++)
{
if(ch[i]==s[j])
{if(i==j)
a++;
b++;}
}
}
}
else
i--;
}
printf(" 位置、数值都相同:%d,数值相同:%dn",a,b);
if(a==N)
{
printf(" 恭喜你答对了!n");
break;
}
}
if(num==NUM)
printf("n 很遗憾,正确答案为:%sn",s);
}
main()
{
int i,j;
char s[N+1];
srand(time(0));
for(i=0;i<N;i++)
{
s[i]=rand()%10+'0';
for(j=0;j<i;j++)
if(s[i]==s[j])
break;
if(j<i) i--;
else
putchar('');
}
s[i]='0';
printf("n 猜数字n");
printf("n 请输入%d位不同的数字n",N);
printf("n 总共%d次机会n",NUM);
detect(s);
}
求一个用C语言编写的小游戏代码
你可以先去绘学霸网站找“游戏设计/游戏制作”板块的免费视频教程-点击进入完整入门到精通视频教程列表: wwwhuixuebanet/web/AppWebClient/AllCourseAndResourcePagetype=1&tagid=307&zdhhr-11y04r-1818074554951406228
想要系统的学习可以考虑报一个网络直播课,推荐CGWANG的网络课。老师讲得细,上完还可以回看,还有同类型录播课可以免费学(赠送终身VIP)。
自制能力相对较弱的话,建议还是去好点的培训机构,实力和规模在国内排名前几的大机构,推荐行业龙头:王氏教育。
王氏教育全国直营校区面授课程试听复制后面链接在浏览器也可打开: wwwhuixuebacomcn/school/3dmodeltype=2&zdhhr-11y04r-1818074554951406228
在“游戏设计/游戏制作”领域的培训机构里,王氏教育是国内的老大,且没有加盟分校,都是总部直营的连锁校区。跟很多其它同类型大机构不一样的是:王氏教育每个校区都是实体面授,老师是手把手教,而且有专门的班主任从早盯到晚,爆肝式的学习模式,提升会很快,特别适合基础差的学生。
大家可以先把绘学霸APP下载到自己手机,方便碎片时间学习——绘学霸APP下载: wwwhuixuebacomcn/scripts/downloadhtml
#include <graphicsh>
#include <conioh>
#include <timeh>
/////////////////////////////////////////////
// 定义常量、枚举量、结构体、全局变量
/////////////////////////////////////////////
#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; // 方块 ID
char 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_NextBlockid = rand() % 7;
g_NextBlockdir = rand() % 4;
g_NextBlockx = WIDTH + 1;
g_NextBlocky = HEIGHT - 1;
// 获取新方块
NewBlock();
}
// 结束游戏
void GameOver()
{
HWND wnd = GetHWnd();
if (MessageBox(wnd, _T("游戏结束。n您想重新来一局吗?"), _T("游戏结束"), MB_YESNO | MB_ICONQUESTION) == IDYES)
NewGame();
else
Quit();
}
// 获取控制命令
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_CurBlockid = g_NextBlockid, g_NextBlockid = rand() % 7;
g_CurBlockdir = g_NextBlockdir, g_NextBlockdir = rand() % 4;
g_CurBlockx = (WIDTH - 4) / 2;
g_CurBlocky = HEIGHT + 2;
// 下移新方块直到有局部显示
WORD c = g_Blocks[g_CurBlockid]dir[g_CurBlockdir];
while((c & 0xF) == 0)
{
g_CurBlocky--;
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[_blockid]dir[_blockdir];
int x, y;
int color = BLACK;
switch(_draw)
{
case SHOW: color = g_Blocks[_blockid]color; break;
case HIDE: color = BLACK; break;
case FIX: color = g_Blocks[_blockid]color / 3; break;
}
setfillstyle(color);
for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _blockx + i % 4;
y = _blocky - 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);
else
bar(x SIZE, (HEIGHT - y - 1) SIZE, (x + 1) SIZE - 1, (HEIGHT - y) SIZE - 1);
}
}
b <<= 1;
}
}
// 检测指定方块是否可以放下
bool CheckBlock(BLOCKINFO _block)
{
WORD b = g_Blocks[_blockid]dir[_blockdir];
int x, y;
for(int i=0; i<16; i++)
{
if (b & 0x8000)
{
x = _blockx + i % 4;
y = _blocky - i / 4;
if ((x < 0) || (x >= 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;
tmpdir++; if (CheckBlock(tmp)) { dx = 0; goto rotate; }
tmpx = g_CurBlockx - 1; if (CheckBlock(tmp)) { dx = -1; goto rotate; }
tmpx = g_CurBlockx + 1; if (CheckBlock(tmp)) { dx = 1; goto rotate; }
tmpx = g_CurBlockx - 2; if (CheckBlock(tmp)) { dx = -2; goto rotate; }
tmpx = g_CurBlockx + 2; if (CheckBlock(tmp)) { dx = 2; goto rotate; }
return;
rotate:
// 旋转
DrawBlock(g_CurBlock, HIDE);
g_CurBlockdir++;
g_CurBlockx += dx;
DrawBlock(g_CurBlock);
}
// 左移方块
void OnLeft()
{
BLOCKINFO tmp = g_CurBlock;
tmpx--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlockx--;
DrawBlock(g_CurBlock);
}
}
// 右移方块
void OnRight()
{
BLOCKINFO tmp = g_CurBlock;
tmpx++;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlockx++;
DrawBlock(g_CurBlock);
}
}
// 下移方块
void onDown()
{
BLOCKINFO tmp = g_CurBlock;
tmpy--;
if (CheckBlock(tmp))
{
DrawBlock(g_CurBlock, HIDE);
g_CurBlocky--;
DrawBlock(g_CurBlock);
}
else
onSink(); // 不可下移时,执行“沉底方块”操作
}
// 沉底方块
void onSink()
{
int i, x, y;
// 连续下移方块
DrawBlock(g_CurBlock, HIDE);
BLOCKINFO tmp = g_CurBlock;
tmpy--;
while (CheckBlock(tmp))
{
g_CurBlocky--;
tmpy--;
}
DrawBlock(g_CurBlock, FIX);
// 固定方块在游戏区
WORD b = g_Blocks[g_CurBlockid]dir[g_CurBlockdir];
for(i = 0; i < 16; i++)
{
if (b & 0x8000)
{
if (g_CurBlocky - i / 4 >= HEIGHT)
{ // 如果方块的固定位置超出高度,结束游戏
GameOver();
return;
}
else
g_World[g_CurBlockx + i % 4][g_CurBlocky - i / 4] = 1;
}
b <<= 1;
}
// 检查是否需要消掉行,并标记
int row[4] = {0};
bool bRow = false;
for(y = g_CurBlocky; y >= max(g_CurBlocky - 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_CurBlocky - 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_CurBlocky - 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_CurBlocky - i + 1)) SIZE);
putimage(0, SIZE, &img);
}
}
}
// 产生新方块
NewBlock();
}
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报