• 回答数

    6

  • 浏览数

    284

dragonyanyan
首页 > 毕业论文 > 基于c语言2048的小游戏毕业论文

6个回答 默认排序
  • 默认排序
  • 按时间排序

最爱尛草莓

已采纳

/*幸运52游戏 */#include<>void main(){int a,b,c;char name[20];printf("请输入您的姓名:\n");scanf("%s",name);printf("请设置玩家的游戏猜谜次数\n");scanf("%d",&b);printf("请设置猜谜的正确答案\n");scanf("%d",&c);printf("\n好了,游戏开始\n*****************************************\n请输入数字:\n");scanf("%d",&a);while(a!=c&&b>0){if(a>c)printf("大了\n");elseprintf("小了\n");b--;scanf("%d",&a);}if(a==c){printf("\n*****************************************\n恭喜您过关了!\n玩家:%s\t",name);}elseprintf("\n*****************************************\n游戏结束,大虾请重新来过\n");getch();}

104 评论

Lucy…黄小猪

学号:    姓名:高少魁 【嵌牛导读】2048游戏在网页端与移动端均可以使用,本设计将该游戏移植到了硬件平台FPGA上,使用Digilent Nexys 4 DDR 开发板,使用Xilinx Vivado 用于搭建基于MicroBlaze 软核处理器的硬件运行环境,“2048”游戏主程序和VGA 显示控制等程序的编写在Xilinx SDK 上进行。游戏必需的上、下、左、右方向控制,在物理上由开发板上的按键实现,在软件层面通过查询方式实现。最终,嵌入式系统的运行结果将输出到显示屏上,包含4×4 棋盘方格、游戏得分和游戏结果。 【嵌牛鼻子】FPGA    VGA    最小嵌入式系统    软核CPU 【嵌牛正文】 一、硬件设计 系统设计的整体电路框图如图所示 硬件部分由基于MicroBlaze 软核处理器的最小嵌入式系统和外围的输入输出模块构成。最小嵌入式系统以MicroBlaze 软核处理器、时钟模块(Clocking Wizard)、处理器系统复位模块(Processor System Reset)、调试模块(MicroBlaze Debug Module,MDM)、内置存储(LocalMemory)和外置存储接口模块(Memory Interface Generator,MIG)为核心,以AXI 总线互联模块(AXI Interconnect)作为处理器与外设的通信基础,以直接或间接挂载于其上的AXI 中断控制器(AXI Interrupt Controller)和中断请求集成器(Concat)作为中断信号的数据通路。 外围输入输出模块包括以下若干部分,它们均通过AXI 总线与处理器通信。UART 模块(AXI Uartlite)实现嵌入式系统与计算机的调试通信,GPIO 模块(AXI GPIO)实现按键输入,TFT 模块(AXI TFT Controller)把系统运行结果通过VGA 接口输出。 由于软件部分需要存储大量的图片资源,且TFT 模块要求显存不少于2MB,而处理器的内置存储空间不足,故使用MIG 模块以使用外置DDR2 存储。硬件系统共需要有三种不同频率的时钟信号:处理器需要100MHz 时钟、MIG 模块需要200MHz 时钟、TFT 模块需要25MHz 时钟,故Clocking Wizard 输出三路时钟。 要把上述嵌入式系统在FPGA 上实现,需要添加管脚约束。共有三处需要添加约束:时钟信号输入、GPIO 模块的按键输入和TFT 模块的VGA 接口输出。前两处在添加相应IP 核时以完成约束,TFT 模块的约束需要手动完成,即把红、绿、蓝三通道颜色信号和行、场同步信号约束到VGA 端子上。 二、软件设计 1.图片素材 嵌入式系统的运行结果,即“2048 ”游戏的状态需要以图形的方式输出到显示屏,因此需要把所有可能显示的较为复杂的内容预先制作好并存储起来。这些内容包括2~ 65536 共16个数字方块、用于显示得分的 0~ 9 这十个数字 、“得分”提示语 和游戏给出的“赢”和“输”的提示信息,均使用 Adobe Photoshop制作。然后,利用 Image 2 Lcd 工具软件把图片输出为 C 语言格式的数组备用。 2.主程序部分 主程序实现的功能为:配置硬件工作参数 、调用 VGA 显示部分的函数来显示两幅静态页面 、初始化游戏、初始化屏幕显示和 识别用户输入的控制信号并传输给游戏核心部分。 硬件工作参数包括GPIO 通道的数据传输方向 、 显存基地址 和 TFT 扫描方式 。 GPIO 用于获取用户输入的控制信息,因此方向为输入 TRI 寄存器的值配置为 0 x1F 。显存基地址为0x 87 E 00000 ,大小为 2MB ,该信息写入 AR 寄存器 。 TFT 显示控制器的工作参数为从左到右扫描、开启显示输出,相应地把 0x 1 写入 CR 寄存器。 程序开始执行时,首先调用VGA 显示部分的两个函数分别 2~ 65536 共 16 种不同数字方格的棋盘。 然后,调用函数开始一局新游戏并在屏幕上预先绘制好不需要更新的棋盘区域底框、“得分”提示信息和显示分数的区域的底框。 主程序使用查询的方式不断获取 GPIO 寄存器提供的用户输入信息。当有输入时,调用游戏核心部分的函数更新“棋盘”信息。 显示部分 该部分程序按照一定的规则向显存写入数据以在显示屏上显示不同的内容。这些内容包括 2~ 65536 共 16 种数字方格的棋盘、得分信息、游戏进行时的棋盘和提示信息。 2~ 65536 共 16 种数字方格的棋盘在程序刚开始执行时显示,每幅画面大约显示 5 秒,用软件延时粗略控制。随着游戏的进行, VGA 显示部分不断读取“棋盘”,并把代表相应数字的图片绘制到显示器上。同时,它还读取得分信息,并绘制到预先设定的位置。如果“棋盘”上出现了“ 2048 ”,它输出“赢”的提示信息。如果“棋盘”上的方格均不能移动且没有出现“ 2048 ”,则显示“输”的提示信息。 4.游戏核心部分 游戏核心部分主要涉及对“棋盘” 的处理 ,程序把它抽象为 4 × 4 的二维数组。这部分的功能包括: 游戏初始化、 方块四个方向 的移动和合并策略、向棋盘添加一个新的方块、检查游戏的状态、计算得分和获取游戏的状态信息。 游戏初始化把得分清零,并向棋盘添加两个数字。方块四个方向的移动和合并策略与我们之前体验过的2048 游戏完全一致。方块移动后,“棋盘”上一定会增加一个新的方块,可能是2 或 4 ,概率为 9:1 。之后,程序检查“棋盘”上是否出现过 2048 。如果出现过(“棋盘”上至少有一个不小于“ 2048的方格),则游戏结束,通知 VGA 绘图部分显示“赢”的提示信息。如果没有出现过,则检查棋盘上的空余位置数量数量以以及方块是否还能移动。如果没有空余位置且方块不能继续移动,及方块是否还能移动。如果没有空余位置且方块不能继续移动,则游戏失败,通知则游戏失败,通VGA显示部分显示部分输出“输”的提示信息。接下来,输出“输”的提示信息。接下来,程序将通知程序将通知VGA显示部显示部分更新“棋盘”和得分的显示。分更新“棋盘”和得分的显示。 三、设计运行效果 运行效果如下图

