суббота, 4 октября 2025 г.

Игра в Дурня на Си под ДОС

Когда то давным давно я в отпуске купил компьютер ZX-Spectrum, подключил его к телевизору и о чудо, там была брошюрка по программированию на бейсике для данного компа. Причем, включая звук и прочие прибамбасы. Так я познакомился с условиями и циклами и за отпуск успел написать карточную игру в дурня для текстового режима. Играла программа строго по алгоритму. Ходила с наименьшей и подкидывала всегда не жалея. Там надо было только добавить случайный выбор приоритета в пределах разумного но как то это до меня не сразу дошло и много лет спустя уже на ватком Си я пытался прикрутить альфа-бета процедуру поиска (подобно полному перебору). Дурень как известно мастерам - игра комбинационная. Так родилась сия программка. Она сочетает Монте Карло случайный выбор хода с поискам лучшей линии для двух сторон (стороны по очереди ходят по алгоритму). Это конечо не совсем комбинационный стиль игры но все же.
Ссылка исходников и экзешника для DOSBOX. Можно компильнуть в текстовом режиме на Visual C. Не судите за графику. Что мог так сказать.
Заглавочный файл программы:

 

 #ifndef KARD_H
#define KARD_H
///////////////

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <conio.h>
#include <sys/timeb.h>
#include <assert.h>
#include <limits.h>


#if INT_MAX==32767
  #define MS_DOS_REAL_MOVE  // comment this line
#endif
#if (_MSC_VER > 1200)
  #define kbhit _kbhit
  #define getch _getch
  #define getche _getche
 // #define sscanf sscanf_s
 // #define sprintf sprintf_s
#endif

enum Status{END_GAME=0, ZAHOD_COMP  =1, OTBOY_COMP  =2,
            ZAHOD_PLAYER=3, OTBOY_PLAYER=4};

enum Side{PLAYER,COMP,NOSIDE};
enum Mast{CHERVY,BUBY,KRESTY,PIKI};               //масть карты
enum Dost{K_6,K_7,K_8,K_9,K_10,K_J,K_D,K_K,K_T};  //достоинство карты
enum GameResult{DRAW=1, WINE=1000, LOSE=-1000};
#define NOKARD -1
#define NOMAST -1
#define KEY_EXIT  100 //user input
#define KEY_GO    101 //user input
#define dost(k) (k%9)   // return 0..8, '6'..'tuz'
#define mast(k) (k/9)   // return 0..3, 'chervy'..'piki'
extern char *dost_str[];
extern char *mast_str[];

struct Dec{
  int v[36],cnt;
};
struct Game{
  struct Dec player, comp, koloda, igra,
         koleso_fortuny;
  struct Dec *p[2];
  int kozyr;
  enum Status game_state;
  enum GameResult result[2];
  int is_load;
  int cnt_list_player_kard;
};
#define GAME_FILE_NAME "gamelst.dat"
#define MSG_HOD  "Pick the kard or press Enter('q'-exit)"
//"Enter the card number (0..31) or key-ENTER(retreat) or 'q' to quit"
#define MSG_LEFT "Do you want pass kard left?"
//"Do you want pass kard left? Card number (0..31) or key-ENTER"
//функции - предварительное описание
int new_game(void); int show_pos(void); int delay(void);
int razdacha(void); int check_end(void); int user_input(const char msg[]); int
iq_can_move_left(int kard,int side);
int shiftleft(struct Dec* x,int min,int max); int mics_dec(struct Dec *koloda);
int less_kard(struct Dec* z, int mast);int pick_kard(struct Dec *p, int kard);
int user_player_other_input(void); unsigned long gettickcount(void);
int run(void);
int find_kard(struct Dec *p, int kard); int find_dost(struct Dec *p, int dos);
int find_mast(struct Dec *p, int mast);
int is_kard_capture(int k0, int k1); char* kard_to_str(int kard,int N);
int clear_key_buf(void);int sort_kard(int v[], int sz);
enum Side getside(void);
enum Side opside(enum Side side);
int do_move(int k); int beru(void); int otboy(void);
int is_zahod(void); int proverka(void);
int get_first_kard_zahod_comp(int side);
int get_next_kard_zahod_comp(int side);
int end_game(void); int find_kard_otboy_comp(int k0,int side);
int get_first_kard_zahod_player(void);
int get_next_kard_zahod_player(void);
int find_kard_otboy_player(int kard0);
int zahod_player1(void); int otboy_player1(void);
int zahod_comp1(void); int otboy_comp1(void);
int save_game(void);
int load_game(void);
int get_other_kards_left_player(void);
int get_other_kards_left(void);
int compare_kard_order(int k0,int k1);
int get_other_kards_left_player_helper(void);
int get_cnt_starshih_kozyrey(int side);
int is_kards_bad(struct Dec *p);
int iq_check_zahod_kard_mid_game(int kard, int side);
int print_str_status(const char s[]);
int read_score(int c);
int Song(void); int Song1(void);
int show_game_result(void);
int get_koleso_fortuny();
////



//переменные игры
extern struct Game g, old_g;
extern int last_wine;
extern unsigned long diff; //задержка во времени в (1/18.2 sec)
extern int is_search; //? идет поиск
extern int is_text_mode;







////////////////
#endif

Комментариев нет:

Отправить комментарий