C语言2048小游戏

由于假期过于无聊,我打算用我仅存的一点点编程基础敲一个2048小游戏

首先咱们要像正规游戏一样有一个像样的主页面
这就是像样的主页面
这个主页面够“像样”了吧,主页面具体实现代码如下

	int m=1;
	while(m){
		system("cls");
		int p;
		printf("┌──────────┐\n");
		printf("│   2048   │\n");
		printf("├──────────┤\n");
		printf("│1.开始游戏│\n");
		printf("├──────────┤\n");
		printf("│2.排行榜  │\n");
		printf("├──────────┤\n");
		printf("│3.退出    │\n");
		printf("└──────────┘\n");
		p=_getch();
		switch(p){
			case '1':doing();break;
			case '2':phb();break;
			case '3':m=0;break;
		}
	}

接下来咱们开始游戏,这个游戏的页面一定要紧凑主页面的风格,所以游戏页面是这样的
游戏页面
游戏过程需要一些函数代码的支撑:
(1)表格初始化函数

void start() {
	srand(time(0));
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			a[i][j]=0;
	int p=rand()%4;
	int q=rand()%4;
	a[p][q]=2;
}

(2)上下左右移动函数(以左移动函数为例)

void left() {
	int b[4][4];
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			b[i][j]=0;
	int w=1;
	for(int i=0;i<4;i++){
		int t=0;
		for(int j=0;j<4;j++){
			if(a[i][j])
				if(j!=0&&a[i][j]==a[i][j-1])
					w=0;
				else if(j-t==0)
					t++;
				else
					w=0;
		}
	}
	if(w)
		return ;
	for(int i=0; i<4; i++) {
		int k=0;
		for(int j=0; j<4; j++) {
			int t=1;
			while(k<4) {
				if(a[i][k])
					if(j==0) {
						a[i][j]=a[i][k];
						t=0;
						k++;
						break;
					} else if(!b[i][j-1]&&a[i][k]==a[i][j-1]) {
						a[i][j-1]*=2;
						b[i][j-1]=1;
						sum+=a[i][j-1];
					} else {
						a[i][j]=a[i][k];
						t=0;
						k++;
						break;
					}
				k++;
			}
			if(t)
				a[i][j]=0;
		}
	}
	add();
}

(3)判断是否结束游戏函数

int ss() {
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			if(!a[i][j])
				return 1;
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			if((j&&a[i][j]==a[i][j-1])||(i&&a[i][j]==a[i-1][j]))
				return 1;
	return 0;
}

(4)随机点插入随机数函数

void add() {
	int p=rand()%4;
	int q=rand()%4;
	int o=rand()%2+1;
	while(a[p][q]) {
		p=rand()%4;
		q=rand()%4;
	}
	a[p][q]=pow(2,o);
}

(5)显示4*4表格函数

void show(){
	for(int i=0;i<4;i++){
			if(i)
				printf("├─────┼─────┼─────┼─────┤\n");
			else
				printf("┌─────┬─────┬─────┬─────┐\n");
			printf("│");
			for(int j=0;j<4;j++)
				if(a[i][j])
					printf("%5d│",a[i][j]);
				else
					printf("     │");
			printf("\n");
			if(i==3)
				printf("└─────┴─────┴─────┴─────┘\n");
		}
}

终于啊,1640分结束了游戏
游戏结束页面

可能我有点菜,但毕竟我智商有限,这么多分我已经满足了
尊姓大名

没想到的是我居然是第一名,哈哈哈
风云榜

排行榜代码如下

void phb(){
	system("cls");
	printf("┌────────────────────┐\n"); 
	printf("│       风云榜       │\n");
	printf("└────────────────────┘\n");
	for(int i=0;i<n;i++){
		if(i==0){
			printf("┌──┬──────────┬──────┐\n");
		}
		else{
			printf("├──┼──────────┼──────┤\n");
		}
		printf("│%2d│%10s│%6d│\n",i+1,c[i].s,c[i].num);
		if(i==n-1){
			printf("└──┴──────────┴──────┘\n");
		} 
	}
	printf("\n");
	printf("请按任意键退出!\n");
	int p;
	p=_getch();
}

为了下次游戏可以保留当前排行榜,咱们把排行榜信息记录在文件中