250 评论

ellalikesyou

做个毕设100分就有人做?真是值得怀疑?

89 评论

夏至迎熙

机顶盒上游戏开发可以么,也是用C语言写的目 录第一章 绪论 机顶盒的产生背景 机顶盒的发展及其现状 游戏模块设计的必要性 模块设计需要解决的问题 3第二章 系统开发环境及相关技术介绍 XX-XX硬件平台 XX操作系统 内核 任务机制 消息队列 信号量 C语言的特点 7第三章 开发流程 功能需求分析 可行性分析 模块设计 编码 测试 11第四章 系统设计 游戏模块接口设计 游戏的初始化 游戏的按键读取和转化 游戏的暂停、恢复和退出 游戏算法设计 推箱子游戏设计 俄罗斯方块游戏设计 黑白棋游戏设计 14结 论 16谢 辞 17参 考 文 献 18附录 推箱子游戏源程序 19

183 评论

香蕉君诶嘿嘿

小游戏2048:

#include<>

#include<>

#include<>

#include<>

#include<>

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 Color(int a)   //设定字符颜色的函数(a应为1-15)

{  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);  }

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 gb={1,0};  //以下两行是隐藏光标的设置,gb代指光标

SetConsoleCursorInfo( GetStdHandle(STD_OUTPUT_HANDLE), &gb );

