洛谷P1000 超级玛丽游戏C++题解

洛谷试机题解:超级玛丽游戏的C语言代码详解
部署运行你感兴趣的模型镜像

首先我们看这道题的题目“超级玛丽游戏”,第一道题就让我们写个游戏出来。结果点进去一看,顿时觉得这道题是在开玩笑,本题是洛谷的试机题目,可以帮助了解洛谷的使用。 建议完成本题目后继续尝试P1001、P1008.**。打开软件开始打代码,让我们看一下这道题的关键,主要是用printf函数输出那一堆'#''*''-''.',但是注意啦!这里一定不要少输出空格,不然就会卡住,然后心态炸了。

方法1:

#include<stdio.h>
int main()
{
 printf("                ********\n");
 printf("               ************\n");
 printf("               ####....#.\n");
 printf("             #..###.....##....\n");
 printf("             ###.......######              ###            ###\n");
 printf("                ...........               #...#          #...#\n");
 printf("               ##*#######                 #.#.#          #.#.#\n");
 printf("            ####*******######             #.#.#          #.#.#\n");
 printf("           ...#***.****.*###....          #...#          #...#\n");
 printf("           ....**********##.....           ###            ###\n");
 printf("           ....****    *****....\n");
 printf("             ####        ####\n");
 printf("           ######        ######\n");
 printf("##############################################################\n");
 printf("#...#......#.##...#......#.##...#......#.##------------------#\n");
 printf("###########################################------------------#\n");
 printf("#..#....#....##..#....#....##..#....#....#####################\n");
 printf("##########################################    #----------#\n");
 printf("#.....#......##.....#......##.....#......#    #----------#\n");
 printf("##########################################    #----------#\n");
 printf("#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n");
 printf("##########################################    ############\n");
 return 0; 
} 

方法2: C 语言中常用的多行字符串写法,少打一些printf,核心内容和方法1一样

#include<stdio.h>
int main() {
    printf(
    "                ********\n"
    "               ************\n"
    "               ####....#.\n"
    "             #..###.....##....\n"
    "             ###.......######              ###            ###\n"
    "                ...........               #...#          #...#\n"
    "               ##*#######                 #.#.#          #.#.#\n"
    "            ####*******######             #.#.#          #.#.#\n"
    "           ...#***.****.*###....          #...#          #...#\n"
    "           ....**********##.....           ###            ###\n"
    "           ....****    *****....\n"
    "             ####        ####\n"
    "           ######        ######\n"
    "##############################################################\n"
    "#...#......#.##...#......#.##...#......#.##------------------#\n"
    "###########################################------------------#\n"
    "#..#....#....##..#....#....##..#....#....#####################\n"
    "##########################################    #----------#\n"
    "#.....#......##.....#......##.....#......#    #----------#\n"
    "##########################################    #----------#\n"
    "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#\n"
    "##########################################    ############\n"
    );
    return 0;
}

方法四:

文言题解,转载于P1000 超级玛丽游戏 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

吾有一數。曰二十二。名之曰「高」。吾有一數。曰六十二。名之曰「宽」。
吾有一列。名之曰「图」。
吾有一言。曰「「#」」。名之曰「井」。吾有一言。曰「「.」」。名之曰「点」。
吾有一言。曰「「-」」。名之曰「减」。吾有一言。曰「「 」」。名之曰「空」。
吾有一言。曰「「*」」。名之曰「星」。

吾有一術。名之曰「画」。欲行是術。必先得五數。曰「甲一」。曰「乙一」。曰「甲二」。曰「乙二」。曰「字」。乃行是術曰。
	減「甲二」以「甲一」。加其以一。名之曰「甲」。
	減「乙二」以「乙一」。加其以一。名之曰「乙」。
	為是「甲」遍。
		吾有一數。曰「乙一」。名之曰「丙」。
		為是「乙」遍。
			乘「甲一」以「宽」。加其以「丙」。加其以一。名之曰「丁」。
			昔之「图」之「丁」者。今「字」是矣。
			加「丙」以一。昔之「丙」者。今其是矣。
		云云。
		加「甲一」以一。昔之「甲一」者。今其是矣。
	云云。
是謂「画」之術也。

吾有一術。名之曰「画点」。欲行是術。必先得三數。曰「甲」。曰「乙」。曰「字」。乃行是術曰。
	施「画」於「甲」。於「乙」。於「甲」。於「乙」。於「字」。
是謂「画点」之術也。

吾有一術。名之曰「画地」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」以八。名之曰「丙」。加「乙」以十三。名之曰「丁」。
	施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「井」。
	吾有一列。名之曰「戊」。充「戊」以一。以三。以五。以七。
	凡「戊」中之「己」。
		加「己」以「甲」。名之曰「庚」。加「乙」以一。名之曰「丙」。加「乙」以十二。名之曰「丁」。
		施「画」於「庚」。於「丙」。於「庚」。於「丁」。於「点」。
	云云。
	加「甲」以一。名之曰「丙」。加「乙」以四。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以十一。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以三。名之曰「丙」。加「乙」以三。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以三。名之曰「丙」。加「乙」以八。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以五。名之曰「丙」。加「乙」以六。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以七。名之曰「丙」。加「乙」以二。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以七。名之曰「丙」。加「乙」以五。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
	加「甲」以七。名之曰「丙」。加「乙」以十。名之曰「丁」。施「画点」於「丙」。於「丁」。於「井」。
