网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
03月22日
漏签
0
天
c语言吧
关注:
798,933
贴子:
4,351,367
看贴
图片
吧主推荐
视频
游戏
1
2
下一页
尾页
49
回复贴,共
2
页
,跳到
页
确定
<<返回c语言吧
>0< 加载中...
菜鸟发帖 学做贪吃蛇
只看楼主
收藏
回复
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
作为c语言的小白, 刚刚学会了一下基础 就想开始制作一下小编程软件, 因为觉得这样才能提高学习速度, 而且要是有什么错误 或者 什么 不知道弄得在这里也肯定有大神们来指导我, 比起自己在网络上盲找的要好的多了, 下面开始发下 刚刚写的 代码, 然后继续写
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
第一要发的是 引用的数据库, 也就是说 那些 API, (应该没说错)
#include <stdio.h> // 这个好像是基础 输入输出的 函数的 API
#include <windows.h> // 这个是 window 的那些函数 里面好像有 软件显示的名字啊, 还是啥的
#include <stdlib.h> // 这也是基础类 的
#include <time.h> // 这个是时间 的 函数
#include <conio.h> // 这个主要是 用于 键盘输入的函数好像
shine萌猫物语
便当
3
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
同小白
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
#define WIDTH 50
#define HEIGHT 20
void init();
void initMap(int map[][WIDTH],int ballPositionX, int ballPositionY);
void displayMap(int map[][WIDTH]);
int moveBall(int map[][WIDTH],int *ballPositionX, int *ballPositionY);
int main(int argc, char *argv[]) {
int map[HEIGHT][WIDTH];
int finish = 0;
int ballPositionY = WIDTH/2;
int ballPositionX = HEIGHT/2;
init();
initMap(map,ballPositionX,ballPositionY);
displayMap(map);
do{
finish = moveBall(map,&ballPositionX,&ballPositionY);
}while(finish == 0);
system("PAUSE");
}
void init(){
SetConsoleTitle("Ì°³ÔÉß----аÌì°æ");
}
void initMap(int map[][WIDTH],int ballPositionX, int ballPositionY){
int i,j;
for(i = 0; i < HEIGHT; i++){
for(j = 0; j < WIDTH; j++){
if(i == 0 || j == 0 || i == HEIGHT-1 || j == WIDTH-1){
map[i][j] = 1;
}else{
map[i][j] = 0;
}
}
}
map[ballPositionX][ballPositionY] = 2;
}
void displayMap(int map[][WIDTH]){
int i,j;
COORD coord;
coord.X = 0;
coord.Y = 0;
SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),coord);
for(i=0;i<25-coord.Y;i++){
for(j=0;j<80;j++)printf(" ");
}
SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),coord);
for(i = 0; i < HEIGHT; i++){
for(j = 0; j < WIDTH; j++){
if(map[i][j]==1){
printf("X");
}else if (map[i][j]==2){
printf("O");
}else{
printf(" ");
}
}
printf("\n");
}
}
int moveBall(int map[][WIDTH],int *ballPositionX, int *ballPositionY){
int direction = getch();
int flag = 0;
switch(direction){
case 50:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionX=*ballPositionX+1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
case 52:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionY=*ballPositionY-1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
case 54:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionY=*ballPositionY+1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
case 56:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionX=*ballPositionX-1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
default:
break;
}
if(*ballPositionX == 0 || *ballPositionY == 0 || *ballPositionX == HEIGHT-1 || *ballPositionY == WIDTH-1){
return 1;
}else if(flag == 1){
displayMap(map);
}
return 0;
}
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
暂时就写到这里了, 现在能够实现的是 在 控制台里显示一个小型的 地图, 可以使用 小键盘里的 2,4,6,8 来移动 地图中间的那个圆圈, 开始 有个问题是, 每次刷新, 也就是清屏, 然后又画出新的地图 的时候 会一闪一闪的 我想找找看有没有其他的方法
xvde110
超能力者
9
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
清屏函数一闪一闪的 别用了
可以每次输出前 把输出坐标设置在{0,0}就行了
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
刚刚找到另一种 清屏 方式 好像比较更简单
system("CLS");
, 也就是说把displayMap() 的函数改下》
void displayMap(int map[][WIDTH]){
int i,j;
system("CLS");
for(i = 0; i < HEIGHT; i++){
for(j = 0; j < WIDTH; j++){
if(map[i][j]==1){
printf("X");
}else if (map[i][j]==2){
printf("O");
}else{
printf(" ");
}
}
printf("\n");
}
}
六道鸣鸣
帕秋莉糕
12
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
我也想写软件和小游戏呢?但是我不知道需要什么,我只会c和c++一些基础
摇头一笑5
异能力者
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
二级还没过……
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
根据一位大神的提示, 我发现根本不需要清屏, 只要在重新画出就好了, 也就是说每次 画地图的时候, 把输出坐标 重新设置到 0,0 点 也就代表重新画一边, 这样就不会一闪一闪的了, 所以改过的代码 就变成这样>
for(i = 0; i < HEIGHT; i++){
for(j = 0; j < WIDTH; j++){
if(map[i][j]==1){
printf("X");
}else if (map[i][j]==2){
printf("O");
}else{
printf(" ");
}
}
printf("\n");
}
// 下面这四行代码是控制 输出坐标位置的代码
COORD coord;
coord.X = 0;
coord.Y = 0;
SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),coord);
}
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
现在开始写一个update 函数, 用来更新游戏图面的, 也就是说每过一定的时间, 在控制台里的地图就会产生变化, 贪吃蛇的游戏里的变化就是, 那条蛇会自动移动, 现在然我好好的想想怎么写
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
还有就是 因为 设置了update这个函数,它是自动运行的, 所以要改写下 moveBall 这个函数, 因为每次运行这个函数的时候程序都会暂停, 等待我们输入方向, 因此 应该添加 kbhit() 这个函数 来判断是否按下某个按键, 还有在 main 函数里的 do,while 添加一个缓冲, Sleep, 不然的话 会移动很快
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
咳咳, 最后还是把 moveBall 函数 改名成 update, 后面又加一个 outputDirection 函数来判断最后 按下的方向
void outDirection(){
if(kbhit()){
snackDirection = getch();
}
}
int update(int map[][WIDTH],int *ballPositionX, int *ballPositionY){
int direction = snackDirection;
int flag = 0;
switch(direction){
case 50:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionX=*ballPositionX+1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
case 52:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionY=*ballPositionY-1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
case 54:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionY=*ballPositionY+1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
case 56:
map[*ballPositionX][*ballPositionY] = 0;
*ballPositionX=*ballPositionX-1;
map[*ballPositionX][*ballPositionY] = 2;
flag = 1;
break;
default:
break;
}
if(*ballPositionX == 0 || *ballPositionY == 0 || *ballPositionX == HEIGHT-1 || *ballPositionY == WIDTH-1){
return 1;
}else if(flag == 1){
displayMap(map);
}
return 0;
}
而main 函数里的 do while则变成这样
do{
outDirection();
finish = update(map,&ballPositionX,&ballPositionY);
Sleep(100);
}while(finish == 0);
还有就是 把 displayMap 里的控制输出坐标 那几行 代码 该了下位置,
void displayMap(int map[][WIDTH]){
COORD coord;
coord.X = 0;
coord.Y = 0;
SetConsoleCursorPosition(GetStdHandle( STD_OUTPUT_HANDLE ),coord);
int i,j;
for(i = 0; i < HEIGHT; i++){
for(j = 0; j < WIDTH; j++){
if(map[i][j]==1){
printf("X");
}else if (map[i][j]==2){
printf("O");
}else{
printf(" ");
}
}
printf("\n");
}
}
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
现在那个蛇头 已经可以 自动移动了, 不过又修改了一个小细节, 就是把sleep 里的 那个缓冲时间 变成一个 固定变量, 变成 define, 这样 可以方便以后改变速度
逍遥邪龙王
大能力者
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
下一步呢 就该 制作食物的 代码和函数了, 不过 刚刚想了下, 其实应该把蛇还有 食物 都 弄成 struct 好像比较好, 因为蛇, 会需要到 蛇头的位置, 蛇的长度,等等, 慢慢改代码中
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示