Color(14);   //设置字体淡黄色

printf("\n\n\t\t  2048小游戏"); Color(7);   //恢复白字黑底

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("      "); Color(7); printf("│");}

else if(a[i][j]<10){ if (a[i][j] == 2) { Color(14); }

else if (a[i][j] == 4) { Color(13); }

else if (a[i][j] == 8) { Color(12); }

printf("   %d  ", a[i][j]); Color(7 ); printf("│");

}

else if (a[i][j] < 100){if (a[i][j] == 16) { Color(12); }

else if (a[i][j] == 32) { Color(10); }

else if (a[i][j] == 64) { Color(2 ); }

printf("  %d  ", a[i][j]); Color(7); printf("│");

}

else if (a[i][j] < 1000) {if (a[i][j] == 128) { Color(9); }

else if (a[i][j] == 256) { Color(1); }

else if (a[i][j] == 512) { Color(13); }

printf("  %d ", a[i][j]); Color(7); printf("│");

}

else if (a[i][j] < 10000) {if (a[i][j] == 1024) { Color(5); }

else { Color(15); }

printf(" %d ", a[i][j]); Color(7); printf("│");

}

}

if (jsk( ) == 0)

{  yes( );  if (over) { gtxy(9,12); Color(10);

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 zb;   //zb代指坐标

= x;

= y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), zb);

}

134 评论

兜里五块糖

/*2048*/#include<>#include<>#include<>#include<>int code[4][4]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0};/*游戏中的16个格子*/int temp[5];/*中间变量*/int move=0;/*移动次数*/int score=0;/*分数*/void print(void)/*显示游戏界面*/{ int i,j; clrscr();/*清屏*/ printf("2048\n"); printf("W--UP A--LEFT S--DOWN D--RIGHT 0--EXIT\n"); printf("Score:%d Move:%d\n",score,move); printf("Made by Yanjisheng\n"); printf("|-------------------|\n");/*显示横向分隔线*/ for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { if(code[i][j]==0) { printf("| ");/*0显示空格*/ } else { printf("|%4d",code[i][j]);/*显示数字和分隔线*/ } } printf("|\n|-------------------|\n");/*显示横向分隔线*/ }}int add(void)/*对中间变量数组进行处理*/{ int i; int t=0; int change=0;/*判断数组是否有改变,0不变,1变化*/ do { for(i=0;i<=3;i++) { if(temp[i]==0) { if(temp[i]!=temp[i+1]) change=1;/*当一个0后面不是0时数组改变*/ temp[i]=temp[i+1]; temp[i+1]=0; } }/*去掉中间的0*/ t++; }while(t<=3);/*重复多次*/ for(i=1;i<=3;i++) { if(temp[i]==temp[i-1]) { if(temp[i]!=0) { change=1;/*当两个非零相同的数相加时数组改变*/ score=score+temp[i];/*加分*/ } temp[i-1]=temp[i-1]*2; temp[i]=0; } }/*把两个相邻的相同的数加起来*/ do { for(i=0;i<=3;i++) { if(temp[i]==0) { temp[i]=temp[i+1]; temp[i+1]=0; } }/*去掉中间的0*/ t++; }while(t<=3);/*重复多次*/ return change;}int main(void){ int gameover=0;/*判断游戏是否结束,1结束,0继续*/ int i,j; int change=1;/*判断格子中的数是否改变,0不变*/ char input; srand((unsigned)time(NULL));/*设置随机数的起点*/ while(gameover==0) { if(change>=1)/*仅当数发生改变时添加新数*/ { do { i=((unsigned)rand())%4; j=((unsigned)rand())%4; }while(code[i][j]!=0); if(((unsigned)rand())%4==0) { code[i][j]=4; } else { code[i][j]=2;/*随机选一个空格填上2或4*/ } move++;/*增加次数*/ } print();/*显示*/ input=getch();/*输入方向*/ change=0; switch(input) { case '0':/*退出*/ printf("Are you sure to exit?(y/n)"); input=getchar(); if(input=='y'||input=='Y') exit(0); break; case 'W': case 'w':/*上*/ for(j=0;j<=3;j++) { for(i=0;i<=3;i++) { temp[i]=code[i][j];/*把一列数移到中间变量*/ } temp[4]=0; change=change+add(); for(i=0;i<=3;i++) { code[i][j]=temp[i];/*把处理好的中间变量移回来*/ } } break; case 'A': case 'a':/*左*/ for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { temp[j]=code[i][j];/*把一行数移到中间变量*/ } temp[4]=0; change=change+add(); for(j=0;j<=3;j++) { code[i][j]=temp[j];/*把处理好的中间变量移回来*/ } } break; case 'S': case 's':/*下*/ for(j=0;j<=3;j++) { for(i=0;i<=3;i++) { temp[i]=code[3-i][j];/*把一列数移到中间变量*/ } temp[4]=0; change=change+add(); for(i=0;i<=3;i++) { code[3-i][j]=temp[i];/*把处理好的中间变量移回来*/ } } break; case 'D': case 'd':/*右*/ for(i=0;i<=3;i++) { for(j=0;j<=3;j++) { temp[j]=code[i][3-j];/*把一行数移到中间变量*/ } temp[4]=0; change=change+add(); for(j=0;j<=3;j++) { code[i][3-j]=temp[j];/*把处理好的中间变量移回来*/ } } break; } gameover=1; for(i=0;i<=3;i++) for(j=0;j<=3;j++) if(code[i][j]==0) gameover=0;/*所有格子都填满则游戏结束*/ } printf("Game over!\n"); getch(); return 0;}

323 评论

相关问答

  • 基于c的网站毕业论文

    兄弟,论文要自己用心写。我是过来人,自己写论文只有好处,没有坏处的。

    大璐璐131483 5人参与回答 2023-12-08
  • 基于java拼图小游戏的毕业论文

    一切一切…网上搜搜…给我分吧…回答者: 不知道吧哈哈哈 - 高级魔法师 七级 5-11 08:53这个不知道吧哈哈哈就是垃圾厚脸皮跟人家要分

    米米狗狗 6人参与回答 2023-12-09
  • 基于c语言的通讯录毕业论文

    应该是要求你用C语言写一个关于通讯录和记事本的程序.然后围绕这个来写一篇论文.主要是看你们学校以及你的老师对你有什么具体要求.这个你必须要自己去问清楚.一般来说

    哈毛小子 5人参与回答 2023-12-07
  • 基于c型槽天线的毕业论文

    5G通信是未来移动通信系统一个新的发展方向,当前这种技术还不是很成熟,处于探索和研发阶段。下面是我带来的关于5g通信技术论文的内容,欢迎阅读参考!5g通信技术论

    无锡一号 4人参与回答 2023-12-07
  • c语言和java语言毕业论文

    摘 要网络中的资源非常丰富,但是如何有效的搜索信息却是一件困难的事情。建立搜索引擎就是解决这个问题的最好方法。本论文首先详细介绍了基于英特网的搜索引擎的系统结

    h071232003 5人参与回答 2023-12-09