是謂「画地」之術也。

吾有一術。名之曰「画島」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」以三。名之曰「丙」。加「乙」以十九。名之曰「丁」。
	施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以一。名之曰「丁」。加「甲」以二。名之曰「戊」。加「乙」以十八。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「减」。
	加「甲」以四。名之曰「丙」。加「乙」以四。名之曰「丁」。加「甲」以八。名之曰「戊」。加「乙」以十五。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「井」。
	加「甲」以四。名之曰「丙」。加「乙」以五。名之曰「丁」。加「甲」以七。名之曰「戊」。加「乙」以十四。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「减」。
是謂「画島」之術也。

吾有一術。名之曰「画币」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「甲」以五。名之曰「丙」。加「乙」以四。名之曰「丁」。
	施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以一。名之曰「丁」。加「甲」以四。名之曰「戊」。加「乙」以三。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「点」。
	加「甲」以二。名之曰「丙」。加「乙」以二。名之曰「丁」。加「甲」以三。名之曰「戊」。加「乙」以二。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「井」。
	施「画点」於「甲」。於「乙」。於「空」。
	加「甲」以五。名之曰「丙」。施「画点」於「丙」。於「乙」。於「空」。
	加「乙」以四。名之曰「丙」。施「画点」於「甲」。於「丙」。於「空」。
	加「甲」以五。名之曰「丙」。加「乙」以四。名之曰「丁」。施「画点」於「丙」。於「丁」。於「空」。
是謂「画币」之術也。

吾有一術。名之曰「画人」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
	加「乙」以五。名之曰「丙」。加「乙」以十二。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以四。名之曰「丙」。加「乙」以十五。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以四。名之曰「丙」。加「乙」以七。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以八。名之曰「丙」。加「乙」以十三。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「乙」以十二。名之曰「丙」。施「画点」於「甲」。於「丙」。於「井」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以二。名之曰「丙」。加「乙」以十四。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以三。名之曰「丙」。加「乙」以四。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「乙」以八。名之曰「丙」。加「乙」以十二。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「乙」以十五。名之曰「丙」。加「乙」以十八。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以二。名之曰「丙」。加「乙」以十七。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以五。名之曰「丙」。加「乙」以十一。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以五。名之曰「丙」。加「乙」以十五。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「点」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以四。名之曰「丙」。加「乙」以十三。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以六。名之曰「丙」。施「画点」於「甲」。於「丙」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「乙」以一。名之曰「丙」。加「乙」以十七。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「井」。
	加「乙」以五。名之曰「丙」。加「乙」以十一。名之曰「丁」。施「画」於「甲」。於「丙」。於「甲」。於「丁」。於「星」。
	加「甲」以一。昔之「甲」者。今其是矣。
	加「甲」以二。名之曰「丙」。加「乙」以二十。名之曰「丁」。施「画」於「甲」。於「乙」。於「丙」。於「丁」。於「点」。
	加「乙」以四。名之曰「丙」。加「甲」以二。名之曰「丁」。加「乙」以十六。名之曰「戊」。施「画」於「甲」。於「丙」。於「丁」。於「戊」。於「星」。
	加「乙」以三。名之曰「丙」。施「画点」於「甲」。於「丙」。於「井」。
	加「乙」以十四。名之曰「丙」。加「甲」以一。名之曰「丁」。加「乙」以十六。名之曰「戊」。施「画」於「甲」。於「丙」。於「丁」。於「戊」。於「井」。
	加「甲」以一。名之曰「丙」。加「乙」以十六。名之曰「丁」。施「画点」於「丙」。於「丁」。於「点」。
	加「甲」以二。名之曰「丙」。加「乙」以八。名之曰「丁」。加「甲」以二。名之曰「戊」。加「乙」以十一。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「空」。
	加「乙」以七。名之曰「丙」。施「画点」於「甲」。於「丙」。於「点」。
	加「乙」以十二。名之曰「丙」。施「画点」於「甲」。於「丙」。於「点」。
	加「甲」以三。名之曰「丙」。加「甲」以四。名之曰「丁」。加「乙」以十九。名之曰「戊」。
	施「画」於「丙」。於「乙」。於「丁」。於「戊」。於「井」。
	加「甲」以三。名之曰「丙」。加「乙」以六。名之曰「丁」。加「甲」以四。名之曰「戊」。加「乙」以十三。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「空」。
	加「甲」以三。名之曰「丙」。加「甲」以三。名之曰「丁」。加「乙」以一。名之曰「戊」。
	施「画」於「丙」。於「乙」。於「丁」。於「戊」。於「空」。
	加「甲」以三。名之曰「丙」。加「乙」以十八。名之曰「丁」。加「甲」以三。名之曰「戊」。加「乙」以十九。名之曰「己」。
	施「画」於「丙」。於「丁」。於「戊」。於「己」。於「空」。
