ShadowBird

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();
}

 

 

第一次练习一个小项目,花费了大概六七个小时的时间,

做完的时候感觉很好,毕竟是自己亲手一个字一个字敲出来的,

毕竟只是一个编程小白,也就只能写写简单代码,

在这期间也发现了很多问题,头文件内定义的函数是给定的,

让人觉得有种带着镣铐舞蹈的感觉,不是自己在发挥所以感觉整个程序的流程有些不明朗

程序运行时在各函数之间的跳转,感觉有些摸不到头脑,

对于一些算法的运用,在编写时总是选择最简单的而不是合适的,

也许编程是一门艺术,而我才刚踏入艺术馆门口

发表于 2018-07-27 21:15  fizm70  阅读(240)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: