C語言小游戲 ——俄羅斯方塊

#include<stdio.h> 
#include<stdlib.h> 
#include<windows.h>//Sleep()函數的頭文件 
#include<time.h> 
#include<conio.h> 
#define MOD 28 
#define SIZE_N 19//控制邊框的高度
#define SIZE_M 12 //控制邊框的寬度
int a[100]={200,30,20};//定義排行榜
int cur_x,cur_y,score,mark,next,map[SIZE_N][SIZE_M],Gamespeed=300; 
char key1,key; 
int shape[28][6]={//這是個比較偷懶的方法,就是7種方塊,加上旋轉總共28種 
{0,-1,0,-2,1,0}, {0,1,1,0,2,0}, {-1,0,0,1,0,2}, {0,-1,-1,0,-2,0}, 
{0,-1,0,1,-1,0}, {0,1,1,0,-1,0},{1,0,0,-1,0,1}, {1,0,-1,0,0,-1}, 
{-1,1,0,1,1,0}, {0,-1,1,0,1,1},{-1,0,0,-1,1,-1}, {-1,-1,-1,0,0,1}, {-1,0,0,1,1,1}, {0,1,1,-1,1,0},{-1,0,0,1,1,1}, {0,1,1,-1,1,0}, 
{-1,0,0,-1,0,-2}, {-1,0,-2,0,0,1},{0,1,0,2,1,0}, {0,-1,1,0,2,0}, 
{0,1,1,0,1,1}, {0,-1,1,0,1,-1}, {-1,0,0,-1,-1,-1}, {-1,0,-1,1,0,1}, 
{0,1,0,2,0,3}, {1,0,2,0,3,0}, {0,-1,0,-2,0,-3}, {-1,0,-2,0,-3,0} 
};                     
void gotoxy(int x,int y)
{COORD c; //定義了一個結構體變量c,有兩個成員x,yc.X=x-1; c.Y=y-1; SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);//設置控制臺光標位置 
} 
//游戲結束的判斷函數
void Gameover()
{//游戲結束的判斷 int i,j,flag=0; for(j=1;j<SIZE_M-1;j++){if(map[1][j]!=0){ flag=1;break; } } if(flag==1){ for(i=1;i<SIZE_N-1;i++){ gotoxy(2,i+1); for(j=1;j<SIZE_M-1;j++){ printf("■"); }puts(""); } gotoxy(7,3); int t;for(j=0;j<3;j++)for(i=0;i<3-j;i++)if(a[i]<a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("GAME OVER!"); gotoxy(8,9); //輸出下面一行內容的位置是9行7列printf(" 排行榜 \n");for(i=0,j=6;i<3;i++,j++){gotoxy(8,j); printf(" 第%d名 %d\n",i+1,a[i]);} gotoxy(1,SIZE_N+1); exit(0); //游戲結束} 
} 
//顯示游戲底板的函數
void ShowMap(int id)
{ int i,j; gotoxy(1,1); if(id!=-1){ for(i=0;i<SIZE_N;i++){ for(j=0;j<SIZE_M;j++){ if(i==0&&j==0 || i==0&&j==SIZE_M-1 || j==0&&i==SIZE_N-1 || j==SIZE_M-1&&i==SIZE_N-1)printf(" "); else if(i==0 || i==SIZE_N-1)printf("--"); //控制游戲上下邊框的圖案else if(j==0 || j==SIZE_M-1)printf("|"); //控制游戲左右邊框的圖案else if(map[i][j]==2) printf("■"); //圖形落地時里邊的圖案else if(i==cur_x+shape[id][0] && j==cur_y+shape[id][1] || i==cur_x+shape[id][2] && j==cur_y+shape[id][3] || i==cur_x+shape[id][4] && j==cur_y+shape[id][5] || i==cur_x && j==cur_y) printf("■"); //圖形開始出現時的圖案else if(map[i][j]==0) printf("  ");  //游戲邊框里的填充圖案} if(i==1)printf("   next:"); //表示提示下一次出現的圖形的條件if(i==11)printf("   score :   %d",score); //計算所得的分數if(i==13)printf("   speed :   %d",score/100+1); //控制圖形下落的速度if(i==15)printf("   空格鍵:   暫停");if(i==16)printf("   左方向鍵左移-右方向鍵右移");if(i==17)printf("   上方向鍵變形-下方向鍵下降");puts(""); } } else { mark=1; for(i=0;i<SIZE_N;i++){ for(j=0;j<SIZE_M;j++){ if(i==0&&j==0 || i==0&&j==SIZE_M-1 || j==0&&i==SIZE_N-1 || j==SIZE_M-1&&i==SIZE_N-1)printf("  "); //控制else if(i==0 || i==SIZE_N-1)printf("--"); //控制圖形落地消除時上下邊界的變化else if(j==0 || j==SIZE_M-1)printf("|"); //控制圖形落地消除時左右邊界的變化else if(map[i][j]==2) printf("■"); //控制圖形落地消除時形狀的變化else if(map[i][j]==0) printf("  ");  //控制圖形落地消除時邊框內部填充圖案的變化} if(i==1)printf("   next:"); //表示提示下一次出現的圖形的條件if(i==11)printf("   score :   %d",score); //計算所得的分數if(i==13)printf("   speed :   %d",score/100+1); //控制圖形下落的速度if(i==15)printf("   空格鍵:   暫停");if(i==16)printf("   左方向鍵左移-右方向鍵右移");if(i==17)printf("   上方向鍵變形-下方向鍵下降");puts(""); } } /*對于next 方塊的處理,先擦除再畫圖*/ for(i=2;i<=10;i++){ for(j=23;j<=34;j++){ gotoxy(j+1,i+1);printf("  "); } }  gotoxy(29,6); printf("■"); //控制下一個圖形出現提示圖形的位置,29是列,6是行for(i=0;i<6;i=i+2){ gotoxy(29+2*shape[next][i+1],6+shape[next][i]); printf("■"); } Sleep(Gamespeed); //Sleep是一個庫函數,是表示時間的函數,這里用來控制圖形下落的速度
} 
//初始化函數,cur_x,cur_y是全局變量,標記了移動方塊的位置 
void init(int id){memset(map,0,sizeof(map)); //memset函數重新申請內存空間for(int i=0;i<SIZE_N;i++){ for(int j=0;j<SIZE_M;j++) if(i==SIZE_N-1 || j==0 || j==SIZE_M-1) map[i][j]=-1; } cur_x=0; cur_y=6; ShowMap(id); 
}
//顏色函數
void color(int n_color)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n_color);
}
//判斷是否出界,或者說是否合法的函數 
int judge_in(int x,int y,int id){if(map[x][y]!=0)return 0; for(int i=0;i<6;i=i+2){ if(map[ x+shape[id][i] ][ y+shape[id][i+1] ]!=0)return 0; }return 1; 
} 
//得分,擦除行的閃爍,還有圖形的向下平移 
void fun_score(){for(int i=1;i<SIZE_N-1;i++){ int flag=0;for(int j=1;j<SIZE_M-1;j++){if(map[i][j]!=2){ flag=1;break;} } if(flag==0){ int k=3; while(k--){ gotoxy(2,i+1); for(int ii=1;ii<SIZE_M-1;ii++){if(map[i][ii]==2){ if(k%2==1) {printf("  ");srand(time(NULL));int a=rand()%12;switch(a){case 0:color(0x0E);break;//case 1:color(0x03);break;//lancase 2:color(0x04);break;//hongcase 3:color(0x05);break;//zihongcase 4:color(0x06);break;//huangcase 5:color(0x07);break;//baicase 6:color(0x08);break;//huicase 7:color(0x09);break;//shenlancase 8:color(0x0A);break;//case 9:color(0x0B);break;case 10:color(0x0C);break;case 11:color(0x0D);break;}}//控制消除的行數else printf("■"); } }Sleep(100); //執行到Sleep()函數時,程序在那里等100毫秒} for(int ii=i;ii>1;ii--){ for(int jj=1;jj<SIZE_M-1;jj++)map[ii][jj]=map[ii-1][jj]; } ShowMap(-1); score+=10; //控制每次得分時所加的分數if(score%100==0 && score!=0)Gamespeed-=50;// 控制形狀下落的速度} } 
} 
//主函數
int main()
{ int i,id,set=1; srand(time(NULL)); id=rand()%MOD; id=(id+MOD)%MOD; next=rand()%MOD; next=(next+MOD)%MOD; //使隨機出現圖形init(id); while(1){ 
Here:   mark=0;// 標志位if(set==0){ id=next; next=rand()%MOD; next=(next+MOD)%MOD; cur_x=0;cur_y=6; set=1; } while(!kbhit())//kbhit()在執行時,檢測是否有按鍵按下,有按下返回鍵值,//沒有按下返回0;是非阻塞函數getch() 在執行時,檢測按下什么鍵,如果不按鍵該函數不返回;是阻塞函數.{ Gameover(); if(judge_in(cur_x+1,cur_y,id)==1) cur_x++; //判斷圖形是否出界else { map[cur_x][cur_y]=2; for(i=0;i<6;i=i+2) map[ cur_x+shape[id][i] ][ cur_y+shape[id][i+1] ]=2; set=0; } fun_score(); if(mark!=1)ShowMap(id); //當標志的那一行為1時,就把那一行消掉goto Here; }//end of while(!kbhit()) key=getch(); if(key1==-32 && key==72)//控制轉換圖形變形的操作{ int tmp=id ;id++; if( id%4==0 && id!=0 )id=id-4; if(judge_in(cur_x,cur_y,id)!=1)id=tmp; } else if(key1==-32 && key==80 && judge_in(cur_x+1,cur_y,id)==1)cur_x++; //使圖形向下移動的操作else if(key1==-32 && key==75 && judge_in(cur_x,cur_y-1,id)==1)cur_y--; //使圖形向左移動的操作else if(key1==-32 && key==77 && judge_in(cur_x,cur_y+1,id)==1)cur_y++; //使圖形向右移動的操作//****************************else if(key==32)   //按空格鍵,暫停{Sleep(1);while(1){if(kbhit())   //再按空格鍵,繼續游戲{key=getch();if(key==32){goto label;}}}}//*****************************else if(key==27)return 0; 
label:key1=key; }return 0; 
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/531015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531015.shtml
英文地址,請注明出處:http://en.pswp.cn/news/531015.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C/C++課程設計 之職工管理系統

文章目錄 (一) 題目內容及簡介(二) 概要設計(三) 詳細設計(四) 實現代碼(五) 相關案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十案例十一(一) 題目內容及簡介 1.課題來源 課題名稱和來源,主要介紹為何選擇此題目來開展課程設計,此課題的開展能體現面向…

C++ 知識要點

1.類與對象 類是事物的抽象。類的對象就是類的具體化&#xff0c;實際化 2.C三大特性 繼承、封裝、多態 3.C父類與子類繼承過程中&#xff0c;子類的特點&#xff1f; 子類擁有父類的所有屬性和行為 子類就是一種特殊的父類 子類對象可以當作父類對象使用 子類中可以添加父類…

C/C++小游戲 ——貪吃蛇

文章目錄案例一案例二案例三案例四案例五案例六案例七案例八案例九案例一 #include <stdio.h>#include <windows.h>#include <conio.h>#include <time.h>//游戲窗口#define FrameX 4//游戲窗口左上角的X軸坐標#define FrameY 4//游戲窗口左上角的Y軸坐…

C/C++課程設計 新生入學管理系統(二)

文章目錄 案例十六案例十七案例十八案例十九案例二十案例二十一案例二十二案例二十三案例二十四案例二十五案例二十六案例二十七案例二十八案例十六 #include<iostream> #include<cstring> //strcpy,strcmp #

Java類名.方法和變量

文章目錄(1) 類名.方法(2) 變量(1) 類名.方法 要是類名直接調用的方法&#xff0c;那這個方法就是靜態的(static)方法&#xff0c;是不用new出新對象實例就可以直接調用的方法。看下面例子&#xff1a; class A {public static void Method1(int a, int b) {//方法體}public …

Java小案例(二) 用數組實現增刪查改排序

文章目錄案例一案例二案例三案例四案例五案例一 Student.Java package curd;public class Student {private String stuid;private String name;private int chinese;private int math;private int english;private int avg;private int sum;public int getAvg() {return avg;…

有趣的一行代碼

文章目錄愛心曼德勃羅集合打印99乘法表實現快速排序禪語漫畫迷宮愛心 print(\n.join([.join([(????????????[(x-y)%12]if((x*0.05)**2(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<0 else )for x in range(-30,30)])for y in range(15,-15,-1)]))效果圖&#xff1…

Python練習之 對文件進行創建,然后重命名文件最近進行文件刪除

import os os.mkdir("D:\\1815925603") context ("序號&#xff1a;1815925603\n""姓名&#xff1a;阿信\n""班級&#xff1a;18云計算2班\n") with open (D:\\1815925603\\file1.txt,a) as fp:fp.write(context)fp.seek(0, 0) with …

Java接口中的成員變量為什么必須是static ?

接口的含義 接口就是提供一種統一的協議, 而接口中的屬性也屬于協議中的成員。它們是公共的,靜態的,最終的常量。相當于全局常量。 在interface里面的變量都是public static final 的。 public static final int i10;等價于int i10;(可以省略掉一部分) //注意在聲明的時候要…

Java函數式編程和面向對象編程

文章目錄什么是函數式編程&#xff1f;什么是面向對象編程&#xff1f;函數式編程和面向對象編程的優缺點什么是函數式編程&#xff1f; 函數式編程的核心&#xff1a;在思考問題時&#xff0c;使用不可變對象和函數&#xff0c;函數將一個值經過處理&#xff0c;映射成另一個…

JDBC實現圖書管理小案例

文章目錄項目文件結構項目運行效果項目詳細代碼項目文件下載相關案例案例一案例二案例三案例四案例五案例六案例七案例八項目文件結構 項目運行效果 項目詳細代碼 JDBCUtils.java package jdbc;import java.sql.*; import com.mysql.jdbc.Driver;public class JDBCUtils {pri…

Java實現多線程售票

文章目錄Synchronized和Lock的區別是什么&#xff1f;案例一方法一 繼承Thread類方法二 實現Runnable接口案例二方法一 繼承Thread類方法二 實現Runnable接口案例三方法一 繼承Thread類方法二 實現Runnable接口案例四方法一 繼承Thread類方法二 實現Runnable接口案例五方法一 繼…

基于TCP原理,采用Socket通信技術,實現聊天室

文章目錄案例一案例二案例三案例四案例五相關案例案例一 Client.java package SocketCode;import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import java.io.*; import …

HTML+CSS+JS 實現登錄注冊界面

文章目錄案例一 滑動樣式案例二 滑動樣式案例三 動態樣式案例四 普通樣式案例五 滑動樣式案例六 普通樣式具體怎么獲取呢&#xff1f;案例一 滑動樣式 login.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">…

數據結構課程設計 迷宮問題

文章目錄一、 目的與要求二、 問題描述和求解方法三、 解題過程四、 實現源碼五、 相關案例案例一案例二一、 目的與要求 1、目的&#xff1a; 通過布置具有一定難度的實際程序設計項目&#xff0c;使學生進一步理解和掌握課堂上所學各種基本抽象數據類型的邏輯結構、存儲結構和…

html+css 小案例(一)

文章目錄點擊下載index.html <!DOCTYPE html> <html lang"ch"> <head><meta charset"UTF-8"><title>Demo_Test</title><link rel"stylesheet" href"css/Dec.css"> </head> <body…

HTML+CSS+JS 表白代碼

文章目錄案例一 愛你到天昏地暗案例二 帶有音樂的表白代碼案例三 帶有圖片旋轉的表白案例源碼案例一 愛你到天昏地暗 <html> <style type"text/css"> <!-- .STYLE1 {font-size: medium} --> </style> <center><br><br>…

Linux常用命令與基本操作、填空題、簡答題

文章目錄基本知識點基本操作敘述什么是shell?重啟虛擬機網絡分區查看當前進程查看主機名重啟關機查看IP地址文件搜索掛載查看網絡配置linux系統中Vi的三種模式磁盤分區查看硬盤信息df&#xff0c;fdisk&#xff0c;lsblk區別進程用戶用戶信息查看用戶密碼信息修改密碼添加用戶…

Java中List、Map、Set三個接口,存取元素時,各有什么特點?

特點 List與Set都是單列元素的集合&#xff0c;它們有一個功共同的父接口Collection。 1.Set里面不允許有重復的元素&#xff0c; 存元素&#xff1a;add方法有一個boolean的返回值&#xff0c;當集合中沒有某個元素&#xff0c;此時add方法可成功加入該元素時&#xff0c;則…

客戶端與服務器(C/S架構與B/S架構)、AJax學習

文章目錄HTTP請求與服務器客戶端與服務器1.C/S架構與B/S架構2.web資源介紹3.資源訪問流程HTTP協議1.什么是協議&#xff1f;2.什么是HTTP協議3.HTTP組成部分4.請求的發送方式什么是Ajax技術Ajax可以做什么&#xff1f;偽造AjaxHTTP請求與服務器 客戶端與服務器 1.C/S架構與B/…