2048 小游戏

一个简易的2048小游戏     算是学习C语言的一次小练手,马马虎虎把

 

/***********************************

2048 游戏
游戏规则:
1.开始时在方块内随即产生两个数字  2    (需要随机数)
2.通过w a s d 控制游戏   (移动数字)
3.所有的数字都会随按键方向靠拢
4.在靠拢的过程中,如果相邻的数字一样的,相加
5.当整个界面中产生一个2048 游戏胜利 (胜利判定条件)
6.当整个界面中没有空格(0)的时候,游戏失败(失败判定条件)


************************************/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define SIZE  4




int score=0;                        //我看别人都用了,不用觉得很low
int map[SIZE][SIZE]={0};


char getch(void)                     
{
char n=0;
system("stty -icanon");
system("stty -echo");
n=getchar();
system("stty icanon");
system("stty echo");
return n;
}




void pauses()                       //清屏暂定输入功能
{
while(getchar()!='\n');
getchar();
}
void printf_MAP();                        //数组print 
void put_new(char dir);                   //数组中随即出现2
void game();                              //相当于游戏开始
void Add(char dir);                       //每次移动符合条件的两个区域会加起来
                                          //具体函数装成了下面四个函数
void moveup();                            //向上移动,并且数组自动计算
void movedown();      //下同
void moveleft();
void moveright();
int check();                              //胜利或者失败条件判断




void main(void)
{
int a=0;
srand(time(NULL));
printf("\t\t+----------------------+\n");
printf("\t\t|   welcome to 2014    |\n");
printf("\t\t|   任意key开始 q退出  |\n");
printf("\t\t|   name:钱   PQ1709   |\n");
printf("\t\t+----------------------+\n");
pauses();

system("clear");
put_new('0');        //开始
game();

}




void printf_MAP()
{
//可以使用for循环构图,但是代码不是很直观。
printf("\t\t+-------------------------------+\n");
printf("\t\t| %4d  | %4d  | %4d  | %4d  |\n",map[0][0],map[0][1],map[0][2],map[0][3]);
printf("\t\t|-------------------------------+\n");
printf("\t\t| %4d  | %4d  | %4d  | %4d  |\n",map[1][0],map[1][1],map[1][2],map[1][3]);
printf("\t\t+-------------------------------+\n");
printf("\t\t| %4d  | %4d  | %4d  | %4d  |\n",map[2][0],map[2][1],map[2][2],map[2][3]);
printf("\t\t+-------------------------------+\n");
printf("\t\t| %4d  | %4d  | %4d  | %4d  |\n",map[3][0],map[3][1],map[3][2],map[3][3]);
printf("\t\t|-------------------------------+\n");
printf("\t\t   your score: %d\n",score);
}


void Add(char dir)                            //wasd操作
{
int i=0;int j=0;int k=0;
switch(dir){
case 'w':
moveup();
break;
case 's':
movedown();
break;
case 'a':
moveleft();
break;
case 'd':
moveright();
break;
}
}


