使用C語言實現三子棋小遊戲
本文實例為大傢分享瞭C語言實現三子棋小遊戲的具體代碼,供大傢參考,具體內容如下
1、實現原理
采用二位數組保存棋盤信息,棋盤上面的任何一個位置,裡頭可以放三個信息:
1、空
2、用戶落子
3、電腦落子
下三子棋就是在二維數組種找對應的空位置,進行落子,落完之後立即就要判斷落子位置是否有三字連珠,從而判斷誰數輸誰贏。每走一次棋會有四種情況:
*用戶1贏
*用戶2贏
*平局(棋盤被沾滿)
**沒有出結果 繼續下棋
2、實現模塊
文件名 作用
three_chress.h 三子棋的函數聲明,頭文件聲明等
three_chress.c 三子棋函數接口的實現
main.c 三子棋函數測試功能
3、實現邏輯
一、我們要先在main.c這個文件,還是一樣把框架構建好,再去分別實現他們的功能。實現菜單以及遊戲的開始結束都在main函數裡面,再從裡面拿出遊戲開始函數去具體實現遊戲的進行。並把每次用到的頭文件包含再three_chress.h裡面。
main.c
#include"three_chress.h" void menu() { printf("###### 1、開始遊戲 #######\n"); printf("###### 2、退出 #######\n"); } void game() { char ret = 0; srand((unsigned int)time(NULL)); char a[ROW][COL] = { 0 }; init_a(a,ROW,COL);//初始化 show(a, ROW, COL);//可視化 while (1) { play_move(a, ROW, COL);//用戶走 show(a, ROW, COL); ret = Is_over(a,ROW,COL);//判斷是否結束 if (ret != 'N')//N這個字符表示繼續的意思 { break; } computer_move(a, ROW, COL);//電腦走 show(a, ROW, COL); ret = Is_over(a,ROW, COL);//判斷是否結束 if (ret != 'N')//N這個字符表示繼續的意思 { break; } } if (ret == '*') { printf("用戶贏\n"); } else if (ret =='#') { printf("電腦贏\n"); } else if (ret ='D')//D表示為平局 { printf("平局\n"); } show(a, ROW, COL); } int main() { int input = 0; do{ menu(); printf("請選擇-> "); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: printf("退出"); break; default: printf("不存在,請重新輸入"); break; } } while (input); return 0; }
three_chress.h
#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void init_a(char a[][COL], int row, int col);//初始化 void show(char a[][COL], int row , int col);//可視化 void play_move(char a[][COL],int row,int col);//用戶下 void computer_move(char a[][COL], int row, int col);//電腦下 char Is_over(char a[][COL],int row,int col);//判斷是否結束 int is_full(char a[][COL],int row, int col);
二、那麼遊戲怎麼進行?我們要先實現這樣的邏輯:構建二維數組並初始化——>顯示棋盤信息即可視化——>讓用戶走並顯示棋盤信息而且要立即判斷用戶是否贏,在判斷時候我們用字符N來取表示遊戲繼續,如果返回的不是N說明遊戲結束。——>如果沒贏讓電腦走並顯示棋盤信息且判斷電腦是否贏。最後我們用返回字符方式去判斷誰贏或者平局。
三、把以上用到的邏輯用函數去一步一步實現,重點說幾個函數:
1、在play_move函數裡面需要註意的是 ,下棋所輸入的坐標要先去判斷其合法性以及多重性也就是重復。之後再賦棋子。
2、在computer_move實現比較簡單,讓電腦自動走、隨機走 ,就要想到rand函數,而rand函數又和srand函數有,再用他們的性質讓是X,Y隨機生成0到2的值,去賦棋子即可。
3、而Is_over函數去判斷輸贏就是四種情況:用戶贏;電腦贏;平局;繼續。
直接比較四個方向上下兩個對角線上的每個位置是否相等,且不為空。再寫個判斷是否滿的函數去判斷是否是平局,最後返回繼續。這裡面返回的都是字符。
如下代碼:
three_chree.c
#include"three_chress.h" static int is_full(char a[][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (a[i][j]== ' ') { return 0; } } } return 1; } void init_a(char a[][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { for (int j = 0; j < col; j++) { a[i][j] = ' '; } } } void show(char a[][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { for (int j = 0; j < col; j++) { printf(" %c ", a[i][j]); if (j < col - 1) { printf("|"); } } printf("\n"); if (i < row - 1) { for (int j = 0; j < col; j++) { printf("---"); if (j < col - 1) { printf("|"); } } printf("\n"); } } } void play_move(char a[][COL], int row, int col) { int x = 0; int y = 0; printf("用戶下\n"); while (1) { printf("用戶請輸入:\n"); scanf("%d %d", &x, &y); if (x >= 1 && x <= row && y >= 1 && y <= col) { if (a[x - 1][y - 1] == ' ') { a[x - 1][y - 1] = '*'; break; } else { printf("已被占用,請重新輸入"); } } else { printf("非法輸入"); } } } void computer_move(char a[][COL], int row, int col) { printf("電腦走\n"); int x = 0; int y = 0; x = rand() % row; y = rand() % col; while (1) { if (a[x][y] == ' ') { a[x][y] = '#'; break; } } } char Is_over(char a[][COL], int row, int col)//判斷是否結束 { for (int i = 0; i < row; i++) { if (a[i][0] == a[i][1] && a[i][1] == a[i][2] && a[i][0] != ' ') { return a[i][0]; } } for (int j = 0; j < col; j++) { if (a[0][j] == a[1][j] && a[1][j] == a[2][j] && a[0][j] != ' ') { return a[0][j]; } } if (a[0][0] == a[1][1] && a[1][1] == a[2][2] && a[0][0] != ' ') { return a[0][0]; } if (a[0][2] == a[1][1] && a[1][1] == a[2][0] && a[0][2] != ' ') { return a[0][2]; } if ( is_full(a, ROW, COL) == 1) { return 'D'; } return 'N';//表示遊戲繼續 }
4、實現結果
以上就是本文的全部內容,希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。