FILE *f=fopen("score.txt","w");
	for(int i=0;i<n;i++)
		fprintf(f,"%s %d\n",c[i].s,c[i].num);
	fclose(f);

读取文件中信息函数如下

void fff(){
	FILE *f=fopen("score.txt","r");
	while(fscanf(f,"%s %d",c[n].s,&c[n].num)!=EOF)
		n++;
	fclose(f);
} 

这是我第一次用C语言编写小游戏,可能做出来的效果比较low,但我已经心满意足了

2048小游戏整体代码如下
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<conio.h>
#include<algorithm>
using namespace std;
int n=0;
struct cc{
	char s[20];
	int num;
}c[20];
int a[4][4];
int sum=0;
bool cmp(struct cc a,struct cc b){
	return a.num>b.num;
}
void start() {
	srand(time(0));
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			a[i][j]=0;
	int p=rand()%4;
	int q=rand()%4;
	a[p][q]=2;
}
void fff(){
	FILE *f=fopen("score.txt","r");
	while(fscanf(f,"%s %d",c[n].s,&c[n].num)!=EOF)
		n++;
	fclose(f);
} 
void add() {
	int p=rand()%4;
	int q=rand()%4;
	int o=rand()%2+1;
	while(a[p][q]) {
		p=rand()%4;
		q=rand()%4;
	}
	a[p][q]=pow(2,o);
}
void left() {
	int b[4][4];
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			b[i][j]=0;
	int w=1;
	for(int i=0;i<4;i++){
		int t=0;
		for(int j=0;j<4;j++){
			if(a[i][j])
				if(j!=0&&a[i][j]==a[i][j-1])
					w=0;
				else if(j-t==0)
					t++;
				else
					w=0;
		}
	}
	if(w)
		return ;
	for(int i=0; i<4; i++) {
		int k=0;
		for(int j=0; j<4; j++) {
			int t=1;
			while(k<4) {
				if(a[i][k])
					if(j==0) {
						a[i][j]=a[i][k];
						t=0;
						k++;
						break;
					} else if(!b[i][j-1]&&a[i][k]==a[i][j-1]) {
						a[i][j-1]*=2;
						b[i][j-1]=1;
						sum+=a[i][j-1];
					} else {
						a[i][j]=a[i][k];
						t=0;
						k++;
						break;
					}
				k++;
			}
			if(t)
				a[i][j]=0;
		}
	}
	add();
}
void right() {
	int b[4][4];
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			b[i][j]=0;
	int w=1;
	for(int i=0;i<4;i++){
		int t=3;
		for(int j=3;j>=0;j--){
			if(a[i][j])
				if(j!=3&&a[i][j]==a[i][j+1])
					w=0;
				else if(j-t==0)
					t--;
				else
					w=0;
		}
	}
	if(w)
		return ;
	for(int i=0; i<4; i++) {
		int k=3;
		for(int j=3; j>=0; j--) {
			int t=1;
			while(k>=0) {
				if(a[i][k])
					if(j==3) {
						a[i][j]=a[i][k];
						t=0;
						k--;
						break;
					} else if(!b[i][j+1]&&a[i][k]==a[i][j+1]) {
						a[i][j+1]*=2;
						b[i][j+1]=1;
						sum+=a[i][j+1];
					} else {
						a[i][j]=a[i][k];
						t=0;
						k--;
						break;
					}
				k--;
			}
			if(t)
				a[i][j]=0;
		}
	}
	add();
}
void down() {
	int b[4][4];
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			b[i][j]=0;
	int w=1;
	for(int i=0;i<4;i++){
		int t=3;
		for(int j=3;j>=0;j--){
			if(a[j][i])
				if(j!=3&&a[j][i]==a[j+1][i])
					w=0;
				else if(j-t==0)
					t--;
				else
					w=0;
		}
	}
	if(w)
		return ;
	for(int i=0; i<4; i++) {
		int k=3;
		for(int j=3; j>=0; j--) {
			int t=1;
			while(k>=0) {
				if(a[k][i])
					if(j==3) {
						a[j][i]=a[k][i];
						t=0;
						k--;
						break;
					} else if(!b[j+1][i]&&a[k][i]==a[j+1][i]) {
						a[j+1][i]*=2;
						b[j+1][i]=1;
						sum+=a[j+1][i];
					} else {
						a[j][i]=a[k][i];
						t=0;
						k--;
						break;
					}
				k--;
			}
			if(t)
				a[j][i]=0;
		}
	}
	add();
}
void up() {
	int b[4][4];
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			b[i][j]=0;
	int w=1;
	for(int i=0;i<4;i++){
		int t=0;
		for(int j=0;j<4;j++){
			if(a[j][i])
				if(j!=0&&a[j][i]==a[j-1][i])
					w=0;
				else if(j-t==0)
					t++;
				else
					w=0;
		}
	}
	if(w)
		return ;
	for(int i=0; i<4; i++) {
		int k=0;
		for(int j=0; j<4; j++) {
			int t=1;
			while(k<4) {
				if(a[k][i])
					if(j==0) {
						a[j][i]=a[k][i];
						t=0;
						k++;
						break;
					} else if(!b[j-1][i]&&a[k][i]==a[j-1][i]) {
						a[j-1][i]*=2;
						b[j-1][i]=1;
						sum+=a[j-1][i];
					} else {
						a[j][i]=a[k][i];
						t=0;
						k++;
						break;
					}
				k++;
			}
			if(t)
				a[j][i]=0;
		}
	}
	add();
}
int ss() {
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			if(!a[i][j])
				return 1;
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			if((j&&a[i][j]==a[i][j-1])||(i&&a[i][j]==a[i-1][j]))
				return 1;
	return 0;
}
void phb(){
	system("cls");
	printf("┌────────────────────┐\n"); 
	printf("│       风云榜       │\n");
	printf("└────────────────────┘\n");
	for(int i=0;i<n;i++){
		if(i==0){
			printf("┌──┬──────────┬──────┐\n");
		}
		else{
			printf("├──┼──────────┼──────┤\n");
		}
		printf("│%2d│%10s│%6d│\n",i+1,c[i].s,c[i].num);
		if(i==n-1){
			printf("└──┴──────────┴──────┘\n");
		} 
	}
	printf("\n");
	printf("请按任意键退出!\n");
	int p;
	p=_getch();
}
void show(){
	for(int i=0;i<4;i++){
			if(i)
				printf("├─────┼─────┼─────┼─────┤\n");
			else
				printf("┌─────┬─────┬─────┬─────┐\n");
			printf("│");
			for(int j=0;j<4;j++)
				if(a[i][j])
					printf("%5d│",a[i][j]);
				else
					printf("     │");
			printf("\n");
			if(i==3)
				printf("└─────┴─────┴─────┴─────┘\n");
		}
}
void doing() {
	start();
	system("cls");
	int t=ss();
	while(t) {
		show();
		printf("得分:%d\n",sum);
		printf("上:↑,下:↓,左:←,右:→\n");
		int l;
		int m=1;
		while(m) {
			l = _getch();
			switch(l) {
				case 72: {
					up();
					m=0;
					break;
				}
				case 75: {
					left();
					m=0;
					break;
				}
				case 80: {
					down();
					m=0;
					break;
				}
				case 77: {
					right();
					m=0;
					break;
				}
			}
		}
		t=ss();
		system("cls");
	}
	show();
	printf("游戏结束!\n");
	printf("得分:%d\n",sum);
	printf("按'0'结束");
	int pp=1;
	while(pp!='0')
		pp=_getch(); 
	system("cls");
	printf("得分:%d\n",sum);
	printf("尊姓大名:");
	scanf("%s",c[n].s);
	c[n++].num=sum;
	sort(c,c+n,cmp);
	if(n>10)
		n=10;
	FILE *f=fopen("score.txt","w");
	for(int i=0;i<n;i++)
		fprintf(f,"%s %d\n",c[i].s,c[i].num);
	fclose(f);
	phb();
}
int main(){
	fff();
	int m=1;
	while(m){
		system("cls");
		int p;
		printf("┌──────────┐\n");
		printf("│   2048   │\n");
		printf("├──────────┤\n");
		printf("│1.开始游戏│\n");
		printf("├──────────┤\n");
		printf("│2.排行榜  │\n");
		printf("├──────────┤\n");
		printf("│3.退出    │\n");
		printf("└──────────┘\n");
		p=_getch();
		switch(p){
			case '1':doing();break;
			case '2':phb();break;
			case '3':m=0;break;
		}
	}
	return 0;
}
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值