void game()
{
char c='\0';
c=getch();
//scanf("%c",&c);
//while(getchar()!='\n');
while(c!='q'){
system("clear");
Add(c);                                        //计算移动后的数组
if(check()==1){
printf("\t\t恭喜您赢了!\n");
printf_MAP();
printf("感谢汪易方老师和陈老师的帮助和教导\n");
break;
}else if(!check()){
printf("\t\t恭喜您输了\n");
printf_MAP();
printf("感谢汪易方老师和陈老师的帮助和教导\n");
break;
}
put_new(c);                                    //计算之后在随即家一个数字2
printf_MAP();                                  
c=getch();
//while(getchar()!='\n');                        //讨厌的缓存
}
}
void put_new(char dir)
{
int i=0;
int row =0, col =0;
row=rand()%4;                        //随即生成行列
col=rand()%4;                     
switch(dir){
case '0':map[row][col]=2;break;    //开局随即产生2
case 'w':
if(map[3][col]==0){                //w:   (如果第三行随即处!=0) 在第三行随即产生一个2,如果等于0,则循环在一个不等于0的地方产生2
map[3][col]=2;
}else {
for(i=0;i<4;i++){
if(map[3][i]==0){
map[3][i]=2;
break;
}
}
}
break;
case 's':
if(map[0][col]==0){                
map[0][col]=2;
}else {
for(i=0;i<4;i++){
if(map[0][i]==0){
map[0][i]=2;
break;
}
}
}
break;
case 'a':
if(map[row][3]==0){                
map[row][3]=2;
}else {
for(i=0;i<4;i++){
if(map[row][3]==0){
map[row][3]=2;
break;
}
}
}
break;
case 'd':
if(map[row][0]==0){                
map[row][0]=2;
}else {
for(i=0;i<4;i++){
if(map[row][0]==0){
map[row][0]=2;
break;
}
}
}
break;
default :break;


}
}




void moveup()                            
{
int i=0;int j=0;int k=0;                            //循环四次每次一列
for(j=0;j<4;j++){
int n=4;
while(n--){                                     //循环四次
for(i=0;i<3;i++){                           //循环三次,最后一行没意义
if(map[i][j]==0){                       //找到行中的0
for(k=i;k<3;k++){                   //0下面的数字向上移动
map[k][j]=map[k+1][j];          //下面的数字变成0
map[k+1][j]=0;
}
}
}
}
for(i=0;i<3;i++){                                //相邻的两个数字如果相等
if(map[i][j]==map[i+1][j]){                  //上面的数字翻北
map[i][j]*=2;                            //下面的数字变成0
score+=10;
for(k=i+1;k<3;k++){
map[k][j]=map[k+1][j];
map[k+1][j]=0;
}
}
}
}

}


void movedown()
{
int i=0;int j=0;int k=0;
for(j=0;j<4;j++){
int n=4;
while(n--){
for(i=3;i>0;i--){
if(map[i][j]==0){
for(k=i;k>0;k--){
map[k][j]=map[k-1][j];
map[k-1][j]=0;
}
}
}
}
for(i=3;i>0;i--){
if(map[i][j]==map[i-1][j]){
map[i][j]*=2;
score+=10;
for(k=i-1;k>0;k--){
map[k][j]=map[k-1][j];
map[k-1][j]=0;
}
}
}
}
}
void moveleft()
{
int i=0;int j=0;int k=0;
for(i=0;i<4;i++){
int n=4;
while(n--){
for(j=0;j<3;j++){
if(map[i][j]==0){
for(k=j;k<3;k++){
map[i][k]=map[i][k+1];
map[i][k+1]=0;
}
}
}
}
for(j=0;j<3;j++){
if(map[i][j]==map[i][j+1]){
map[i][j]*=2;
score+=10;
for(k=j+1;k<3;k++){
map[i][k]=map[i][k+1];
map[i][k+1]=0;
}
}
}
}
}
void moveright()
{
int i=0;int j=0;int k=0;
for(i=0;i<4;i++){
int n=4;
while(n--){
for(j=3;j>0;j--){
if(map[i][j]==0){
for(k=j;k>0;k--){
map[i][k]=map[i][k-1];
map[i][k-1]=0;
}
}
}
}
for(j=3;j>0;j--){
if(map[i][j]==map[i][j-1]){
map[i][j]*=2;
score+=10;
for(k=j-1;k>0;k--){
map[i][k]=map[i][k-1];
map[i][k-1]=0;
}
}
}
}
}


