C语言简单尝试——五子棋小游戏
这是我在博客园的第一篇文章,也是我写的第一篇技术文章。
作为一个只能掌握基础语法的编程小白,
当然希望能够通过博客记录自己,让它与自己一同走在成为大牛的路上,
也希望能够向其他技术博客曾经对我的指导一样,
对其他小白有一些提点,
我会尽力对我写的每一个字负责,也希望能够收到来自各位的意见与建议,
小白的疑惑、大佬的指点,我们都走在一条大陆上,
但愿日后在万水千山人海中相遇,
我们会轻轻的说,
原来你也在这里
编写:vim
编译:gcc
环境:ubuntu 18.04lts
编译命令
gcc main.c menu.c recore.c game.c -o game
代码文件
gobang.h
#ifndef _gobang_h_ #define _gobang_h_ #define WIDTH 15 #define LENGTH 15 #define GOBANG_FILENAME "record.txt" //main.c //menu.c void menu(void); void printf_menu(void); //score.c void ReadRecord(int record[], const char filename[]); void WriteRecord(int record[], const char filename[]); void RecordSort(int record[], int n); void ShowRecord(int record[], int n); //game.c void StartGame(int game[][WIDTH], int record[]); void PlayGame(int game[][WIDTH], int record[], int length, int width); void ShowBoard(int game[][WIDTH], int length, int width); int Judge(int game[][WIDTH], int length, int width, int row, int col); void Initall(int game[][WIDTH], int length, int width); #endif
main.c #include <stdio.h> #include "gobang.h" int main(){ while(1){ menu(); } }
menu.c #include <stdio.h> #include <stdlib.h> #include "gobang.h" void print_menu(){// printf menu system("clear"); printf("Welcome\n"); printf("Please in put your choice\n\n"); printf("1.New game\n2.History record\n3.quit game\n\n"); printf("Your choice:"); } void menu(void){ print_menu(); int choice=-1; scanf("%d" ,&choice); int game[15][15] = {0};//game ary int record[10]={128,128,128,128,128,128,128,128,128,128};//record ary system("touch record.txt");//new file char filename[15] = GOBANG_FILENAME; ReadRecord(record, filename); if ( 1 == choice){ StartGame(game, record); } else if (2 == choice){ ShowRecord(record, 10); } else if (3 == choice){ exit(0); } else{ printf("Program Error\nExiting...\n"); exit(0); } }
game.c #include <stdio.h> #include <stdlib.h> #include "gobang.h" //Init -> game[][] = 0 void Initall(int game[][WIDTH], int length, int width){ for(int i=0;i<length; i++){ for(int j=0; j<width; j++){ game[i][j] = 0; } } } //showboard 0 is \'*\' ///1 is \'A\'///2 is \'B\' void ShowBoard(int game[][WIDTH], int length, int width){ system("clear"); printf("\t "); for (int i=0; i<15; i++){ printf(" %2d", i+1); } printf("\n\n"); for (int i=0; i<length; i++){ printf("\t%2d", i+1); for(int j=0; j<width; j++){ if (0 == game[i][j]){ printf(" *"); } else if (1 == game[i][j]) printf(" A"); else if (2 == game[i][j]) printf(" B"); else{ printf("Program Error\nExiting...\n"); exit(0); } } printf("\n\n"); } } int Judge(int game[][WIDTH], int length, int width, int row, int col){//Judge int win_flag=0; int player_flag = game[row][col]; for (int i=0; i<5; i++){ if ((game[row+i][col+i] == player_flag) && (game[row-1+i][col-1+i] == player_flag )&& ( game[row-2+i][col-2+i] == player_flag) && (game[row-3+i][col-3+i] == player_flag) && (game[row-4+i][col-4+i] == player_flag)){ win_flag = 1; } if ((game[row-i][col+i] == player_flag ) && (game[row+1-1][col-1+i] == player_flag )&& ( game[row+2-i][col-2+i] == player_flag ) && (game[row+3-i][col-3+i] == player_flag)&& (game[row+4-i][col-3+i] == player_flag)){ win_flag = 1; } if ((game[row+i][col] == player_flag) && (game[row-1+i][col] == player_flag )&& ( game[row-2+i][col] == player_flag) && (game[row-3+i][col] == player_flag )&&(game[row-4+i][col] == player_flag)){ win_flag = 1; } if ((game[row][col+i] == player_flag) && (game[row][col-1+i] == player_flag)&& ( game[row][col-2+i] == player_flag) && (game[row][col-3+i] == player_flag)&&(game[row][col-4+i] == player_flag)){ win_flag = 1; } } return win_flag; } int judge_ok(int game[][WIDTH], int row, int col){ if ((game[row-1][col-1] == 1) || (game[row-1][col-1] == 2) || (row > 15) || (col > 15) || (row < 0) || (col < 0) ){ return 1; } else{ return 0; } } // Xmain during playing game void PlayGame(int game[][WIDTH], int record[], int length, int width){ int win_flag=0; int step=0; int row=0, col=0; char filename[15] = GOBANG_FILENAME; do{ if (0 == step%2){//A player printf("Please in put you choice(eg:1,1)\n"); scanf("%d %d", &row, &col); while (1){ if(judge_ok(game, row, col)){ ShowBoard(game, LENGTH, WIDTH); printf("Error please input again\n"); scanf("%d %d", &row, &col); } else{ break; } } game[row-1][col-1] = 1; win_flag = Judge(game, LENGTH, WIDTH, row-1, col-1); } if (1 == step%2){//B player printf("Please in put you choice(eg:1,1)\n"); scanf("%d %d", &row, &col); while (1){ if(judge_ok(game, row, col)){ ShowBoard(game, LENGTH, WIDTH); printf("Error please input again\n"); scanf("%d %d", &row, &col); } else{ break; } } game[row-1][col-1] = 2; win_flag = Judge(game, LENGTH, WIDTH, row-1, col-1); } ShowBoard(game, LENGTH, WIDTH); step++; }while(0 == win_flag); if (0 == step%2){ printf("You win B\n"); step = step; } else if (1 == step%2){ printf("You win A\n"); step = (step+1)/2; } printf("Enter to back to menu\n"); if (record[9] > step){ record[9] = step; WriteRecord(record, filename); } getchar(); getchar(); } //when the game start void StartGame(int game[][WIDTH], int record[]){ Initall(game, LENGTH, WIDTH); ShowBoard(game, LENGTH, WIDTH); PlayGame(game, record, LENGTH, WIDTH); }
record.c #include <stdio.h> #include <stdlib.h> #include "gobang.h" void RecordSort(int record[], int n){ int max_flag=0; int temp; for (int i=0; i<n; i++){ for(int j=i+1; j<n; j++){ if (record[max_flag] > record[j]){ max_flag = j; } } temp = record[max_flag]; record[max_flag] = record[i]; record[i] = temp; max_flag = i+1; } } void WriteRecord(int record[], const char filename[]){ FILE *fp; if ((fp = fopen(filename, "w")) == NULL){ printf("Program Error\nExiting...\n"); exit(0); } RecordSort(record, 10); for (int i=0; i<10; i++){ fprintf(fp, "%d\n", record[i]); } fclose(fp); } void ReadRecord(int record[], const char filename[]){ FILE *fp; if ((fp = fopen(filename, "r")) == NULL){ printf("Program Error\nExiting...\n"); exit(0); } for (int i=0; i<10; i++){ fscanf(fp, "%d", &record[i]); } } void ShowRecord(int record[], int n){ char filename[15] = "record.txt"; ReadRecord(record, filename); for (int i=0; i<10; i++){ printf("%2d\t", i+1); if (128 == record[i]){ printf("###"); } else{ printf("%3d", record[i]); } printf("\n"); } printf("Enter to menu\n"); getchar(); getchar(); }
第一次练习一个小项目,花费了大概六七个小时的时间,
做完的时候感觉很好,毕竟是自己亲手一个字一个字敲出来的,
毕竟只是一个编程小白,也就只能写写简单代码,
在这期间也发现了很多问题,头文件内定义的函数是给定的,
让人觉得有种带着镣铐舞蹈的感觉,不是自己在发挥所以感觉整个程序的流程有些不明朗
程序运行时在各函数之间的跳转,感觉有些摸不到头脑,
对于一些算法的运用,在编写时总是选择最简单的而不是合适的,
也许编程是一门艺术,而我才刚踏入艺术馆门口