由于假期过于无聊,我打算用我仅存的一点点编程基础敲一个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;
}