int check()
{
int i=0;int j=0;
for(i=0;i<4;i++){                                   //2048太多了,我改成128,游戏可以胜利;
for(j=0;j<4;j++){
if(map[i][j]==2048){
return 1;
}
}
}
for(i=0;i<4;i++){
for(j=1;j<4;j++){
if(map[i][j]==map[i][j-1]){
return 2;
}
}
}
for(j=0;j<4;j++){
for(i=0;i<4;i++){
if(map[i-1][j]==map[i][j]){
return 2;
}
}
}

for(i=0;i<4;i++){                               
for(j=0;j<4;j++){
if(map[i][j]==0){
return 2;
}
}
}     
return 0  ;                         //代表没有数字相等了并且没有0,不可以移动了,return gg
 

}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 2048是一款非常有趣的数字游戏,可以通过Python编程实现。 首先,我们需要安装pygame模块来实现游戏图形面。可以使用以下命令来安装pygame: ``` pip install pygame ``` 然后,我们可以根据2048游戏规则,设计游戏的逻辑。我们需要一个4x4的方格来存储数字,并可以进行上下左右四个方向的移动。每次移动时,相邻的相同数字会合并成一个数字,并在空白的方格上生成一个新的数字。当方格被填满,无法继续移动时,游戏结束。 接下来是代码实现,以下是一个简单的2048游戏实现代码: ```python import pygame import random # 初始化游戏 pygame.init() # 游戏面大小 screen_width = 400 screen_height = 400 # 方格大小 grid_size = 100 # 方格间隔 grid_gap = 10 # 游戏面 screen = pygame.display.set_mode([screen_width, screen_height]) # 游戏标题 pygame.display.set_caption("2048") # 游戏颜色 background_color = (250, 248, 239) grid_color = (187, 173, 160) text_color = (119, 110, 101) # 字体 font = pygame.font.SysFont("Arial", 36) # 数字颜色 number_color = { 0: (204, 192, 179), 2: (238, 228, 218), 4: (237, 224, 200), 8: (242, 177, 121), 16: (245, 149, 99), 32: (246, 124, 95), 64: (246, 95, 59), 128: (237, 207, 114), 256: (237, 204, 97), 512: (237, 200, 80), 1024: (237, 197, 63), 2048: (237, 194, 46), } # 初始化方格 grid = [[0 for i in range(4)] for j in range(4)] # 随机生成一个数字 def generate_number(): x = random.randint(0, 3) y = random.randint(0, 3) while grid[x][y] != 0: x = random.randint(0, 3) y = random.randint(0, 3) grid[x][y] = 2 # 绘制方格 def draw_grid(): for i in range(4): for j in range(4): pygame.draw.rect(screen, grid_color, (i * (grid_size + grid_gap) + grid_gap, j * (grid_size + grid_gap) + grid_gap, grid_size, grid_size)) if grid[i][j] != 0: text = font.render(str(grid[i][j]), True, number_color[grid[i][j]]) text_rect = text.get_rect(center=(i * (grid_size + grid_gap) + grid_size / 2 + grid_gap, j * (grid_size + grid_gap) + grid_size / 2 + grid_gap)) screen.blit(text, text_rect) # 判断游戏是否结束 def is_game_over(): for i in range(4): for j in range(4): if grid[i][j] == 0: return False if i > 0 and grid[i][j] == grid[i - 1][j]: return False if i < 3 and grid[i][j] == grid[i + 1][j]: return False if j > 0 and grid[i][j] == grid[i][j - 1]: return False if j < 3 and grid[i][j] == grid[i][j + 1]: return False return True # 移动方格 def move(key): if key == pygame.K_UP: for j in range(4): for i in range(1, 4): if grid[i][j] != 0: k = i - 1 while k >= 0 and grid[k][j] == 0: k -= 1 if k >= 0 and grid[k][j] == grid[i][j]: grid[k][j] *= 2 grid[i][j] = 0 elif k < i - 1: grid[k + 1][j] = grid[i][j] grid[i][j] = 0 elif key == pygame.K_DOWN: for j in range(4): for i in range(2, -1, -1): if grid[i][j] != 0: k = i + 1 while k <= 3 and grid[k][j] == 0: k += 1 if k <= 3 and grid[k][j] == grid[i][j]: grid[k][j] *= 2 grid[i][j] = 0 elif k > i + 1: grid[k - 1][j] = grid[i][j] grid[i][j] = 0 elif key == pygame.K_LEFT: for i in range(4): for j in range(1, 4): if grid[i][j] != 0: k = j - 1 while k >= 0 and grid[i][k] == 0: k -= 1 if k >= 0 and grid[i][k] == grid[i][j]: grid[i][k] *= 2 grid[i][j] = 0 elif k < j - 1: grid[i][k + 1] = grid[i][j] grid[i][j] = 0 elif key == pygame.K_RIGHT: for i in range(4): for j in range(2, -1, -1): if grid[i][j] != 0: k = j + 1 while k <= 3 and grid[i][k] == 0: k += 1 if k <= 3 and grid[i][k] == grid[i][j]: grid[i][k] *= 2 grid[i][j] = 0 elif k > j + 1: grid[i][k - 1] = grid[i][j] grid[i][j] = 0 # 游戏主循环 generate_number() while True: # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: move(event.key) if not is_game_over(): generate_number() else: print("Game Over!") # 绘制面 screen.fill(background_color) draw_grid() pygame.display.flip() ``` 运行代码,即可开始游戏。通过上下左右方向来移动方格,合并相同数字。当方格被填满,无法继续移动时,游戏结束。 ### 回答2: 2048小游戏是一款非常流行的益智游戏,玩家需要通过合并相同数字的方块,最终得到2048这个数字方块。 在Python中编写这个游戏,可以使用面向对象的思想来实现。首先,我们需要创建一个2048游戏类,其中包含游戏面的初始化、方块的生成与移动等方法。 游戏开始时,我们可以使用一个二维数组来表示游戏面,每个位置的值代表方块上的数字。我们可以在游戏开始时随机生成两个数字方块,然后玩家可以通过盘输入来移动方块。移动的过程中,如果两个相邻方块的数字相同,它们会合并为一个新方块。每次移动,都要随机生成一个新的数字方块。 在创建游戏类的同时,我们可以定义一个打印游戏面的方法,用来显示当前方块的位置和数字。我们还可以编写一个判断游戏是否结束的方法,如果面上没有可以移动的方块或者已经达到2048,则游戏结束。 总的来说,编写2048小游戏需要考虑游戏面的初始化和刷新、方块的生成和移动、游戏结束的判断等方面。通过使用Python面向对象的编程思想,我们可以比较方便地实现这个小游戏。 ### 回答3: 2048是一款流行的数字益智游戏,它的目标是通过在一个4x4的方格上移动并合并相同数字的方块来达到数字2048。 首先,我们需要导入必要的库。在Python中,我们可以使用pygame库来创建游戏面并处理用户的输入。 然后,我们需要定义一个方格的类,用于存储每个方格的数字和位置。该类应包括以下方法:初始化方格,绘制方格和移动方格。 接下来,我们需要定义一个游戏板的类,用于存储所有方格,并处理方格的移动和合并。该类应包括以下方法:初始化游戏板,生成新的方格,移动方格,合并方格和检查游戏是否结束等。 在游戏循环中,我们首先创建一个游戏板的实例,并生成初始方格。然后,我们使用pygame库创建游戏窗口,并进入游戏循环,等待用户的输入。 当用户按下方向时,我们将调用游戏板的移动方格和合并方格的方法来处理方格的移动和合并。如果方格成功移动或合并,我们将生成一个新的方格。然后,我们将重新绘制游戏面,显示更新后的方格。 游戏循环会一直进行,直到出现某个方块的数字达到2048,或者没有可以移动的方格时,游戏结束。在游戏结束时,我们将显示游戏结束的信息,并提供重新开始游戏或退出游戏的选项。 以上就是使用Python编写2048小游戏的大致流程。实际编写代码时,还需要注意处理边条件、用户输入的验证以及游戏结束的判断等细节。希望这个回答对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值