C语言推箱子(更新完毕)
本帖最后由 andy大宝 于 2026-7-1 09:04 编辑可能有点乱,如果运行不了及时告诉我……
注:提出建议者,或提供关卡的鱼油有赏~
第一关:#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a={" ###",
" #*#",
" # #",
"####O######",
"#*OS O *#",
"#####O#####",
" # #",
" #*#",
" ###",};
int i,x,y;
char ch;
x=4;
y=5;
for (i=0;i<=8;i++)
{
puts(a);
}
while (a!='@' || a!='@'|| a!='@' || a!='@')//是否过关
{
ch=getch();
if (ch=='s')//按下s键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
x++;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
x++;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
x++;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
x++;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
x++;
break;
}
break;
}
}
if (ch=='w')//按下w键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
x--;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
x--;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
x--;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
x--;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
x--;
break;
}
break;
}
}
if (ch=='a')//按下a键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
y--;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
y--;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
y--;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
y--;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
y--;
break;
}
break;
}
}
if (ch=='d')//按下d键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
y++;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
y++;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
y++;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
y++;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
y++;
break;
}
break;
}
}
system("cls");
for (i=0;i<=8;i++)//刷新
{
puts(a);
}
}
system("cls");
printf("挑战成功!");
system("pause");
return 0;
}
第二关:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
char a={"##########",
"## ###",
"##O### #",
"# S OO #",
"# **# O#",
"##**# #",
"##########",};
int i,x,y;
char ch;
x=3;
y=2;
for (i=0;i<=7;i++)
{
puts(a);
}
while (a!='@' || a!='@'|| a!='@' || a!='@')//是否过关
{
ch=getch();
if (ch=='s')//按下s键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
x++;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
x++;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
x++;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
x++;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
x++;
break;
}
break;
}
}
if (ch=='w')//按下w键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
x--;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
x--;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
x--;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
x--;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
x--;
break;
}
break;
}
}
if (ch=='a')//按下a键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
y--;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
y--;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
y--;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
y--;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
y--;
break;
}
break;
}
}
if (ch=='d')//按下d键
{
while (1)
{
if (a!='#' && a!='O' && a!='@')//从此开始判断
{
a=' ';
y++;
a='S';
break;
}
if (a=='O' && a==' ')
{
a=' ';
a='S';
a='O';
y++;
break;
}
if (a=='O' && a=='*')
{
a=' ';
a='S';
a='@';
y++;
break;
}
if (a=='@' && a==' ')
{
a=' ';
a='S';
a='O';
y++;
break;
}
if (a=='@' && a=='*')
{
a=' ';
a='S';
a='@';
y++;
break;
}
break;
}
}
system("cls");
if(a!= '@')
if (a!= 'S')
a='*';
if(a!= '@')
if (a!= 'S')
a='*';
if(a!= '@')
if (a!= 'S')
a='*';
if(a!= '@')
if (a!= 'S')
a='*';
for (i=0;i<=8;i++)//刷新
{
puts(a);
}
}
system("cls");
printf("挑战成功!");
system("pause");
return 0;
}
如果此贴对您有帮助,别忘了评分{:7_139:} 看看 哈哈,评个分{:7_139:} wuqramy 发表于 2020-3-15 13:24
哈哈,评个分
谢谢{:7_139:}你们的鼓励是我最大的动力~ 看一看 看一看 555 棒 看看 看看 看看 看看 好难啊 试一下,顶楼主 第26行代码没有声明
过来围观一下{:10_334:} 易烊千玺女友 发表于 2020-5-5 08:39
第26行代码没有声明
捕捉键盘字符的意思 本帖最后由 java2python 于 2020-5-23 03:05 编辑
无需回复可见的楼主 本帖最后由 java2python 于 2020-5-23 20:12 编辑
重复代码不少(楼主别生气):
控制台光标位置可以设定的(没有闪烁),
另外a)写法,改成行优先a,比如printf,实际打印的a,x只是一个行中的列位置
取得游戏数据放到了get_new_game函数中,
由于修改贴不了代码格式,只能再回一贴:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
static int dxy={{1,0},{-1,0},{0,-1},{0,1}};
static char tans_table = {{'O',' ','O'},{'O','*','@'},{'@',' ','O'},{'@','*','@'}};
HANDLE init_con(){
SMALL_RECT winPon={0,0,25,10};
HANDLE con=GetStdHandle(STD_OUTPUT_HANDLE);
COORD buf={26,11};
SetConsoleWindowInfo(con,1,&winPon);
SetConsoleScreenBufferSize(con,buf);
SetConsoleTextAttribute(con, 6 | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
CONSOLE_CURSOR_INFO cinfo;
cinfo.dwSize = 1;
cinfo.bVisible = false;
SetConsoleCursorInfo(con,&cinfo);
return con;
}
void print_char(HANDLE con,int y,int x,char c){
if(c=='\0') return;
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition(con, coord);
int fore_color=7;
if(c == 'O') fore_color = 6;
else if(c == 'S') fore_color = 7;
else if(c == '#') fore_color = 12;
else if(c == '*') fore_color = 3;
else if(c == '@') fore_color = 2;
SetConsoleTextAttribute(con, fore_color | FOREGROUND_INTENSITY | BACKGROUND_BLUE);
putchar(c);
}
void get_new_game(char a,int no,COORD *s_pos,COORD star[],int *pStar_cnt){
if(no == 1){
char aa={" ###",
" #*#",
" # #",
"####O######",
"#*OS O *#",
"#####O#####",
" # #",
" #*#",
" ###",};
for(int y=0;y<20;y++) for(int x=0;x<20;x++) a = aa;
}else if(no == 2){
char aa={"##########",
"## ###",
"##O### #",
"# S OO #",
"#** # O#",
"##**# #",
"##########",};
for(int y=0;y<20;y++) for(int x=0;x<20;x++) a = aa;
}
int star_cnt = 0;
for(int y=0;y<20;y++) for(int x=0;x<20;x++) {
//a = aa;
if(a == 'S'){
s_pos->X = x;
s_pos->Y = y;
}
if(a == '*'){
star.X = x;
star.Y = y;
star_cnt++;
}
}
*pStar_cnt = star_cnt;
}
int play(HANDLE con,int no)
{
char a;
COORD s_pos,next_pos,next2_pos;
COORD star;
int star_cnt = 0;
get_new_game(a,no,&s_pos,star,&star_cnt);
int direct=0;
int cur_a,next_a,next2_a,loc_change,star_in_pos=0;
char ch;
for (int y=0;y<=7;y++) for(int x=0;x<20;x++) print_char(con,y,x,a);
while (star_in_pos != star_cnt)//是否过关
{
ch=getch();
if (ch=='s') direct = 0;//按下s键
else if (ch=='w') direct = 1;//按下w键
else if (ch=='a') direct = 2;//按下a键
else if (ch=='d') direct = 3;//按下d键
else direct = -1;
if(0<=direct && direct <=3)
{
loc_change = 0;
next_pos.Y = s_pos.Y+dxy;
next_pos.X = s_pos.X+dxy;
next2_pos.Y = next_pos.Y+dxy;
next2_pos.X = next_pos.X+dxy;
next_a = a;
next2_a = a;
if (next_a !='#' && next_a !='O' && next_a!='@')//从此开始判断
{
loc_change = 1;
}else {
for(int i=0;i<4;i++){
if (next_a == tans_table && next2_a == tans_table)
{
a=tans_table;
print_char(con,next2_pos.Y,next2_pos.X,tans_table);
loc_change = 1;
break;
}
}
}
if(loc_change == 1){
a=' ';
a='S';
print_char(con,s_pos.Y,s_pos.X,' ');
print_char(con,next_pos.Y,next_pos.X,'S');
for(int i=0;i<star_cnt;i++){
if(s_pos.X == star.X && s_pos.Y== star.Y){
cur_a = a;
if(cur_a != 'S' && cur_a != '@') {
a='*';
print_char(con,s_pos.Y,s_pos.X,'*');
}
}
}
s_pos.Y = next_pos.Y;s_pos.X = next_pos.X;
star_in_pos = 0;
for(int i=0;i<star_cnt;i++){
if(a.Y].X] == '@') star_in_pos++;
}
}
}
}
system("cls");
printf("挑战成功!");
system("pause");
system("cls");
return 0;
}
int main(){
HANDLE con = init_con();
play(con,1);
play(con,2);
}
看看