是謂「画人」之術也。

施「画人」於一。於十二。
施「画地」於十四。於一。施「画地」於十四。於十五。施「画地」於十四。於二十九。
施「画島」於十四。於四十三。
施「画币」於五。於四十三。施「画币」於五。於五十八。

吾有一數。曰一。名之曰「甲」。
為是「高」遍。
	吾有一言。曰「「」」。名之曰「果」。
	吾有一數。曰一。名之曰「乙」。
	為是「宽」遍。
		乘「甲」以「宽」。加其以「乙」。加其以一。名之曰「丙」。
		夫「图」之「丙」。名之曰「丁」。
		若「丁」等於變者。昔之「丁」者。今「空」是矣也。
		加「果」以「丁」。昔之「果」者。今其是矣。
		加「乙」以一。昔之「乙」者。今其是矣。
	云云。
	吾有一言。曰「果」。書之。
	加「甲」以一。昔之「甲」者。今其是矣。
云云。

方法五(非原创),转载于“洛谷题解”

#include <bits/stdc++.h>
using namespace std;
int mp[100][100];
int last[100];
int n = 22, m = 62;
// 在[x1-x2, y1-y2]绘制ch
void draw(int x1, int y1, int x2, int y2, char ch = '#'){
    for(int i = x1; i <= x2; i++)
        for(int j = y1; j <= y2; j++)
            mp[i][j] = ch;
}
// 在[x1, y1]绘制ch
void draw(int x1, int y1, char ch = '#'){
    draw(x1, y1, x1, y1, ch);
}
// 以[x, y]为左上角绘制泥土
void drawland(int x, int y){
    draw(x, y, x+8, y+13);
    for(int i = x+1; i < x+8; i+=2)
        draw(i, y+1, i, y+12, '.');
    draw(x+1, y+4); draw(x+1, y+11);
    draw(x+3, y+3); draw(x+3, y+8);
    draw(x+5, y+6); draw(x+7, y+2);
    draw(x+7, y+5); draw(x+7, y+10);
}
// 以[x, y]为左上角绘制小岛
void drawisland(int x, int y){
    draw(x, y, x+3, y+19);
    draw(x+1, y+1, x+2, y+18, '-');
    draw(x+4, y+4, x+8, y+15);
    draw(x+4, y+5, x+7, y+14, '-');
}
// 以[x, y]为左上角绘制金币
void drawcoin(int x, int y){
    draw(x, y, x+5, y+4);
    draw(x+1, y+1, x+4, y+3, '.');
    draw(x+2, y+2, x+3, y+2);
    draw(x, y, ' '); draw(x+5, y, ' ');
    draw(x, y+4, ' '); draw(x+5, y+4, ' ');
}
// 以[x, y]为左上角绘制马里奥
void drawman(int x, int y){
    draw(x, y+5, x, y+12, '*'); x++;
    draw(x, y+4, x, y+15, '*'); x++;
    draw(x, y+4, x, y+7); draw(x, y+8, x, y+13, '.'); draw(x, y+12); x++;
    draw(x, y+2, x, y+14); draw(x, y+3, x, y+4, '.');
    draw(x, y+8, x, y+12, '.'); draw(x, y+15, x, y+18, '.'); x++;
    draw(x, y+2, x, y+17); draw(x, y+5, x, y+11, '.'); x++;
    draw(x, y+5, x, y+15, '.'); x++;
    draw(x, y+4, x, y+13); draw(x, y+6, '*'); x++;
    draw(x, y+1, x, y+17); draw(x, y+5, x, y+11, '*'); x++;
    draw(x, y, x+2, y+20, '.'); draw(x, y+4, x+2, y+16, '*');
    draw(x, y+3); draw(x, y+14, x+1, y+16); draw(x+1, y+16, '.');
    draw(x+2, y+8, x+2, y+11, ' '); draw(x, y+7, '.'); draw(x, y+12, '.');
    draw(x+3, y, x+4, y+19); draw(x+3, y+6, x+4, y+13, ' ');
    draw(x+3, y, x+3, y+1, ' '); draw(x+3, y+18, x+3, y+19, ' ');
}
// 打印输出
void printscreen(){
    for(int i = 1; i <= n; i++){
        last[i] = m;
        while(mp[i][last[i]] == ' ')
            last[i]--;
    }
    for(int i = 1; i <= n; i++,puts(""))
        for(int j = 1; j <= last[i]; j++)
            putchar(mp[i][j]);
}
int main(){
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            mp[i][j] = ' ';
    // 绘制人
    drawman(1, 12);
    // 绘制他脚下的三块泥土
    drawland(14, 1); drawland(14, 15); drawland(14, 29);
    // 绘制金币下面的那个岛屿
    drawisland(14, 43);
    // 绘制两个金币
    drawcoin(5, 43); drawcoin(5, 58);
    // 输出
    printscreen();
    return 0;
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值